// $Id$
// Author: Jean-Guilhem Rouel
// (c) COPYRIGHT MIT, ERCIM and Keio, 2005.
// Please first read the full copyright statement in file COPYRIGHT.html
package org.w3c.css.properties;
import org.w3c.css.util.Utf8Properties;
import org.w3c.css.util.Util;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Hashtable;
import java.util.Iterator;
/**
* PropertiesLoader
* Created: Aug 16, 2005 5:19:44 PM
* This class is a factory used to load all the CSS-related properties files
*/
public class PropertiesLoader {
public static Utf8Properties DEFAULT_PROFILE;
/**
* Basic configuration of the CSS Validator
*/
public static Utf8Properties config;
/**
* The association between properties and the media for which they
* are defined
*/
public static Utf8Properties mediaProperties;
/**
* The list of existing profiles associated to their Java classes
*/
private static Utf8Properties profiles;
/**
* This hashtable contains for each css profile, an Utf8Properties
* containing all its properties
*/
private static Hashtable allProps;
private static Utf8Properties loadProfile(String profile,
String profilePath)
throws IOException {
Utf8Properties result = new Utf8Properties();
InputStream f = null;
URL url = null;
// the url of the properties file of the selected profiles
if (profilePath != null) {
String[] profilePathes = profilePath.split(",");
for (String p : profilePathes) {
url = PropertiesLoader.class.getResource(p);
f = url.openStream();
// we load the properties
result.load(f);
f.close();
}
// we add the profile to the profiles Hashtable
allProps.put(new String(profile), result);
if (Util.onDebug) {
System.out.println(profile + " profile loaded");
}
}
return result;
}
/**
* @param profile the profile needed
* @return an Utf8Properties containing all the properties
* for the specified profile
*/
public static Utf8Properties getProfile(String profile) {
Utf8Properties result = (Utf8Properties) allProps.get(profile);
// the profile has not been loaded yet
if (result == null) {
result = new Utf8Properties();
String profilePath = (String) profiles.get(profile);
if (profilePath != null && !profilePath.equals("")) {
try {
return loadProfile(profile, profilePath);
} catch (IOException e) {
if (Util.onDebug) {
System.out.println(PropertiesLoader.class +
": Error while loading " + profile +
" profile");
}
e.printStackTrace();
}
}
// if the wanted profile is unknown, or there has been an error
// while loading it, we return the default profile
return DEFAULT_PROFILE;
} else {
return result;
}
}
/**
* This method returns the profile to check against
* when no special profile is specified
* This function is used in CssPropertyFactory
*
* @return the sorted list of profiles as a string array
*/
public static String[] getProfiles() {
//initializations
Iterator it = profiles.keySet().iterator();
ArrayList res = new ArrayList();
String profil;
while (it.hasNext()) {
// we filtered only the profiles that we're interessted in
profil = it.next().toString();
if (profil.startsWith("css") && !profil.contains("svg")) {
res.add(profil);
}
}
// we sort them
Collections.sort(res);
// return them as an array
return (String[]) res.toArray(new String[res.size()]);
}
static {
config = new Utf8Properties();
mediaProperties = new Utf8Properties();
profiles = new Utf8Properties();
allProps = new Hashtable();
InputStream f = null;
try {
// first, we load the general Config
URL url = PropertiesLoader.class.getResource("Config.properties");
f = url.openStream();
config.load(f);
// the media associated to each property
url = PropertiesLoader.class.getResource(config.getProperty("media"));
f = url.openStream();
mediaProperties.load(f);
// profiles
url = PropertiesLoader.class.getResource(config.getProperty("profilesProperties"));
f = url.openStream();
profiles.load(f);
// Load the default profile
String defaultProfile = config.getProperty("defaultProfile");
String defaultPath = (String) profiles.get(defaultProfile);
DEFAULT_PROFILE = loadProfile(defaultProfile, defaultPath);
if (Util.onDebug) {
System.out.println("Default profile (" + defaultProfile + ") loaded");
}
} catch (Exception e) {
System.err.println(PropertiesLoader.class + ": Error while loading default config");
e.printStackTrace();
} finally {
try {
if (f != null) {
f.close();
f = null;
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}