/* * JOSSO: Java Open Single Sign-On * * Copyright 2004-2009, Atricore, Inc. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. * */ package org.josso.tooling.gshell.install.installer; import java.io.IOException; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.commons.vfs.FileObject; import org.apache.commons.vfs.FileSystemException; import org.apache.commons.vfs.FileType; import org.apache.geronimo.gshell.common.io.PumpStreamHandler; import org.josso.tooling.gshell.install.JOSSOArtifact; import org.josso.tooling.gshell.install.TargetPlatform; /** * @author <a href="mailto:sgonzalez@josso.org">Sebastian Gonzalez Oyuela</a> * @version $Id: WeblogicInstaller.java 1572 2009-12-09 20:03:27Z sgonzalez $ * @org.apache.xbean.XBean element="weblogic-installer" */ public class WeblogicInstaller extends VFSInstaller { private static final Log log = LogFactory.getLog(WeblogicInstaller.class); private FileObject targetJOSSOMBeansDir; protected String wlVersionStr; public WeblogicInstaller(TargetPlatform targetPlatform) { super(targetPlatform); } public WeblogicInstaller() { super(); } @Override public void validatePlatform() throws InstallException { if (getTargetPlatform().getVersion().startsWith("9.2")) this.wlVersionStr = "92"; else if (getTargetPlatform().getVersion().startsWith("10")) this.wlVersionStr = "10"; else if (getTargetPlatform().getVersion().startsWith("12")) this.wlVersionStr = "12"; else throw new InstallException("Unsupported Weblogic version " + getTargetPlatform().getVersion()); super.validatePlatform(); try { boolean valid = true; if (!targetLibDir.exists() || !targetLibDir.getType().getName().equals(FileType.FOLDER.getName())) { getPrinter().printErrStatus("Target conf", "folder does not exist or is not a directory:" + targetLibDir.getName().getFriendlyURI()); valid = false; } FileObject weblogicJar = targetDir.resolveFile("server/lib/weblogic.jar"); if (weblogicJar == null || !weblogicJar.exists() || !weblogicJar.getType().getName().equals(FileType.FILE.getName())) { valid = false; getPrinter().printErrStatus("WeblogicHome", "Cannot find weblogic"); } else { getPrinter().printOkStatus("WeblogicHome"); } // Validate domain String weblogicDomain = getProperty("weblogicDomain"); FileObject weblogicDomainDir = targetDir.resolveFile(weblogicDomain); if (weblogicDomainDir == null || !weblogicDomainDir.exists() || !weblogicDomainDir.getType().getName().equals(FileType.FOLDER.getName())) { valid = false; getPrinter().printErrStatus("WeblogicDomain", "Cannot find domain " + weblogicDomainDir.getName().getFriendlyURI()); } else { getPrinter().printOkStatus("WeblogicDomain", weblogicDomainDir.getName().getFriendlyURI()); } // TODO : Validate Version ? if (!valid) throw new InstallException("Target does not seem a " + getTargetPlatform().getDescription() + " install."); } catch (IOException e) { getPrinter().printErrStatus("WeblogicHome", e.getMessage()); throw new InstallException(e.getMessage(), e); } } @Override public void init() throws InstallException { try { log.debug("Init Weblogic installer"); String weblogicDomain = getProperty("weblogicDomain"); if (weblogicDomain == null) throw new InstallException("Weblogic Domain path not specified"); log.debug("Weblogic Domain : " + weblogicDomain); registerVarResolution("domain", weblogicDomain); // Initialize installer, this will initialize standar folders. super.init(); targetJOSSOMBeansDir = targetLibDir.resolveFile("mbeantypes"); } catch (FileSystemException e) { throw new InstallException(e.getMessage(), e); } } /** * Installs JOSSO Configuration files in tomcat * * @param artifact * @throws InstallException */ @Override public void installConfiguration(JOSSOArtifact artifact, boolean replace) throws InstallException { try { FileObject srcFile = getFileSystemManager().resolveFile(artifact.getLocation()); installFile(srcFile, this.targetJOSSOConfDir, replace); } catch (IOException e) { throw new InstallException(e.getMessage(), e); } } @Override public void installComponent(JOSSOArtifact artifact, boolean replace) throws InstallException { try { // Create targetLibDir if necessary if (!targetJOSSOMBeansDir.exists()) targetJOSSOMBeansDir.createFolder(); FileObject srcFile = getFileSystemManager().resolveFile(artifact.getLocation()); // Install only the proper artifact for the target platform ... if (artifact.getBaseName().startsWith("josso-agent-shared")) { installFile(srcFile, this.targetJOSSOSharedLibDir, replace); } else if (artifact.getBaseName().startsWith("josso-agents-bin") && artifact.getClassifier() != null && artifact.getClassifier().equals("axis")) { installFile(srcFile, this.targetJOSSOLibDir, replace); } else if (artifact.getBaseName().startsWith("josso-weblogic92-agent") && getTargetPlatform().getVersion().startsWith("9.2")) { installFile(srcFile, this.targetJOSSOLibDir, replace); } else if (artifact.getBaseName().startsWith("josso-weblogic10-agent") && getTargetPlatform().getVersion().startsWith("10.")) { installFile(srcFile, this.targetJOSSOLibDir, replace); } else if (artifact.getBaseName().startsWith("josso-weblogic12-agent") && getTargetPlatform().getVersion().startsWith("12.")) { installFile(srcFile, this.targetJOSSOLibDir, replace); } else if (artifact.getBaseName().startsWith("josso-servlet-agent")) { installFile(srcFile, this.targetJOSSOLibDir, replace); } else { log.debug("Artifact is not valid for selected platform : " + artifact); } } catch (IOException e) { throw new InstallException(e.getMessage(), e); } } @Override public void install3rdPartyComponent(JOSSOArtifact artifact, boolean replace) throws InstallException { // Only use commons logging api (commonst-logging-api) and skip commons-logging if (artifact.getBaseName().startsWith("commons-logging-1") || artifact.getBaseName().startsWith("spring-2.0")) return; if (artifact.getBaseName().startsWith("slf4j")) return; if (artifact.getBaseName().startsWith("jcl-over-slf4j")) return; if (artifact.getBaseName().startsWith("logback")) return; try { FileObject srcFile = getFileSystemManager().resolveFile(artifact.getLocation()); removeOldJar(srcFile.getName().getBaseName(), this.targetLibDir, true); installFile(srcFile, this.targetLibDir, replace); } catch (IOException e) { throw new InstallException(e.getMessage(), e); } } @Override public void installApplication(JOSSOArtifact artifact, boolean replace) throws InstallException { try { // If the war is already expanded, copy it with a new name. FileObject srcFile = getFileSystemManager().resolveFile(artifact.getLocation()); // Is this the josso gateaway ? String name = artifact.getBaseName(); boolean isFolder = srcFile.getType().equals(FileType.FOLDER); if (artifact.getType().equals("war") && name.startsWith("josso-gateway-web")) { // INSTALL GWY String newName = "josso.war"; // Do we have to explode the war ? if (getTargetPlatform().isJOSSOWarExploded() && !isFolder) { installJar(srcFile, this.targetDeployDir, newName, true, replace); } else { installFile(srcFile, this.targetDeployDir, newName, replace); } return; } if (artifact.getType().equals("ear") && artifact.getBaseName().startsWith("josso-partner-wl" + wlVersionStr)) { installFile(srcFile, this.targetDeployDir, replace); return; } log.debug("Skipping partner application : " + srcFile.getName().getFriendlyURI()); } catch (IOException e) { throw new InstallException(e.getMessage(), e); } } @Override public void configureAgent() { } @Override public void installComponentFromSrc(JOSSOArtifact artifact, boolean replace) throws InstallException { try { if (!artifact.getBaseName().contains(this.wlVersionStr)) return; // Prepare paths FileObject homeDir = getFileSystemManager().resolveFile(System.getProperty("josso-gsh.home")); FileObject srcDir = homeDir.resolveFile("dist/agents/src/josso-weblogic" + wlVersionStr + "-agent-mbeans-src"); FileObject jossoLibDir = homeDir.resolveFile("dist/agents/bin"); FileObject thrdPartyLibDir = jossoLibDir.resolveFile("3rdparty"); FileObject descriptorFile = srcDir.resolveFile("org/josso/wls" + wlVersionStr + "/agent/mbeans/JOSSOAuthenticatorProviderImpl.xml"); FileObject mbeanFile = this.targetJOSSOMBeansDir.resolveFile("josso-weblogic" + wlVersionStr + "-agent-mbeans.jar"); FileObject javaDir = getFileSystemManager().resolveFile(System.getProperty("java.home") + "/../"); FileObject javaToolsFile = javaDir.resolveFile("lib/tools.jar"); FileObject javaFile = javaDir.resolveFile("bin/java"); getPrinter().printMsg("Using JAVA JDK at " + getLocalFilePath(javaDir)); if (!javaDir.exists()) { getPrinter().printActionErrStatus("Generate", "WL MBeans Descriptors", "JAVA JDK is required : " + getLocalFilePath(javaDir)); throw new InstallException("JAVA JDK is required for WL : " + getLocalFilePath(javaDir)); } if (!javaToolsFile.exists()) { getPrinter().printActionErrStatus("Generate", "WL MBeans Descriptors", "JAVA JDK is required : " + getLocalFilePath(javaToolsFile)); throw new InstallException("JAVA JDK is required for WL : " + getLocalFilePath(javaToolsFile)); } if (!javaToolsFile.exists()) { getPrinter().printActionErrStatus("Generate", "WL MBeans Descriptors", "JAVA JDK is required : " + getLocalFilePath(javaToolsFile)); throw new InstallException("JAVA JDK is required for WL : " + getLocalFilePath(javaToolsFile)); } // Java CMD and Class path : String javaCmd = getLocalFilePath(javaFile); String classpath = ""; String pathSeparator = ""; // JOSSO Jars for (FileObject child : jossoLibDir.getChildren()) { if (!child.getName().getBaseName().endsWith(".jar")) continue; classpath += pathSeparator + getLocalFilePath(child); pathSeparator = System.getProperty("path.separator"); } // JOSSO 3rd party Jars for (FileObject child : thrdPartyLibDir.getChildren()) { if (!child.getName().getBaseName().endsWith(".jar")) continue; classpath += pathSeparator + getLocalFilePath(child); pathSeparator = System.getProperty("path.separator"); } for (FileObject child : this.targetDir.resolveFile("server/lib").getChildren()) { if (!child.getName().getBaseName().endsWith(".jar")) continue; classpath += pathSeparator + getLocalFilePath(child); pathSeparator = System.getProperty("path.separator"); } classpath += pathSeparator + getLocalFilePath(javaToolsFile); pathSeparator = System.getProperty("path.separator"); for (FileObject child : javaDir.resolveFile("jre/lib").getChildren()) { classpath += pathSeparator + getLocalFilePath(child); pathSeparator = System.getProperty("path.separator"); } // ---------------------------------------------------------------- // 1. Create the MBean Descriptor Files // ---------------------------------------------------------------- { /* <argument>-Dfiles=${basedir}/target/generated-sources</argument> <argument>-DMDF=${project.build.directory}/generated-sources/org/josso/wls92/agent/mbeans/JOSSOAuthenticatorProviderImpl.xml</argument> <argument>-DtargetNameSpace=urn:org:josso:wls92:agent:mbeans</argument> <argument>-DpreserveStubs=false</argument> <argument>-DcreateStubs=true</argument> <argument>-classpath</argument> <classpath/> <argument>weblogic.management.commo.WebLogicMBeanMaker</argument> */ ProcessBuilder generateMBeanDescriptorProcessBuilder = new ProcessBuilder(javaCmd, "-Dfiles=" + getLocalFilePath(srcDir), "-DMDF=" + getLocalFilePath(descriptorFile), "-DtargetNameSpace=urn:org:josso:wls" + wlVersionStr + ":agent:mbeans", "-DschemaLocation=" + getLocalFilePath(descriptorFile), "-DpreserveStubs=false", "-DcreateStubs=true", "-Dtarget=1.6", "-target=1.6", "-classpath", classpath, "weblogic.management.commo.WebLogicMBeanMaker"); log.info("Executing: " + generateMBeanDescriptorProcessBuilder.command()); Process generateMBeanDescriptorProcess = generateMBeanDescriptorProcessBuilder.start(); PumpStreamHandler generateMBeanHandler = new PumpStreamHandler(getPrinter().getIo().inputStream, getPrinter().getIo().outputStream, getPrinter().getIo().errorStream); generateMBeanHandler.attach(generateMBeanDescriptorProcess); generateMBeanHandler.start(); log.debug("Waiting for process to exit..."); int statusDescr = generateMBeanDescriptorProcess.waitFor(); log.info("Process exited w/status: " + statusDescr); generateMBeanHandler.stop(); getPrinter().printActionOkStatus("Generate", "WL MBeans Descriptors", ""); } // ---------------------------------------------------------------- // 2. Create the MBean JAR File // ---------------------------------------------------------------- { /* <argument>-Dfiles=${project.build.directory}/generated-sources</argument> <argument>-DMJF=${project.build.directory}/josso-weblogic92-agent-mbeans-${pom.version}.jar</argument> <argument>-DpreserveStubs=false</argument> <argument>-DcreateStubs=true</argument> <argument>-classpath</argument> <classpath/> <argument>weblogic.management.commo.WebLogicMBeanMaker</argument> */ ProcessBuilder generateMBeanJarProcessBuilder = new ProcessBuilder(javaCmd, "-Dfiles=" + getLocalFilePath(srcDir), "-DMJF=" + getLocalFilePath(mbeanFile), "-DpreserveStubs=false", "-DcreateStubs=true", "-Dtarget=1.6", "-target=1.6", "-classpath", classpath, "weblogic.management.commo.WebLogicMBeanMaker"); log.info("Executing: " + generateMBeanJarProcessBuilder.command()); Process generateMBeanJarProcess = generateMBeanJarProcessBuilder.start(); PumpStreamHandler generateMBeanJarHandler = new PumpStreamHandler(getPrinter().getIo().inputStream, getPrinter().getIo().outputStream, getPrinter().getIo().errorStream); generateMBeanJarHandler.attach(generateMBeanJarProcess); generateMBeanJarHandler.start(); log.debug("Waiting for process to exit..."); int statusJar = generateMBeanJarProcess.waitFor(); log.info("Process exited w/status: " + statusJar); generateMBeanJarHandler.stop(); getPrinter().printActionOkStatus("Generate", "WL MBeans JAR", getLocalFilePath(mbeanFile)); } } catch (Exception e) { getPrinter().printActionErrStatus("Generate", "WL MBeans", e.getMessage()); throw new InstallException("Cannot generate WL MBeans Descriptors : " + e.getMessage(), e); } // 2. Create the MBean JAR File // 3. Install the file in the target platform // We need to create WL Mbeans using MBean Maker! } }