/* * Licensed to the Apache Software Foundation (ASF) under one or more contributor license * agreements. See the NOTICE file distributed with this work for additional information regarding * copyright ownership. The ASF licenses this file to You 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.apache.geode.management.internal.cli.modes; import java.io.IOException; import java.io.InputStream; import java.util.Collection; import java.util.HashMap; import java.util.Map; import org.apache.geode.LogWriter; import org.apache.geode.cache.Cache; import org.apache.geode.cache.CacheFactory; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; public class CommandModes { public static final String DEFAULT_MODE = "default"; public Map<String, Map<String, CommandMode>> getModeMap() { return modeMap; } private static CommandModes _allModes; private CommandModes() { readAllModes(); } public static CommandModes getInstance() { synchronized (CommandModes.class) { if (_allModes == null) { _allModes = new CommandModes(); } return _allModes; } } private Map<String, Map<String, CommandMode>> modeMap = new HashMap<String, Map<String, CommandMode>>(); private void readAllModes() { try { InputStream stream = CommandModes.class.getResourceAsStream("commands.json"); byte[] bytes = new byte[50 * 1024]; int bytesRead = stream.read(bytes); String str = new String(bytes, 0, bytesRead); parseModes(str); stream.close(); } catch (IOException e) { logException(e); } catch (JSONException e) { logException(e); } } private void parseModes(String str) throws JSONException { JSONObject jsonObject = new JSONObject(str); JSONArray array = jsonObject.getJSONArray("commands"); for (int i = 0; i < array.length(); i++) { try { addCommandMode(array.getString(i)); } catch (JSONException e) { logException(e); } catch (IOException e) { logException(e); } } } private void logException(Exception e) { Cache cache = CacheFactory.getAnyInstance(); LogWriter logger = cache.getLogger(); logger.warning("Error parsing command mode descriptor", e); } private void addCommandMode(String commandName) throws JSONException, IOException { InputStream stream = CommandModes.class.getResourceAsStream(commandName + ".json"); byte[] bytes = new byte[50 * 1024]; int bytesRead = stream.read(bytes); String str = new String(bytes, 0, bytesRead); JSONObject object = new JSONObject(str); String name = object.getString("name"); JSONArray array = object.getJSONArray("modes"); Map<String, CommandMode> map = new HashMap<String, CommandMode>(); for (int i = 0; i < array.length(); i++) { CommandMode mode = readMode(array.getJSONObject(i)); map.put(mode.name, mode); } modeMap.put(name, map); } private CommandMode readMode(JSONObject jsonObject) throws JSONException { CommandMode mode = new CommandMode(); mode.name = jsonObject.getString("name"); mode.text = jsonObject.getString("text"); mode.leadOption = jsonObject.getString("lead-option"); mode.options = toStringArray(jsonObject.getJSONArray("options")); return mode; } private String[] toStringArray(JSONArray jsonArray) throws JSONException { String[] array = new String[jsonArray.length()]; for (int i = 0; i < array.length; i++) array[i] = jsonArray.getString(i); return array; } public Collection<CommandMode> getCommandModes(String name) { Map<String, CommandMode> commandModes = modeMap.get(name); if (commandModes != null) return commandModes.values(); else return null; } public CommandMode getCommandMode(String commandName, String modeName) { Map<String, CommandMode> commandModes = modeMap.get(commandName); if (commandModes != null) return commandModes.get(modeName); else return null; } public String toString() { return modeMap.toString(); } public static class CommandMode { public String name; public String leadOption; public String[] options; public String text; public String toString() { return "CM: name : " + name + " text:" + text; } } }