Refactor zusammen main tool 91/55991/1
authortalig <talig@amdocs.com>
Sun, 8 Jul 2018 10:28:37 +0000 (13:28 +0300)
committertalig <talig@amdocs.com>
Sun, 8 Jul 2018 10:29:31 +0000 (13:29 +0300)
Use command pattern instead of switch case

Change-Id: I1457179f90b37b4a8cede5af23a4ebc1f30c1cce
Issue-ID: SDC-1444
Signed-off-by: talig <talig@amdocs.com>
openecomp-be/tools/zusammen-tools/pom.xml
openecomp-be/tools/zusammen-tools/src/main/java/org/openecomp/core/tools/commands/AddContributorCommand.java
openecomp-be/tools/zusammen-tools/src/main/java/org/openecomp/core/tools/commands/Command.java [new file with mode: 0644]
openecomp-be/tools/zusammen-tools/src/main/java/org/openecomp/core/tools/commands/CommandName.java [new file with mode: 0644]
openecomp-be/tools/zusammen-tools/src/main/java/org/openecomp/core/tools/commands/CommandsHolder.java [new file with mode: 0644]
openecomp-be/tools/zusammen-tools/src/main/java/org/openecomp/core/tools/commands/HealAll.java
openecomp-be/tools/zusammen-tools/src/main/java/org/openecomp/core/tools/commands/PopulateUserPermissions.java
openecomp-be/tools/zusammen-tools/src/main/java/org/openecomp/core/tools/commands/SetHealingFlag.java
openecomp-be/tools/zusammen-tools/src/main/java/org/openecomp/core/tools/exportinfo/ExportDataCommand.java
openecomp-be/tools/zusammen-tools/src/main/java/org/openecomp/core/tools/importinfo/ImportDataCommand.java
openecomp-be/tools/zusammen-tools/src/main/java/org/openecomp/core/tools/main/ZusammenMainTool.java

index 4b9a033..4322488 100644 (file)
             <artifactId>openecomp-sdc-vendor-software-product-manager</artifactId>
             <version>${project.version}</version>
         </dependency>
+        <dependency>
+            <groupId>commons-cli</groupId>
+            <artifactId>commons-cli</artifactId>
+            <version>1.4</version>
+        </dependency>
         <dependency>
             <groupId>org.testng</groupId>
             <artifactId>testng</artifactId>
index caa688d..2c13ab7 100644 (file)
@@ -1,11 +1,5 @@
 package org.openecomp.core.tools.commands;
 
-import org.openecomp.core.tools.concurrent.ItemAddContributorsTask;
-import org.openecomp.core.tools.exceptions.CommandExecutionRuntimeException;
-import org.openecomp.core.tools.store.ItemHandler;
-import org.openecomp.core.tools.store.NotificationHandler;
-import org.openecomp.core.tools.store.PermissionHandler;
-
 import java.io.IOException;
 import java.nio.file.Files;
 import java.nio.file.Paths;
@@ -17,88 +11,111 @@ import java.util.concurrent.Executors;
 import java.util.concurrent.Future;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
-
-public class AddContributorCommand {
-
-
-  private static final int DEFAULT_THREAD_NUMBER = 8;
-  private static final String ERROR_TRYING_TO_READ_FILE = "Error while trying to read item list";
-  private static final String COMMAND_ADD_CONTRIBUTOR_FAILED =
-      "Command AddContributor execution failed.";
-
-  private AddContributorCommand() {
-    // it's a utility class, prevent instantiation
-  }
-
-  public static void add(String itemListPath, String userListPath) {
-
-    List<String> itemList;
-    try {
-      itemList = getItemList(itemListPath);
-    } catch (IOException e) {
-      throw new CommandExecutionRuntimeException(ERROR_TRYING_TO_READ_FILE +
-          "from:" + itemListPath, e);
+import org.apache.commons.cli.CommandLine;
+import org.apache.commons.cli.Option;
+import org.openecomp.core.tools.concurrent.ItemAddContributorsTask;
+import org.openecomp.core.tools.exceptions.CommandExecutionRuntimeException;
+import org.openecomp.core.tools.store.ItemHandler;
+import org.openecomp.core.tools.store.NotificationHandler;
+import org.openecomp.core.tools.store.PermissionHandler;
+import org.openecomp.sdc.logging.api.Logger;
+import org.openecomp.sdc.logging.api.LoggerFactory;
+
+public class AddContributorCommand extends Command {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(AddContributorCommand.class);
+    private static final String ITEMS_PATH_OPTION = "p";
+    private static final String UUSERS_PATH_OPTION = "u";
+    private static final int DEFAULT_THREAD_NUMBER = 8;
+    private static final String ERROR_TRYING_TO_READ_FILE = "Error while trying to read item list";
+    private static final String COMMAND_ADD_CONTRIBUTOR_FAILED = "Command AddContributor execution failed.";
+
+    AddContributorCommand() {
+        options.addOption(Option.builder(ITEMS_PATH_OPTION).hasArg().argName("file")
+                                .desc("file containing list of item ids, mandatory").build());
+        options.addOption(Option.builder(UUSERS_PATH_OPTION).hasArg().argName("file")
+                                .desc("file containing list of users, mandatory").build());
     }
-    List<String> userList;
-    try {
-      userList = load(userListPath).collect(Collectors.toList());
-    } catch (IOException e) {
-      throw new CommandExecutionRuntimeException(ERROR_TRYING_TO_READ_FILE +
-          "from:" + userListPath, e);
+
+    @Override
+    public boolean execute(String[] args) {
+        CommandLine cmd = parseArgs(args);
+
+        if (!cmd.hasOption(ITEMS_PATH_OPTION) || !cmd.hasOption(UUSERS_PATH_OPTION)) {
+            LOGGER.error("Arguments p and u are mandatory");
+            return false;
+        }
+
+        String itemListPath = cmd.getOptionValue(ITEMS_PATH_OPTION);
+        String userListPath = cmd.getOptionValue(UUSERS_PATH_OPTION);
+
+        List<String> itemList;
+        try {
+            itemList = getItemList(itemListPath);
+        } catch (IOException e) {
+            throw new CommandExecutionRuntimeException(ERROR_TRYING_TO_READ_FILE + "from:" + itemListPath, e);
+        }
+        List<String> userList;
+        try {
+            userList = load(userListPath).collect(Collectors.toList());
+        } catch (IOException e) {
+            throw new CommandExecutionRuntimeException(ERROR_TRYING_TO_READ_FILE + "from:" + userListPath, e);
+        }
+
+        List<ItemAddContributorsTask> tasks =
+                itemList.stream().map(itemid -> createTask(itemid, userList)).collect(Collectors.toList());
+
+        ExecutorService executor = null;
+
+        try {
+            executor = Executors.newFixedThreadPool(DEFAULT_THREAD_NUMBER);
+            executeAllTasks(executor, tasks);
+        } catch (InterruptedException e) {
+            throw new CommandExecutionRuntimeException(COMMAND_ADD_CONTRIBUTOR_FAILED, e);
+        } finally {
+            if (executor != null) {
+                executor.shutdownNow();
+            }
+        }
+        return true;
     }
 
-    List<ItemAddContributorsTask> tasks =
-        itemList.stream().map(itemid -> createTask(itemid, userList)).collect(Collectors.toList());
+    @Override
+    public CommandName getCommandName() {
+        return CommandName.ADD_CONTRIBUTOR;
+    }
 
-    ExecutorService executor = null;
+    private static List<String> getItemList(String itemListPath) throws IOException {
+        List<String> itemList;
+        if (itemListPath != null) {
+            itemList = load(itemListPath).collect(Collectors.toList());
+        } else {
+            itemList = new ItemHandler().getItemList();
+        }
 
-    try {
-      executor = Executors.newFixedThreadPool(DEFAULT_THREAD_NUMBER);
-      executeAllTasks(executor, tasks);
-    } catch (InterruptedException e) {
-      throw new CommandExecutionRuntimeException(COMMAND_ADD_CONTRIBUTOR_FAILED, e);
-    } finally {
-      if (executor != null) {
-        executor.shutdownNow();
-      }
-    }
-  }
-
-  private static List<String> getItemList(String itemListPath) throws IOException {
-    List<String> itemList;
-    if (itemListPath != null) {
-      itemList = load(itemListPath).collect(Collectors.toList());
-    } else {
-      itemList = new ItemHandler().getItemList();
+        return itemList;
     }
 
-    return itemList;
-  }
-
-  private static void executeAllTasks(ExecutorService executor,
-                                      Collection<? extends Callable<String>> tasks)
-      throws InterruptedException {
-    List<Future<String>> futureTasks;
-    futureTasks = executor.invokeAll(tasks);
-    boolean isThreadOpen = true;
-    while (isThreadOpen) {
-      isThreadOpen = futureTasks.stream().anyMatch(future -> !future.isDone());
+    private static void executeAllTasks(ExecutorService executor, Collection<? extends Callable<String>> tasks)
+            throws InterruptedException {
+        List<Future<String>> futureTasks;
+        futureTasks = executor.invokeAll(tasks);
+        boolean isThreadOpen = true;
+        while (isThreadOpen) {
+            isThreadOpen = futureTasks.stream().anyMatch(future -> !future.isDone());
 
+        }
     }
-  }
 
 
+    private static ItemAddContributorsTask createTask(String itemId, List<String> users) {
+        return new ItemAddContributorsTask(new PermissionHandler(), new NotificationHandler(), itemId, users);
+    }
 
-  private static ItemAddContributorsTask createTask(String itemId, List<String> users) {
-    return new ItemAddContributorsTask(new PermissionHandler(), new NotificationHandler(),
-        itemId, users);
-  }
-
-  private static Stream<String> load(String filePath)
-      throws IOException {
-    return Files.lines(Paths.get(filePath));
+    private static Stream<String> load(String filePath) throws IOException {
+        return Files.lines(Paths.get(filePath));
 
-  }
+    }
 
 
 }
diff --git a/openecomp-be/tools/zusammen-tools/src/main/java/org/openecomp/core/tools/commands/Command.java b/openecomp-be/tools/zusammen-tools/src/main/java/org/openecomp/core/tools/commands/Command.java
new file mode 100644 (file)
index 0000000..b8d1d51
--- /dev/null
@@ -0,0 +1,44 @@
+package org.openecomp.core.tools.commands;
+
+import org.apache.commons.cli.CommandLine;
+import org.apache.commons.cli.CommandLineParser;
+import org.apache.commons.cli.DefaultParser;
+import org.apache.commons.cli.HelpFormatter;
+import org.apache.commons.cli.Option;
+import org.apache.commons.cli.Options;
+import org.apache.commons.cli.ParseException;
+
+public abstract class Command {
+
+    static final String COMMAND_OPTION = "c";
+    protected final Options options = new Options();
+
+    protected Command() {
+        options.addOption(
+                Option.builder(COMMAND_OPTION).hasArg().argName("command").desc(getCommandName().name()).build());
+    }
+
+    protected CommandLine parseArgs(String[] args) {
+        CommandLineParser parser = new DefaultParser();
+        CommandLine cmd;
+        try {
+            cmd = parser.parse(options, args);
+        } catch (ParseException e) {
+            throw new RuntimeException(e);
+        }
+        return cmd;
+    }
+
+    public void printUsage() {
+        HelpFormatter formater = new HelpFormatter();
+        formater.printHelp("zusammenMainTool", options);
+    }
+
+    public void register(){
+        CommandsHolder.addCommand(this);
+    }
+
+    public abstract boolean execute(String[] args);
+
+    public abstract CommandName getCommandName();
+}
diff --git a/openecomp-be/tools/zusammen-tools/src/main/java/org/openecomp/core/tools/commands/CommandName.java b/openecomp-be/tools/zusammen-tools/src/main/java/org/openecomp/core/tools/commands/CommandName.java
new file mode 100644 (file)
index 0000000..7fa04a3
--- /dev/null
@@ -0,0 +1,10 @@
+package org.openecomp.core.tools.commands;
+
+public enum CommandName {
+    RESET_OLD_VERSION,
+    EXPORT,
+    IMPORT,
+    HEAL_ALL,
+    POPULATE_USER_PERMISSIONS,
+    ADD_CONTRIBUTOR
+}
diff --git a/openecomp-be/tools/zusammen-tools/src/main/java/org/openecomp/core/tools/commands/CommandsHolder.java b/openecomp-be/tools/zusammen-tools/src/main/java/org/openecomp/core/tools/commands/CommandsHolder.java
new file mode 100644 (file)
index 0000000..b6cc048
--- /dev/null
@@ -0,0 +1,80 @@
+package org.openecomp.core.tools.commands;
+
+import static org.openecomp.core.tools.commands.Command.COMMAND_OPTION;
+import static org.openecomp.core.tools.util.Utils.printMessage;
+
+import java.util.EnumMap;
+import java.util.Map;
+import java.util.Optional;
+import org.apache.commons.cli.CommandLine;
+import org.apache.commons.cli.DefaultParser;
+import org.apache.commons.cli.Option;
+import org.apache.commons.cli.Options;
+import org.apache.commons.cli.ParseException;
+import org.openecomp.core.tools.exportinfo.ExportDataCommand;
+import org.openecomp.core.tools.importinfo.ImportDataCommand;
+import org.openecomp.sdc.logging.api.Logger;
+import org.openecomp.sdc.logging.api.LoggerFactory;
+
+public class CommandsHolder {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(CommandsHolder.class);
+    private static final Options OPTIONS = new Options();
+    private static final Map<CommandName, Command> COMMANDS = new EnumMap<>(CommandName.class);
+
+    static {
+        OPTIONS.addOption(
+                Option.builder(COMMAND_OPTION).hasArg().argName("command").desc("command name, mandatory").build());
+        registerCommands();
+    }
+
+    private static void registerCommands() {
+        new SetHealingFlag().register();
+        new ExportDataCommand().register();
+        new ImportDataCommand().register();
+        new HealAll().register();
+        new PopulateUserPermissions().register();
+        new AddContributorCommand().register();
+    }
+
+    private CommandsHolder() {
+    }
+
+    public static Optional<Command> getCommand(String[] args) {
+        CommandLine cmd = parseArgs(args);
+        return cmd == null || !cmd.hasOption(COMMAND_OPTION) || cmd.getOptionValue(COMMAND_OPTION) == null
+                       ? Optional.empty()
+                       : getCommandName(cmd.getOptionValue(COMMAND_OPTION)).map(COMMANDS::get);
+    }
+
+    public static void printUsages() {
+        COMMANDS.values().forEach(Command::printUsage);
+    }
+
+    private static Optional<CommandName> getCommandName(String commandName) {
+        try {
+            return Optional.of(CommandName.valueOf(commandName));
+        } catch (IllegalArgumentException iae) {
+            printMessage(LOGGER, String.format("message: %s is illegal command.", commandName));
+            return Optional.empty();
+        }
+    }
+
+    private static CommandLine parseArgs(String[] args) {
+        try {
+            return new DefaultParser().parse(OPTIONS, args, true);
+        } catch (ParseException e) {
+            LOGGER.error("Error parsing arguments", e);
+            return null;
+        }
+    }
+
+    static void addCommand(Command command) {
+        CommandName commandName = command.getCommandName();
+        if (COMMANDS.containsKey(commandName)) {
+            throw new IllegalArgumentException(
+                    String.format("Command with the name %s was already registered", commandName));
+        }
+        COMMANDS.put(commandName, command);
+    }
+}
index d6344f7..8e0bb0e 100644 (file)
@@ -1,17 +1,5 @@
 package org.openecomp.core.tools.commands;
 
-import org.apache.commons.collections.CollectionUtils;
-import org.openecomp.core.tools.concurrent.ItemHealingTask;
-import org.openecomp.core.tools.exceptions.HealingRuntimeException;
-import org.openecomp.core.tools.loaders.VersionInfoCassandraLoader;
-import org.openecomp.sdc.healing.api.HealingManager;
-import org.openecomp.sdc.healing.factory.HealingManagerFactory;
-import org.openecomp.sdc.vendorsoftwareproduct.VendorSoftwareProductConstants;
-import org.openecomp.sdc.vendorsoftwareproduct.VendorSoftwareProductManager;
-import org.openecomp.sdc.vendorsoftwareproduct.VspManagerFactory;
-import org.openecomp.sdc.versioning.dao.types.Version;
-import org.openecomp.sdc.versioning.dao.types.VersionInfoEntity;
-
 import java.io.BufferedWriter;
 import java.io.FileWriter;
 import java.io.IOException;
@@ -25,105 +13,128 @@ import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 import java.util.concurrent.Future;
 import java.util.stream.Stream;
+import org.apache.commons.cli.CommandLine;
+import org.apache.commons.cli.Option;
+import org.apache.commons.collections.CollectionUtils;
+import org.openecomp.core.tools.concurrent.ItemHealingTask;
+import org.openecomp.core.tools.exceptions.HealingRuntimeException;
+import org.openecomp.core.tools.loaders.VersionInfoCassandraLoader;
+import org.openecomp.sdc.healing.api.HealingManager;
+import org.openecomp.sdc.healing.factory.HealingManagerFactory;
+import org.openecomp.sdc.vendorsoftwareproduct.VendorSoftwareProductConstants;
+import org.openecomp.sdc.vendorsoftwareproduct.VendorSoftwareProductManager;
+import org.openecomp.sdc.vendorsoftwareproduct.VspManagerFactory;
+import org.openecomp.sdc.versioning.dao.types.Version;
+import org.openecomp.sdc.versioning.dao.types.VersionInfoEntity;
 
 /**
  * Created by ayalaben on 11/6/2017
  */
-public class HealAll {
+public class HealAll extends Command {
 
-  private static final int DEFAULT_THREAD_NUMBER = 100;
-  private static List<ItemHealingTask> tasks = new ArrayList<>();
-  private static VendorSoftwareProductManager vspManager = VspManagerFactory
-      .getInstance().createInterface();
-  private static HealingManager healingManager = HealingManagerFactory.getInstance()
-      .createInterface();
+    private static final int DEFAULT_THREAD_NUMBER = 100;
+    private static final String THREAD_NUM_OPTION = "t";
+    private static List<ItemHealingTask> tasks = new ArrayList<>();
+    private VendorSoftwareProductManager vspManager;
+    private HealingManager healingManager;
 
-  private HealAll() {
-  }
+    HealAll() {
+        options.addOption(
+                Option.builder(THREAD_NUM_OPTION).hasArg().argName("number").desc("number of threads").build());
+    }
 
-  public static void healAll(String threadNumber) {
+    @Override
+    public boolean execute(String[] args) {
+        CommandLine cmd = parseArgs(args);
 
-    String logFileName = "healing.log";
-    try (BufferedWriter log = new BufferedWriter(new FileWriter(logFileName, true))) {
+        vspManager = VspManagerFactory.getInstance().createInterface();
+        healingManager = HealingManagerFactory.getInstance().createInterface();
 
-      writeToLog("----starting healing------", log);
-      Instant startTime = Instant.now();
+        String logFileName = "healing.log";
+        try (BufferedWriter log = new BufferedWriter(new FileWriter(logFileName, true))) {
 
-      int numberOfThreads = Objects.nonNull(threadNumber) ? Integer.valueOf(threadNumber) :
-          DEFAULT_THREAD_NUMBER;
-      ExecutorService executor = Executors.newFixedThreadPool(numberOfThreads);
+            writeToLog("----starting healing------", log);
+            Instant startTime = Instant.now();
 
-      filterByEntityType(VersionInfoCassandraLoader.list(),
-          VendorSoftwareProductConstants.VENDOR_SOFTWARE_PRODUCT_VERSIONABLE_TYPE).forEach
-          (HealAll::addTaskToTasks);
+            int numberOfThreads =
+                    cmd.hasOption(THREAD_NUM_OPTION) && Objects.nonNull(cmd.getOptionValue(THREAD_NUM_OPTION))
+                            ? Integer.valueOf(cmd.getOptionValue(THREAD_NUM_OPTION))
+                            : DEFAULT_THREAD_NUMBER;
+            ExecutorService executor = Executors.newFixedThreadPool(numberOfThreads);
 
-      executeAllTasks(executor, log);
+            filterByEntityType(VersionInfoCassandraLoader.list(),
+                    VendorSoftwareProductConstants.VENDOR_SOFTWARE_PRODUCT_VERSIONABLE_TYPE)
+                    .forEach(this::addTaskToTasks);
 
-      writeToLog("----finished healing------", log);
-      Instant endTime = Instant.now();
-      writeToLog("Total runtime was: " + Duration.between(startTime, endTime), log);
-    } catch (IOException e) {
-      throw new HealingRuntimeException("can't initial healing log file '" + logFileName + "'", e);
+            executeAllTasks(executor, log);
+
+            writeToLog("----finished healing------", log);
+            Instant endTime = Instant.now();
+            writeToLog("Total runtime was: " + Duration.between(startTime, endTime), log);
+        } catch (IOException e) {
+            throw new HealingRuntimeException("can't initial healing log file '" + logFileName + "'", e);
+        }
+        return true;
     }
 
-    System.exit(1);
-  }
+    @Override
+    public CommandName getCommandName() {
+        return CommandName.HEAL_ALL;
+    }
 
-  private static void executeAllTasks(ExecutorService executor, BufferedWriter log) {
-    List<Future<String>> futureTasks;
-    try {
-      futureTasks = executor.invokeAll(tasks);
-      futureTasks.forEach(future -> {
+    private static void executeAllTasks(ExecutorService executor, BufferedWriter log) {
+        List<Future<String>> futureTasks;
         try {
-          log.write(future.get());
-          log.newLine();
-        } catch (Exception e) {
-          writeToLog(e.getMessage(), log);
+            futureTasks = executor.invokeAll(tasks);
+            futureTasks.forEach(future -> {
+                try {
+                    log.write(future.get());
+                    log.newLine();
+                } catch (Exception e) {
+                    writeToLog(e.getMessage(), log);
+                }
+            });
+        } catch (InterruptedException e) {
+            Thread.currentThread().interrupt();
+            writeToLog("migration tasks failed with message: " + e.getMessage(), log);
+            throw new HealingRuntimeException(e);
         }
-      });
-    } catch (InterruptedException e) {
-      Thread.currentThread().interrupt();
-      writeToLog("migration tasks failed with message: " + e.getMessage(), log);
-      throw new HealingRuntimeException(e);
-    }
 
-    boolean isThreadOpen = true;
-    while (isThreadOpen) {
-      isThreadOpen = futureTasks.stream().anyMatch(future -> !future.isDone());
+        boolean isThreadOpen = true;
+        while (isThreadOpen) {
+            isThreadOpen = futureTasks.stream().anyMatch(future -> !future.isDone());
+        }
     }
-  }
 
 
-  private static Version resolveVersion(VersionInfoEntity versionInfoEntity) {
-    if (Objects.nonNull(versionInfoEntity.getCandidate())) {
-      return versionInfoEntity.getCandidate().getVersion();
-    } else if (!CollectionUtils.isEmpty(versionInfoEntity.getViewableVersions())) {
+    private static Version resolveVersion(VersionInfoEntity versionInfoEntity) {
+        if (Objects.nonNull(versionInfoEntity.getCandidate())) {
+            return versionInfoEntity.getCandidate().getVersion();
+        } else if (!CollectionUtils.isEmpty(versionInfoEntity.getViewableVersions())) {
 
-      return versionInfoEntity.getViewableVersions().stream().max(Version::compareTo)
-          .orElse(new Version());
+            return versionInfoEntity.getViewableVersions().stream().max(Version::compareTo).orElse(new Version());
+        }
+        return versionInfoEntity.getActiveVersion();
     }
-    return versionInfoEntity.getActiveVersion();
-  }
-
-  private static void writeToLog(String message, BufferedWriter log) {
-    try {
-      log.write(message);
-      log.newLine();
-    } catch (IOException e) {
-      throw new HealingRuntimeException("unable to write to healing all log file.", e);
+
+    private static void writeToLog(String message, BufferedWriter log) {
+        try {
+            log.write(message);
+            log.newLine();
+        } catch (IOException e) {
+            throw new HealingRuntimeException("unable to write to healing all log file.", e);
+        }
+    }
+
+    private static Stream<VersionInfoEntity> filterByEntityType(Collection<VersionInfoEntity> versionInfoEntities,
+            String entityType) {
+        return versionInfoEntities.stream()
+                                  .filter(versionInfoEntity -> versionInfoEntity.getEntityType().equals(entityType));
+    }
+
+    private void addTaskToTasks(VersionInfoEntity versionInfoEntity) {
+        tasks.add(new ItemHealingTask(versionInfoEntity.getEntityId(), resolveVersion(versionInfoEntity).toString(),
+                vspManager, healingManager));
     }
-  }
-
-  private static Stream<VersionInfoEntity> filterByEntityType(
-      Collection<VersionInfoEntity> versionInfoEntities, String entityType) {
-    return versionInfoEntities.stream().filter(versionInfoEntity -> versionInfoEntity
-        .getEntityType().equals(entityType));
-  }
-
-  private static void addTaskToTasks(VersionInfoEntity versionInfoEntity) {
-    tasks.add(new ItemHealingTask(versionInfoEntity.getEntityId(), resolveVersion
-        (versionInfoEntity).toString(),
-        vspManager, healingManager));
-  }
 
 }
index fb415c5..ad280e1 100644 (file)
 
 package org.openecomp.core.tools.commands;
 
+import static org.openecomp.core.tools.commands.CommandName.POPULATE_USER_PERMISSIONS;
+
+import java.util.Collections;
+import java.util.List;
 import org.openecomp.core.tools.store.PermissionHandler;
 import org.openecomp.sdc.itempermissions.type.ItemPermissionsEntity;
 
-import java.util.*;
-
-
-public class PopulateUserPermissions {
 
-    private static PermissionHandler permissionHandler = new PermissionHandler();
-
-    private PopulateUserPermissions(){ }
-
-    public static void execute() {
+public class PopulateUserPermissions extends Command {
 
+    @Override
+    public boolean execute(String[] args) {
+        PermissionHandler permissionHandler = new PermissionHandler();
         List<ItemPermissionsEntity> permissions = permissionHandler.getAll();
 
         permissions.forEach(itemPermissionsEntity -> {
             if (!itemPermissionsEntity.getUserId().isEmpty() && !itemPermissionsEntity.getPermission().isEmpty()) {
-            permissionHandler.addItem
-                    (Collections.singleton(itemPermissionsEntity.getItemId()),
-                            itemPermissionsEntity.getUserId(),itemPermissionsEntity.getPermission());
+                permissionHandler.addItem(Collections.singleton(itemPermissionsEntity.getItemId()),
+                        itemPermissionsEntity.getUserId(), itemPermissionsEntity.getPermission());
             }
         });
 
-        System.exit(0);
+        return true;
+    }
 
+    @Override
+    public CommandName getCommandName() {
+        return POPULATE_USER_PERMISSIONS;
     }
 }
index fc20b66..c8aee89 100644 (file)
@@ -1,33 +1,48 @@
 package org.openecomp.core.tools.commands;
 
+import static org.openecomp.core.tools.commands.CommandName.RESET_OLD_VERSION;
+
 import com.datastax.driver.core.ResultSet;
+import java.util.ArrayList;
+import org.apache.commons.cli.CommandLine;
+import org.apache.commons.cli.Option;
 import org.openecomp.core.tools.store.HealingHandler;
 import org.openecomp.core.tools.store.VersionCassandraLoader;
 import org.openecomp.core.tools.store.zusammen.datatypes.HealingEntity;
 
-import java.util.ArrayList;
-
 
 /**
  * Created by ayalaben on 10/15/2017
  */
-public class SetHealingFlag {
+public class SetHealingFlag extends Command {
+
+    private static final String VERSION_OPTION = "v";
 
+    SetHealingFlag() {
+        options.addOption(Option.builder(VERSION_OPTION).hasArg().argName("version").desc("release version").build());
+    }
 
-  private SetHealingFlag(){}
+    @Override
+    public boolean execute(String[] args) {
+        CommandLine cmd = parseArgs(args);
+        String oldVersion = cmd.hasOption(VERSION_OPTION) ? cmd.getOptionValue(VERSION_OPTION) : null;
 
-  public static void populateHealingTable(String oldVersion) {
+        VersionCassandraLoader versionCassandraLoader = new VersionCassandraLoader();
+        ResultSet listItemVersion = versionCassandraLoader.listItemVersion();
 
-    VersionCassandraLoader versionCassandraLoader = new VersionCassandraLoader();
-    ResultSet listItemVersion = versionCassandraLoader.listItemVersion();
+        ArrayList<HealingEntity> healingEntities = new ArrayList<>();
 
-    ArrayList<HealingEntity> healingEntities = new ArrayList<>();
+        listItemVersion.iterator().forEachRemaining(entry -> healingEntities.add(new HealingEntity(entry.getString(0),
+                entry.getString(1), entry.getString(2), true, oldVersion)));
 
-    listItemVersion.iterator().forEachRemaining(entry -> healingEntities.add(new HealingEntity
-        (entry.getString(0),entry.getString(1),entry.getString(2),true,oldVersion)));
+        HealingHandler healingHandler = new HealingHandler();
+        healingHandler.populateHealingTable(healingEntities);
 
-    HealingHandler healingHandler = new HealingHandler();
-    healingHandler.populateHealingTable(healingEntities);
+        return true;
+    }
 
-  }
+    @Override
+    public CommandName getCommandName() {
+        return RESET_OLD_VERSION;
+    }
 }
index decd0ce..64511cd 100644 (file)
@@ -1,24 +1,18 @@
 /**
  * Copyright © 2016-2017 European Support Limited.
  */
+
 package org.openecomp.core.tools.exportinfo;
 
+import static java.nio.file.Files.createDirectories;
+import static org.openecomp.core.tools.commands.CommandName.EXPORT;
+
 import com.datastax.driver.core.ResultSet;
 import com.datastax.driver.core.ResultSetFuture;
 import com.datastax.driver.core.Session;
 import com.google.common.collect.Sets;
 import com.google.common.util.concurrent.FutureCallback;
 import com.google.common.util.concurrent.Futures;
-import org.apache.commons.io.FileUtils;
-import org.openecomp.core.nosqldb.impl.cassandra.CassandraSessionFactory;
-import org.openecomp.core.tools.importinfo.ImportProperties;
-import org.openecomp.core.tools.util.Utils;
-import org.openecomp.core.tools.util.ZipUtils;
-import org.openecomp.core.zusammen.impl.CassandraConnectionInitializer;
-import org.openecomp.sdc.logging.api.Logger;
-import org.openecomp.sdc.logging.api.LoggerFactory;
-import org.yaml.snakeyaml.Yaml;
-
 import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
@@ -35,31 +29,55 @@ import java.util.concurrent.Executor;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 import java.util.stream.Collectors;
+import org.apache.commons.cli.CommandLine;
+import org.apache.commons.cli.Option;
+import org.apache.commons.io.FileUtils;
+import org.openecomp.core.nosqldb.impl.cassandra.CassandraSessionFactory;
+import org.openecomp.core.tools.commands.Command;
+import org.openecomp.core.tools.commands.CommandName;
+import org.openecomp.core.tools.importinfo.ImportProperties;
+import org.openecomp.core.tools.util.Utils;
+import org.openecomp.core.tools.util.ZipUtils;
+import org.openecomp.core.zusammen.impl.CassandraConnectionInitializer;
+import org.openecomp.sdc.logging.api.Logger;
+import org.openecomp.sdc.logging.api.LoggerFactory;
+import org.yaml.snakeyaml.Yaml;
 
-import static java.nio.file.Files.createDirectories;
 
+public final class ExportDataCommand extends Command {
 
-public final class ExportDataCommand {
-    private static final Logger logger = LoggerFactory.getLogger(ExportDataCommand.class);
-    public static final String JOIN_DELIMITER = "$#";
+    private static final Logger LOGGER = LoggerFactory.getLogger(ExportDataCommand.class);
+    private static final String ITEM_ID_OPTION = "i";
+    static final String JOIN_DELIMITER = "$#";
     public static final String JOIN_DELIMITER_SPLITTER = "\\$\\#";
-    public static final String MAP_DELIMITER = "!@";
+    static final String MAP_DELIMITER = "!@";
     public static final String MAP_DELIMITER_SPLITTER = "\\!\\@";
-    public static final int THREAD_POOL_SIZE = 6;
+    private static final int THREAD_POOL_SIZE = 6;
     public static final String NULL_REPRESENTATION = "nnuullll";
 
-    private ExportDataCommand() {
+    public ExportDataCommand() {
+        options.addOption(
+                Option.builder(ITEM_ID_OPTION).hasArg().argName("item id").desc("id of item to export, mandatory").build());
     }
 
-    public static void exportData(String filterItem) {
+    @Override
+    public boolean execute(String[] args) {
+        CommandLine cmd = parseArgs(args);
+
+        if (!cmd.hasOption(ITEM_ID_OPTION) || cmd.getOptionValue(ITEM_ID_OPTION) == null) {
+            LOGGER.error("Argument i is mandatory");
+            return false;
+        }
+
         ExecutorService executor = null;
         try {
             CassandraConnectionInitializer.setCassandraConnectionPropertiesToSystem();
             Path rootDir = Paths.get(ImportProperties.ROOT_DIRECTORY);
             initDir(rootDir);
             try (Session session = CassandraSessionFactory.getSession()) {
-                final Set<String> filteredItems = Sets.newHashSet(filterItem);
-                Set<String> fis = filteredItems.stream().map(fi -> fi.replaceAll("\\r", "")).collect(Collectors.toSet());
+                final Set<String> filteredItems = Sets.newHashSet(cmd.getOptionValue(ITEM_ID_OPTION));
+                Set<String> fis =
+                        filteredItems.stream().map(fi -> fi.replaceAll("\\r", "")).collect(Collectors.toSet());
                 Map<String, List<String>> queries;
                 Yaml yaml = new Yaml();
                 try (InputStream is = ExportDataCommand.class.getResourceAsStream("/queries.yaml")) {
@@ -86,35 +104,39 @@ public final class ExportDataCommand {
             zipPath(rootDir);
             FileUtils.forceDelete(rootDir.toFile());
         } catch (Exception ex) {
-            Utils.logError(logger, ex);
+            Utils.logError(LOGGER, ex);
         } finally {
             if (executor != null) {
                 executor.shutdown();
             }
         }
-
+        return true;
     }
 
+    @Override
+    public CommandName getCommandName() {
+        return EXPORT;
+    }
 
-    private static void executeQuery(final Session session, final String query, final Set<String> filteredItems, final String filteredColumn,
-                                        final Set<String> vlms, final CountDownLatch donequerying, Executor executor) {
+    private static void executeQuery(final Session session, final String query, final Set<String> filteredItems,
+            final String filteredColumn, final Set<String> vlms, final CountDownLatch donequerying, Executor executor) {
         ResultSetFuture resultSetFuture = session.executeAsync(query);
         Futures.addCallback(resultSetFuture, new FutureCallback<ResultSet>() {
             @Override
             public void onSuccess(ResultSet resultSet) {
                 try {
-                    Utils.printMessage(logger, "Start to serialize " + query);
+                    Utils.printMessage(LOGGER, "Start to serialize " + query);
                     new ExportSerializer().serializeResult(resultSet, filteredItems, filteredColumn, vlms);
                     donequerying.countDown();
-                } catch (Exception e){
-                    Utils.logError(logger, "Serialization failed :" + query, e);
+                } catch (Exception e) {
+                    Utils.logError(LOGGER, "Serialization failed :" + query, e);
                     System.exit(-1);
                 }
             }
 
             @Override
             public void onFailure(Throwable t) {
-                Utils.logError(logger, "Query failed :" + query, t);
+                Utils.logError(LOGGER, "Query failed :" + query, t);
                 System.exit(-1);
             }
         }, executor);
@@ -127,7 +149,7 @@ public final class ExportDataCommand {
         dateStr = dateStr.replaceAll(":", "_");
         String zipFile = System.getProperty("user.home") + File.separatorChar + "onboarding_import" + dateStr + ".zip";
         ZipUtils.createZip(zipFile, rootDir);
-        Utils.printMessage(logger, "Exported file :" + zipFile);
+        Utils.printMessage(LOGGER, "Exported file :" + zipFile);
     }
 
 
index 17b7d64..6f18bca 100644 (file)
@@ -1,7 +1,18 @@
 package org.openecomp.core.tools.importinfo;
 
 
+import static org.openecomp.core.tools.commands.CommandName.IMPORT;
+
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.stream.Stream;
+import org.apache.commons.cli.CommandLine;
+import org.apache.commons.cli.Option;
 import org.apache.commons.io.FileUtils;
+import org.openecomp.core.tools.commands.Command;
+import org.openecomp.core.tools.commands.CommandName;
 import org.openecomp.core.tools.exportinfo.ExportDataCommand;
 import org.openecomp.core.tools.util.Utils;
 import org.openecomp.core.tools.util.ZipUtils;
@@ -9,28 +20,40 @@ import org.openecomp.core.zusammen.impl.CassandraConnectionInitializer;
 import org.openecomp.sdc.logging.api.Logger;
 import org.openecomp.sdc.logging.api.LoggerFactory;
 
-import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.util.stream.Stream;
+public class ImportDataCommand extends Command {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(ImportDataCommand.class);
+    private static final String FILE_OPTION = "f";
 
-public class ImportDataCommand {
+    public ImportDataCommand() {
+        options.addOption(Option.builder(FILE_OPTION).hasArg().argName("file").desc("export file (zip), mandatory").build());
+    }
 
-    private static final Logger logger = LoggerFactory.getLogger(ImportDataCommand.class);
+    @Override
+    public boolean execute(String[] args) {
+        CommandLine cmd = parseArgs(args);
 
-    public static void execute(String uploadFile) {
+        if (!cmd.hasOption(FILE_OPTION) || cmd.getOptionValue(FILE_OPTION) == null) {
+            LOGGER.error("Argument f is mandatory");
+            return false;
+        }
         try {
             CassandraConnectionInitializer.setCassandraConnectionPropertiesToSystem();
             Path outputFolder = Paths.get(ImportProperties.ROOT_DIRECTORY);
             ExportDataCommand.initDir(outputFolder); //clear old imports.
-            ZipUtils.unzip(Paths.get(uploadFile), outputFolder);
-            tryStream<Path> files = Files.list(outputFolder)) {
+            ZipUtils.unzip(Paths.get(cmd.getOptionValue(FILE_OPTION)), outputFolder);
+            try (Stream<Path> files = Files.list(outputFolder)) {
                 files.forEach(new ImportSingleTable()::importFile);
             }
             FileUtils.forceDelete(outputFolder.toFile()); // leaves directory clean
         } catch (IOException e) {
-            Utils.logError(logger, e);
+            Utils.logError(LOGGER, e);
         }
+        return true;
+    }
+
+    @Override
+    public CommandName getCommandName() {
+        return IMPORT;
     }
 }
index 1080a23..d9c46e1 100644 (file)
 package org.openecomp.core.tools.main;
 
-import org.openecomp.core.tools.commands.AddContributorCommand;
-import org.openecomp.core.tools.commands.HealAll;
-import org.openecomp.core.tools.commands.PopulateUserPermissions;
-import org.openecomp.core.tools.commands.SetHealingFlag;
-import org.openecomp.core.tools.exportinfo.ExportDataCommand;
-import org.openecomp.core.tools.importinfo.ImportDataCommand;
-import org.openecomp.core.tools.util.ToolsUtil;
-import org.openecomp.sdc.common.session.SessionContextProviderFactory;
-import org.openecomp.sdc.logging.api.Logger;
-import org.openecomp.sdc.logging.api.LoggerFactory;
+import static org.openecomp.core.tools.util.Utils.printMessage;
 
 import java.time.Duration;
 import java.time.Instant;
-
-import static org.openecomp.core.tools.util.Utils.printMessage;
+import java.util.Optional;
+import org.openecomp.core.tools.commands.Command;
+import org.openecomp.core.tools.commands.CommandsHolder;
+import org.openecomp.sdc.common.session.SessionContextProviderFactory;
+import org.openecomp.sdc.logging.api.Logger;
+import org.openecomp.sdc.logging.api.LoggerFactory;
 
 public class ZusammenMainTool {
 
-  private static final String GLOBAL_USER = "GLOBAL_USER";
-  private static Logger logger = LoggerFactory.getLogger(ZusammenMainTool.class);
-  private static int status = 0;
+    private static final Logger LOGGER = LoggerFactory.getLogger(ZusammenMainTool.class);
 
-  public static void main(String[] args) {
+    public static void main(String[] args) {
+        Command command = getCommandToRun(args);
 
-    COMMANDS command = getCommand(args);
+        Instant startTime = Instant.now();
+        SessionContextProviderFactory.getInstance().createInterface().create("GLOBAL_USER", "dox");
+        if (!command.execute(args)) {
+            command.printUsage();
+            System.exit(-1);
+        }
+        Instant stopTime = Instant.now();
 
-    if (command == null) {
-      printMessage(logger,
-          "parameter -c is mandatory. script usage: zusammenMainTool.sh -c {command name} " +
-              "[additional arguments depending on the command] ");
-      printMessage(logger,
-          "reset old version: -c RESET_OLD_VERSION [-v {version}]");
-      printMessage(logger,
-          "export: -c EXPORT [-i {item id}]");
-      printMessage(logger,
-          "import: -c IMPORT -f {zip file full path}");
-      printMessage(logger,
-          "heal all: -c HEAL_ALL [-t {number of threads}]");
-      printMessage(logger,
-          "add users as contributors: -c ADD_CONTRIBUTOR [-p {item id list file path}] -u {user " +
-              "list file path}");
-      System.exit(-1);
+        printDuration(command, startTime, stopTime);
+        System.exit(0);
     }
-    Instant startTime = Instant.now();
-
-    SessionContextProviderFactory.getInstance().createInterface().create(GLOBAL_USER, "dox");
-
-    switch (command) {
-      case RESET_OLD_VERSION:
-        SetHealingFlag.populateHealingTable(ToolsUtil.getParam("v", args));
-        break;
-      case EXPORT:
-        ExportDataCommand.exportData(ToolsUtil.getParam("i", args));
-        break;
-      case IMPORT:
-        ImportDataCommand.execute(ToolsUtil.getParam("f", args));
-        break;
-      case HEAL_ALL:
-        HealAll.healAll(ToolsUtil.getParam("t", args));
-        break;
-      case POPULATE_USER_PERMISSIONS:
-        PopulateUserPermissions.execute();
-        break;
-      case ADD_CONTRIBUTOR:
-        AddContributorCommand.add(ToolsUtil.getParam("p", args), ToolsUtil.getParam("u", args));
 
+    private static Command getCommandToRun(String[] args) {
+        Optional<Command> command = CommandsHolder.getCommand(args);
+        if (!command.isPresent()) {
+            LOGGER.error("Illegal execution.");
+            CommandsHolder.printUsages();
+            System.exit(-1);
+        }
+        return command.get();
     }
 
-    Instant stopTime = Instant.now();
-    Duration duration = Duration.between(startTime, stopTime);
-    long minutesPart = duration.toMinutes();
-    long secondsPart = duration.minusMinutes(minutesPart).getSeconds();
-
+    private static void printDuration(Command command, Instant startTime, Instant stopTime) {
+        Duration duration = Duration.between(startTime, stopTime);
+        long minutesPart = duration.toMinutes();
+        long secondsPart = duration.minusMinutes(minutesPart).getSeconds();
 
-    printMessage(logger,
-        "Zusammen tools command:[] finished . Total run time was : " + minutesPart + ":" +
-            secondsPart
-            + " minutes");
-    System.exit(status);
-
-  }
-
-  private static COMMANDS getCommand(String[] args) {
-    String commandSrt = ToolsUtil.getParam("c", args);
-    try {
-      return COMMANDS.valueOf(commandSrt);
-    } catch (IllegalArgumentException iae) {
-      printMessage(logger, "message:" + commandSrt + " is illegal.");
+        printMessage(LOGGER, String.format("Zusammen tools command %s finished. Total run time was %s:%s minutes.",
+                command.getCommandName(), minutesPart, secondsPart));
     }
-    return null;
-  }
-
-  private enum COMMANDS {
-    RESET_OLD_VERSION,
-    EXPORT,
-    IMPORT,
-    HEAL_ALL,
-    POPULATE_USER_PERMISSIONS,
-    ADD_CONTRIBUTOR
-  }
 }