package com.limegroup.gnutella.xml; import java.io.File; import java.io.FileInputStream; import java.io.FilenameFilter; import java.io.IOException; import java.util.Properties; import com.limegroup.gnutella.util.CommonUtils; /** * This class manages the properties needed by the * com.limegroup.gnutella.server.** package It maintains * default settings for values not set in the saved * settings files. * * <p>Adheres to Singleton design pattern. * So, only one instance of the class gets created. * * @author Anurag Singla */ public class LimeXMLProperties { /** * The default index for responses when there is no there no file and * hecne to no download. The value is set to 2^32 -1 */ public static final long DEFAULT_NONFILE_INDEX = 0x00000000FFFFFFFFl; /** * Properties and the values set by user */ private Properties _properties = new Properties(); /** * An instance of this class. As the constructor of the class is private, * a new * instance of the class cant be made from outside the class. * This makes sure * that only properly initialized instance of the class will be used, * as the users * will be invoking all the methods on this instance only. */ private static LimeXMLProperties _instance = new LimeXMLProperties(); /** * Name of the file that contains the properties used by this class */ private static final String XML_PROPS_FILENAME = "xml.props"; //Property names and defualt values /** * The property that denotes the directory in which XML Schemas will be * kept for querying and responding. */ private static final String XML_SCHEMA_DIR = "XML_SCHEMA_DIR"; /** * The property that denotes the directory in which XML Images will be * kept (for query display). */ private static final String XML_IMAGES_DIR = "XML_IMAGES_DIR"; /** * The property that denotes the directory in which XML Documents will be * kept for querying and responding. */ private static final String XML_DOCS_DIR = "XML_DOCS_DIR"; /** * The propertiy that denotes the directoru in which the mappings * of canonicalized field names to display string will be stores * per schema */ private static final String XML_DISPLAY_PROPS_DIR="XML_DISPLAY_PROPS_DIR"; /** * The name of the directory in which XML Schemas will be * kept for querying and responding. */ private static final String XML_SCHEMA_DIR_DEF = "xml" + File.separator + "schemas" + File.separator; /** * The name of the directory in which XML Images will be * kept (for query display). */ private static final String XML_IMAGES_DIR_DEF = "xml" + File.separator + "misc" + File.separator; /** * The name of the directory in which XML Documents will be * kept for querying and responding. */ private static final String XML_DOCS_DIR_DEF = "xml" + File.separator + "data" + File.separator; /** * The name of the directory in which the field names for various * schemas will have their display strings. */ private static final String XML_DISPLAY_PROPS_DIR_DEF = "xml"+ File.separator+"display"+File.separator; /** * The property that denotes the name of the file that stores the * user information map */ private static final String USER_MAP_FILE = "USER_MAP_FILE"; /** * The name of the file that stores the user information map */ private static final String USER_MAP_FILE_DEF = "UserMap.dat"; /** * Constructor: Initializes various default values, and loads the settings * from the properties file. * It is made private so that all the accesses to the static settings that * it maintains is thru the '_instance' using instance() method * @see LimeXMLProperties#_instance */ private LimeXMLProperties() { //load the properties from file loadProperties(); } /** * Loads the settings from the default properties file */ protected void loadProperties() { //load the properties from file try { _properties.load(new FileInputStream( getPath() + XML_PROPS_FILENAME)); } catch(IOException e) { //no problem, defaults will get used } } /** * If an instance of this object has been already initialized, returns it, * else initializes * a new instance and returns the same * @return The initialized instance of this class */ public static LimeXMLProperties instance() { return _instance; } //Accessor methods /** * Returns the name of the directory in which XML Schemas are located * for querying and responding. */ public String getXMLSchemaDir() { String xmlSchemaDirRel = _properties.getProperty(XML_SCHEMA_DIR, XML_SCHEMA_DIR_DEF); return getPath() + xmlSchemaDirRel ; } /** * Returns the name of the directory in which XML Images are located. */ public String getXMLImagesDir() { String xmlImagesDirRel = _properties.getProperty(XML_IMAGES_DIR, XML_IMAGES_DIR_DEF); return getPath() + xmlImagesDirRel ; } /** * Returns the name of the directory where the XML Documents are located */ public String getXMLDocsDir() { String xmlDocsDirRel = _properties.getProperty(XML_DOCS_DIR, XML_DOCS_DIR_DEF); return getPath() + xmlDocsDirRel; } public String getXMLDisplayPropsDir() { String xmlDisplayPropsDirRel = _properties.getProperty (XML_DISPLAY_PROPS_DIR,XML_DISPLAY_PROPS_DIR_DEF); return getPath() + xmlDisplayPropsDirRel; } /** * Returns the files pertaining to the XML Schemas used for * querying/responding */ public File[] getAllXMLSchemaFiles() { File dir = new File(getXMLSchemaDir()); String[] fileNames = (dir).list( new FilenameFilter() { //the files to be accepted to be returned public boolean accept(File directory, String name) { if(name.endsWith(".xsd")) { return true; } return false; } }); if(fileNames==null || fileNames.length==0) return new File[0]; int z = fileNames.length; File[] files = new File[z]; for(int i=0;i<z;i++){ files[i] = new File(dir,fileNames[i]); } return files; } /** * Returns the name of the file that stores user information map */ public String getUserMapFile() { String userMapFile = _properties.getProperty( USER_MAP_FILE, USER_MAP_FILE_DEF); return getPath() + userMapFile; } /** * Returns the base path for properties */ public String getPath() { //Use LIME_HOME property, if available String limeHome = System.getProperty("LIME_HOME"); if(limeHome == null || limeHome.trim().equals("")) { File libDir = CommonUtils.getUserSettingsDir(); String stringPath = libDir.getAbsolutePath(); if(!stringPath.endsWith(File.separator)) { stringPath = stringPath + File.separator; } return stringPath; } else { if(!limeHome.endsWith("/") && !limeHome.endsWith("\\")) limeHome = limeHome + File.separator; return limeHome + "lib" + File.separator; } // return "e:/work/lib/"; } }//end of class