package mil.nga.giat.geowave.cli.geoserver; import static mil.nga.giat.geowave.cli.geoserver.constants.GeoServerConstants.GEOSERVER_NAMESPACE_PREFIX; import static mil.nga.giat.geowave.cli.geoserver.constants.GeoServerConstants.GEOSERVER_PASS; import static mil.nga.giat.geowave.cli.geoserver.constants.GeoServerConstants.GEOSERVER_URL; import static mil.nga.giat.geowave.cli.geoserver.constants.GeoServerConstants.GEOSERVER_USER; import static mil.nga.giat.geowave.cli.geoserver.constants.GeoServerConstants.GEOSERVER_WORKSPACE; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Properties; import org.apache.commons.lang3.StringUtils; import com.beust.jcommander.JCommander; import com.beust.jcommander.Parameter; import com.beust.jcommander.ParameterException; import com.beust.jcommander.Parameters; import com.beust.jcommander.ParametersDelegate; import mil.nga.giat.geowave.core.cli.annotations.GeowaveOperation; import mil.nga.giat.geowave.core.cli.api.Command; import mil.nga.giat.geowave.core.cli.api.DefaultOperation; import mil.nga.giat.geowave.core.cli.api.OperationParams; import mil.nga.giat.geowave.core.cli.converters.GeoWaveBaseConverter; import mil.nga.giat.geowave.core.cli.converters.OptionalPasswordConverter; import mil.nga.giat.geowave.core.cli.operations.config.ConfigSection; import mil.nga.giat.geowave.core.cli.operations.config.options.ConfigOptions; import mil.nga.giat.geowave.core.cli.prefix.JCommanderPrefixTranslator; import mil.nga.giat.geowave.core.cli.prefix.JCommanderTranslationMap; import mil.nga.giat.geowave.core.cli.prefix.TranslationEntry; @GeowaveOperation(name = "geoserver", parentOperation = ConfigSection.class) @Parameters(commandDescription = "Create a local configuration for GeoServer") public class ConfigGeoServerCommand extends DefaultOperation implements Command { @Parameter(names = { "-u", "--url" }, description = "GeoServer URL (for example http://localhost:8080/geoserver or https://localhost:8443/geoserver), or simply host:port and appropriate assumptions are made") private String url; @Parameter(names = { "-n", "--name" }, description = "GeoServer User") private String name; // GEOWAVE-811 - adding additional password options for added protection @Parameter(names = { "-p", "--pass" }, description = "GeoServer Password - " + OptionalPasswordConverter.DEFAULT_PASSWORD_DESCRIPTION, converter = OptionalPasswordConverter.class) private String pass; @Parameter(names = { "-ws", "--workspace" }, description = "GeoServer Default Workspace") private String workspace; @ParametersDelegate private GeoServerSSLConfigurationOptions sslConfigOptions = new GeoServerSSLConfigurationOptions(); @Override public boolean prepare( OperationParams params ) { boolean retval = true; retval |= super.prepare(params); String username = getName(); String password = getPass(); boolean usernameSpecified = username != null && !"".equals(username.trim()); boolean passwordSpecified = password != null && !"".equals(password.trim()); if (usernameSpecified || passwordSpecified) { if (usernameSpecified && !passwordSpecified) { setPass(GeoWaveBaseConverter.promptAndReadPassword("Please enter a password for username [" + username + "]: ")); if (getPass() == null || "".equals(getPass().trim())) { throw new ParameterException( "Password cannot be null or empty if username is specified"); } } else if (passwordSpecified && !usernameSpecified) { setName(GeoWaveBaseConverter .promptAndReadValue("Please enter a username associated with specified password: ")); if (getName() == null || "".equals(getName().trim())) { throw new ParameterException( "Username cannot be null or empty if password is specified"); } } } return retval; } @Override public void execute( OperationParams params ) throws Exception { Properties existingProps = getGeoWaveConfigProperties(params); // all switches are optional if (url != null) { existingProps.setProperty( GEOSERVER_URL, url); } if (getName() != null) { existingProps.setProperty( GEOSERVER_USER, getName()); } if (getPass() != null) { existingProps.setProperty( GEOSERVER_PASS, getPass()); } if (getWorkspace() != null) { existingProps.setProperty( GEOSERVER_WORKSPACE, getWorkspace()); } // save properties from ssl configurations sslConfigOptions.saveProperties(existingProps); // Write properties file ConfigOptions.writeProperties( getGeoWaveConfigFile(params), existingProps, this.getClass(), GEOSERVER_NAMESPACE_PREFIX); } public String getName() { return name; } public void setName( String name ) { this.name = name; } public String getPass() { return pass; } public void setPass( String pass ) { this.pass = pass; } public String getWorkspace() { return workspace; } public void setWorkspace( String workspace ) { this.workspace = workspace; } public GeoServerSSLConfigurationOptions getGeoServerSSLConfigurationOptions() { return sslConfigOptions; } public void setGeoServerSSLConfigurationOptions( final GeoServerSSLConfigurationOptions sslConfigOptions ) { this.sslConfigOptions = sslConfigOptions; } @Override public String usage() { StringBuilder builder = new StringBuilder(); List<String> nameArray = new ArrayList<String>(); JCommanderPrefixTranslator translator = new JCommanderPrefixTranslator(); translator.addObject(this); JCommanderTranslationMap map = translator.translate(); map.createFacadeObjects(); // Copy default parameters over for help display. map.transformToFacade(); JCommander jc = new JCommander(); Map<String, TranslationEntry> translations = map.getEntries(); for (Object obj : map.getObjects()) { for (Field field : obj.getClass().getDeclaredFields()) { TranslationEntry tEntry = translations.get(field.getName()); if (tEntry != null && tEntry.getObject() instanceof ConfigGeoServerCommand) { jc.addObject(obj); break; } } } String programName = StringUtils.join( nameArray, " "); jc.setProgramName(programName); jc.usage(builder); // Trim excess newlines. String operations = builder.toString().trim(); builder = new StringBuilder(); builder.append(operations); builder.append("\n\n"); builder.append(" "); jc = new JCommander(); for (Object obj : map.getObjects()) { for (Field field : obj.getClass().getDeclaredFields()) { TranslationEntry tEntry = translations.get(field.getName()); if (tEntry != null && !(tEntry.getObject() instanceof ConfigGeoServerCommand)) { Parameters parameters = tEntry.getObject().getClass().getAnnotation( Parameters.class); if (parameters != null) { builder.append(parameters.commandDescription()); } else { builder.append("Additional Parameters"); } jc.addObject(obj); break; } } } jc.setProgramName(programName); jc.usage(builder); builder.append("\n\n"); return builder.toString().trim(); } }