/************************************************************************************* * Copyright (c) 2013 Red Hat, Inc. and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * JBoss by Red Hat - Initial implementation. ************************************************************************************/ package org.jboss.tools.runtime.core.util; import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.Arrays; 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.TreeSet; import org.jboss.tools.runtime.core.RuntimeCoreActivator; import org.jboss.tools.runtime.core.model.IRuntimeDetector; import org.jboss.tools.runtime.core.model.RuntimeDefinition; import org.jboss.tools.runtime.core.model.RuntimeModel; import org.jboss.tools.runtime.core.model.RuntimePath; public class RuntimeModelUtil { public static final String LINE_DELIMITER = "\n\r\f";//$NON-NLS-1$ public static final String IN_LINE_DELIMITER = ",";//$NON-NLS-1$ /** * This class will read a properties file of the format: * pathName=/some/path/to/jboss,true * * Where the path is a path to be scanned, and the * following boolean is whether this should be scanned * on every startup. * * @param file * @return */ public static Set<RuntimePath> parseRuntimeFile(File file) { try { return parseRuntimeFile(new BufferedInputStream(new FileInputStream(file)), false); } catch(IOException ioe) { RuntimeCoreActivator.pluginLog().logError(ioe); } return new TreeSet<RuntimePath>(); } /** * This class will read an input stream of the format: * pathName=/some/path/to/jboss,true * * Where the path is a path to be scanned, and the * following boolean is whether this should be scanned * on every startup. * * @param file * @return */ public static Set<RuntimePath> parseRuntimeFile(InputStream is, boolean includeMissing) { final Set<RuntimePath> runtimePaths = new HashSet<RuntimePath>(); try { Properties servers = new Properties(); servers.load(is); Enumeration<Object> elements = servers.elements(); while (elements.hasMoreElements()) { String str = (String) elements.nextElement(); StringTokenizer lineTokenizer = new StringTokenizer(str,LINE_DELIMITER); while (lineTokenizer.hasMoreTokens()) { String lineToken = lineTokenizer.nextToken(); StringTokenizer tokenizer = new StringTokenizer( lineToken, IN_LINE_DELIMITER); if (tokenizer.countTokens() == 2) { String location = tokenizer.nextToken(); boolean scan = Boolean.parseBoolean(tokenizer.nextToken()); File locationFile = new File(location); if (locationFile.isDirectory() || (includeMissing && !locationFile.exists())) { RuntimePath tempLocation = new RuntimePath(location); tempLocation.setScanOnEveryStartup(scan); runtimePaths.add(tempLocation); } else { RuntimeCoreActivator.pluginLog().logWarning("Runtime location \"" + location + "\" does not exist or is not a directory"); } } } } } catch (IOException e) { RuntimeCoreActivator.pluginLog().logError(e); } return runtimePaths; } public static void updateTimestamps(RuntimePath[] runtimePaths2) { for (RuntimePath runtimePath : runtimePaths2) { String path = runtimePath.getPath(); if (path != null && !path.isEmpty()) { File directory = new File(path); if (directory.isDirectory()) { runtimePath.setTimestamp(directory.lastModified()); } } } } public static boolean verifyRuntimeDefinitionCreated(RuntimeDefinition runtimeDefinition) { return verifyRuntimeDefinitionCreated(runtimeDefinition, true); } public static boolean verifyRuntimeDefinitionCreated(RuntimeDefinition runtimeDefinition, boolean checkNested) { Set<IRuntimeDetector> detectors = RuntimeCoreActivator.getDefault().getRuntimeDetectors(); return verifyRuntimeDefinitionCreated(runtimeDefinition, detectors, checkNested); } public static boolean verifyRuntimeDefinitionCreated(RuntimeDefinition runtimeDefinition, Set<IRuntimeDetector> detectors, boolean checkNested) { boolean created = false; for (IRuntimeDetector detector:detectors) { if (!detector.isEnabled()) { continue; } if (detector.exists(runtimeDefinition)) { if( !checkNested ) { created = true; } else { List<RuntimeDefinition> includedDefinitions = runtimeDefinition.getIncludedRuntimeDefinitions(); boolean includedCreated = true; for (RuntimeDefinition includedDefinition:includedDefinitions) { if (!verifyRuntimeDefinitionCreated(includedDefinition)) { includedCreated = false; break; } } if (includedCreated) { created = true; break; } } } } return (created); } public static List<RuntimeDefinition> getRuntimeDefinitions(Set<RuntimePath> runtimePaths) { RuntimePath[] paths = (RuntimePath[]) runtimePaths.toArray(new RuntimePath[runtimePaths.size()]); return getRuntimeDefinitions(paths); } public static List<RuntimeDefinition> getRuntimeDefinitions(RuntimePath[] runtimePaths) { ArrayList<RuntimeDefinition> runtimeDefinitions = new ArrayList<RuntimeDefinition>(); for (RuntimePath runtimePath:runtimePaths) { runtimeDefinitions.addAll(Arrays.asList(runtimePath.getRuntimeDefinitions())); } return runtimeDefinitions; } public static List<RuntimeDefinition> getAllDefinitions(RuntimePath runtimePath) { return getAllDefinitions(new RuntimePath[]{runtimePath}); } public static List<RuntimeDefinition> getAllDefinitions(RuntimePath[] runtimePath) { List<RuntimeDefinition> allDefinitions = new ArrayList<RuntimeDefinition>(); for( int i = 0; i < runtimePath.length; i++ ) { allDefinitions.addAll(Arrays.asList(runtimePath[i].getRuntimeDefinitions())); for (RuntimeDefinition runtimeDefinition : runtimePath[i].getRuntimeDefinitions()) { allDefinitions.addAll(runtimeDefinition.getIncludedRuntimeDefinitions()); } } return allDefinitions; } public static boolean runtimeDefinitionsExists(RuntimeDefinition runtimeDefinition, RuntimeModel model) { return runtimeDefinitionsExists(runtimeDefinition, model.getRuntimePaths()); } public static boolean runtimeDefinitionsExists(RuntimeDefinition runtimeDefinition, RuntimePath[] paths) { return runtimeDefinitionsExists(runtimeDefinition, getRuntimeDefinitions(paths)); } public static boolean runtimeDefinitionsExists(RuntimeDefinition runtimeDefinition, List<RuntimeDefinition> allRuntimeDefinitions) { Iterator<RuntimeDefinition> it = allRuntimeDefinitions.iterator(); while(it.hasNext()) { if( it.next().equals(runtimeDefinition)) return true; } return false; } }