All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.coos.messaging.COOSBootstrapHelper Maven / Gradle / Ivy

/**
 * COOS - Connected Objects Operating System (www.connectedobjects.org).
 *
 * Copyright (C) 2009 Telenor ASA and Tellu AS. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This library 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 3 of the License, or
 * (at your option) any later version.
 *
 * This program 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 program.  If not, see .
 *
 * You may also contact one of the following for additional information:
 * Telenor ASA, Snaroyveien 30, N-1331 Fornebu, Norway (www.telenor.no)
 * Tellu AS, Hagalokkveien 13, N-1383 Asker, Norway (www.tellu.no)
 */
package org.coos.messaging;

import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Properties;
import java.util.Set;
import java.util.StringTokenizer;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;

import org.coos.util.macro.MacroSubstituteReader;

import org.coos.messaging.COContainer;
import org.coos.messaging.ConnectingException;
import org.coos.messaging.Plugin;
import org.coos.messaging.util.Log;
import org.coos.messaging.util.LogFactory;

/*
 * @author Knut Eilif Husa, Tellu AS
 *This file contains a helper function for starting a COOS instance with helper funtions. 
 */
public class COOSBootstrapHelper {

	private final static String COOS_CONFIG_FILE = "/coos.xml";
	private final static String CONFIG_FILE_PATTERN = "plugin.*\\.xml";
	private static final String COOS_CONFIG_PATH = "/org/coos/config";
	private static final String COOS_CONFIG_PATH_WTH_SLHS = "org/coos/config";
	private static final Log logger = LogFactory.getLog(COOSBootstrapHelper.class);

	public static COOS startCOOS(String configDir, COContainer container) throws Exception {
		logger.info("Coos starting");
		InputStream is = null;
		try {
			is = new FileInputStream(configDir + COOS_CONFIG_FILE);
		} catch (Exception e1) {
		}
		if (is != null) {
			logger.info("Using provided COOS config");
		} else {
			is = COOSBootstrapHelper.class.getResourceAsStream(COOS_CONFIG_PATH + COOS_CONFIG_FILE);
			logger.info("Using COOS included default configuration");
		}
		is = substitute(is);
		COOS coos = COOSFactory.createCOOS(is, container);
		coos.start();

		return coos;
	}

	/*
	 * Loading plugins
	 */
	public static Plugin[] startPlugins(String configDir, COContainer container) throws Exception {
		// Loading default plugins
		InputStream is = null;
		List pluginConfigFiles = new ArrayList();
		String[] files = getResources();
		for (int i = 0; i < files.length; i++) {
			if (files[i].matches(CONFIG_FILE_PATTERN)) {
				pluginConfigFiles.add(COOSBootstrapHelper.class.getResource(COOS_CONFIG_PATH + "/" + files[i]));
			}
		}

		// Loading specified plugins. Classes must reside on classpath
		File dir = new File(configDir);
		if (dir.isDirectory()) {
			files = dir.list();
			for (int i = 0; i < files.length; i++) {
				if (files[i].matches(CONFIG_FILE_PATTERN)) {
					pluginConfigFiles.add(new File(files[i]).toURI().toURL());
				}
			}
		}

		if (!pluginConfigFiles.isEmpty()) {
			StringBuffer buf = new StringBuffer();
			for (URL conf : pluginConfigFiles) {
				buf.append(conf);
				buf.append("\n");
			}
			logger.info("Starting COOS plugins defined in: \n" + buf.toString());
		}

		Plugin[] plugins = null;
		ArrayList pluginArray = new ArrayList();
		for (Iterator iterator = pluginConfigFiles.iterator(); iterator.hasNext();) {
			URL url = (URL) iterator.next();
			is = url.openStream();
			is = substitute(is);
			plugins = PluginFactory.createPlugins(is, container);

			for (int i = 0; i < plugins.length; i++) {
				pluginArray.add(plugins[i]);
			}
		}

		plugins = pluginArray.toArray(new Plugin[0]);

		// sort plugins according to startlevel
		Plugin[] sortedPlugins = new Plugin[plugins.length];
		int lowest = Integer.MAX_VALUE;
		int lowestIdx = 0;
		for (int i = 0; i < sortedPlugins.length; i++) {
			for (int j = 0; j < plugins.length; j++) {
				if (plugins[j] != null && plugins[j].getStartLevel() < lowest) {
					lowest = plugins[j].getStartLevel();
					lowestIdx = j;
				}
			}
			sortedPlugins[i] = plugins[lowestIdx];
			plugins[lowestIdx] = null;
			lowest = Integer.MAX_VALUE;
		}

		plugins = sortedPlugins;

		for (int i = 0; i < plugins.length; i++) {
			Plugin plugin = plugins[i];
			try {
				plugin.connect();
			} catch (ConnectingException e) {
				e.printStackTrace();
			}
		}
		return plugins;
	}

	private static String[] getResources() throws IOException, URISyntaxException {
		Set result = new HashSet();
		Properties prop = System.getProperties();
		String classpath = prop.getProperty("java.class.path");
		logger.debug("java class path: " + classpath);
		String sfclasspath = prop.getProperty("surefire.test.class.path");
		logger.debug("surefire class path: " + sfclasspath);
		if (sfclasspath != null) {
			classpath = sfclasspath;
		}
		String delim = ":";
		if (prop.getProperty("os.name").contains("Windows")) {
			delim = ";";
		}
		StringTokenizer tokenizer = new StringTokenizer(classpath, delim);
		while (tokenizer.hasMoreElements()) {
			String fileStr = tokenizer.nextToken();
			File dir = new File(fileStr + COOS_CONFIG_PATH);
			if (dir.isDirectory()) {
				/* A file path: easy enough */
				// Add all files that are under classes, skip those under
				// test-classes
				if (dir.getAbsolutePath().replace('\\', '/').matches(".*/classes.*")) {
					logger.debug("Looking for plugin config files in dir: " + dir);
					String[] resources = dir.list();
					for (String res : resources) {
						result.add(res);
					}
				}

			} else if (fileStr.trim().endsWith("jar")) {
				logger.debug("Looking for plugin config files in jar: " + dir);
				/* A JAR path */
				dir = new File(fileStr);
				String jarPath = dir.getAbsolutePath();
				JarFile jar = new JarFile(jarPath);
				Enumeration entries = jar.entries(); // gives ALL
				// entries in jar
				// is a subdirectory
				while (entries.hasMoreElements()) {
					String entry = entries.nextElement().getName();
					if (entry.startsWith(COOS_CONFIG_PATH_WTH_SLHS)) {
						int resourceIdx = entry.lastIndexOf("/");
						if (resourceIdx >= 0) {
							// if it is a subdirectory, we just return the
							// directory name
							entry = entry.substring(resourceIdx + 1);
						}
						result.add(entry);
					}
				}
			}

		}
		return result.toArray(new String[result.size()]);

	}

	private static InputStream substitute(InputStream is) throws IOException {
		InputStreamReader isr = new InputStreamReader(is);
		MacroSubstituteReader msr = new MacroSubstituteReader(isr);
		String substituted = msr.substituteMacros();
		is = new ByteArrayInputStream(substituted.getBytes());
		return is;
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy