package com.orctom.mojo.was; import com.orctom.was.model.WebSphereModel; import com.orctom.was.utils.PropertiesUtils; import org.apache.maven.artifact.Artifact; import org.apache.maven.plugin.AbstractMojo; import org.apache.maven.plugins.annotations.Component; import org.apache.maven.plugins.annotations.Parameter; import org.apache.maven.project.MavenProject; import org.apache.maven.project.MavenProjectHelper; import org.codehaus.plexus.configuration.PlexusConfiguration; import org.codehaus.plexus.util.StringUtils; import java.io.File; import java.util.*; /** * Abstract Mojo for websphere deployment * Created by CH on 3/4/14. */ public abstract class AbstractWASMojo extends AbstractMojo { @Component protected MavenProject project; @Component protected MavenProjectHelper projectHelper; @Parameter(defaultValue = "${plugin.artifacts}") protected List<Artifact> pluginArtifacts; @Parameter(defaultValue = "${project.basedir}/was-maven-plugin.properties") protected File deploymentsPropertyFile; @Parameter(required = true) protected String wasHome; @Parameter(defaultValue = "${project.build.finalName}") protected String applicationName; @Parameter(defaultValue = "localhost") protected String host; @Parameter protected String port; @Parameter protected String connectorType; @Parameter(defaultValue = "true") protected boolean restartAfterDeploy; /** * Required if target server is a cluster */ @Parameter protected String cluster; @Parameter protected String cell; /** * Required if target server is NOT cluster */ @Parameter protected String node; @Parameter protected String server; @Parameter protected String webservers; @Parameter protected String virtualHost; @Parameter protected String user; @Parameter protected String password; @Parameter protected String contextRoot; @Parameter protected String sharedLibs; @Parameter protected boolean parentLast; @Parameter protected boolean webModuleParentLast; @Parameter(defaultValue = "${project.artifact.file}") protected File packageFile; @Parameter(defaultValue = "false") protected boolean failOnError; @Parameter protected String script; @Parameter protected String scriptArgs; @Parameter protected String javaoption; @Parameter protected String deployOptions; @Parameter protected boolean verbose; /** * The XML for the Ant target. */ @Parameter protected PlexusConfiguration[] preSteps; /** * The XML for the Ant target */ @Parameter protected PlexusConfiguration[] postSteps; protected Set<WebSphereModel> getWebSphereModels() { String deployTargets = System.getProperty(Constants.KEY_DEPLOY_TARGETS); if (StringUtils.isNotBlank(deployTargets)) { if (null != deploymentsPropertyFile && deploymentsPropertyFile.exists()) { Map<String, Properties> propertiesMap = PropertiesUtils.loadSectionedProperties(deploymentsPropertyFile, getProjectProperties()); if (null != propertiesMap && propertiesMap.size() >= 1) { getLog().info("Multi targets: " + deployTargets); return getWebSphereModels(deployTargets, propertiesMap); } } if (null == deploymentsPropertyFile) { getLog().info("Property config file: " + deploymentsPropertyFile + " not configured."); } if (!deploymentsPropertyFile.exists()) { getLog().info("Property config file: " + deploymentsPropertyFile + " doesn't exist."); } getLog().info("Single target not properly configured."); return null; } else { WebSphereModel model = getWebSphereModel(); if (!model.isValid()) { getLog().info("Single target not properly configured. Missing 'cell' or 'cluster' or 'server' or 'node'"); return null; } getLog().info("Single target: " + model.getHost()); Set<WebSphereModel> models = new HashSet<WebSphereModel>(1); models.add(model); return models; } } protected WebSphereModel getWebSphereModel() { WebSphereModel model = new WebSphereModel() .setWasHome(wasHome) .setApplicationName(applicationName) .setHost(host) .setPort(port) .setConnectorType(connectorType) .setCluster(cluster) .setCell(cell) .setNode(node) .setServer(server) .setWebservers(webservers) .setVirtualHost(virtualHost) .setContextRoot(contextRoot) .setSharedLibs(sharedLibs) .setParentLast(parentLast) .setWebModuleParentLast(webModuleParentLast) .setUser(user) .setPassword(password) .setPackageFile(packageFile.getAbsolutePath()) .setScript(script) .setScriptArgs(scriptArgs) .setJavaoption(javaoption) .setDeployOptions(deployOptions) .setFailOnError(failOnError) .setRestartAfterDeploy(restartAfterDeploy) .setVerbose(verbose); model.setProperties(getProjectProperties()); return model; } protected Set<WebSphereModel> getWebSphereModels(String deployTargetStr, Map<String, Properties> propertiesMap) { Set<String> deployTargets = new HashSet<String>(); Collections.addAll(deployTargets, StringUtils.split(deployTargetStr, ",")); Set<WebSphereModel> models = new HashSet<WebSphereModel>(); for (String deployTarget : deployTargets) { Properties props = propertiesMap.get(deployTarget); if (null == props || props.isEmpty()) { getLog().info("[SKIPPED] " + deployTarget + ", not configured in property file."); continue; } updateApplicationNameWithSuffix(props); WebSphereModel model = new WebSphereModel() .setWasHome(wasHome) .setApplicationName(getPropertyValue("applicationName", props)) .setHost(getPropertyValue("host", props)) .setPort(getPropertyValue("port", props)) .setConnectorType(getPropertyValue("connectorType", props)) .setCluster(getPropertyValue("cluster", props)) .setCell(getPropertyValue("cell", props)) .setNode(getPropertyValue("node", props)) .setServer(getPropertyValue("server", props)) .setWebservers(getPropertyValue("webservers", props)) .setVirtualHost(getPropertyValue("virtualHost", props)) .setContextRoot(getPropertyValue("contextRoot", props)) .setSharedLibs(getPropertyValue("sharedLibs", props)) .setParentLast(Boolean.valueOf(getPropertyValue("parentLast", props))) .setWebModuleParentLast(Boolean.valueOf(getPropertyValue("webModuleParentLast", props))) .setUser(getPropertyValue("user", props)) .setPassword(getPropertyValue("password", props)) .setPackageFile(packageFile.getAbsolutePath()) .setScript(script) .setScriptArgs(scriptArgs) .setJavaoption(javaoption) .setDeployOptions(deployOptions) .setFailOnError(failOnError) .setRestartAfterDeploy(Boolean.valueOf(getPropertyValue("restartAfterDeploy", props))) .setVerbose(verbose); model.setProperties(props); if (model.isValid()) { models.add(model); } } return models; } private void updateApplicationNameWithSuffix(Properties props) { String appNameSuffix = getPropertyValue("applicationNameSuffix", props); if (StringUtils.isNotEmpty(appNameSuffix)) { String appName = getPropertyValue("applicationName", props); props.setProperty("applicationName", appName + "_" + appNameSuffix); } } protected String getPropertyValue(String propertyName, Properties props) { String value = props.getProperty(propertyName); if (isValueNotResolved(value)) { value = PropertiesUtils.resolve(value, props); props.setProperty(propertyName, value); } return value; } private boolean isValueNotResolved(String value) { return StringUtils.isNotEmpty(value) && value.contains("{{") && value.contains("}}"); } private Properties getProjectProperties() { Properties properties = new Properties(project.getProperties()); setProperty(properties, "applicationName", applicationName); setProperty(properties, "host", host); setProperty(properties, "port", port); setProperty(properties, "connectorType", connectorType); setProperty(properties, "cluster", cluster); setProperty(properties, "cell", cell); setProperty(properties, "node", node); setProperty(properties, "server", server); setProperty(properties, "webservers", webservers); setProperty(properties, "virtualHost", virtualHost); setProperty(properties, "user", user); setProperty(properties, "password", password); setProperty(properties, "contextRoot", contextRoot); setProperty(properties, "sharedLibs", sharedLibs); setProperty(properties, "parentLast", String.valueOf(parentLast)); setProperty(properties, "webModuleParentLast", String.valueOf(webModuleParentLast)); setProperty(properties, "packageFile", packageFile.getAbsolutePath()); setProperty(properties, "javaoption", javaoption); setProperty(properties, "deployOptions", deployOptions); setProperty(properties, "failOnError", String.valueOf(failOnError)); setProperty(properties, "script", script); setProperty(properties, "scriptArgs", scriptArgs); setProperty(properties, "verbose", String.valueOf(verbose)); setProperty(properties, "restartAfterDeploy", String.valueOf(restartAfterDeploy)); properties.setProperty("basedir", project.getBasedir().getAbsolutePath()); properties.setProperty("project.basedir", project.getBasedir().getAbsolutePath()); properties.setProperty("version", project.getVersion()); properties.setProperty("project.version", project.getVersion()); properties.setProperty("project.build.directory", project.getBuild().getDirectory()); properties.setProperty("project.build.outputDirectory", project.getBuild().getOutputDirectory()); properties.setProperty("project.build.finalName", project.getBuild().getFinalName()); properties.setProperty("project.name", project.getName()); properties.setProperty("groupId", project.getGroupId()); properties.setProperty("project.groupId", project.getGroupId()); properties.setProperty("artifactId", project.getArtifactId()); properties.setProperty("project.artifactId", project.getArtifactId()); return properties; } private void setProperty(Properties properties, String key, String value) { if (StringUtils.isNotEmpty(value)) { properties.setProperty(key, value); } } }