CLI profile support 79/11079/2
authorKanagaraj Manickam k00365106 <kanagaraj.manickam@huawei.com>
Mon, 11 Sep 2017 13:09:55 +0000 (18:39 +0530)
committerKanagaraj Manickam k00365106 <kanagaraj.manickam@huawei.com>
Mon, 11 Sep 2017 13:10:41 +0000 (18:40 +0530)
invoke CLI with --profile <name> to persist the
settings across the sessions.

CLI-5
Change-Id: I214334dab11fecdb730c780976d5d9bb2c14509d
Signed-off-by: Kanagaraj Manickam k00365106 <kanagaraj.manickam@huawei.com>
framework/src/main/java/org/onap/cli/fw/OnapCommandRegistrar.java
framework/src/main/java/org/onap/cli/fw/conf/Constants.java
framework/src/main/java/org/onap/cli/fw/conf/OnapCommandConfg.java
framework/src/main/java/org/onap/cli/fw/input/cache/OnapCommandParameterCache.java
framework/src/main/java/org/onap/cli/fw/input/cache/Param.java [new file with mode: 0644]
framework/src/main/java/org/onap/cli/fw/utils/OnapCommandUtils.java
framework/src/main/resources/onap.properties
main/src/main/java/org/onap/cli/main/OnapCli.java
main/src/main/java/org/onap/cli/main/conf/OnapCliConstants.java

index 01d4742..4e89215 100644 (file)
@@ -60,7 +60,7 @@ public class OnapCommandRegistrar {
 
     private boolean isDevMode = Boolean.getBoolean(System.getenv(Constants.CLI_DEV_MODE));
 
-    private OnapCommandParameterCache paramCache = new OnapCommandParameterCache();
+    private OnapCommandParameterCache paramCache = OnapCommandParameterCache.getInstance();
 
     public boolean isInteractiveMode() {
         return isInteractiveMode;
@@ -90,6 +90,9 @@ public class OnapCommandRegistrar {
         this.isDevMode = isDevMode;
     }
 
+    public void setProfile(String profileName) {
+        this.paramCache.setProfile(profileName);
+    }
 
     private static OnapCommandRegistrar registrar = null;
 
index d7e277c..00bdb85 100644 (file)
@@ -147,9 +147,9 @@ public class Constants {
     public static final String EXTERNAL_YAML_PATTERN = "/**/*.yaml";
     public static final String EXTERNAL_JSON_PATTERN = "/**/*.json";
     public static final String EXTERNAL_SCHEMA_PATH_PATERN = EXTERNAL_SCHEMA_DIRECTORY + EXTERNAL_YAML_PATTERN;
-    public static final String EXTERNAL_DISCOVERY_DIRECTORY = "data";
+    public static final String DATA_DIRECTORY = "data";
     public static final String EXTERNAL_DISCOVERY_FILE = "cli-schema.json";
-    public static final String EXTERNAL_DISCOVERY_DIRECTORY_PATTERN = EXTERNAL_DISCOVERY_DIRECTORY
+    public static final String DATA_DIRECTORY_JSON_PATTERN = DATA_DIRECTORY
             + EXTERNAL_JSON_PATTERN;
 
     public static final String PARAMETER_TYPE_JSON = "json";
@@ -194,7 +194,7 @@ public class Constants {
     public static final String HTTP_SAMPLE_RESPONSE_FAILED_PARSING = "The http Sample response json is failed to parse.";
     public static final String USE_DIRECTIVE = "use";
 
-    public static final String PARAM_CACHE_FILE_NAME = "cli.parameter.cache.file";
+    public static final String PARAM_CACHE_FILE_NAME = "global-profile";
 
     public static final String CLI_DEV_MODE = "CLI_DEV";
 
index 35461a0..b706ea6 100644 (file)
@@ -161,7 +161,4 @@ public final class OnapCommandConfg {
         return Arrays.stream(prps.getProperty(key).split(",")).map(String::trim).collect(Collectors.toList());  // NOSONAR
     }
 
-    public static String getParamCacheFileName() {
-        return prps.getProperty(Constants.PARAM_CACHE_FILE_NAME);
-    }
 }
index 5c8bdf6..6ce0917 100644 (file)
 
 package org.onap.cli.fw.input.cache;
 
+import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
+import org.onap.cli.fw.conf.Constants;
+import org.onap.cli.fw.utils.OnapCommandUtils;
+
 public class OnapCommandParameterCache {
 
     public Map<String, Map<String, String>> paramCache = new HashMap<>();
 
+    private static OnapCommandParameterCache single = null;
+
+    private String profileName = Constants.PARAM_CACHE_FILE_NAME;
+
+    private OnapCommandParameterCache() {
+
+    }
+
+    public static OnapCommandParameterCache getInstance() {
+        if (single == null) {
+            single = new OnapCommandParameterCache();
+        }
+
+        single.load();
+        return single;
+    }
+
+
     public void add(String productVersion, String paramName, String paramValue) {
 
         if (!paramCache.containsKey(productVersion)) {
@@ -30,6 +53,8 @@ public class OnapCommandParameterCache {
         }
 
         paramCache.get(productVersion).put(paramName, paramValue);
+
+        this.persist();
     }
 
     public void remove(String productVersion, String paramName) {
@@ -38,6 +63,8 @@ public class OnapCommandParameterCache {
                 paramCache.get(productVersion).remove(paramName);
             }
         }
+
+        this.persist();
     }
 
     public Map<String, String> getParams(String productVersion) {
@@ -48,11 +75,33 @@ public class OnapCommandParameterCache {
         }
     }
 
-    public void persist() {
-        // mrkana add persistence logic
+    private void persist() {
+        List<Param> params = new ArrayList<>();
+        for (String p: this.paramCache.keySet()) {
+            for (String name: this.paramCache.get(p).keySet()) {
+
+                Param param = new Param();
+                param.setProduct(p);
+                param.setName(name);
+                param.setValue(this.paramCache.get(p).get(name));
+
+                params.add(param);
+             }
+        }
+
+        OnapCommandUtils.persistParams(params, this.profileName);
+    }
+
+    private void load() {
+        List<Param> params = OnapCommandUtils.loadParamFromCache(this.profileName);
+
+        for (Param p : params) {
+            this.add(p.getProduct(), p.getName(), p.getValue());
+        }
     }
 
-    public void load() {
-        // mrkanag add loading cache from persistence
+    public void setProfile(String profileName) {
+        this.profileName = profileName;
+        this.load();
     }
 }
diff --git a/framework/src/main/java/org/onap/cli/fw/input/cache/Param.java b/framework/src/main/java/org/onap/cli/fw/input/cache/Param.java
new file mode 100644 (file)
index 0000000..5a32e88
--- /dev/null
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2017 Huawei Technologies Co., Ltd.
+ *
+ * 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 org.onap.cli.fw.input.cache;
+
+public class Param {
+
+    private String product;
+
+    private String name;
+
+    private String value;
+
+    public String getProduct() {
+        return product;
+    }
+    public void setProduct(String product) {
+        this.product = product;
+    }
+    public String getName() {
+        return name;
+    }
+    public void setName(String name) {
+        this.name = name;
+    }
+    public String getValue() {
+        return value;
+    }
+    public void setValue(String value) {
+        this.value = value;
+    }
+}
index d850199..f4fb751 100644 (file)
 
 package org.onap.cli.fw.utils;
 
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.jayway.jsonpath.JsonPath;
-import net.minidev.json.JSONArray;
-import net.minidev.json.JSONObject;
-import org.onap.cli.fw.OnapCommand;
-import org.onap.cli.fw.OnapCommandRegistrar;
-import org.onap.cli.fw.ad.OnapCredentials;
-import org.onap.cli.fw.ad.OnapService;
-import org.onap.cli.fw.cmd.OnapHttpCommand;
-import org.onap.cli.fw.cmd.OnapSwaggerCommand;
-import org.onap.cli.fw.conf.Constants;
-import org.onap.cli.fw.conf.OnapCommandConfg;
-import org.onap.cli.fw.error.OnapCommandDiscoveryFailed;
-import org.onap.cli.fw.error.OnapCommandException;
-import org.onap.cli.fw.error.OnapCommandHelpFailed;
-import org.onap.cli.fw.error.OnapCommandHttpHeaderNotFound;
-import org.onap.cli.fw.error.OnapCommandHttpInvalidResponseBody;
-import org.onap.cli.fw.error.OnapCommandHttpInvalidResultMap;
-import org.onap.cli.fw.error.OnapCommandInvalidDefaultParameter;
-import org.onap.cli.fw.error.OnapCommandInvalidParameterType;
-import org.onap.cli.fw.error.OnapCommandInvalidParameterValue;
-import org.onap.cli.fw.error.OnapCommandInvalidPrintDirection;
-import org.onap.cli.fw.error.OnapCommandInvalidResultAttributeScope;
-import org.onap.cli.fw.error.OnapCommandInvalidSchema;
-import org.onap.cli.fw.error.OnapCommandInvalidSchemaVersion;
-import org.onap.cli.fw.error.OnapCommandParameterNameConflict;
-import org.onap.cli.fw.error.OnapCommandParameterNotFound;
-import org.onap.cli.fw.error.OnapCommandParameterOptionConflict;
-import org.onap.cli.fw.error.OnapCommandResultEmpty;
-import org.onap.cli.fw.error.OnapCommandResultMapProcessingFailed;
-import org.onap.cli.fw.error.OnapCommandSchemaNotFound;
-import org.onap.cli.fw.http.HttpInput;
-import org.onap.cli.fw.http.HttpResult;
-import org.onap.cli.fw.input.OnapCommandParameter;
-import org.onap.cli.fw.input.ParameterType;
-import org.onap.cli.fw.output.OnapCommandResult;
-import org.onap.cli.fw.output.OnapCommandResultAttribute;
-import org.onap.cli.fw.output.OnapCommandResultAttributeScope;
-import org.onap.cli.fw.output.PrintDirection;
-import org.onap.cli.fw.output.ResultType;
-import org.onap.cli.fw.run.OnapCommandExecutor;
-import org.springframework.core.io.Resource;
-import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
-import org.springframework.core.io.support.ResourcePatternResolver;
-import org.yaml.snakeyaml.Yaml;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.ServiceLoader;
-import java.util.Set;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
-
 import static org.onap.cli.fw.conf.Constants.API;
 import static org.onap.cli.fw.conf.Constants.ATTRIBUTES;
 import static org.onap.cli.fw.conf.Constants.AUTH;
@@ -100,8 +36,8 @@ import static org.onap.cli.fw.conf.Constants.DIRECTION;
 import static org.onap.cli.fw.conf.Constants.ENTITY;
 import static org.onap.cli.fw.conf.Constants.EXCEPTION;
 import static org.onap.cli.fw.conf.Constants.EXECUTOR;
-import static org.onap.cli.fw.conf.Constants.EXTERNAL_DISCOVERY_DIRECTORY;
-import static org.onap.cli.fw.conf.Constants.EXTERNAL_DISCOVERY_DIRECTORY_PATTERN;
+import static org.onap.cli.fw.conf.Constants.DATA_DIRECTORY;
+import static org.onap.cli.fw.conf.Constants.DATA_DIRECTORY_JSON_PATTERN;
 import static org.onap.cli.fw.conf.Constants.EXTERNAL_DISCOVERY_FILE;
 import static org.onap.cli.fw.conf.Constants.EXTERNAL_SCHEMA_DIRECTORY;
 import static org.onap.cli.fw.conf.Constants.EXTERNAL_SCHEMA_PATH_PATERN;
@@ -120,15 +56,15 @@ import static org.onap.cli.fw.conf.Constants.INPUT_PARAMS_MANDATORY_LIST;
 import static org.onap.cli.fw.conf.Constants.IS_OPTIONAL;
 import static org.onap.cli.fw.conf.Constants.IS_SECURED;
 import static org.onap.cli.fw.conf.Constants.LONG_OPTION;
-import static org.onap.cli.fw.conf.Constants.METHOD_TYPE;
 import static org.onap.cli.fw.conf.Constants.METHOD;
+import static org.onap.cli.fw.conf.Constants.METHOD_TYPE;
 import static org.onap.cli.fw.conf.Constants.MODE;
 import static org.onap.cli.fw.conf.Constants.MODE_VALUES;
+import static org.onap.cli.fw.conf.Constants.MULTIPART_ENTITY_NAME;
 import static org.onap.cli.fw.conf.Constants.NAME;
 import static org.onap.cli.fw.conf.Constants.ONAP_CMD_SCHEMA_VERSION;
 import static org.onap.cli.fw.conf.Constants.PARAMETERS;
 import static org.onap.cli.fw.conf.Constants.QUERIES;
-import static org.onap.cli.fw.conf.Constants.MULTIPART_ENTITY_NAME;
 import static org.onap.cli.fw.conf.Constants.REQUEST;
 import static org.onap.cli.fw.conf.Constants.RESULTS;
 import static org.onap.cli.fw.conf.Constants.RESULT_MAP;
@@ -150,6 +86,73 @@ import static org.onap.cli.fw.conf.Constants.TYPE;
 import static org.onap.cli.fw.conf.Constants.URI;
 import static org.onap.cli.fw.conf.Constants.VERSION;
 
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.ServiceLoader;
+import java.util.Set;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import org.onap.cli.fw.OnapCommand;
+import org.onap.cli.fw.OnapCommandRegistrar;
+import org.onap.cli.fw.ad.OnapCredentials;
+import org.onap.cli.fw.ad.OnapService;
+import org.onap.cli.fw.cmd.OnapHttpCommand;
+import org.onap.cli.fw.cmd.OnapSwaggerCommand;
+import org.onap.cli.fw.conf.Constants;
+import org.onap.cli.fw.conf.OnapCommandConfg;
+import org.onap.cli.fw.error.OnapCommandDiscoveryFailed;
+import org.onap.cli.fw.error.OnapCommandException;
+import org.onap.cli.fw.error.OnapCommandHelpFailed;
+import org.onap.cli.fw.error.OnapCommandHttpHeaderNotFound;
+import org.onap.cli.fw.error.OnapCommandHttpInvalidResponseBody;
+import org.onap.cli.fw.error.OnapCommandHttpInvalidResultMap;
+import org.onap.cli.fw.error.OnapCommandInvalidDefaultParameter;
+import org.onap.cli.fw.error.OnapCommandInvalidParameterType;
+import org.onap.cli.fw.error.OnapCommandInvalidParameterValue;
+import org.onap.cli.fw.error.OnapCommandInvalidPrintDirection;
+import org.onap.cli.fw.error.OnapCommandInvalidResultAttributeScope;
+import org.onap.cli.fw.error.OnapCommandInvalidSchema;
+import org.onap.cli.fw.error.OnapCommandInvalidSchemaVersion;
+import org.onap.cli.fw.error.OnapCommandParameterNameConflict;
+import org.onap.cli.fw.error.OnapCommandParameterNotFound;
+import org.onap.cli.fw.error.OnapCommandParameterOptionConflict;
+import org.onap.cli.fw.error.OnapCommandResultEmpty;
+import org.onap.cli.fw.error.OnapCommandResultMapProcessingFailed;
+import org.onap.cli.fw.error.OnapCommandSchemaNotFound;
+import org.onap.cli.fw.http.HttpInput;
+import org.onap.cli.fw.http.HttpResult;
+import org.onap.cli.fw.input.OnapCommandParameter;
+import org.onap.cli.fw.input.ParameterType;
+import org.onap.cli.fw.input.cache.Param;
+import org.onap.cli.fw.output.OnapCommandResult;
+import org.onap.cli.fw.output.OnapCommandResultAttribute;
+import org.onap.cli.fw.output.OnapCommandResultAttributeScope;
+import org.onap.cli.fw.output.PrintDirection;
+import org.onap.cli.fw.output.ResultType;
+import org.onap.cli.fw.run.OnapCommandExecutor;
+import org.springframework.core.io.Resource;
+import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
+import org.springframework.core.io.support.ResourcePatternResolver;
+import org.yaml.snakeyaml.Yaml;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.jayway.jsonpath.JsonPath;
+
+import net.minidev.json.JSONArray;
+import net.minidev.json.JSONObject;
+
 /**
  * Provides helper method to parse Yaml files and produce required objects.
  *
@@ -1609,7 +1612,7 @@ public class OnapCommandUtils {
     public static void persist(List<ExternalSchema> schemas) throws OnapCommandDiscoveryFailed {
         if (schemas != null) {
             try {
-                Resource[] resources = getExternalResources(EXTERNAL_DISCOVERY_DIRECTORY);
+                Resource[] resources = getExternalResources(DATA_DIRECTORY);
                 if (resources != null && resources.length == 1) {
                     String path = resources[0].getURI().getPath();
                     File file = new File(path + File.separator + EXTERNAL_DISCOVERY_FILE);
@@ -1617,12 +1620,28 @@ public class OnapCommandUtils {
                     mapper.writerWithDefaultPrettyPrinter().writeValue(file, schemas);
                 }
             } catch (IOException e1) {
-                throw new OnapCommandDiscoveryFailed(EXTERNAL_DISCOVERY_DIRECTORY,
+                throw new OnapCommandDiscoveryFailed(DATA_DIRECTORY,
                         EXTERNAL_DISCOVERY_FILE, e1);
             }
         }
     }
 
+    public static void persistParams(List<Param> params, String profileName) {
+        if (params != null) {
+            try {
+                Resource[] resources = getExternalResources(DATA_DIRECTORY);
+                if (resources != null && resources.length == 1) {
+                    String path = resources[0].getURI().getPath();
+                    File file = new File(path + File.separator + profileName + ".json");
+                    ObjectMapper mapper = new ObjectMapper();
+                    mapper.writerWithDefaultPrettyPrinter().writeValue(file, params);
+                }
+            } catch (IOException e1) {
+                // Never occur  //  NOSONAR
+            }
+        }
+    }
+
     /**
      * Check if json file discovered or not.
      *
@@ -1634,12 +1653,12 @@ public class OnapCommandUtils {
         Resource resource = null;
         try {
             resource = getExternalResource(EXTERNAL_DISCOVERY_FILE,
-                    EXTERNAL_DISCOVERY_DIRECTORY_PATTERN);
+                    DATA_DIRECTORY_JSON_PATTERN);
             if (resource != null) {
                 return true;
             }
         } catch (IOException e) {
-            throw new OnapCommandDiscoveryFailed(EXTERNAL_DISCOVERY_DIRECTORY,
+            throw new OnapCommandDiscoveryFailed(DATA_DIRECTORY,
                     EXTERNAL_DISCOVERY_FILE, e);
         }
 
@@ -1665,7 +1684,7 @@ public class OnapCommandUtils {
         } else {
             try {
                 Resource resource = getExternalResource(EXTERNAL_DISCOVERY_FILE,
-                        EXTERNAL_DISCOVERY_DIRECTORY_PATTERN);
+                        DATA_DIRECTORY_JSON_PATTERN);
                 if (resource != null) {
                     File file = new File(resource.getURI().getPath());
                     ObjectMapper mapper = new ObjectMapper();
@@ -1673,7 +1692,7 @@ public class OnapCommandUtils {
                     schemas.addAll(Arrays.asList(list));
                 }
             } catch (IOException e) {
-                throw new OnapCommandDiscoveryFailed(EXTERNAL_DISCOVERY_DIRECTORY,
+                throw new OnapCommandDiscoveryFailed(DATA_DIRECTORY,
                         EXTERNAL_DISCOVERY_FILE, e);
             }
         }
@@ -1681,6 +1700,25 @@ public class OnapCommandUtils {
         return schemas;
     }
 
+    public static List<Param> loadParamFromCache(String profileName) {
+        List<Param> params = new ArrayList<>();
+
+        try {
+            Resource resource = getExternalResource(profileName + ".json",
+                    DATA_DIRECTORY_JSON_PATTERN);
+            if (resource != null) {
+                File file = new File(resource.getURI().getPath());
+                ObjectMapper mapper = new ObjectMapper();
+                Param[] list = mapper.readValue(file, Param[].class);
+                params.addAll(Arrays.asList(list));
+            }
+        } catch (IOException e) {
+            // Never occur  //  NOSONAR
+        }
+
+        return params;
+    }
+
     /**
      * Fetch a particular schema details.
      *
index 6df5682..fc4dcb7 100644 (file)
@@ -55,4 +55,3 @@ cli.schema.mode_values=direct,catalog
 #product version
 cli.product.version=cli-1.0
 
-cli.parameter.cache.file=param-cache.json
index f689830..71d9cf7 100644 (file)
@@ -118,6 +118,25 @@ public class OnapCli {
         }
     }
 
+
+    /**
+     * Handles profile. --profile or -c
+     */
+    public void handleProfile() {
+        try {
+            if ((args.size() == 2) && (this.getLongOption(OnapCliConstants.PARAM_PROFILE_LONG).equals(args.get(0))
+                        || this.getShortOption(OnapCliConstants.PARAM_PROFILE_SHORT).equals(args.get(0)))) {
+
+                OnapCommandRegistrar.getRegistrar().setProfile(args.get(1));
+                //Make space of interactive mode
+                this.args = new ArrayList<>();
+            }
+        } catch (Exception e) {
+            this.print(e);
+            this.exitFailure();
+        }
+    }
+
     private String getDirectiveHelp() throws OnapCommandHelpFailed {
         OnapCommandResult help = new OnapCommandResult();
         help.setType(ResultType.TABLE);
@@ -344,14 +363,18 @@ public class OnapCli {
             this.handleVersion();
         }
 
+        if (this.exitCode == -1) {
+            this.handleProfile();
+        }
+
         if (this.exitCode == -1) {
             this.handleInteractive();
         }
 
-            if (this.exitCode == -1) {
-                this.handleCommand();
-            }
+        if (this.exitCode == -1) {
+            this.handleCommand();
         }
+    }
 
     /**
      * Main method.
index 2ce12f3..337cd41 100644 (file)
@@ -24,6 +24,9 @@ public final class OnapCliConstants {
     public static final String PARAM_VERSION_SHORT = "v";
     public static final String PARAM_VERSION_LONG = "version";
 
+    public static final String PARAM_PROFILE_SHORT = "c";
+    public static final String PARAM_PROFILE_LONG = "profile";
+
     public static final int EXIT_SUCCESS = 0;
     public static final int EXIT_FAILURE = 1;