// Decompiled by Jad v1.5.8e. Copyright 2001 Pavel Kouznetsov. // Jad home page: http://www.geocities.com/kpdus/jad.html // Decompiler options: packimports(3) fieldsfirst lnc // Source File Name: KeyManager.java package com.icl.saxon; import com.icl.saxon.expr.Expression; import com.icl.saxon.expr.NodeSetExtent; import com.icl.saxon.expr.NodeSetValue; import com.icl.saxon.expr.Value; import com.icl.saxon.expr.XPathException; import com.icl.saxon.om.DocumentInfo; import com.icl.saxon.om.EmptyEnumeration; import com.icl.saxon.om.NamePool; import com.icl.saxon.om.NodeEnumeration; import com.icl.saxon.om.NodeInfo; import com.icl.saxon.pattern.AnyNodeTest; import com.icl.saxon.pattern.Pattern; import com.icl.saxon.sort.LocalOrderComparer; import java.util.Hashtable; import java.util.Vector; // Referenced classes of package com.icl.saxon: // KeyDefinition, Controller, Context public class KeyManager { private Hashtable keyList; public KeyManager() { /* 35*/ keyList = new Hashtable(); } public void setKeyDefinition(KeyDefinition keydefinition) { /* 45*/ Integer integer = new Integer(keydefinition.getFingerprint()); /* 46*/ Vector vector = (Vector)keyList.get(integer); /* 47*/ if(vector == null) { /* 48*/ vector = new Vector(); /* 49*/ keyList.put(integer, vector); } /* 51*/ vector.addElement(keydefinition); } public Vector getKeyDefinitions(int i) { /* 61*/ return (Vector)keyList.get(new Integer(i)); } private synchronized Hashtable buildIndex(int i, DocumentInfo documentinfo, Controller controller) throws XPathException { /* 76*/ Vector vector = getKeyDefinitions(i); /* 77*/ if(vector == null) /* 78*/ throw new XPathException("Key " + controller.getNamePool().getDisplayName(i) + " has not been defined"); /* 83*/ Hashtable hashtable = new Hashtable(); /* 85*/ for(int j = 0; j < vector.size(); j++) /* 86*/ constructIndex(documentinfo, hashtable, (KeyDefinition)vector.elementAt(j), controller, j == 0); /* 90*/ return hashtable; } private void constructIndex(DocumentInfo documentinfo, Hashtable hashtable, KeyDefinition keydefinition, Controller controller, boolean flag) throws XPathException { /* 104*/ Pattern pattern = keydefinition.getMatch(); /* 105*/ Expression expression = keydefinition.getUse(); /* 106*/ DocumentInfo documentinfo1 = documentinfo; /* 107*/ DocumentInfo documentinfo2 = documentinfo1; /* 108*/ Context context = controller.makeContext(documentinfo); /* 110*/ short word0 = pattern.getNodeType(); /* 112*/ com.icl.saxon.om.AxisEnumeration axisenumeration = documentinfo.getEnumeration((byte)4, AnyNodeTest.getInstance()); /* 117*/ if(word0 == 2 || word0 == 0) { /* 119*/ while(axisenumeration.hasMoreElements()) { /* 119*/ NodeInfo nodeinfo = axisenumeration.nextElement(); /* 120*/ if(nodeinfo.getNodeType() == 1) { /* 121*/ for(com.icl.saxon.om.AxisEnumeration axisenumeration1 = nodeinfo.getEnumeration((byte)2, AnyNodeTest.getInstance()); axisenumeration1.hasMoreElements(); processKeyNode(axisenumeration1.nextElement(), pattern, expression, hashtable, context, flag)); /* 126*/ if(word0 == 0) /* 128*/ processKeyNode(nodeinfo, pattern, expression, hashtable, context, flag); } else { /* 131*/ processKeyNode(nodeinfo, pattern, expression, hashtable, context, flag); } } } else { NodeInfo nodeinfo1; /* 137*/ for(; axisenumeration.hasMoreElements(); processKeyNode(nodeinfo1, pattern, expression, hashtable, context, flag)) /* 137*/ nodeinfo1 = axisenumeration.nextElement(); } } private void processKeyNode(NodeInfo nodeinfo, Pattern pattern, Expression expression, Hashtable hashtable, Context context, boolean flag) throws XPathException { /* 149*/ if(pattern.matches(nodeinfo, context)) { /* 150*/ context.setContextNode(nodeinfo); /* 151*/ context.setCurrentNode(nodeinfo); /* 152*/ context.setPosition(1); /* 153*/ context.setLast(1); /* 154*/ Value value = expression.evaluate(context); /* 155*/ if(value instanceof NodeSetValue) { /* 157*/ for(NodeEnumeration nodeenumeration = ((NodeSetValue)value).enumerate(); nodeenumeration.hasMoreElements();) { /* 159*/ NodeInfo nodeinfo1 = nodeenumeration.nextElement(); /* 160*/ String s1 = nodeinfo1.getStringValue(); /* 161*/ NodeSetExtent nodesetextent1 = (NodeSetExtent)hashtable.get(s1); /* 162*/ if(nodesetextent1 == null) { /* 163*/ nodesetextent1 = new NodeSetExtent(LocalOrderComparer.getInstance()); /* 164*/ nodesetextent1.setSorted(true); /* 165*/ hashtable.put(s1, nodesetextent1); } /* 167*/ nodesetextent1.append(nodeinfo); /* 168*/ if(!flag) { /* 172*/ nodesetextent1.setSorted(false); /* 173*/ nodesetextent1.sort(); } } } else { /* 177*/ String s = value.asString(); /* 178*/ context.setContextNode(nodeinfo); /* 179*/ NodeSetExtent nodesetextent = (NodeSetExtent)hashtable.get(s); /* 180*/ if(nodesetextent == null) { /* 181*/ nodesetextent = new NodeSetExtent(LocalOrderComparer.getInstance()); /* 182*/ nodesetextent.setSorted(true); /* 183*/ hashtable.put(s, nodesetextent); } /* 185*/ nodesetextent.append(nodeinfo); /* 186*/ if(!flag) { /* 190*/ nodesetextent.setSorted(false); /* 191*/ nodesetextent.sort(); } } } } public NodeEnumeration selectByKey(int i, DocumentInfo documentinfo, String s, Controller controller) throws XPathException { /* 211*/ Hashtable hashtable = documentinfo.getKeyIndex(this, i); /* 212*/ if(hashtable == null) { /* 213*/ hashtable = buildIndex(i, documentinfo, controller); /* 214*/ documentinfo.setKeyIndex(this, i, hashtable); } /* 216*/ NodeSetExtent nodesetextent = (NodeSetExtent)hashtable.get(s); /* 217*/ return ((NodeEnumeration) (nodesetextent != null ? nodesetextent.enumerate() : EmptyEnumeration.getInstance())); } }