/* * XMLStringUtils.java * * Created on April 24, 2001, 11:03 AM */ package com.limegroup.gnutella.xml; import java.util.ArrayList; import java.util.List; /** * Provides utility methods to process the canonicalized strings we use to * represent XML document structure. The structure is explained below: * <p> * So as to preserve the structure, Structure.Field will be represented as * Structure__Field (Double Underscore is being used as a delimiter to * represent the structure). *<p> * In case of multiple structured values with same name, * as might occur while using + or * in the regular expressions in schema, * those should be represented as using the array index using the __ * notation (withouth the square brackets) * for e.g. myarray[0].name ==> myarray__0__name * <p> * attribute names for an element in the XML schema should be postfixed * with __ (double underscore). * So element.attribute ==> element__attribute__ * @author asingla */ public class XMLStringUtils { /** * Delimiter used to preserve the structural information in the * canonicalized xml field strings */ public static final String DELIMITER = "__"; /** * Breaks the given string (which confirms to the pattern defined above * in the class description) into a list (of strings) such that the * first element in the list is the top most structural element, * and the last one the actual field/attribute name * * @param canonicalizedField The string thats needed to be split * * @return List (of strings) . The first element in the list is the top * most structural element, and the last one the actual field/attribute * name */ public static List split(String canonicalizedField) { List returnList = new ArrayList(); int lastIndex = 0; int index = 0; //break into parts while((index = canonicalizedField.indexOf(DELIMITER, lastIndex)) != -1) { //add the structural part returnList.add(canonicalizedField.substring(lastIndex, index)); lastIndex = index + DELIMITER.length(); //index = index + DELIMITER.length(); } //if the last part is element (and not attribute that ends with the //DELIMITER), then we need to store that also if(!canonicalizedField.endsWith(DELIMITER)) returnList.add(canonicalizedField.substring(lastIndex)); return returnList; } /** * Derives the last field name from a given name. * With input "things__thing__field__", this will return "field". */ public static String getLastField(String canonicalKey, String full) { // things__thing__field__ // ^ ^ // idx idx2 int idx = full.indexOf(canonicalKey); if(idx == -1 || idx != 0) return null; int length = canonicalKey.length(); int idx2 = full.indexOf(DELIMITER, length); if(idx2 == -1) return null; // insert quotes around field name if it has a space. return full.substring(length, idx2); } }