/** * * 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 org.apache.tomee.webapp.installer; import org.apache.tomee.installer.InstallerInterface; import org.apache.tomee.installer.PathsInterface; import javax.naming.Context; import javax.naming.InitialContext; import java.io.File; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Properties; public class Runner { private final InstallerInterface installer; private String catalinaHome = System.getProperty("catalina.home"); private String catalinaBase = System.getProperty("catalina.base"); private String serverXmlFile = System.getProperty("catalina.base") + "/conf/server.xml"; private static List<Map<String, String>> installerResults; private static org.apache.tomee.installer.Status installerStatus; public Runner(final InstallerInterface installer) { this.installer = installer; } public void setCatalinaHome(final String catalinaHome) { this.catalinaHome = catalinaHome; } public void setCatalinaBaseDir(final String catalinaBase) { this.catalinaBase = catalinaBase; } public void setServerXmlFile(final String serverXmlFile) { this.serverXmlFile = serverXmlFile; } private void setAlerts(final String key, final List<String> messages) { if (messages == null) { return; } for (final String message : messages) { installerResults.add(Common.build(key, message)); } } public synchronized List<Map<String, String>> execute(final boolean install) { if (org.apache.tomee.installer.Status.INSTALLED.equals(installerStatus) || org.apache.tomee.installer.Status.REBOOT_REQUIRED.equals(installerStatus)) { return installerResults; } final PathsInterface paths = installer.getPaths(); paths.reset(); installer.reset(); paths.setCatalinaHomeDir(this.catalinaHome); paths.setCatalinaBaseDir(this.catalinaBase); paths.setServerXmlFile(this.serverXmlFile); if (paths.verify() && install) { installer.installAll(); } installerResults = new ArrayList<Map<String, String>>(); installerResults.add(Common.build("catalinaHomeDir", String.valueOf(catalinaHome))); installerResults.add(Common.build("catalinaBaseDir", String.valueOf(catalinaBase))); installerResults.add(Common.build("serverXmlFile", String.valueOf(serverXmlFile))); installerStatus = installer.getStatus(); installerResults.add(Common.build("status", String.valueOf(installerStatus))); setAlerts("errors", installer.getAlerts().getErrors()); setAlerts("warnings", installer.getAlerts().getWarnings()); setAlerts("infos", installer.getAlerts().getInfos()); { boolean hasHome = false; boolean doesHomeExist = false; boolean isHomeDirectory = false; boolean hasLibDirectory = false; final String homePath = System.getProperty("openejb.home"); if (homePath != null) { hasHome = true; final File homeDir = new File(homePath); doesHomeExist = homeDir.exists(); if (homeDir.exists()) { isHomeDirectory = homeDir.isDirectory(); final File libDir = new File(homeDir, "lib"); hasLibDirectory = libDir.exists(); } } installerResults.add(Common.build("hasHome", String.valueOf(hasHome))); installerResults.add(Common.build("doesHomeExist", String.valueOf(doesHomeExist))); installerResults.add(Common.build("isHomeDirectory", String.valueOf(isHomeDirectory))); installerResults.add(Common.build("hasLibDirectory", String.valueOf(hasLibDirectory))); } { boolean wereTheOpenEJBClassesInstalled = false; boolean wereTheEjbClassesInstalled = false; boolean wasOpenEJBStarted = false; boolean canILookupAnything = false; try { final ClassLoader myLoader = this.getClass().getClassLoader(); Class.forName("org.apache.openejb.OpenEJB", true, myLoader); wereTheOpenEJBClassesInstalled = true; } catch (final Exception e) { // noop } try { Class.forName("javax.ejb.EJBHome", true, this.getClass().getClassLoader()); wereTheEjbClassesInstalled = true; } catch (final Exception e) { // noop } try { final Class openejb = Class.forName("org.apache.openejb.OpenEJB", true, this.getClass().getClassLoader()); final Method isInitialized = openejb.getDeclaredMethod("isInitialized"); wasOpenEJBStarted = (Boolean) isInitialized.invoke(openejb); } catch (final Exception e) { // noop } try { final Properties p = new Properties(); p.put(Context.INITIAL_CONTEXT_FACTORY, "org.apache.openejb.core.LocalInitialContextFactory"); p.put("openejb.loader", "embed"); final InitialContext ctx = new InitialContext(p); final Object obj = ctx.lookup(""); if (obj.getClass().getName().equals("org.apache.openejb.core.ivm.naming.IvmContext")) { canILookupAnything = true; } } catch (final Exception e) { // noop } installerResults.add(Common.build("wereTheOpenEJBClassesInstalled", String.valueOf(wereTheOpenEJBClassesInstalled))); installerResults.add(Common.build("wereTheEjbClassesInstalled", String.valueOf(wereTheEjbClassesInstalled))); installerResults.add(Common.build("wasOpenEJBStarted", String.valueOf(wasOpenEJBStarted))); installerResults.add(Common.build("canILookupAnything", String.valueOf(canILookupAnything))); } return installerResults; } }