/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package net.fredjean.ws7; import hudson.Extension; import hudson.Launcher; import hudson.Util; import hudson.model.AbstractBuild; import hudson.model.AbstractProject; import hudson.model.Action; import hudson.model.BuildListener; import hudson.model.Descriptor; import hudson.model.Descriptor.FormException; import hudson.tasks.BuildStepDescriptor; import hudson.tasks.BuildStepMonitor; import hudson.tasks.Notifier; import hudson.tasks.Publisher; import hudson.util.ArgumentListBuilder; import java.io.IOException; import net.sf.json.JSONObject; import org.kohsuke.stapler.StaplerRequest; /** * * @author fjean */ public class WS7Publisher extends Notifier { private String user; private String pwdLocation; private String adminHost; private String adminPort; private String virtualServer; private String wsConfig; private String warFile; private String appContext; private String urlToApplication; private static final Object lock = new Object(); /** * @stapler-constructor */ public WS7Publisher() { } @Override public boolean perform(AbstractBuild<?, ?> build, Launcher launcher, BuildListener listener) throws InterruptedException, IOException { String cmd = DESCRIPTOR.ws7Location + "/bin/wadm"; int rc = -1; if (validateArguments()) { synchronized (lock) { /* * Serialize adding the web app to a configuration and deploying * the configuration to avoid issues where multiple projects * are built around the same time and try to deploy at the same * time. */ ArgumentListBuilder args = buildConnectOptions(cmd, "add-webapp"); args.add("--echo", "--no-prompt", "--config=" + getWsConfig(), "--vs=" + getVirtualServer(), "--uri=" + getAppContext(), getWarFile()); try { /* * Adds the web application to the server. */ rc = launcher.launch().cmds(args).envs(build.getEnvironment(listener)).stdout(listener).pwd(build.getModuleRoot()).join(); /* * Redeploy the configuration if the webapp was added succesfully. */ if (rc == 0) { args = buildConnectOptions(cmd, "deploy-config"); args.add("--echo", "--no-prompt", getWsConfig()); rc = launcher.launch().cmds(args).envs(build.getEnvironment(listener)).stdout(listener).pwd(build.getModuleRoot()).join(); } } catch (IOException ioe) { Util.displayIOException(ioe, listener); ioe.printStackTrace(); rc = -1; } } } return rc == 0; } @Override public Action getProjectAction(AbstractProject<?, ?> project) { return new WS7ProjectAction(project, this); } public BuildStepMonitor getRequiredMonitorService() { return BuildStepMonitor.BUILD; } /** * Verifies that all the required arguments are present before we can * launch the command. * @return */ private boolean validateArguments() { return !isEmpty(getWsConfig()) && !isEmpty(getVirtualServer()) && !isEmpty(getVirtualServer()) && !isEmpty(getAppContext()) && !isEmpty(getWarFile()) && !isEmpty(getUser()) && !isEmpty(getPwdLocation()); } private ArgumentListBuilder buildConnectOptions(String cmd, String wadmcmd) { ArgumentListBuilder args = new ArgumentListBuilder(); args.add(cmd, wadmcmd, "--user=" + getUser(), "--password-file=" + getPwdLocation()); if (!isEmpty(getAdminHost())) { args.add("--host=" + getAdminHost()); } if (!isEmpty(getAdminPort())) { args.add("--port=" + getAdminPort()); } return args; } /** * Reference to the Descriptor */ @Extension public static final DescriptorImpl DESCRIPTOR = new DescriptorImpl(); public String getUser() { return isEmpty(user) ? DESCRIPTOR.defaultUser : user; } public void setUser(String user) { this.user = user; } public String getPwdLocation() { return isEmpty(pwdLocation) ? DESCRIPTOR.defaultPwdLocation : pwdLocation; } public void setPwdLocation(String pwdLocation) { this.pwdLocation = pwdLocation; } public String getAdminHost() { return isEmpty(adminHost) ? DESCRIPTOR.defaultAdminHost : adminHost; } public void setAdminHost(String adminHost) { this.adminHost = adminHost; } public String getAdminPort() { return isEmpty(adminPort) ? DESCRIPTOR.defaultAdminPort : adminPort; } public void setAdminPort(String adminPort) { this.adminPort = adminPort; } public String getVirtualServer() { return isEmpty(virtualServer) ? DESCRIPTOR.defaultVS : virtualServer; } public void setVirtualServer(String virtualServer) { this.virtualServer = virtualServer; } public String getWsConfig() { return isEmpty(wsConfig) ? DESCRIPTOR.defaultConfig : wsConfig; } public void setWsConfig(String wsConfig) { this.wsConfig = wsConfig; } public String getWarFile() { return warFile; } public void setWarFile(String warFile) { this.warFile = warFile; } public String getUrlToApplication() { return urlToApplication; } public void setUrlToApplication(String urlToApplication) { this.urlToApplication = urlToApplication; } public String getAppContext() { return appContext; } public void setAppContext(String appContext) { this.appContext = appContext; } private boolean isEmpty(String str) { return (str == null || str.length() == 0); } public static final class DescriptorImpl extends BuildStepDescriptor<Publisher> { private String ws7Location = "/sun/webserver7"; private String defaultUser = "admin"; private String defaultPwdLocation; private String defaultAdminHost; private String defaultAdminPort; private String defaultConfig; private String defaultVS; public DescriptorImpl() { super(WS7Publisher.class); load(); } @Override public String getDisplayName() { return "Deploy to SJS Web Server 7"; } @Override public boolean configure(StaplerRequest req, JSONObject formData) throws FormException { ws7Location = req.getParameter("ws7.ws7Location"); defaultUser = req.getParameter("ws7.defaultUser"); defaultPwdLocation = req.getParameter("ws7.defaultPwdLocation"); defaultAdminHost = req.getParameter("ws7.defaultAdminHost"); defaultAdminPort = req.getParameter("ws7.defaultAdminPort"); defaultConfig = req.getParameter("ws7.defaultConfig"); defaultVS = req.getParameter("ws7.defaultVS"); save(); return super.configure(req, formData); } @Override public boolean isApplicable(Class<? extends AbstractProject> jobType) { return true; } @Override public Publisher newInstance(StaplerRequest req, JSONObject formData) throws FormException { WS7Publisher ws7 = new WS7Publisher(); req.bindParameters(ws7, "ws7."); return ws7; } public String getWs7Location() { return ws7Location; } public void setWs7Location(String ws7Location) { this.ws7Location = ws7Location; } public String getDefaultUser() { return defaultUser; } public void setDefaultUser(String defaultUser) { this.defaultUser = defaultUser; } public String getDefaultPwdLocation() { return defaultPwdLocation; } public void setDefaultPwdLocation(String defaultPwdLocation) { this.defaultPwdLocation = defaultPwdLocation; } public String getDefaultAdminHost() { return defaultAdminHost; } public void setDefaultAdminHost(String defaultAdminHost) { this.defaultAdminHost = defaultAdminHost; } public String getDefaultAdminPort() { return defaultAdminPort; } public void setDefaultAdminPort(String defaultAdminPort) { this.defaultAdminPort = defaultAdminPort; } public String getDefaultVS() { return defaultVS; } public void setDefaultVS(String defaultVS) { this.defaultVS = defaultVS; } public String getDefaultConfig() { return defaultConfig; } public void setDefaultConfig(String defaultConfig) { this.defaultConfig = defaultConfig; } } }