/* * 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.openejb.config; import org.apache.openejb.EnvProps; import org.apache.openejb.OpenEJBException; import org.apache.openejb.config.sys.Deployments; import org.apache.openejb.config.sys.JaxbOpenejb; import org.apache.openejb.config.sys.Openejb; import org.apache.openejb.loader.IO; import org.apache.openejb.loader.SystemInstance; import org.apache.openejb.util.LogCategory; import org.apache.openejb.util.Logger; import org.apache.xbean.finder.ResourceFinder; import java.io.File; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; public class ConfigUtils { public static Logger logger = Logger.getInstance(LogCategory.OPENEJB, "org.apache.openejb.util.resources"); /** * TODO: It should always be assumed that the path input param is a URL or URL-convertible */ public static String searchForConfiguration(final String rawPath) throws OpenEJBException { File file; if (rawPath != null) { for (final String path : deducePaths(rawPath)) { /* * [1] Try finding the file relative to the current working * directory */ file = new File(path); if (file.exists() && file.isFile()) { return file.getAbsolutePath(); } /* * [2] Try finding the file relative to the openejb.base directory */ try { file = SystemInstance.get().getBase().getFile(path); if (file != null && file.exists() && file.isFile()) { return file.getAbsolutePath(); } } catch (final IOException ignored) { // no-op } /* * [3] Try finding the file relative to the openejb.home directory */ try { file = SystemInstance.get().getHome().getFile(path); if (file != null && file.exists() && file.isFile()) { return file.getAbsolutePath(); } } catch (final IOException ignored) { // no-op } /* * [4] Consider path as a URL resource - file: and jar: accepted by JaxbOpenejb.readConfig(String configFile) */ try { // verify if it's parseable according to URL rules new URL(path); // it's so return it unchanged return path; } catch (final MalformedURLException ignored) { // no-op } } logger.warning("Cannot find the configuration file [" + rawPath + "], Trying conf/openejb.xml instead."); } try { /* * [4] Try finding the standard openejb.xml file relative to the * openejb.base directory */ file = SystemInstance.get().getConf("openejb.xml"); if (file != null && file.exists() && file.isFile()) { return file.getAbsolutePath(); } /* * [5] Try finding the standard openejb.conf file relative to the */ file = SystemInstance.get().getConf("openejb.conf"); if (file != null && file.exists() && file.isFile()) { return file.getAbsolutePath(); } file = SystemInstance.get().getConf("openejb.json"); if (file != null && file.exists() && file.isFile()) { return file.getAbsolutePath(); } if (EnvProps.extractConfigurationFiles()) { /* [6] No config found! Create a config for them * using the default.openejb.conf file from * the openejb-x.x.x.jar */ final File confDir = SystemInstance.get().getConf(null); if (confDir != null && confDir.exists()) { final File config = new File(confDir, "openejb.xml"); logger.info("Cannot find the configuration file [conf/openejb.xml]. Creating one at " + config.getAbsolutePath()); file = createConfig(config); } else { logger.info("Cannot find the configuration file [conf/openejb.xml]. Will attempt to create one for the beans deployed."); } } } catch (final IOException e) { e.printStackTrace(); throw new OpenEJBException("Could not locate config file: ", e); } return file == null || !file.exists() ? null : file.getAbsolutePath(); } public static String[] deducePaths(final String path) { if (path.endsWith(".xml")) { // try json too, this is just a common way matching our defaults return new String[]{path, path.substring(0, path.length() - "xml".length()) + "json"}; } return new String[]{path}; } public static File createConfig(final File config) throws IOException { final ResourceFinder finder = new ResourceFinder(""); final URL defaultConfig = finder.find("default.openejb.conf"); IO.copy(IO.read(defaultConfig), config); return config; } public static boolean addDeploymentEntryToConfig(final String jarLocation, final Openejb config) { final File jar = new File(jarLocation); /* Check to see if the entry is already listed */ for (final Deployments d : config.getDeployments()) { if (d.getFile() != null) { try { final File target = SystemInstance.get().getBase().getFile(d.getFile(), false); /* * If the jar entry is already there, no need * to add it to the config or go any futher. */ if (jar.equals(target)) { return false; } } catch (final IOException e) { /* No handling needed. If there is a problem * resolving a config file path, it is better to * just add this jars path explicitly. */ } } else if (d.getDir() != null) { try { final File target = SystemInstance.get().getBase().getFile(d.getDir(), false); final File jarDir = jar.getAbsoluteFile().getParentFile(); /* * If a dir entry is already there, the jar * will be loaded automatically. No need * to add it explicitly to the config or go * any futher. */ if (jarDir != null && jarDir.equals(target)) { return false; } } catch (final IOException e) { /* No handling needed. If there is a problem * resolving a config file path, it is better to * just add this jars path explicitly. */ } } } /* Create a new Deployments entry */ final Deployments dep = JaxbOpenejb.createDeployments(); dep.setFile(jarLocation); config.getDeployments().add(dep); return true; } }