Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * (C) 2007-2012 Alibaba Group Holding Limited.
   * 
   * 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.
  * Authors:
  *   wuhua <wq163@163.com> , boyan <killme2008@gmail.com>
  */
 package com.taobao.metamorphosis.tools.shell;
 
 import java.io.File;
 import java.util.List;
 
 
 ������(Ŀ¼)��ǰ�����ƫ��,һ�����ڷ���Ǩ��ʱ
 usage:
      MovePartitionFiles -dataDir /home/admin/metadata -topic xxtopic -start 5 -end 10 -offset -5
 

Author(s):
�޻�
Since:
2011-8-25 ����12:59:24
 
 
 public class MovePartitionFiles extends ShellTool {
 
     public MovePartitionFiles(PrintStream out) {
         super(out);
     }
 
 
     public static void main(String[] argsthrows Exception {
         new MovePartitionFiles(.).doMain(args);
     }
 
 
     @Override
     public void doMain(String[] argsthrows Exception {
         CommandLine commandLine = this.getCommandLine(args);
         String dataDir = commandLine.getOptionValue("dataDir");
         String topic = commandLine.getOptionValue("topic");
         int start = Integer.parseInt(commandLine.getOptionValue("start"));
         int end = Integer.parseInt(commandLine.getOptionValue("end"));
         int offset = Integer.parseInt(commandLine.getOptionValue("offset"));
 
         this.checkArg(dataDirtopicstartendoffset);
 
         List<FileoldPartitionPaths = this.getPartitionPaths(dataDirtopicstartend);
         this.checkOldPartitionPaths(oldPartitionPaths);
 
         List<FilenewPartitionPaths = this.getPartitionPaths(dataDirtopicstart + offsetend + offset);
         this.checkNewPartitionPaths(oldPartitionPathsnewPartitionPaths);
 
         this.rename(offsetoldPartitionPathsnewPartitionPaths);
 
     }
 
 
     private void rename(int offsetList<FileoldPartitionPathsList<FilenewPartitionPaths) {
         // ��ǰ�ƶ�
         if (offset < 0) {
             for (int i = 0; i < oldPartitionPaths.size(); i++) {
                 oldPartitionPaths.get(i).renameTo(newPartitionPaths.get(i));
                 this.println(oldPartitionPaths.get(i).getAbsolutePath() + " rename to " + newPartitionPaths.get(i));
             }
         }
         else {// ����ƶ�
             for (int i = oldPartitionPaths.size() - 1; i >= 0; i--) {
                 if (oldPartitionPaths.get(i).renameTo(newPartitionPaths.get(i))) {
                     this.println(oldPartitionPaths.get(i).getAbsolutePath() + " rename to " + newPartitionPaths.get(i));
 
                 }
                 else {
                     this.println(oldPartitionPaths.get(i).getAbsolutePath() + " rename to " + newPartitionPaths.get(i)
                             + " failed");
                 }
             }
         }
     }


    
����ƶ��������Ŀ¼�Ƿ��Ѿ�����,��һ�����ھͲ��������,�׳��쳣
    private void checkNewPartitionPaths(List<FileoldPartitionPathsList<FilenewPartitionPaths) {
        for (File file : newPartitionPaths) {
            if (!oldPartitionPaths.contains(file) && file.exists()) {
                throw new IllegalStateException("can not move," + "expected new dir " + file.getAbsolutePath()
                        + " exists");
            }
        }
    }


    
�����Ҫ�ƶ���Ŀ¼�Ƿ����,��һ�������ھͲ��������,�׳��쳣
    private void checkOldPartitionPaths(List<FileoldPartitionPaths) {
        for (File file : oldPartitionPaths) {
            if (!file.exists()) {
                throw new RuntimeException("can not move,old partition dir " + file.getAbsolutePath() + " not exists");
            }
        }
    }
    private List<FilegetPartitionPaths(String dataDirString topicint startint end) {
        List<FileoldPartitionPaths = new LinkedList<File>();
        for (int i = starti <= endi++) {
            oldPartitionPaths.add(new File(dataDir + . + topic + "-" + i));
        }
        return oldPartitionPaths;
    }
    private CommandLine getCommandLine(String[] args) {
        Option dataDirOption = new Option("dataDir"true"meta data dir");
        dataDirOption.setRequired(true);
        Option topicOption = new Option("topic"true"topic");
        topicOption.setRequired(true);
        Option startOption = new Option("start"true"start partition number");
        startOption.setRequired(true);
        Option endOption = new Option("end"true"end partition number");
        endOption.setRequired(true);
        Option offsetOption = new Option("offset"true"��������ǰ�����ƫ����");
        offsetOption.setRequired(true);
        return CommandLineUtils.parseCmdLine(argsnew Options().addOption(dataDirOption).addOption(topicOption)
            .addOption(startOption).addOption(endOption).addOption(offsetOption));
    }
    private void checkArg(String dataDirString topicint startint endint offset) {
        if (StringUtils.isBlank(topic)) {
            throw new IllegalArgumentException("can not move,topic is blank");
        }
        if (StringUtils.isBlank(dataDir)) {
            throw new IllegalArgumentException("can not move,dataDir is blank");
        }
        if (start < 0 || end < 0) {
            throw new IllegalArgumentException("can not move,start and end must not less than 0");
        }
        if (start > end) {
            throw new IllegalArgumentException("can not move,start less then end");
        }
        if (offset == 0) {
            throw new IllegalArgumentException("can not move,offset == 0,don��t move");
        }
        if ((start + offset) < 0) {
            throw new IllegalArgumentException("can not move,�ƶ�����С�ķ����Ž�С��0");
        }
    }
New to GrepCode? Check out our FAQ X