package jadex.xml; import jadex.commons.IFilter; import jadex.commons.SReflect; import java.util.Comparator; import javax.xml.namespace.QName; /** * Superclass for XML object type/link infos. */ public class AbstractInfo { //-------- attributes -------- protected XMLInfo xmlinfo; /** The xml path elements without tag. */ protected QName[] xmlpathelementswithouttag; /** The info id. */ protected int id; /** The id cnt. */ protected static int idcnt; //-------- constructors -------- /** * Create an abstract OAV info. */ public AbstractInfo(XMLInfo xmlinfo) { this.xmlinfo = xmlinfo; synchronized(AbstractInfo.class) { this.id = idcnt++; } } //-------- methods -------- /** * Get the xmlinfo. * @return The xmlinfo. */ public XMLInfo getXMLInfo() { return xmlinfo; } /** * Get the xmlpath */ public String getXMLPath() { return xmlinfo!=null? xmlinfo.getXMLPath(): null; } /** * Get the xml tag */ public QName getXMLTag() { return xmlinfo!=null && xmlinfo.getXMLPathElements()!=null? xmlinfo.getXMLPathElements()[xmlinfo.getXMLPathElements().length-1]: null; } /** * Get the xmlpath as string array. * @return The xmlpath. */ public QName[] getXMLPathElements() { return xmlinfo!=null && xmlinfo.getXMLPathElements()!=null? xmlinfo.getXMLPathElements(): null; } /** * Get the xml path without element. */ public QName[] getXMLPathElementsWithoutElement() { if(xmlpathelementswithouttag==null && xmlinfo!=null) { xmlpathelementswithouttag = new QName[xmlinfo.getXMLPathElements().length-1]; System.arraycopy(xmlinfo.getXMLPathElements(), 0, xmlpathelementswithouttag, 0, xmlinfo.getXMLPathElements().length-1); } return xmlpathelementswithouttag; } /** * Get the xml path without element. * / public String getXMLPathWithoutElement() { String ret = ""; String xmlpath = getXMLPath(); if(xmlpath!=null) { int idx = xmlpath.lastIndexOf("/"); if(idx!=-1) ret = xmlpath.substring(0, idx-1); } return ret; }*/ /** * Get the path depth. */ public int getXMLPathDepth() { return xmlinfo!=null && xmlinfo.getXMLPathElements()!=null? xmlinfo.getXMLPathElements().length-1: 0; } /** * Get the filter. * @return the filter */ public IFilter getFilter() { return xmlinfo!=null ? xmlinfo.getFilter() : null; } /** * Get the id. * @return The id. */ public int getId() { return this.id; } /** * Get a string representation of this mapping. */ public String toString() { StringBuffer sbuf = new StringBuffer(); sbuf.append(SReflect.getInnerClassName(getClass())); if(xmlinfo!=null && xmlinfo.getXMLPath()!=null) { sbuf.append("(path="); sbuf.append(xmlinfo.getXMLPath()); } sbuf.append(")"); return sbuf.toString(); } //-------- helper classes -------- /** * Compare infos by specificity of the XML path. */ public static final class SpecificityComparator implements Comparator { public int compare(Object arg0, Object arg1) { AbstractInfo m1 = (AbstractInfo)arg0; AbstractInfo m2 = (AbstractInfo)arg1; int ret = m2.getXMLPathDepth() - m1.getXMLPathDepth(); if(ret==0) ret = m1.getXMLPath()!=null && m2.getXMLPath()==null? 1: m1.getXMLPath()==null && m2.getXMLPath()!=null? -1: m1.getXMLPath()!=null && m2.getXMLPath()!=null? m2.getXMLPath().length() - m1.getXMLPath().length()!=0? m2.getXMLPath().length() - m1.getXMLPath().length(): m2.getXMLPath().compareTo(m1.getXMLPath()): 0; if(ret==0) ret = m1.getFilter()!=null && m2.getFilter()==null? 1: m1.getFilter()==null && m2.getFilter()!=null? -1: m1.getFilter()!=null && m2.getFilter()!=null? m2.getId()-m1.getId() : 0; if(ret==0) throw new RuntimeException("Info should differ: "+m1+" "+m2); return ret; } } }