blob: c2fe5c23eb2eaaf4cb902723cca2ff121af0246b [file] [log] [blame]
/*
* 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 com.epam.dlab;
import com.epam.dlab.core.BillingUtils;
import com.epam.dlab.core.ModuleType;
import com.epam.dlab.exceptions.InitializationException;
import com.fasterxml.jackson.annotation.JsonClassDescription;
import com.fasterxml.jackson.annotation.JsonTypeName;
import org.apache.commons.lang3.StringUtils;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/** Print help for billing tool.
*/
public class Help {
private Help() {
}
/** Print help to console.
* @param resourceName the name of resource.
* @param substitute - map for substitution in help content.
* @throws InitializationException
*/
private static void printHelp(String resourceName, Map<String, String> substitute) throws InitializationException {
List<String> list = BillingUtils.getResourceAsList("/" + Help.class.getName() + "." + resourceName + ".txt");
String help = StringUtils.join(list, System.lineSeparator());
if (substitute == null) {
substitute = new HashMap<>();
}
substitute.put("classname", BillingServiceImpl.class.getName());
for (String key : substitute.keySet()) {
help = StringUtils.replace(help, "${" + key.toUpperCase() + "}", substitute.get(key));
}
System.out.println(help);
}
/** Create and return substitutions for names of modules.
* @return
* @throws InitializationException
*/
private static Map<String, String> findModules() throws InitializationException {
List<Class<?>> modules = BillingUtils.getModuleClassList();
Map<String, String> substitute = new HashMap<>();
for (Class<?> module : modules) {
ModuleType type = BillingUtils.getModuleType(module);
JsonTypeName typeName = module.getAnnotation(JsonTypeName.class);
if (typeName != null) {
String typeNames = substitute.get(type.toString() + "s");
typeNames = (typeNames == null ? typeName.value() : typeNames + ", " + typeName.value());
substitute.put(type.toString() + "s", typeNames);
}
}
return substitute;
}
/** Find and return help for module.
* @param type the type of module.
* @param name the name of module.
* @throws InitializationException
*/
private static String findModuleHelp(ModuleType type, String name) throws InitializationException {
List<Class<?>> modules = BillingUtils.getModuleClassList();
String typeNames = null;
for (Class<?> module : modules) {
ModuleType t = BillingUtils.getModuleType(module);
if (t == type) {
JsonTypeName typeName = module.getAnnotation(JsonTypeName.class);
if (typeName != null ) {
if (name.equals(typeName.value())) {
JsonClassDescription description = module.getAnnotation(JsonClassDescription.class);
if (description != null) {
return description.value();
}
throw new InitializationException("Help for " + type + " " + name + " not found");
} else {
typeNames = (typeNames == null ? typeName.value() : typeNames + ", " + typeName.value());
}
}
}
}
throw new InitializationException("Module for " + type + " " + name + " not found." +
(typeNames == null ? "" : " Module type must be one of next: " + typeNames));
}
/** Print help screen for billing tool.
* @throws InitializationException */
public static void usage(String ... args) throws InitializationException {
if (args == null || args.length == 0) {
printHelp("usage", null);
} else if (args[0].equalsIgnoreCase("conf")) {
printHelp("conf", findModules());
} else {
ModuleType type = ModuleType.of(args[0]);
if (type == null) {
System.out.println("Unknown --help " + args[0] + " command.");
} else if (args.length < 2) {
System.out.println("Missing the type of module.");
String typeNames = findModules().get(type.toString() + "s");
if (typeNames != null) {
System.out.println("Must be one of next: " + typeNames);
}
} else if (args.length > 2) {
System.out.println("Extra arguments in command: " +
StringUtils.join(Arrays.copyOfRange(args, 2, args.length), " "));
} else {
System.out.println(findModuleHelp(type, args[1]));
}
}
}
}