/** * * 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.installer; import org.apache.openejb.jpa.integration.MakeTxLookup; import org.apache.openejb.loader.JarLocation; import java.io.File; import java.io.FilenameFilter; import java.util.ArrayList; import java.util.List; /** * This class is used to verify that all the main directories and files exist. * @see #verify() for more details * * */ public class Paths implements PathsInterface { /** * The openejb webapp directory under <<tomcat-install>>/webapps */ private final File openejbWarDir; /** * Used to store errors which represent verification failures * @see #verify() */ private final List<String> errors = new ArrayList<String>(); /** * The directory represented by the catalina.home system property */ private File catalinaHomeDir; /** * The directory represented by the catalina.base system property */ private File catalinaBaseDir; /** * The <<tomcat-install>>/conf/server.xml file */ private File serverXmlFile; private File openEJBWebLibDir; private File tomcatUsersXml; public Paths(final File openejbWarDir) { this.openejbWarDir = openejbWarDir; } /** * Returns the directory represented by the catalina.home system property * @return The directory represented by the catalina.home system property */ @Override public File getCatalinaHomeDir() { if (catalinaHomeDir == null) { final String catalinaHome = System.getProperty("catalina.home"); if (catalinaHome != null) { catalinaHomeDir = new File(catalinaHome); } } return catalinaHomeDir; } /** * Sets the catalina home directory * @param catalinaHomeDir the absolute path of the catalina home directory */ @Override public void setCatalinaHomeDir(final String catalinaHomeDir) { this.catalinaHomeDir = createFile(catalinaHomeDir); } /** * Sets the catalina home directory * @param catalinaHomeDir the file representing the absolute path of the catalina home directory */ @Override public void setCatalinaHomeDir(final File catalinaHomeDir) { this.catalinaHomeDir = catalinaHomeDir; } /** * Returns the directory represented by the catalina.base system property * @return The directory represented by the catalina.base system property */ @Override public File getCatalinaBaseDir() { if (catalinaBaseDir == null) { final String catalinaBase = System.getProperty("catalina.base"); if (catalinaBase != null) { catalinaBaseDir = new File(catalinaBase); } } return catalinaBaseDir; } /** * Sets the catalina base directory * @param catalinaBaseDir the absolute path of the catalina base directory */ @Override public void setCatalinaBaseDir(final String catalinaBaseDir) { setCatalinaBaseDir(createFile(catalinaBaseDir)); } /** * Sets the catalina base directory * @param catalinaBaseDir the file representing the absolute path of the catalina base directory */ @Override public void setCatalinaBaseDir(final File catalinaBaseDir) { this.catalinaBaseDir = catalinaBaseDir; } /** * Returns the file representing <<tomcat-install>>/conf/server.xml * @return the file representing <<tomcat-install>>/conf/server.xml */ @Override public File getServerXmlFile() { if (serverXmlFile == null) { final File confdir = getCatalinaConfDir(); if (confdir == null) { return null; } serverXmlFile = new File(confdir, "server.xml"); } return serverXmlFile; } @Override public File getHome() { return new File(getCatalinaBaseDir(), "webapps/ROOT/index.jsp"); } /** * Sets the server.xml file * @param serverXmlFile the absolute path of the server.xml file */ @Override public void setServerXmlFile(final String serverXmlFile) { this.serverXmlFile = createFile(serverXmlFile); } /** * Sets the server.xml file * @param serverXmlFile the file representing the absolute path of the server.xml file */ @Override public void setServerXmlFile(final File serverXmlFile) { this.serverXmlFile = serverXmlFile; } /** * Returns the directory representing {@link #catalinaHomeDir}/lib for Tomcat 6. For Tomcat 5.x it returns {@link #catalinaHomeDir}/server/lib * @return the directory representing {@link #catalinaHomeDir}/lib */ @Override public File getCatalinaLibDir() { final File catalinaHomeDir = getCatalinaHomeDir(); if (catalinaHomeDir == null) { return null; } return new File(catalinaHomeDir, "lib"); } /** * Returns the directory representing {@link #catalinaBaseDir}/conf * @return the directory representing {@link #catalinaBaseDir}/conf */ @Override public File getCatalinaConfDir() { final File catalinaBaseDir = getCatalinaBaseDir(); if (catalinaBaseDir == null) { return null; } return new File(catalinaBaseDir, "conf"); } /** * Returns the directory representing {@link #catalinaHomeDir}/bin * @return the directory representing {@link #catalinaHomeDir}/bin */ @Override public File getCatalinaBinDir() { final File catalinaHomeDir = getCatalinaHomeDir(); if (catalinaHomeDir == null) { return null; } return new File(catalinaHomeDir, "bin"); } /** * Returns the {@link #getCatalinaBinDir()}/catalina.sh file * @return the {@link #getCatalinaBinDir()}/catalina.sh file */ @Override public File getCatalinaShFile() { final File binDir = getCatalinaBinDir(); if (binDir == null) { return null; } return new File(binDir, "catalina.sh"); } /** * Returns the {@link #getCatalinaBinDir()}/catalina.bat file * @return the {@link #getCatalinaBinDir()}/catalina.bat file */ @Override public File getCatalinaBatFile() { final File binDir = getCatalinaBinDir(); if (binDir == null) { return null; } return new File(binDir, "catalina.bat"); } /** * Returns the {@link #openejbWarDir}/lib directory. * Returns null if {@link #openejbWarDir} is null * @return the {@link #openejbWarDir}/lib directory */ @Override public File getOpenEJBLibDir() { if (openejbWarDir == null) { return null; } return new File(openejbWarDir, "lib"); } /** * Returns the tomee-loader.jar file * @return the tomee-loader.jar file */ @Override public File getOpenEJBTomcatLoaderJar() { return findOpenEJBJar("tomee-loader"); } @Override public File getJavaEEAPIJar() { return findOpenEJBJar("javaee-api"); } /** * Returns the openejb-javaagent.jar file * @return the openejb-javaagent.jar file */ @Override public File getOpenEJBJavaagentJar() { return findOpenEJBJar("openejb-javaagent"); } /** * Returns the openejb-core.jar file * @return the openejb-core.jar file */ @Override public File getOpenEJBCoreJar() { return findOpenEJBJar("openejb-core"); } @Override public File geOpenEJBTomcatCommonJar() { return findOpenEJBJar("tomee-common"); } @Override public File findOpenEJBJar(final String namePrefix) { return findJar(getOpenEJBLibDir(), namePrefix); } @Override public File findOpenEJBWebJar(final String namePrefix) { return findJar(getOpenEJBWebLibDir(), namePrefix); } @Override public File findTomEELibJar(final String prefix) { File jar = findJar(getCatalinaLibDir(), prefix); if (jar == null) { // maybe tomcat/openejb integration final String tomeeWar = System.getProperty("tomee.war"); if (tomeeWar != null) { jar = findJar(new File(tomeeWar, "lib"), prefix); } if ((jar == null || !jar.exists()) && prefix.equals("openejb-jpa-integration")) { jar = JarLocation.jarLocation(MakeTxLookup.class); } } return jar; } private File findJar(final File dir, final String namePrefix) { if (dir == null) { return null; } final File[] files = dir.listFiles(new FilenameFilter() { @Override public boolean accept(final File dir, final String name) { return (name.startsWith(namePrefix + "-") && name.endsWith(".jar")) || name.equals(namePrefix); } }); return files != null && files.length > 0? files[0] : null; } /**Verifies the following: * <ul> * <li>{@link #openejbWarDir} is unpacked</li> * <li>{@link #catalinaHomeDir} is defined </li> * <li>{@link #catalinaBaseDir} is defined </li> * <li>{@link #catalinaHomeDir} exists, is a directory and is readable </li> * <li>{@link #catalinaBaseDir} exists, is a directory and is readable </li> * <li>{@link #getCatalinaLibDir()} exists, is a directory , is readable and is writable </li> * <li>{@link #getCatalinaConfDir()} exists, is a directory , is readable and is writable </li> * <li>{@link #getCatalinaBinDir()} exists, is a directory , is readable</li> * <li>{@link #getCatalinaShFile()} exists, is a File , is readable and is writable </li> * <li>{@link #getCatalinaBatFile()()} exists, is a File , is readable and is writable </li> * <li>{@link #getServerXmlFile()} exists, is a File , is readable and is writable </li> * <li>{@link #getOpenEJBLibDir()} exists, is a directory and is readable </li> * <li>{@link #getOpenEJBTomcatLoaderJar()} is not null, exists, is a File and is readable </li> * <li>{@link #getOpenEJBJavaagentJar()} is not null, exists, is a File and is readable </li> * <li>{@link #getOpenEJBCoreJar()} is not null, exists, is a File and is readable </li> * <li>{@link #getOpenEJBJavaagentJar()} exists, is a File and is readable </li> * </ul> * * @return true if verification succeeds */ @Override public boolean verify() { if (openejbWarDir == null) { addError("OpenEJB war is not unpacked"); } if (getCatalinaHomeDir() == null) { addError("Catalina home directory is not defined"); } if (getCatalinaBaseDir() == null) { addError("Catalina base directory is not defined"); } verifyDirectory("Catalina home", getCatalinaHomeDir()); verifyDirectory("Catalina base", getCatalinaBaseDir()); // if catalina home or base has errors, just give up if (hasErrors()) { return false; } verifyWritableDirectory("Catalina lib", getCatalinaLibDir()); verifyWritableDirectory("Catalina conf", getCatalinaConfDir()); verifyDirectory("Catalina bin", getCatalinaBinDir()); verifyWritableFile("Catalina server.xml", getServerXmlFile()); verifyWritableFile("Catalina catalina.sh", getCatalinaShFile()); verifyWritableFile("Catalina catalina.bat", getCatalinaBatFile()); verifyDirectory("OpenEJB lib", getOpenEJBLibDir()); final File openejbLoaderJar = getOpenEJBTomcatLoaderJar(); if (openejbLoaderJar == null) { addError("OpenEJB loader jar was not found in the OpenEJB lib dir"); } verifyFile("OpenEJB loader jar", openejbLoaderJar); final File openejbJavaagentJar = getOpenEJBJavaagentJar(); if (openejbJavaagentJar == null) { addError("OpenEJB javaagent jar was not found in the OpenEJB lib dir"); } verifyFile("OpenEJB javaagent jar", openejbJavaagentJar); final File openejbCoreJar = getOpenEJBCoreJar(); if (openejbCoreJar != null) { verifyFile("OpenEJB core jar", openejbCoreJar); } return !hasErrors(); } /** * Clears out all verification errors from the underlying list */ @Override public void reset() { errors.clear(); } /** * Checks to see if there are any verification errors * @return true if there are verification errors */ @Override public boolean hasErrors() { return !errors.isEmpty(); } /** * Returns a list of verification errors * @return a list of verification errors */ @Override public List<String> getErrors() { return errors; } private void addError(final String message) { errors.add(message); } private boolean verifyDirectory(final String description, final File file) { if (file == null) { // ignore... files are built up based on other files, and probles // with the root files will have been logged else where return false; } if (!file.exists()) { addError(description + " directory does not exist"); return false; } if (!file.isDirectory()) { addError(description + " directory is not a directory"); return false; } if (!file.canRead()) { addError(description + " directory is not readable"); return false; } return true; } private void verifyWritableDirectory(final String description, final File file) { if (verifyDirectory(description, file)) { verifyWritable(description, file); } } private boolean verifyFile(final String description, final File file) { if (file == null) { // ignore... files are built up based on other files, and probles // with the root files will have been logged else where return false; } if (!file.exists()) { addError(description + " file does not exist"); return false; } if (!file.isFile()) { addError(description + " file is not a file"); return false; } if (!file.canRead()) { addError(description + " file is not readable"); return false; } return true; } private void verifyWritableFile(final String description, final File file) { if (verifyFile(description, file)) { verifyWritable(description, file); } } private void verifyWritable(final String description, final File file) { if (file == null) { // ignore... files are built up based on other files, and probles // with the root files will have been logged else where return; } if (!file.canWrite()) { addError(description + " file is not writable"); } } private File createFile(final String fileName) { if (fileName != null && fileName.trim().length() > 0) { return new File(fileName.trim()); } return null; } @Override public File getOpenEJBWebLibDir() { if (openEJBWebLibDir == null) { openEJBWebLibDir = new File(openejbWarDir, "WEB-INF/lib"); } return openEJBWebLibDir; } @Override public File getTomcatUsersXml() { if (tomcatUsersXml == null) { final File confdir = getCatalinaConfDir(); if (confdir == null) { return null; } tomcatUsersXml = new File(confdir, "tomcat-users.xml"); } return tomcatUsersXml; } @Override public File getSetClasspathSh() { final File binDir = getCatalinaBinDir(); if (binDir == null) { return null; } return new File(binDir, "setclasspath.sh"); } @Override public File getSetClasspathBat() { final File binDir = getCatalinaBinDir(); if (binDir == null) { return null; } return new File(binDir, "setclasspath.bat"); } }