blob: 45f3bc16b613eb57add2a2a872b6148d265ba22f [file] [log] [blame]
/*
* 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.ivy.osgi.core;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Properties;
import org.apache.ivy.util.Message;
public class ExecutionEnvironmentProfileProvider {
private static final String DEFAULT_PROFILES_FILE = "jvm-packages.properties";
private static final String PACKAGE_PREFIX = "org/apache/ivy/osgi/core/";
private Map<String, ExecutionEnvironmentProfile> profileList;
private static final ExecutionEnvironmentProfileProvider INSTANCE;
static {
try {
INSTANCE = new ExecutionEnvironmentProfileProvider();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
public static ExecutionEnvironmentProfileProvider getInstance() {
return INSTANCE;
}
public ExecutionEnvironmentProfileProvider() throws IOException {
profileList = loadDefaultProfileList();
}
public ExecutionEnvironmentProfile getProfile(String profile) {
return profileList.get(profile);
}
public static Map<String, ExecutionEnvironmentProfile> loadDefaultProfileList()
throws IOException {
ClassLoader loader = ExecutionEnvironmentProfileProvider.class.getClassLoader();
InputStream defaultProfilesFile = loader.getResourceAsStream(PACKAGE_PREFIX
+ DEFAULT_PROFILES_FILE);
if (defaultProfilesFile == null) {
throw new FileNotFoundException(PACKAGE_PREFIX + DEFAULT_PROFILES_FILE
+ " not found in the classpath");
}
Properties props = new Properties();
try {
props.load(defaultProfilesFile);
} finally {
defaultProfilesFile.close();
}
Map<String, ExecutionEnvironmentProfile> profiles = new HashMap<String, ExecutionEnvironmentProfile>();
for (Entry<Object, Object> prop : props.entrySet()) {
String propName = (String) prop.getKey();
if (propName.endsWith(".pkglist")) {
String profileName = propName.substring(0, propName.length() - 8);
if (!profiles.containsKey(profileName)) {
loadProfile(props, profiles, profileName);
}
}
}
return profiles;
}
private static ExecutionEnvironmentProfile loadProfile(Properties props,
Map<String, ExecutionEnvironmentProfile> profiles, String name) {
ExecutionEnvironmentProfile profile = new ExecutionEnvironmentProfile(name);
// load the package for the extended profile
String extendedProfileName = props.getProperty(name + ".extends");
if (extendedProfileName != null) {
ExecutionEnvironmentProfile extendedProfile = profiles.get(extendedProfileName);
if (extendedProfile == null) {
// not loaded yet, so load it now
extendedProfile = loadProfile(props, profiles, extendedProfileName);
}
profile.pkgNames.addAll(extendedProfile.pkgNames);
}
// load the actual list
String pkgList = props.getProperty(name + ".pkglist");
String[] packages = pkgList.split(",");
for (int i = 0; i < packages.length; i++) {
String pkg = packages[i].trim();
if (pkg.length() != 0) {
profile.pkgNames.add(pkg);
}
}
profiles.put(name, profile);
String aliasList = props.getProperty(name + ".aliases");
if (aliasList != null) {
String[] aliases = aliasList.split(",");
for (int i = 0; i < aliases.length; i++) {
String alias = aliases[i].trim();
if (alias.length() != 0) {
ExecutionEnvironmentProfile profileAlias = new ExecutionEnvironmentProfile(
alias);
profileAlias.pkgNames = profile.pkgNames;
profiles.put(alias, profileAlias);
}
}
}
Message.verbose("Execution environment profile " + profile.getName() + " loaded");
return profile;
}
}