[graphl-cvs] graphl/src/org/mediavirus/graphl/jaxen IterableGraphlAxis.java GraphlXPath.java Docum
Status: Pre-Alpha
Brought to you by:
flo1
From: Flo L. <fl...@us...> - 2006-06-30 14:31:38
|
Update of /cvsroot/graphl/graphl/src/org/mediavirus/graphl/jaxen In directory sc8-pr-cvs2.sourceforge.net:/tmp/cvs-serv11488/src/org/mediavirus/graphl/jaxen Added Files: IterableGraphlAxis.java GraphlXPath.java DocumentNavigator.java GuessNamespaceFunction.java GuessNameFunction.java Log Message: - migrated from jxpath to jaxen, which gives a much cleaner implementation of custom axes --- NEW FILE: DocumentNavigator.java --- /* * Created on 26.06.2006 */ package org.mediavirus.graphl.jaxen; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.List; import org.jaxen.DefaultNavigator; import org.jaxen.NamedAccessNavigator; import org.jaxen.Navigator; import org.jaxen.UnsupportedAxisException; import org.jaxen.XPath; import org.jaxen.saxpath.Axis; import org.jaxen.saxpath.SAXPathException; import org.mediavirus.graphl.graph.Edge; import org.mediavirus.graphl.graph.GraphElement; import org.mediavirus.graphl.graph.Node; public class DocumentNavigator extends DefaultNavigator implements NamedAccessNavigator { /** Singleton implementation. */ private static class Singleton { /** Singleton instance. */ private static DocumentNavigator instance = new DocumentNavigator(); } /** Retrieve the singleton instance of this <code>DocumentNavigator</code>. */ public static Navigator getInstance() { return Singleton.instance; } public Iterator getChildAxisIterator(Object contextNode, String localName, String namespacePrefix, String namespaceURI) throws UnsupportedAxisException { return null; } public Iterator getAttributeAxisIterator(Object contextNode, String localName, String namespacePrefix, String namespaceURI) throws UnsupportedAxisException { // System.out.println("Attrib Iterator: "); // System.out.println(" : context: " + contextNode); // System.out.println(" : locName: " + localName); // System.out.println(" : nsPref.: " + namespacePrefix); // System.out.println(" : nsURI : " + namespaceURI); if (contextNode instanceof GraphElement) { GraphElement element = (GraphElement)contextNode; if (localName != null) { return Collections.singleton(element.getProperty(namespaceURI + localName)).iterator(); } else { return element.getProperties().values().iterator(); } } return null; } public String getElementNamespaceUri(Object element) { return null; } public String getElementName(Object element) { return null; } public String getElementQName(Object element) { return null; } public String getAttributeNamespaceUri(Object attr) { return null; } public String getAttributeName(Object attr) { return null; } public String getAttributeQName(Object attr) { return null; } public boolean isDocument(Object object) { return false; } public boolean isElement(Object object) { return (object instanceof GraphElement); } public boolean isAttribute(Object object) { return (object instanceof String); } public boolean isNamespace(Object object) { return false; } public boolean isComment(Object object) { return false; } public boolean isText(Object object) { return false; } public boolean isProcessingInstruction(Object object) { return false; } public String getCommentStringValue(Object comment) { return null; } public String getElementStringValue(Object element) { return ((GraphElement)element).getId(); } public String getAttributeStringValue(Object attr) { return (String)attr; } public String getNamespaceStringValue(Object ns) { return null; } public String getTextStringValue(Object text) { return null; } public String getNamespacePrefix(Object ns) { return null; } public XPath parseXPath(String xpath) throws SAXPathException { return new GraphlXPath(xpath); } public Iterator getGraphlAxisIterator(int axis, Object contextNode, String localName, String namespacePrefix, String namespaceURI) { // System.out.println("Axis Iterator: " + Axis.lookup(axis)); // System.out.println(" : context: " + contextNode); // System.out.println(" : locName: " + localName); // System.out.println(" : nsPref.: " + namespacePrefix); // System.out.println(" : nsURI : " + namespaceURI); List<GraphElement> matchingElements = new ArrayList<GraphElement>(); if (contextNode instanceof Node) { Node node = (Node)contextNode; if (axis == Axis.BOTH || axis == Axis.OUT) { if (localName != null) { matchingElements.addAll(node.getEdgesFrom(namespaceURI + localName)); } else { matchingElements.addAll(node.getEdgesFrom()); } } if (axis == Axis.BOTH || axis == Axis.IN) { if (localName != null) { matchingElements.addAll(node.getEdgesTo(namespaceURI + localName)); } else { matchingElements.addAll(node.getEdgesTo()); } } } else if (contextNode instanceof Edge) { Edge edge = (Edge)contextNode; if (axis == Axis.BOTH || axis == Axis.OUT) { if (localName != null) { Node n = edge.getTo(); if (n.getType().equals(namespaceURI + localName)) { matchingElements.add(n); } } else { matchingElements.add(edge.getTo()); } } if (axis == Axis.BOTH || axis == Axis.IN) { if (localName != null) { Node n = edge.getFrom(); if (n.getType().equals(namespaceURI + localName)) { matchingElements.add(n); } } else { matchingElements.add(edge.getFrom()); } } } return matchingElements.iterator(); } } --- NEW FILE: GraphlXPath.java --- /* * Created on 26.06.2006 */ package org.mediavirus.graphl.jaxen; import org.jaxen.BaseXPath; import org.jaxen.JaxenException; import org.jaxen.SimpleFunctionContext; import org.jaxen.SimpleNamespaceContext; import org.jaxen.XPathFunctionContext; import org.mediavirus.graphl.GraphlRegistry; public class GraphlXPath extends BaseXPath { public GraphlXPath(String xpathExpr) throws JaxenException { super( xpathExpr, DocumentNavigator.getInstance() ); SimpleFunctionContext fc = new XPathFunctionContext(); fc.registerFunction("http://www.mediavirus.org/graphl#", "guessName", new GuessNameFunction()); fc.registerFunction("http://www.mediavirus.org/graphl#", "guessNamespace", new GuessNamespaceFunction()); this.setFunctionContext(fc); this.setNamespaceContext(GraphlRegistry.instance().getVocabularyRegistry()); } } --- NEW FILE: GuessNameFunction.java --- /* * Created on 27.06.2006 */ package org.mediavirus.graphl.jaxen; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.jaxen.Context; import org.jaxen.Function; import org.jaxen.FunctionCallException; import org.jaxen.Navigator; import org.jaxen.function.StringFunction; import org.mediavirus.util.ParseUtils; public class GuessNameFunction implements Function{ public List<String> call(Context context, List args) throws FunctionCallException { List<String> result = new ArrayList<String>(); if (args.isEmpty()) return result; Navigator navigator = context.getNavigator(); Iterator iterator = args.iterator(); while (iterator.hasNext()) { String next = StringFunction.evaluate(iterator.next(), navigator); result.add(ParseUtils.guessName(next)); } return result; } } --- NEW FILE: GuessNamespaceFunction.java --- /* * Created on 27.06.2006 */ package org.mediavirus.graphl.jaxen; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.jaxen.Context; import org.jaxen.Function; import org.jaxen.FunctionCallException; import org.jaxen.Navigator; import org.jaxen.function.StringFunction; import org.mediavirus.util.ParseUtils; public class GuessNamespaceFunction implements Function { public List<String> call(Context context, List args) throws FunctionCallException { List<String> result = new ArrayList<String>(); if (args.isEmpty()) return result; Navigator navigator = context.getNavigator(); Iterator iterator = args.iterator(); while (iterator.hasNext()) { String next = StringFunction.evaluate(iterator.next(), navigator); result.add(ParseUtils.guessNamespace(next)); } return result; } } --- NEW FILE: IterableGraphlAxis.java --- /* * Created on 26.06.2006 */ package org.mediavirus.graphl.jaxen; import java.util.Iterator; import org.jaxen.ContextSupport; import org.jaxen.NamedAccessNavigator; import org.jaxen.UnsupportedAxisException; import org.jaxen.expr.iter.IterableAxis; public class IterableGraphlAxis extends IterableAxis { int value; public IterableGraphlAxis(int axisValue) { super(axisValue); this.value = axisValue; } @Override public Iterator iterator(Object contextNode, ContextSupport support) throws UnsupportedAxisException { if (support.getNavigator() instanceof DocumentNavigator) { DocumentNavigator nav = (DocumentNavigator)support.getNavigator(); return nav.getGraphlAxisIterator(this.value, contextNode, null, null, null); } return null; } /** * Gets an iterator for the child XPath axis that supports named access. * * @param contextNode the current context node to work from * @param support the additional context information * @param localName the local name of the children to return * @param namespacePrefix the prefix of the namespace of the children to return * @param namespaceURI the URI of the namespace of the children to return * @return an iterator over the children of the context node * @throws UnsupportedAxisException if the child axis is not supported by the model */ public Iterator namedAccessIterator( Object contextNode, ContextSupport support, String localName, String namespacePrefix, String namespaceURI) throws UnsupportedAxisException { if (support.getNavigator() instanceof DocumentNavigator) { DocumentNavigator nav = (DocumentNavigator)support.getNavigator(); return nav.getGraphlAxisIterator(this.value, contextNode, localName, namespacePrefix, namespaceURI); } return null; } /** * Does this axis support named access? * * @param support the additional context information * @return true if named access supported. If not iterator() will be used */ public boolean supportsNamedAccess(ContextSupport support) { return (support.getNavigator() instanceof NamedAccessNavigator); } } |