Java tutorial
/* * 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.karaf.eik.core; import org.apache.karaf.eik.core.equinox.BundleEntry; import org.apache.karaf.eik.core.internal.KarafCorePluginActivator; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Properties; import java.util.StringTokenizer; import org.apache.commons.collections.Predicate; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.FileLocator; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.Status; import org.osgi.framework.Bundle; public final class KarafCorePluginUtils { private static final String INCLUDES_PROPERTY = "${includes}"; /** * Create a JVM system property argument (e.g -DpropertyName=propertyValue). * * @param name * the name of the system property * @param value * the value of the system property * @return the fully constructed system property string */ public static String constructSystemProperty(final String name, final String value) { final StringBuilder sb = new StringBuilder("-D"); sb.append(name); sb.append("="); sb.append(value); return sb.toString(); } /** * * @param model * @return */ public static boolean isKaraf(final KarafPlatformModel model) { if (model.getConfigurationFile(IKarafConstants.ORG_APACHE_KARAF_MANAGEMENT_CFG_FILENAME).toFile() .exists()) { return true; } else if (model instanceof KarafWorkingPlatformModel) { final KarafWorkingPlatformModel workingModel = (KarafWorkingPlatformModel) model; return workingModel.getConfigurationFile(IKarafConstants.ORG_APACHE_KARAF_MANAGEMENT_CFG_FILENAME) .toFile().exists(); } else { return false; } } /** * Filter a list based on a {@link Predicate} * * @param <T> * @param target * @param predicate * @return */ public static <T> List<T> filterList(final Collection<T> target, final Predicate predicate) { final List<T> result = new ArrayList<T>(); for (final T element : target) { if (predicate.evaluate(element)) { result.add(element); } } return result; } /** * Helper method that returns the {@link Bundle}'s location based on its * symbolic name * * @param bundleSymbolicName * the symbolic name of the {@code Bundle} * @return the location of the {@code Bundle} or {@code null} */ public static String getBundleLocation(final String bundleSymbolicName) { final Bundle bundle = Platform.getBundle(bundleSymbolicName); if (bundle == null) { KarafCorePluginActivator.getLogger() .error("Unable to locate bundle with symbolic name: " + bundleSymbolicName); return null; } try { return FileLocator.getBundleFile(bundle).getAbsolutePath(); } catch (final IOException e) { KarafCorePluginActivator.getLogger() .error("Unable to locate bundle with symbolic name: " + bundleSymbolicName, e); return null; } } /** * Construct a {@link List} of {@link BundleEntry} objects from the * specified string. The string is one typically found in the {@code * osgi.bundles} property of an Eclipse {@code config.ini} * * @param osgiBundles * a string is typically found in the {@code osgi.bundles} * property of an Eclipse {@code config.ini} * @return a {@code List} of {@code BundleEntry} objects */ public static List<BundleEntry> getEquinoxBundles(final String osgiBundles) { final String[] bundles = osgiBundles.split(","); final List<BundleEntry> entries = new ArrayList<BundleEntry>(); for (final String s : bundles) { entries.add(BundleEntry.fromString(s.trim())); } return entries; } /** * Searches a directory to the specified depth for library files.<br> * <br> * This method is recursive so be careful with the maximum depth * * @param dir * the directory to being the search * @param list * the list of libraries found * @param maxDepth * the current maximum depth */ public static void getJarFileList(final File dir, final List<File> list, final int maxDepth) { getFileList(dir, ".jar", list, maxDepth); } /** * Searches a directory to the specified depth for library files.<br> * <br> * This method is recursive so be careful with the maximum depth * * @param dir * the directory to being the search * @param extension * the extension to search for * @param list * the list of libraries found * @param maxDepth * the current maximum depth */ public static void getFileList(final File dir, final String extension, final List<File> list, final int maxDepth) { if (dir == null) { throw new IllegalArgumentException("Directory must not be null"); } final File[] files = dir.listFiles(); if (files == null) { return; } for (final File file : files) { if (file.isDirectory() && maxDepth > 0) { getFileList(file, extension, list, maxDepth - 1); } else if (file.getAbsolutePath().endsWith(extension) || file.getAbsolutePath().endsWith(".zip")) { list.add(file); } } } /** * Implementation of join using a {@link StringBuffer} * * @param items * the {@link Collection} of items that will be joined together * @param glue * the string to act as glue in the concatenation * @return the concatenation of the specified items */ public static String join(final Collection<? extends Object> items, final String glue) { final StringBuffer buffer = new StringBuffer(); for (final Object o : items) { if (buffer.length() > 0) { buffer.append(glue); } buffer.append(o.toString()); } return buffer.toString(); } /** * Loads a configuration file relative to the specified base * directory * * @param base * the directory containing the file * @param filename * the relative path to the properties file * @return the {@link Properties} object created from the contents of * configuration file * @throws CoreException * if there is a problem loading the file */ public static Properties loadProperties(final File base, final String filename) throws CoreException { return loadProperties(base, filename, false); } /** * Loads a configuration file relative to the specified base directory. This * method also processes any include directives that import other properties * files relative to the specified property file. * * @param base * the directory containing the file * @param filename * the relative path to the properties file * @param processIncludes * true if {@link #INCLUDES_PROPERTY} statements should be * followed; false otherwise. * @return the {@link Properties} object created from the contents of * configuration file * @throws CoreException * if there is a problem loading the file */ public static Properties loadProperties(final File base, final String filename, final boolean processIncludes) throws CoreException { final File f = new File(base, filename); try { final Properties p = new Properties(); p.load(new FileInputStream(f)); if (processIncludes) { final String includes = p.getProperty(INCLUDES_PROPERTY); if (includes != null) { final StringTokenizer st = new StringTokenizer(includes, "\" ", true); if (st.countTokens() > 0) { String location; do { location = nextLocation(st); if (location != null) { final Properties includeProps = loadProperties(base, location); p.putAll(includeProps); } } while (location != null); } p.remove(INCLUDES_PROPERTY); } } return p; } catch (final IOException e) { final String message = "Unable to load configuration file from configuration directory: " + f.getAbsolutePath(); throw new CoreException( new Status(IStatus.ERROR, KarafCorePluginActivator.PLUGIN_ID, IStatus.OK, message, e)); } } /** * Saves a properties file * * @param file * @param properties */ public static void save(final File file, final Properties properties) { FileOutputStream stream = null; try { stream = new FileOutputStream(file); properties.store(stream, "Configuration File"); //$NON-NLS-1$ stream.flush(); } catch (final IOException e) { KarafCorePluginActivator.getLogger().error("Unable to store properties in: " + file.getAbsolutePath(), e); } finally { if (stream != null) { try { stream.close(); } catch (final IOException e) { // Intentionally left blank } } } } private KarafCorePluginUtils() { throw new AssertionError("Cannot instantiate " + KarafCorePluginUtils.class.getName()); } private static String nextLocation(final StringTokenizer st) { String retVal = null; if (st.countTokens() > 0) { String tokenList = "\" "; StringBuffer tokBuf = new StringBuffer(10); String tok = null; boolean inQuote = false; boolean tokStarted = false; boolean exit = false; while (st.hasMoreTokens() && !exit) { tok = st.nextToken(tokenList); if (tok.equals("\"")) { inQuote = !inQuote; if (inQuote) { tokenList = "\""; } else { tokenList = "\" "; } } else if (tok.equals(" ")) { if (tokStarted) { retVal = tokBuf.toString(); tokStarted = false; tokBuf = new StringBuffer(10); exit = true; } } else { tokStarted = true; tokBuf.append(tok.trim()); } } // Handle case where end of token stream and // still got data if (!exit && tokStarted) { retVal = tokBuf.toString(); } } return retVal; } }