You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xmlbeans.apache.org by ce...@apache.org on 2012/07/19 00:26:10 UTC
svn commit: r1363158 - in /xmlbeans/trunk: build.xml
src/store/org/apache/xmlbeans/impl/store/Path.java
src/store/org/apache/xmlbeans/impl/store/Query.java
Author: cezar
Date: Wed Jul 18 22:26:09 2012
New Revision: 1363158
URL: http://svn.apache.org/viewvc?rev=1363158&view=rev
Log:
Add another xpath and xquery interface implementation.
Modified:
xmlbeans/trunk/build.xml
xmlbeans/trunk/src/store/org/apache/xmlbeans/impl/store/Path.java
xmlbeans/trunk/src/store/org/apache/xmlbeans/impl/store/Query.java
Modified: xmlbeans/trunk/build.xml
URL: http://svn.apache.org/viewvc/xmlbeans/trunk/build.xml?rev=1363158&r1=1363157&r2=1363158&view=diff
==============================================================================
--- xmlbeans/trunk/build.xml (original)
+++ xmlbeans/trunk/build.xml Wed Jul 18 22:26:09 2012
@@ -19,7 +19,7 @@
<property name="javac.source" value="1.4"/>
<property name="javac.target" value="1.4"/>
- <property name="version.base" value="2.6.0"/>
+ <property name="version.base" value="2.6.0-RC1"/>
<property name="version.rc" value=""/>
<!-- manifest entries -->
Modified: xmlbeans/trunk/src/store/org/apache/xmlbeans/impl/store/Path.java
URL: http://svn.apache.org/viewvc/xmlbeans/trunk/src/store/org/apache/xmlbeans/impl/store/Path.java?rev=1363158&r1=1363157&r2=1363158&view=diff
==============================================================================
--- xmlbeans/trunk/src/store/org/apache/xmlbeans/impl/store/Path.java (original)
+++ xmlbeans/trunk/src/store/org/apache/xmlbeans/impl/store/Path.java Wed Jul 18 22:26:09 2012
@@ -37,6 +37,7 @@ public abstract class Path
{
public static final String PATH_DELEGATE_INTERFACE = "PATH_DELEGATE_INTERFACE";
public static String _useDelegateForXpath = "use delegate for xpath";
+ public static String _useXdkForXpath = "use xdk for xpath";
public static String _useXqrlForXpath = "use xqrl for xpath";
public static String _useXbeanForXpath = "use xbean for xpath";
public static String _forceXqrl2002ForXpathXQuery = "use xqrl-2002 for xpath";
@@ -45,14 +46,18 @@ public abstract class Path
private static final int USE_XQRL = 0x02;
private static final int USE_DELEGATE = 0x04;
private static final int USE_XQRL2002 = 0x08;
+ private static final int USE_XDK = 0x10;
private static Map _xbeanPathCache = new WeakHashMap();
+ private static Map _xdkPathCache = new WeakHashMap();
private static Map _xqrlPathCache = new WeakHashMap();
private static Map _xqrl2002PathCache = new WeakHashMap();
+ private static Method _xdkCompilePath;
private static Method _xqrlCompilePath;
private static Method _xqrl2002CompilePath;
+ private static boolean _xdkAvailable = true;
private static boolean _xqrlAvailable = true;
private static boolean _xqrl2002Available = true;
@@ -120,9 +125,10 @@ public abstract class Path
int force =
options.hasOption(_useDelegateForXpath) ? USE_DELEGATE
: options.hasOption(_useXqrlForXpath) ? USE_XQRL
+ : options.hasOption(_useXdkForXpath) ? USE_XDK
: options.hasOption(_useXbeanForXpath) ? USE_XBEAN
: options.hasOption(_forceXqrl2002ForXpathXQuery) ? USE_XQRL2002
- : USE_XBEAN|USE_XQRL|USE_DELEGATE; //set all bits except XQRL2002
+ : USE_XBEAN|USE_XQRL|USE_XDK|USE_DELEGATE; //set all bits except XQRL2002
String delIntfName =
options.hasOption(PATH_DELEGATE_INTERFACE) ?
(String)options.get(PATH_DELEGATE_INTERFACE) : _delIntfName;
@@ -141,6 +147,8 @@ public abstract class Path
pathWeakRef = (WeakReference)_xbeanPathCache.get(pathExpr);
if (pathWeakRef == null && (force & USE_XQRL) != 0)
pathWeakRef = (WeakReference)_xqrlPathCache.get(pathExpr);
+ if (pathWeakRef == null && (force & USE_XDK) != 0)
+ pathWeakRef = (WeakReference)_xdkPathCache.get(pathExpr);
if (pathWeakRef == null && (force & USE_XQRL2002) != 0)
pathWeakRef = (WeakReference)_xqrl2002PathCache.get(pathExpr);
@@ -153,6 +161,8 @@ public abstract class Path
path = getCompiledPathXbean(pathExpr, currentVar, namespaces);
if (path == null && (force & USE_XQRL) != 0)
path = getCompiledPathXqrl(pathExpr, currentVar);
+ if (path == null && (force & USE_XDK) != 0)
+ path = getCompiledPathXdk(pathExpr, currentVar);
if (path == null && (force & USE_DELEGATE) != 0)
path = getCompiledPathDelegate(pathExpr, currentVar, namespaces, delIntfName);
if (path == null && (force & USE_XQRL2002) != 0)
@@ -165,6 +175,8 @@ public abstract class Path
errMessage.append(" Trying XBeans path engine...");
if ((force & USE_XQRL) != 0)
errMessage.append(" Trying XQRL...");
+ if ((force & USE_XDK) != 0)
+ errMessage.append(" Trying XDK...");
if ((force & USE_DELEGATE) != 0)
errMessage.append(" Trying delegated path engine...");
if ((force & USE_XQRL2002) != 0)
@@ -176,6 +188,15 @@ public abstract class Path
return path;
}
+ static private synchronized Path getCompiledPathXdk(String pathExpr, String currentVar)
+ {
+ Path path = createXdkCompiledPath(pathExpr, currentVar);
+ if (path != null)
+ _xdkPathCache.put(path._pathKey, new WeakReference(path));
+
+ return path;
+ }
+
static private synchronized Path getCompiledPathXqrl(String pathExpr, String currentVar)
{
Path path = createXqrlCompiledPath(pathExpr, currentVar);
@@ -278,7 +299,7 @@ public abstract class Path
if (!c.isContainer() || _compiledPath.sawDeepDot())
{
- int force = USE_DELEGATE | USE_XQRL;
+ int force = USE_DELEGATE | USE_XQRL | USE_XDK;
return getCompiledPath(_pathKey, force, _currentVar, delIntfName).execute(c, options);
}
return new XbeanPathEngine(_compiledPath, c);
@@ -289,6 +310,47 @@ public abstract class Path
public Map namespaces;
}
+ private static Path createXdkCompiledPath(String pathExpr, String currentVar)
+ {
+ if (!_xdkAvailable)
+ return null;
+
+ if (_xdkCompilePath == null)
+ {
+ try
+ {
+ Class xdkImpl = Class.forName("org.apache.xmlbeans.impl.store.OXQXBXqrlImpl");
+
+ _xdkCompilePath =
+ xdkImpl.getDeclaredMethod("compilePath",
+ new Class[]{String.class, String.class, Boolean.class});
+ }
+ catch (ClassNotFoundException e)
+ {
+ _xdkAvailable = false;
+ return null;
+ }
+ catch (Exception e)
+ {
+ _xdkAvailable = false;
+ throw new RuntimeException(e.getMessage(), e);
+ }
+ }
+
+ Object[] args = new Object[]{pathExpr, currentVar, new Boolean(true)};
+
+ try {
+ return (Path) _xdkCompilePath.invoke(null, args);
+ }
+ catch (InvocationTargetException e) {
+ Throwable t = e.getCause();
+ throw new RuntimeException(t.getMessage(), t);
+ }
+ catch (IllegalAccessException e) {
+ throw new RuntimeException(e.getMessage(), e);
+ }
+ }
+
private static Path createXqrlCompiledPath(String pathExpr, String currentVar)
{
if (!_xqrlAvailable)
Modified: xmlbeans/trunk/src/store/org/apache/xmlbeans/impl/store/Query.java
URL: http://svn.apache.org/viewvc/xmlbeans/trunk/src/store/org/apache/xmlbeans/impl/store/Query.java?rev=1363158&r1=1363157&r2=1363158&view=diff
==============================================================================
--- xmlbeans/trunk/src/store/org/apache/xmlbeans/impl/store/Query.java (original)
+++ xmlbeans/trunk/src/store/org/apache/xmlbeans/impl/store/Query.java Wed Jul 18 22:26:09 2012
@@ -33,10 +33,15 @@ public abstract class Query
{
public static final String QUERY_DELEGATE_INTERFACE = "QUERY_DELEGATE_INTERFACE";
public static String _useDelegateForXQuery = "use delegate for xquery";
+ public static String _useXdkForXQuery = "use xdk for xquery";
private static String _delIntfName;
//private static HashMap _delegateQueryCache = new HashMap();
+ private static HashMap _xdkQueryCache = new HashMap();
+ private static Method _xdkCompileQuery;
+ private static boolean _xdkAvailable = true; // at the beginning assume is available
+
private static HashMap _xqrlQueryCache = new HashMap(); //todo check for memory leaks
private static Method _xqrlCompileQuery;
private static boolean _xqrlAvailable = true; // at the beginning assume is available
@@ -124,6 +129,21 @@ public abstract class Query
((Integer) boundary.get(XPath._NS_BOUNDARY)).intValue();
}
+ if (options.hasOption(_useXdkForXQuery))
+ {
+ //try XDK
+ query = (Query) _xdkQueryCache.get(queryExpr);
+ if (query != null)
+ return query;
+
+ query = createXdkCompiledQuery(queryExpr, currentVar);
+ if (query != null)
+ {
+ _xdkQueryCache.put(queryExpr, query);
+ return query;
+ }
+ }
+
if (!options.hasOption(_useDelegateForXQuery))
{
//try XQRL
@@ -166,6 +186,49 @@ public abstract class Query
return queryExpr;
}
+ private static Query createXdkCompiledQuery(String queryExpr, String currentVar)
+ {
+ //if the XDK engine has been determined unavailable, return null
+ if ( !_xdkAvailable ) return null;
+ if ( _xdkCompileQuery == null)
+ {
+ try
+ {
+ Class xdkImpl = Class.forName("org.apache.xmlbeans.impl.store.OXQXBXqrlImpl");
+
+ _xdkCompileQuery =
+ xdkImpl.getDeclaredMethod("compileQuery",
+ new Class[]{String.class, String.class, Boolean.class});
+ }
+ catch (ClassNotFoundException e)
+ {
+ _xdkAvailable = false;
+ return null;
+ }
+ catch (Exception e)
+ {
+ _xdkAvailable = false;
+ throw new RuntimeException(e.getMessage(), e);
+ }
+ }
+
+ Object[] args = new Object[]{queryExpr, currentVar, new Boolean(true)};
+
+ try
+ {
+ return (Query) _xdkCompileQuery.invoke(null, args);
+ }
+ catch (InvocationTargetException e)
+ {
+ Throwable t = e.getCause();
+ throw new RuntimeException(t.getMessage(), t);
+ }
+ catch (IllegalAccessException e)
+ {
+ throw new RuntimeException(e.getMessage(), e);
+ }
+ }
+
private static Query createXqrlCompiledQuery(String queryExpr, String currentVar)
{
//if the XQRL engine has been determined unavailable, return null
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@xmlbeans.apache.org
For additional commands, e-mail: commits-help@xmlbeans.apache.org