package org.greenstone.gsdl3.util; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.Element; import org.w3c.dom.NodeList; import org.w3c.dom.Document; import org.w3c.dom.Text; import java.util.Map; import java.util.Set; import java.util.HashMap; import java.util.Vector; import java.util.Iterator; import java.util.ArrayList; //import java.util.Locale; import org.apache.log4j.*; /** various functions for extracting info out of GS XML */ public class GSXML { static Logger logger = Logger.getLogger(org.greenstone.gsdl3.util.GSXML.class.getName()); // greenstone xml elements public static final String MESSAGE_ELEM = "message"; public static final String REQUEST_ELEM = "request"; public static final String RESPONSE_ELEM = "response"; public static final String COLLECTION_ELEM = "collection"; public static final String SERVICE_ELEM = "service"; public static final String CLUSTER_ELEM = "serviceCluster"; public static final String SITE_ELEM = "site"; public static final String PARAM_ELEM = "param"; public static final String PARAM_OPTION_ELEM = "option"; public static final String CONTENT_ELEM = "content"; public static final String RESOURCE_ELEM = "resource"; public static final String DOCUMENT_ELEM = "document"; public static final String METADATA_ELEM = "metadata"; public static final String SERVICE_CLASS_ELEM = "serviceRack"; public static final String CLASSIFIER_ELEM = "classifier"; public static final String APPLET_ELEM = "applet"; public static final String APPLET_DATA_ELEM = "appletData"; public static final String CONFIGURE_ELEM = "configure"; public static final String STATUS_ELEM = "status"; public static final String ERROR_ELEM = "error"; public static final String DEFAULT_ELEM = "default"; public static final String STYLESHEET_ELEM = "format";//"stylesheet"; // any additional stylesheet stuff is carried in the message inside this elem public static final String FORMAT_ELEM = "format"; // config files use format - should we use this instead of stylesheet?? public static final String TERM_ELEM = "term"; public static final String SYSTEM_ELEM = "system"; //config file elems public static final String COLLECTION_CONFIG_ELEM = "collectionConfig"; public static final String COLLECTION_BUILD_ELEM = "buildConfig"; public static final String COLLECTION_INIT_ELEM = "collectionInit"; public static final String RECOGNISE_ELEM = "recognise"; public static final String DOC_TYPE_ELEM = "docType"; public static final String SEARCH_ELEM = "search"; public static final String INDEX_ELEM = "index"; public static final String INDEX_STEM_ELEM = "indexStem"; public static final String INDEX_OPTION_ELEM = "indexOption"; public static final String BROWSE_ELEM = "browse"; public static final String DISPLAY_ELEM = "display"; public static final String LEVEL_ELEM = "level"; public static final String SHORTNAME_ATT = "shortname"; public static final String NOTIFY_ELEM = "notify"; public static final String NOTIFY_HOST_ATT = "host"; // elems for the pages to be processed by xslt public final static String PAGE_ELEM = "page"; public final static String CONFIGURATION_ELEM = "config"; public final static String PAGE_REQUEST_ELEM = "pageRequest"; public final static String PAGE_RESPONSE_ELEM = "pageResponse"; public final static String PAGE_EXTRA_ELEM = "pageExtra"; //public final static String DESCRIPTION_ELEM = "description"; public static final String ACTION_ELEM = "action"; public static final String SUBACTION_ELEM = "subaction"; // add on to another elem type to get a list of that type public static final String LIST_MODIFIER = "List"; // greenstone xml attributes public static final String NAME_ATT = "name"; public static final String TO_ATT = "to"; public static final String USER_ID_ATT = "uid"; public static final String FROM_ATT = "from"; public static final String LANG_ATT = "lang"; public static final String TYPE_ATT = "type"; public static final String VALUE_ATT = "value"; public static final String DEFAULT_ATT = "default"; public static final String INFO_ATT = "info"; public static final String ACTION_ATT = "action"; public static final String SUBACTION_ATT = "subaction"; public static final String OUTPUT_ATT = "output"; public static final String ADDRESS_ATT = "address"; public static final String LOCAL_SITE_ATT = "localSite"; public static final String LOCAL_SITE_NAME_ATT = "localSiteName"; public static final String STATUS_ERROR_CODE_ATT = "code"; public static final String STATUS_PROCESS_ID_ATT = "pid"; public static final String PARAM_SHORTNAME_ATT = "shortname"; public static final String PARAM_IGNORE_POS_ATT = "ignore"; public static final String CLASSIFIER_CONTENT_ATT = "content"; public static final String ERROR_TYPE_ATT = "type"; // document stuff public static final String DOC_TYPE_ATT = "docType"; public static final String DOC_NODE_ELEM = "documentNode"; public static final String NODE_CONTENT_ELEM = "nodeContent"; public static final String NODE_STRUCTURE_ELEM = "nodeStructure"; public static final String NODE_ID_ATT = "nodeID"; public static final String NODE_NAME_ATT = "nodeName"; public static final String NODE_TYPE_ATT = "nodeType"; public static final String NODE_RANK_ATT = "rank"; public static final String NODE_TYPE_ROOT = "root"; public static final String NODE_TYPE_INTERNAL = "internal"; public static final String NODE_TYPE_LEAF = "leaf"; public static final String DOC_TYPE_SIMPLE = "simple"; public static final String DOC_TYPE_PAGED = "paged"; public static final String DOC_TYPE_HIERARCHY = "hierarchy"; public static final String SESSION_EXPIRATION = "session_expiration"; public static final String USER_SESSION_CACHE_ATT = "user_session_cache"; // classifier stuff public static final String CLASS_NODE_ELEM = "classifierNode"; public static final String CLASS_NODE_ORIENTATION_ATT = "orientation"; // parameter types public static final String PARAM_TYPE_INTEGER = "integer"; public static final String PARAM_TYPE_BOOLEAN = "boolean"; public static final String PARAM_TYPE_ENUM_START = "enum"; public static final String PARAM_TYPE_ENUM_SINGLE = "enum_single"; public static final String PARAM_TYPE_ENUM_MULTI = "enum_multi"; public static final String PARAM_TYPE_STRING = "string"; public static final String PARAM_TYPE_TEXT = "text"; public static final String PARAM_TYPE_MULTI = "multi"; public static final String PARAM_TYPE_FILE = "file"; public static final String PARAM_TYPE_INVISIBLE = "invisible"; // stuff for text strings public static final String DISPLAY_TEXT_ELEM = "displayItem"; // the following are used for the name attributes public static final String DISPLAY_TEXT_NAME = "name"; public static final String DISPLAY_TEXT_SUBMIT = "submit"; public static final String DISPLAY_TEXT_DESCRIPTION = "description"; // request types // get the module description public static final String REQUEST_TYPE_DESCRIBE = "describe"; // startup a process public static final String REQUEST_TYPE_PROCESS = "process"; // get the status of an ongoing process public static final String REQUEST_TYPE_STATUS = "status"; // system type request - eg reload a collection public static final String REQUEST_TYPE_SYSTEM = "system"; // page requests to the Receptionist/Actions public static final String REQUEST_TYPE_PAGE = "page"; // used to be cgi // get any format info for a service public static final String REQUEST_TYPE_FORMAT = "format"; // modify the requests public static final String REQUEST_TYPE_MESSAGING = "messaging"; // service types public static final String SERVICE_TYPE_QUERY = "query"; public static final String SERVICE_TYPE_RETRIEVE = "retrieve"; public static final String SERVICE_TYPE_BROWSE = "browse"; public static final String SERVICE_TYPE_APPLET = "applet"; public static final String SERVICE_TYPE_PROCESS = "process"; public static final String SERVICE_TYPE_ENRICH = "enrich"; public static final String FLAX_PAGE = "flaxPage"; public static final String FLAX_PAGE_GENERATION = "FlaxPageGeneration"; // system command types and attributes public static final String SYSTEM_TYPE_CONFIGURE = "configure"; public static final String SYSTEM_TYPE_ACTIVATE = "activate"; public static final String SYSTEM_TYPE_DEACTIVATE = "deactivate"; public static final String SYSTEM_SUBSET_ATT = "subset"; public static final String SYSTEM_MODULE_TYPE_ATT = "moduleType"; public static final String SYSTEM_MODULE_NAME_ATT = "moduleName"; // communicator types public static final String COMM_TYPE_SOAP_JAVA = "soap"; // error types public static final String ERROR_TYPE_SYNTAX = "syntax"; public static final String ERROR_TYPE_SYSTEM = "system"; public static final String ERROR_TYPE_INVALID_ID = "invalid_id"; public static final String ERROR_TYPE_OTHER = "other"; // some system wide param names public static final String SUBSET_PARAM = "subset"; //for plugin public static final String PLUGIN_ELEM = "plugin"; public static final String IMPORT_ELEM = "import"; //for authentication public static final String AUTHEN_NODE_ELEM="authenticationNode"; public static final String USER_NODE_ELEM="userNode"; /** takes a list of elements, and returns an array of strings * of the values of attribute att_name */ public static String [] getAttributeValuesFromList(Element list, String att_name) { NodeList children = list.getChildNodes(); int num_nodes = children.getLength(); String []ids = new String[num_nodes]; for (int i=0; i0)) { current_node = current_node.getNextSibling(); if (current_node == null) break; // end of the list if (!current_node.getNodeName().equals(node_name)) { continue; // not a valid node } list_att = ((Element)current_node).getAttribute(sort_att); } parent_node.insertBefore(cloned_elem, current_node); return cloned_elem; } /** Returns the appropriate language element from a display elem, * display is the containing element, name is the name of the element to * look for, lang is the preferred language, lang_default is the fall back * lang if neither lang is found, will return the first one it finds*/ public static String getDisplayText(Element display, String name, String lang, String lang_default) { String def = null; String first = null; NodeList elems = display.getElementsByTagName(DISPLAY_TEXT_ELEM); if (elems.getLength() == 0) return ""; for (int i=0; i " ' & in the original with their entities public static String xmlSafe(String original) { StringBuffer filtered = new StringBuffer(original.length()); char c; for (int i=0; i') { filtered.append(">"); } else if (c == '<') { filtered.append("<"); } else if (c == '"') { filtered.append("""); } else if (c == '&') { filtered.append("&"); } else if (c == '\'') { filtered.append("'"); } else { filtered.append(c); } } return filtered.toString(); } // replaces < > " ' & entities with their originals public static String unXmlSafe(String original) { StringBuffer filtered = new StringBuffer(original.length()); char c; for (int i=0; i"); } else if (entity.equals("lt")) { filtered.append("<"); } else if (entity.equals("apos")) { filtered.append("'"); } else if (entity.equals("amp")) { filtered.append("&"); } else if (entity.equals("quot")) { filtered.append("\""); } else { filtered.append("&"+entity+";"); } i = pos; } else { filtered.append(c); } } return filtered.toString(); } public static void printXMLNode(Node e) { printXMLNode(e, 0) ; } public static String xmlNodeToString(Node e){ StringBuffer sb = new StringBuffer(""); xmlNodeToString(sb,e,0); return sb.toString(); } private static void xmlNodeToString(StringBuffer sb, Node e, int depth){ for (int i=0 ; i\n") ; else { sb.append(">\n") ; int len = children.getLength(); for (int i = 0; i < len; i++) { xmlNodeToString(sb,children.item(i), depth + 1); } for (int i=0 ; i\n"); } } public static void printXMLNode(Node e, int depth) { //recursive method call using DOM API... for (int i=0 ; i") ; else { System.out.println('>') ; int len = children.getLength(); for (int i = 0; i < len; i++) { printXMLNode(children.item(i), depth + 1); } for (int i=0 ; i"); } } }