content: /*
   * Copyright 1999-2012 Alibaba Group.
   *  
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   *  
   *      http://www.apache.org/licenses/LICENSE-2.0
   *  
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   */
  
  package com.alibaba.cobar.manager.dao.xml;
  
  import java.io.File;
  import java.io.FileInputStream;
  import java.io.FileNotFoundException;
  import java.io.FileOutputStream;
  import java.io.IOException;
  import java.nio.ByteBuffer;
  import java.nio.channels.FileChannel;
  import java.text.SimpleDateFormat;
  import java.util.Date;
  
  import org.apache.log4j.Logger;
  import org.xmlpull.mxp1_serializer.MXSerializer;
  import org.xmlpull.v1.XmlPullParser;
  
  /**
   * @author haiqing.zhuhq 2011-6-14
   */
  public abstract class AbstractDAOImple {
      private static final Logger logger = Logger.getLogger(AbstractDAOImple.class);
      protected String xmlPath;
      protected XmlPullParser xpp;
      protected MXSerializer xsl;
      protected XMLFileLoader xmlFileLoader;
      protected static final long[] EMPTY_LONG_ARRAY = new long[0];
      protected static final int[] EMPTY_INT_ARRAY = new int[0];
  
      public void setXmlFileLoader(XMLFileLoader xmlFileLoader) {
          this.xmlFileLoader = xmlFileLoader;
      }
  
      //flag means if it is going to write END_TAG
      protected boolean writePrefix(boolean flag) {
          int count = xsl.getDepth();
          if (flag) {
              count--;
          }
          for (int i = 0; i < count; i++) {
              try {
                  xsl.text("  ");
              } catch (IOException e) {
                  logger.error(e.getMessage(), e);
                  return false;
              }
          }
          return true;
      }
  
      protected boolean writeProperty(String name, String value) {
          try {
              writePrefix(false);
              xsl.startTag(null, "property");
              xsl.attribute(null, "name", name);
              xsl.text(value);
              xsl.endTag(null, "property");
              xsl.text("\n");
          } catch (IOException e) {
              logger.error(e.getMessage(), e);
              return false;
          }
          return true;
      }
  
      /**
       * copy file from xmlpath to newpath
       * 
       * @param xmlpath : the file to copy
       * @param newpath : the file copy to
       * @return true for copy success, or false for fail.
       */
      protected boolean fileCopy(String xmlpath, String newpath) {
          int length = 1024 * 1024; //1MB
          try {
              FileInputStream in = new FileInputStream(xmlpath);
              FileOutputStream out = new FileOutputStream(newpath);
              FileChannel inC = in.getChannel();
              FileChannel outC = out.getChannel();
              ByteBuffer b = null;
              while (true) {
                  if (inC.position() == inC.size()) {
                      inC.close();
                      outC.close();
                      return true;
                  }
                  if ((inC.size() - inC.position()) < length) {
                      length = (int) (inC.size() - inC.position());
                  }
                  b = ByteBuffer.allocateDirect(length);
                  inC.read(b);
                  b.flip();
                  outC.write(b);
                  outC.force(false);
              }
          } catch (FileNotFoundException e) {
              logger.error(e.getMessage(), e);
          } catch (IOException e) {
              logger.error(e.getMessage(), e);
          }
          return false;
      }
  
      protected boolean backup(String path) {
          Date today = new Date();
          SimpleDateFormat format = new SimpleDateFormat("-yyyy-MM-dd");
          String date = format.format(today);
          String newpath = new StringBuilder(path).append(date).toString();
          File f = new File(newpath);
          if (f.exists()) {
              return true;
          }
          if (fileCopy(path, newpath)) {
              return true;
          }
          logger.error("file backup fail for: " + newpath);
          return false;
      }
  
      protected boolean recovery(String path) {
          Date today = new Date();
          SimpleDateFormat format = new SimpleDateFormat("-yyyy-MM-dd");
          String date = format.format(today);
          String newpath = new StringBuilder(path).append(date).toString();
          File f = new File(newpath);
          if (f.exists()) {
              if (fileCopy(newpath, path)) {
                  return true;
              }
              logger.error("file recovery fail for : " + newpath);
          }
          logger.error("file does exsit for recovery: " + newpath);
  
          return false;
      }
  
  }
  