@BeforeClass
 public void setup() throws NamingException, AnalyticsException, IOException {
   GenericUtils.clearGlobalCustomDataSourceRepo();
   System.setProperty(
       GenericUtils.WSO2_ANALYTICS_CONF_DIRECTORY_SYS_PROP, "src/test/resources/conf3");
   AnalyticsServiceHolder.setHazelcastInstance(null);
   AnalyticsServiceHolder.setAnalyticsClusterManager(null);
   System.setProperty(AnalyticsServiceHolder.FORCE_INDEXING_ENV_PROP, Boolean.TRUE.toString());
   this.init(AnalyticsServiceHolder.getAnalyticsDataService());
 }
 @AfterClass
 public void done() throws NamingException, AnalyticsException, IOException {
   this.service.destroy();
   System.clearProperty(AnalyticsServiceHolder.FORCE_INDEXING_ENV_PROP);
   AnalyticsServiceHolder.setAnalyticsDataService(null);
 }
 @SuppressWarnings("static-access")
 public static void main(String[] args) throws Exception {
   String timePattern = "yy-mm-dd hh:mm:ss";
   Options options = new Options();
   options.addOption(new Option("backup", false, "backup analytics data"));
   options.addOption(new Option("restore", false, "restores analytics data"));
   options.addOption(new Option("enableIndexing", false, "enables indexing while restoring"));
   options.addOption(
       OptionBuilder.withArgName("directory")
           .hasArg()
           .withDescription("source/target directory")
           .create("dir"));
   options.addOption(
       OptionBuilder.withArgName("table list")
           .hasArg()
           .withDescription("analytics tables (comma separated) to backup/restore")
           .create("tables"));
   options.addOption(
       OptionBuilder.withArgName(timePattern)
           .hasArg()
           .withDescription("consider records from this time (inclusive)")
           .create("timefrom"));
   options.addOption(
       OptionBuilder.withArgName(timePattern)
           .hasArg()
           .withDescription("consider records to this time (non-inclusive)")
           .create("timeto"));
   options.addOption(
       OptionBuilder.withArgName("tenant id (default is super tenant)")
           .hasArg()
           .withDescription("specify tenant id of the tenant considered")
           .create("tenant_id"));
   options.addOption(
       OptionBuilder.withArgName("restore record batch size (default is 1000)")
           .hasArg()
           .withDescription("specify the number of records per batch for backup")
           .create("batch"));
   CommandLineParser parser = new BasicParser();
   CommandLine line = parser.parse(options, args);
   if (args.length < 2) {
     new HelpFormatter().printHelp("analytics-backup.sh|cmd", options);
     System.exit(1);
   }
   if (line.hasOption("restore")) {
     if (line.hasOption("enableIndexing")) {
       System.setProperty(AnalyticsServiceHolder.FORCE_INDEXING_ENV_PROP, Boolean.TRUE.toString());
       forceIndexing = true;
     }
   }
   if (line.hasOption("backup")) {
     if (line.hasOption("batch")) {
       String batchValue = line.getOptionValue("batch");
       batchSize = Integer.parseInt(batchValue);
     } else {
       batchSize = RECORD_BATCH_SIZE;
     }
   }
   AnalyticsDataService service = null;
   try {
     service = AnalyticsServiceHolder.getAnalyticsDataService();
     int tenantId;
     if (line.hasOption("tenant_id")) {
       tenantId = Integer.parseInt(args[2]);
     } else {
       tenantId = MultitenantConstants.SUPER_TENANT_ID;
     }
     SimpleDateFormat dateFormat = new SimpleDateFormat(timePattern);
     long timeFrom = Long.MIN_VALUE;
     String tfStr = "-~";
     if (line.hasOption("timefrom")) {
       tfStr = line.getOptionValue("timefrom");
       timeFrom = dateFormat.parse(tfStr).getTime();
     }
     long timeTo = Long.MAX_VALUE;
     String ttStr = "+~";
     if (line.hasOption("timeto")) {
       ttStr = line.getOptionValue("timeto");
       timeTo = dateFormat.parse(ttStr).getTime();
     }
     String[] specificTables = null;
     if (line.hasOption("tables")) {
       specificTables = line.getOptionValue("tables").split(",");
     }
     File baseDir = new File(line.getOptionValue("dir"));
     if (!baseDir.exists()) {
       baseDir.mkdirs();
     }
     System.out.println(
         "Intializing [tenant="
             + tenantId
             + "] [timefrom='"
             + tfStr
             + "'] [timeto='"
             + ttStr
             + "'] [dir='"
             + baseDir.getAbsolutePath()
             + "']"
             + (specificTables != null ? (" [table=" + Arrays.toString(specificTables) + "]") : "")
             + "...");
     if (line.hasOption("backup")) {
       backup(service, tenantId, baseDir, timeFrom, timeTo, specificTables);
     } else if (line.hasOption("restore")) {
       restore(service, tenantId, baseDir, timeFrom, timeTo, specificTables);
     }
     System.out.println("Done.");
   } finally {
     if (service != null) {
       service.destroy();
     }
   }
 }