You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@labs.apache.org by jo...@apache.org on 2010/08/09 10:10:50 UTC

svn commit: r983550 [2/2] - in /labs/jaxmas/trunk/JaxMas: ./ .settings/ src/main/java/org/apache/labs/jaxmas/registry/ src/main/java/org/apache/labs/jaxmas/registry/accessor/ src/main/java/org/apache/labs/jaxmas/registry/infomodel/ src/main/java/org/ap...

Modified: labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/sql/AbstractDbDriver.java
URL: http://svn.apache.org/viewvc/labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/sql/AbstractDbDriver.java?rev=983550&r1=983549&r2=983550&view=diff
==============================================================================
--- labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/sql/AbstractDbDriver.java (original)
+++ labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/sql/AbstractDbDriver.java Mon Aug  9 08:10:48 2010
@@ -223,16 +223,19 @@ public abstract class AbstractDbDriver i
 		return result;
 	}
 
-	public void deleteInternationalString(Key pKey, InternationalStringImpl.Type pType) throws JAXRException {
+	@Override
+    public void deleteInternationalString(Key pKey, InternationalStringImpl.Type pType) throws JAXRException {
 		run("DELETE FROM LocalizedStrings WHERE roKey=? AND lsType=?", pKey, pType); //$NON-NLS-1$
 	}
 
-	public void updateInternationalString(Key pKey, InternationalStringImpl.Type pType, final InternationalString pValue) throws JAXRException {
+	@Override
+    public void updateInternationalString(Key pKey, InternationalStringImpl.Type pType, final InternationalString pValue) throws JAXRException {
 	    deleteInternationalString(pKey, pType);
         insertInternationalString(pKey, pType, pValue);
 	}
 
-	public void insertInternationalString(final Key pKey, final InternationalStringImpl.Type pType,
+	@Override
+    public void insertInternationalString(final Key pKey, final InternationalStringImpl.Type pType,
 	        final InternationalString pValue) throws JAXRException {
 	    if (pValue != null) {
 	        new ObjStmtUser("INSERT INTO LocalizedStrings (roKey, lsType, locale, charset, val) VALUES (?, ?, ?, ?, ?)"){ //$NON-NLS-1$

Modified: labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/sql/AssociationTargetPredicate.java
URL: http://svn.apache.org/viewvc/labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/sql/AssociationTargetPredicate.java?rev=983550&r1=983549&r2=983550&view=diff
==============================================================================
--- labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/sql/AssociationTargetPredicate.java (original)
+++ labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/sql/AssociationTargetPredicate.java Mon Aug  9 08:10:48 2010
@@ -28,7 +28,7 @@ import javax.xml.registry.infomodel.Key;
 /**
  * A predicate for searching associations by target.
  */
-public class AssociationTargetPredicate implements Predicate {
+public class AssociationTargetPredicate implements FilterPredicate {
     private final Object key;
 
     /**

Modified: labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/sql/AssociationTypePredicate.java
URL: http://svn.apache.org/viewvc/labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/sql/AssociationTypePredicate.java?rev=983550&r1=983549&r2=983550&view=diff
==============================================================================
--- labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/sql/AssociationTypePredicate.java (original)
+++ labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/sql/AssociationTypePredicate.java Mon Aug  9 08:10:48 2010
@@ -28,7 +28,7 @@ import javax.xml.registry.JAXRException;
 /**
  * A predicate for searching associations by target.
  */
-public class AssociationTypePredicate implements Predicate {
+public class AssociationTypePredicate implements FilterPredicate {
     private final Collection<?> keys;
 
     /**

Modified: labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/sql/CustomObjectTypePredicate.java
URL: http://svn.apache.org/viewvc/labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/sql/CustomObjectTypePredicate.java?rev=983550&r1=983549&r2=983550&view=diff
==============================================================================
--- labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/sql/CustomObjectTypePredicate.java (original)
+++ labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/sql/CustomObjectTypePredicate.java Mon Aug  9 08:10:48 2010
@@ -31,7 +31,7 @@ import org.apache.labs.jaxmas.registry.a
 /**
  * Predicate for restricting a search to a particular registry object type.
  */
-public class CustomObjectTypePredicate implements Predicate {
+public class CustomObjectTypePredicate extends RegistryObjectTypePredicate {
     private final Collection<String> types;
 
     /**
@@ -39,6 +39,7 @@ public class CustomObjectTypePredicate i
      * type.
      */
     public CustomObjectTypePredicate(Collection<String> pTypes) {
+        super(ObjectTypes.REGISTRY_ENTRY);
     	if (pTypes == null  ||  pTypes.isEmpty()) {
     		throw new IllegalArgumentException("The list of custom object types must not be null."); //$NON-NLS-1$
     	}
@@ -54,6 +55,8 @@ public class CustomObjectTypePredicate i
 
     @Override
     public void add(StringBuilder pBuffer, List<Object> pParameters) throws SQLException, JAXRException {
+        super.add(pBuffer, pParameters);
+        pBuffer.append(" AND ");
     	final Collection<String> customTypes = getTypes();
     	pBuffer.append("re.customType IN (SELECT ctro.roKey FROM RegistryObjects ctro JOIN Concepts ctco ON ctro.roType=? AND ctro.roKey=ctco.roKey WHERE ctro.roOwnerRestricting=? AND "); //$NON-NLS-1$
     	pParameters.add(new Integer(ObjectTypes.CONCEPT.ordinal()));

Added: labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/sql/FilterPredicate.java
URL: http://svn.apache.org/viewvc/labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/sql/FilterPredicate.java?rev=983550&view=auto
==============================================================================
--- labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/sql/FilterPredicate.java (added)
+++ labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/sql/FilterPredicate.java Mon Aug  9 08:10:48 2010
@@ -0,0 +1,10 @@
+package org.apache.labs.jaxmas.registry.sql;
+
+
+/**
+ * Marker interface, which indicates that this predicate is used
+ * to filter the result set.
+ */
+public interface FilterPredicate extends Predicate {
+	// No additional methods, or fields.
+}

Propchange: labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/sql/FilterPredicate.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/sql/HsqlDbDriver.java
URL: http://svn.apache.org/viewvc/labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/sql/HsqlDbDriver.java?rev=983550&r1=983549&r2=983550&view=diff
==============================================================================
--- labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/sql/HsqlDbDriver.java (original)
+++ labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/sql/HsqlDbDriver.java Mon Aug  9 08:10:48 2010
@@ -43,12 +43,15 @@ public class HsqlDbDriver extends Abstra
 
     @Override
     public boolean isUnknownTableError(SQLException pException) {
-        if ("S0002".equals(pException.getSQLState())  &&  pException.getErrorCode() == -22) { //$NON-NLS-1$
+        if ("S0002".equals(pException.getSQLState())  &&  pException.getErrorCode() == -22) { // HsqlDb 1
             return true;
         }
-        if ("S1000".equals(pException.getSQLState())  &&  pException.getErrorCode() == -35) { //$NON-NLS-1$
+        if ("S1000".equals(pException.getSQLState())  &&  pException.getErrorCode() == -35) { // HsqlDb 1
         	return true;
         }
+        if ("42501".equals(pException.getSQLState())  &&  pException.getErrorCode() == -5501) { // HsqlDb 2
+            return true;
+        }
         return false;
     }
 

Modified: labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/sql/KeyPredicate.java
URL: http://svn.apache.org/viewvc/labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/sql/KeyPredicate.java?rev=983550&r1=983549&r2=983550&view=diff
==============================================================================
--- labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/sql/KeyPredicate.java (original)
+++ labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/sql/KeyPredicate.java Mon Aug  9 08:10:48 2010
@@ -28,7 +28,7 @@ import javax.xml.registry.JAXRException;
 /**
  * A predicate for the registry objects key.
  */
-public class KeyPredicate implements Predicate {
+public class KeyPredicate implements FilterPredicate {
     private final Collection<?> keys;
 
     /**

Modified: labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/sql/NamePredicate.java
URL: http://svn.apache.org/viewvc/labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/sql/NamePredicate.java?rev=983550&r1=983549&r2=983550&view=diff
==============================================================================
--- labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/sql/NamePredicate.java (original)
+++ labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/sql/NamePredicate.java Mon Aug  9 08:10:48 2010
@@ -30,7 +30,7 @@ import org.apache.labs.jaxmas.registry.i
 /**
  * A predicate for the registry objects name.
  */
-public class NamePredicate implements Predicate {
+public class NamePredicate implements FilterPredicate {
     private final Collection<String> namePatterns;
 
     /**

Modified: labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/sql/OwnerPredicate.java
URL: http://svn.apache.org/viewvc/labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/sql/OwnerPredicate.java?rev=983550&r1=983549&r2=983550&view=diff
==============================================================================
--- labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/sql/OwnerPredicate.java (original)
+++ labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/sql/OwnerPredicate.java Mon Aug  9 08:10:48 2010
@@ -28,7 +28,7 @@ import javax.xml.registry.infomodel.Key;
 /**
  * A predicate for the objects owner.
  */
-public class OwnerPredicate implements Predicate {
+public class OwnerPredicate implements FilterPredicate {
     private final Object key;
     private final boolean restricting;
 

Modified: labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/sql/RegistryObjectLoader.java
URL: http://svn.apache.org/viewvc/labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/sql/RegistryObjectLoader.java?rev=983550&r1=983549&r2=983550&view=diff
==============================================================================
--- labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/sql/RegistryObjectLoader.java (original)
+++ labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/sql/RegistryObjectLoader.java Mon Aug  9 08:10:48 2010
@@ -36,6 +36,7 @@ import javax.xml.registry.infomodel.Regi
 
 import org.apache.labs.jaxmas.registry.accessor.ROAccessor;
 import org.apache.labs.jaxmas.registry.accessor.ROAccessors;
+import org.apache.labs.jaxmas.registry.accessor.ROAccessors.ObjectTypes;
 import org.apache.labs.jaxmas.registry.infomodel.AssociationImpl;
 import org.apache.labs.jaxmas.registry.infomodel.ClassificationImpl;
 import org.apache.labs.jaxmas.registry.infomodel.KeyImpl;
@@ -50,144 +51,166 @@ import org.apache.labs.jaxmas.registry.i
  * objects.
  */
 public class RegistryObjectLoader {
-    private static final ExtensionHandler[] EXTENSION_HANDLERS_ASSOCIATION = new ExtensionHandler[]{
-                        new AssociationExtensionHandler(ROAccessors.ObjectTypes.ASSOCIATION)
-                    };
-    private static final ExtensionHandler[] EXTENSION_HANDLERS_CLASSIFICATION = new ExtensionHandler[]{
-                        new ClassificationExtensionHandler(ROAccessors.ObjectTypes.CLASSIFICATION)
-                    };
-    private static final ExtensionHandler[] EXTENSION_HANDLERS_EXTRINSIC_OBJECT = new ExtensionHandler[]{
-                        new RegistryEntryExtensionHandler(ROAccessors.ObjectTypes.EXTRINSIC_OBJECT)
-                    };
-    private static final ExtensionHandler[] EXTENSION_HANDLERS_SERVICE = new ExtensionHandler[]{
-                        new RegistryEntryExtensionHandler(ROAccessors.ObjectTypes.SERVICE)
-                    };
-    private static final ExtensionHandler[] EXTENSION_HANDLERS_REGISTRY_PACKAGE = new ExtensionHandler[]{
-                        new RegistryEntryExtensionHandler(ROAccessors.ObjectTypes.REGISTRY_PACKAGE)
-                    };
-    private static final ExtensionHandler[] EXTENSION_HANDLERS_REGISTRY_ENTRY = new ExtensionHandler[]{
-                        new RegistryEntryExtensionHandler(ROAccessors.ObjectTypes.REGISTRY_ENTRY)
-                    };
-    private static final ExtensionHandler[] EXTENSION_HANDLERS_CLASSIFICATION_SCHEME = new ExtensionHandler[]{
-                        new RegistryEntryExtensionHandler(ROAccessors.ObjectTypes.CLASSIFICATION_SCHEME)
-                    };
-    private static final ExtensionHandler[] EXTENSION_HANDLERS_CONCEPT = new ExtensionHandler[]{
-                        new ConceptExtensionHandler(ROAccessors.ObjectTypes.CONCEPT)
-                    };
-    private static final ExtensionHandler[] EXTENSION_HANDLERS_NULL_TYPE = new ExtensionHandler[]{
-        new ConceptExtensionHandler(null),
-        new RegistryEntryExtensionHandler(null),
-        new AssociationExtensionHandler(null),
-        new ClassificationExtensionHandler(null)
+    private static final TableHandler[] EXTENSION_HANDLERS_REGISTRY_OBJECT = new TableHandler[]{
+        new DefaultTableHandler()
+    };
+    private static final TableHandler[] EXTENSION_HANDLERS_ASSOCIATION = new TableHandler[]{
+        new DefaultTableHandler(),
+        new AssociationTableHandler(ROAccessors.ObjectTypes.ASSOCIATION)
+    };
+    private static final TableHandler[] EXTENSION_HANDLERS_CLASSIFICATION = new TableHandler[]{
+        new DefaultTableHandler(),
+        new ClassificationTableHandler(ROAccessors.ObjectTypes.CLASSIFICATION)
+    };
+    private static final TableHandler[] EXTENSION_HANDLERS_EXTRINSIC_OBJECT = new TableHandler[]{
+        new DefaultTableHandler(),
+        new RegistryEntryTableHandler(ROAccessors.ObjectTypes.EXTRINSIC_OBJECT)
+    };
+    private static final TableHandler[] EXTENSION_HANDLERS_SERVICE = new TableHandler[]{
+        new DefaultTableHandler(),
+        new RegistryEntryTableHandler(ROAccessors.ObjectTypes.SERVICE)
+    };
+    private static final TableHandler[] EXTENSION_HANDLERS_REGISTRY_PACKAGE = new TableHandler[]{
+        new DefaultTableHandler(),
+        new RegistryEntryTableHandler(ROAccessors.ObjectTypes.REGISTRY_PACKAGE)
+    };
+    private static final TableHandler[] EXTENSION_HANDLERS_REGISTRY_ENTRY = new TableHandler[]{
+        new DefaultTableHandler(),
+        new RegistryEntryTableHandler(ROAccessors.ObjectTypes.REGISTRY_ENTRY)
+    };
+    private static final TableHandler[] EXTENSION_HANDLERS_CLASSIFICATION_SCHEME = new TableHandler[]{
+        new DefaultTableHandler(),
+        new RegistryEntryTableHandler(ROAccessors.ObjectTypes.CLASSIFICATION_SCHEME)
+    };
+    private static final TableHandler[] EXTENSION_HANDLERS_CONCEPT = new TableHandler[]{
+        new DefaultTableHandler(),
+        new ConceptTableHandler(ROAccessors.ObjectTypes.CONCEPT)
+    };
+    private static final TableHandler[] EXTENSION_HANDLERS_NULL_TYPE = new TableHandler[]{
+        new DefaultTableHandler(),
+        new ConceptTableHandler(null),
+        new RegistryEntryTableHandler(null),
+        new AssociationTableHandler(null),
+        new ClassificationTableHandler(null)
     };
-
-    /**
-     * Extension handlers are used for type specific extension tables.
-     */
-    public static abstract class ExtensionHandler {
-        private final ROAccessors.ObjectTypes objectType;
-
-        /**
-         * Creates a new instance with the given object type.
-         */
-        public ExtensionHandler(ROAccessors.ObjectTypes pObjectType) {
-            objectType = pObjectType;
-        }
-
-        /**
-         * Returns the extension handlers object type. May be null, if the
-         * object type is not specified.
-         */
-        protected ROAccessors.ObjectTypes getObjectType() {
-            return objectType;
-        }
-
-        /**
-         * Called to extend the column list of the SQL query for reading registry objects.
-         */
-        protected abstract int addColumns(StringBuilder pBuilder, int pIndex);
-        /**
-         * Called to extend the FROM clause of the SQL query for reading registry objects.
-         */
-        protected abstract void addJoin(StringBuilder pBuilder, List<?> pParameters);
-        /**
-         * Called to pull data from the resul set when reading registry objects.
-         */
-        protected abstract void load(ResultSet pResultSet, RegistryObject pRegistryObject, int pIndex)
-            throws SQLException, JAXRException;
-    }
 
     /**
      * Extension handler for concepts.
      */
-    public static class ConceptExtensionHandler extends ExtensionHandler {
+    public static class ConceptTableHandler extends TableHandler {
         /**
          * Creates a new instance with the given object type.
          */
-        public ConceptExtensionHandler(ROAccessors.ObjectTypes pObjectType) {
+        public ConceptTableHandler(ROAccessors.ObjectTypes pObjectType) {
             super(pObjectType);
         }
 
         @Override
-        protected int addColumns(StringBuilder pBuilder, int pIndex) {
-            pBuilder.append(", c.value"); //$NON-NLS-1$
+        protected int addColumns(StringBuilder pBuilder, String pPrefix, int pIndex) {
+            final String table = getTable(pPrefix, "c");
+            pBuilder.append(", ");
+            pBuilder.append(table);
+            pBuilder.append(".value");
             return pIndex + 1;
         }
 
         @Override
-        protected void addJoin(StringBuilder pBuilder, List<?> pParameters) {
+        protected void addJoin(StringBuilder pBuilder, String pPrefix, List<?> pParameters) {
+            final String table = getTable(pPrefix, "c");
+            final String roTable = getRoTable(pPrefix);
             if (getObjectType() == null) {
-                pBuilder.append(" LEFT OUTER"); //$NON-NLS-1$
+                pBuilder.append(" LEFT OUTER");
             }
-            pBuilder.append(" JOIN Concepts c ON ro.roType="); //$NON-NLS-1$
+            pBuilder.append(" JOIN Concepts ");
+            pBuilder.append(table);
+            pBuilder.append(" ON ");
+            pBuilder.append(roTable);
+            pBuilder.append(".roType="); //$NON-NLS-1$
             pBuilder.append(String.valueOf(ROAccessors.ObjectTypes.CONCEPT.ordinal()));
-            pBuilder.append(" AND ro.roKey=c.roKey"); //$NON-NLS-1$
+            pBuilder.append(" AND "); //$NON-NLS-1$
+            pBuilder.append(roTable);
+            pBuilder.append(".roKey="); //$NON-NLS-1$
+            pBuilder.append(table);
+            pBuilder.append(".roKey"); //$NON-NLS-1$
         }
 
         @Override
-        protected void load(final ResultSet pResultSet, final RegistryObject pRegistryObject, int pIndex)
+        protected int load(final ResultSet pResultSet, final RegistryObject pRegistryObject, int pIndex)
                 throws SQLException, JAXRException {
             if (pRegistryObject instanceof Concept) {
                 final Concept concept = (Concept) pRegistryObject;
                 concept.setValue(pResultSet.getString(pIndex));
             }
+            return pIndex+1;
         }
     }
 
     /**
      * Extension handler for registry entries.
      */
-    public static class RegistryEntryExtensionHandler extends ExtensionHandler {
+    public static class RegistryEntryTableHandler extends TableHandler {
         /**
          * Creates a new instance with the given object type.
          */
-        public RegistryEntryExtensionHandler(ROAccessors.ObjectTypes pObjectType) {
+        public RegistryEntryTableHandler(ROAccessors.ObjectTypes pObjectType) {
             super(pObjectType);
         }
 
         @Override
-        protected int addColumns(StringBuilder pBuilder, int pIndex) {
-            pBuilder.append(", re.customType, re.expiration, re.status, re.stability, re.majorVersion, re.minorVersion, re.userVersion"); //$NON-NLS-1$
+        protected int addColumns(StringBuilder pBuilder, String pPrefix, int pIndex) {
+            final String table = getTable(pPrefix, "re");
+            pBuilder.append(", ");
+            pBuilder.append(table);
+            pBuilder.append(".customType, ");
+            pBuilder.append(table);
+            pBuilder.append(".expiration, ");
+            pBuilder.append(table);
+            pBuilder.append(".status, ");
+            pBuilder.append(table);
+            pBuilder.append(".stability, ");
+            pBuilder.append(table);
+            pBuilder.append(".majorVersion, ");
+            pBuilder.append(table);
+            pBuilder.append(".minorVersion, ");
+            pBuilder.append(table);
+            pBuilder.append(".userVersion");
             return pIndex + 7;
         }
 
         @Override
-        protected void addJoin(StringBuilder pBuilder, List<?> pParameters) {
+        protected void addJoin(StringBuilder pBuilder, String pPrefix, List<?> pParameters) {
+            final String table = getTable(pPrefix, "re");
+            final String roTable = getRoTable(pPrefix);
             final ROAccessors.ObjectTypes objectType = getObjectType();
             if (objectType == null) {
-                pBuilder.append(" LEFT OUTER JOIN RegistryEntries re ON ro.roType="); //$NON-NLS-1$
-                pBuilder.append(String.valueOf(ROAccessors.ObjectTypes.CLASSIFICATION_SCHEME.ordinal()));
-                pBuilder.append(" OR ro.roType="); //$NON-NLS-1$
-                pBuilder.append(String.valueOf(ROAccessors.ObjectTypes.REGISTRY_ENTRY.ordinal()));
+                pBuilder.append(" LEFT OUTER JOIN RegistryEntries ");
+                pBuilder.append(table);
+                pBuilder.append(" ON (");
+                pBuilder.append(roTable);
+                pBuilder.append(".roType=");
+                pBuilder.append(ROAccessors.ObjectTypes.CLASSIFICATION_SCHEME.ordinal());
+                pBuilder.append(" OR ");
+                pBuilder.append(roTable);
+                pBuilder.append(".roType=");
+                pBuilder.append(ROAccessors.ObjectTypes.REGISTRY_ENTRY.ordinal());
+                pBuilder.append(")");
             } else {
-                pBuilder.append(" JOIN RegistryEntries re ON ro.roType="); //$NON-NLS-1$
+                pBuilder.append(" JOIN RegistryEntries ");
+                pBuilder.append(table);
+                pBuilder.append(" ON ");
+                pBuilder.append(roTable);
+                pBuilder.append(".roType=");
                 pBuilder.append(String.valueOf(objectType.ordinal()));
             }
-            pBuilder.append(" AND ro.roKey=re.roKey"); //$NON-NLS-1$
+            pBuilder.append(" AND ");
+            pBuilder.append(roTable);
+            pBuilder.append(".roKey=");
+            pBuilder.append(table);
+            pBuilder.append(".roKey");
         }
 
         @Override
-        protected void load(final ResultSet pResultSet, final RegistryObject pRegistryObject, int pIndex)
+        protected int load(final ResultSet pResultSet, final RegistryObject pRegistryObject, int pIndex)
                 throws SQLException, JAXRException {
             if (pRegistryObject instanceof RegistryEntry) {
                 final RegistryEntryImpl<?> re = (RegistryEntryImpl<?>) pRegistryObject;
@@ -198,38 +221,108 @@ public class RegistryObjectLoader {
                 re.setMinorVersion(pResultSet.getInt(pIndex+5));
                 re.setUserVersion(pResultSet.getString(pIndex+6));
             }
+            return pIndex+7;
+        }
+    }
+
+    /**
+     * Table handlers for standard registry objects.
+     */
+    public static class DefaultTableHandler extends TableHandler {
+        public DefaultTableHandler() {
+            super(null);
+        }
+
+        @Override
+        protected int addColumns(StringBuilder pBuilder, String pPrefix, int pIndex) {
+            final String table = getRoTable(pPrefix);
+            pBuilder.append(table);
+            pBuilder.append(".roKey, ");
+            pBuilder.append(table);
+            pBuilder.append(".roType, ");
+            pBuilder.append(table);
+            pBuilder.append(".roOwnerRestricting, ");
+            pBuilder.append(table);
+            pBuilder.append(".roOwnerCascading, ");
+            pBuilder.append(table);
+            pBuilder.append(".pos");
+            return pIndex + 5;
+        }
+
+        @Override
+        protected void addJoin(StringBuilder pBuilder, String pPrefix, List<?> pParameters) {
+            throw new IllegalStateException("Join not supported"); //$NON-NLS-1$
+        }
+
+        @Override
+        protected int load(ResultSet pResultSet, RegistryObject pRegistryObject, int pIndex)
+                throws SQLException, JAXRException {
+            final RegistryObjectImpl<?> ro = (RegistryObjectImpl<?>) pRegistryObject;
+            ro.setState(ROState.loaded);
+
+            if (pRegistryObject instanceof OwnedRegistryObject<?>) {
+                final OwnedRegistryObject<?> oro = (OwnedRegistryObject<?>) ro;
+                final String ownerKeyRestricting = pResultSet.getString(pIndex+2);
+                final String ownerKeyCascading = pResultSet.getString(pIndex+3);
+                assert(ownerKeyRestricting == null  ||  ownerKeyCascading == null);
+                final String ownerKey = ownerKeyCascading == null ? ownerKeyRestricting : ownerKeyCascading;
+                assert(ownerKey != null);
+                oro.setOwner(new KeyImpl(ownerKey));
+                int pos = pResultSet.getInt(pIndex+4);
+                assert(!pResultSet.wasNull());
+                oro.setPosition(pos);
+            }
+
+            return pIndex+5;
         }
     }
 
     /**
      * Extension handler for associations.
      */
-    public static class AssociationExtensionHandler extends ExtensionHandler {
+    public static class AssociationTableHandler extends TableHandler {
         /**
          * Creates a new instance with the given object type.
          */
-        public AssociationExtensionHandler(ROAccessors.ObjectTypes pObjectType) {
+        public AssociationTableHandler(ROAccessors.ObjectTypes pObjectType) {
             super(pObjectType);
         }
 
         @Override
-        protected int addColumns(StringBuilder pBuilder, int pIndex) {
-            pBuilder.append(", assoc.roKeyTarget, assoc.roKeyType, assoc.num"); //$NON-NLS-1$
+        protected int addColumns(StringBuilder pBuilder, String pPrefix, int pIndex) {
+            final String table = getTable(pPrefix, "assoc");
+            pBuilder.append(", ");
+            pBuilder.append(table);
+            pBuilder.append(".roKeyTarget, ");
+            pBuilder.append(table);
+            pBuilder.append(".roKeyType, ");
+            pBuilder.append(table);
+            pBuilder.append(".num");
             return pIndex + 3;
         }
 
         @Override
-        protected void addJoin(StringBuilder pBuilder, List<?> pParameters) {
+        protected void addJoin(StringBuilder pBuilder, String pPrefix, List<?> pParameters) {
+            final String table = getTable(pPrefix, "assoc");
+            final String roTable = getRoTable(pPrefix);
             if (getObjectType() == null) {
                 pBuilder.append(" LEFT OUTER"); //$NON-NLS-1$
             }
-            pBuilder.append(" JOIN Associations assoc ON ro.roType="); //$NON-NLS-1$
-            pBuilder.append(String.valueOf(ROAccessors.ObjectTypes.ASSOCIATION.ordinal()));
-            pBuilder.append(" AND ro.roKey=assoc.roKey"); //$NON-NLS-1$
+            pBuilder.append(" JOIN Associations ");
+            pBuilder.append(table);
+            pBuilder.append(" ON ");
+            pBuilder.append(roTable);
+            pBuilder.append(".roType=");
+            pBuilder.append(ROAccessors.ObjectTypes.ASSOCIATION.ordinal());
+            pBuilder.append(" AND ");
+            pBuilder.append(roTable);
+            pBuilder.append(".roKey=");
+            pBuilder.append(table);
+            pBuilder.append(".roKey");
         }
 
         @Override
-        protected void load(final ResultSet pResultSet, final RegistryObject pRegistryObject, int pIndex)
+        protected int load(final ResultSet pResultSet, final RegistryObject pRegistryObject, int pIndex)
                 throws SQLException, JAXRException {
             if (pRegistryObject instanceof Association) {
                 final AssociationImpl assoc = (AssociationImpl) pRegistryObject;
@@ -242,38 +335,54 @@ public class RegistryObjectLoader {
                 assoc.setNum(pResultSet.getInt(pIndex+2));
                 assert(!pResultSet.wasNull());
             }
+            return pIndex+3;
         }
     }
 
     /**
      * Extension handler for classifications.
      */
-    public static class ClassificationExtensionHandler extends ExtensionHandler {
+    public static class ClassificationTableHandler extends TableHandler {
         /**
          * Creates a new instance with the given object type.
          */
-        public ClassificationExtensionHandler(ROAccessors.ObjectTypes pObjectType) {
+        public ClassificationTableHandler(ROAccessors.ObjectTypes pObjectType) {
             super(pObjectType);
         }
 
         @Override
-        protected int addColumns(StringBuilder pBuilder, int pIndex) {
-            pBuilder.append(", cl.roKeyConcept, cl.num"); //$NON-NLS-1$
+        protected int addColumns(StringBuilder pBuilder, String pPrefix, int pIndex) {
+            final String table = getTable(pPrefix, "cl");
+            pBuilder.append(", ");
+            pBuilder.append(table);
+            pBuilder.append(".roKeyConcept, ");
+            pBuilder.append(table);
+            pBuilder.append(".num");
             return pIndex + 2;
         }
 
         @Override
-        protected void addJoin(StringBuilder pBuilder, List<?> pParameters) {
+        protected void addJoin(StringBuilder pBuilder, String pPrefix, List<?> pParameters) {
+            final String table = getTable(pPrefix, "cl");
+            final String roTable = getRoTable(pPrefix);
             if (getObjectType() == null) {
                 pBuilder.append(" LEFT OUTER"); //$NON-NLS-1$
             }
-            pBuilder.append(" JOIN Classifications cl ON ro.roType="); //$NON-NLS-1$
-            pBuilder.append(String.valueOf(ROAccessors.ObjectTypes.CLASSIFICATION.ordinal()));
-            pBuilder.append(" AND ro.roKey=cl.roKey"); //$NON-NLS-1$
+            pBuilder.append(" JOIN Classifications ");
+            pBuilder.append(table);
+            pBuilder.append(" ON ");
+            pBuilder.append(roTable);
+            pBuilder.append(".roType=");
+            pBuilder.append(ROAccessors.ObjectTypes.CLASSIFICATION.ordinal());
+            pBuilder.append(" AND ");
+            pBuilder.append(roTable);
+            pBuilder.append(".roKey=");
+            pBuilder.append(table);
+            pBuilder.append(".roKey");
         }
 
         @Override
-        protected void load(final ResultSet pResultSet, final RegistryObject pRegistryObject, int pIndex)
+        protected int load(final ResultSet pResultSet, final RegistryObject pRegistryObject, int pIndex)
                 throws SQLException, JAXRException {
             if (pRegistryObject instanceof Classification) {
                 final ClassificationImpl cl = (ClassificationImpl) pRegistryObject;
@@ -283,42 +392,46 @@ public class RegistryObjectLoader {
                 cl.setNum(pResultSet.getInt(pIndex+1));
                 assert(!pResultSet.wasNull());
             }
+            return pIndex+2;
         }
     }
-    
-    private final String query;
-    private int numPredicates;
-    private final Object[] parameters;
-    private final ROAccessors.ObjectTypes objectType;
-    private final ExtensionHandler[] extensionHandlers;
-    private final int[] indexes;
-
-    private static ROAccessors.ObjectTypes getObjectType(ROAccessors.ObjectTypes pObjectType,
-            Collection<Predicate> pPredicates) {
-        ROAccessors.ObjectTypes type = pObjectType;
-        if (pPredicates != null) {
-            for (Predicate predicate : pPredicates) {
-                if (predicate instanceof RegistryObjectTypePredicate) {
-                    ROAccessors.ObjectTypes predicateType = ((RegistryObjectTypePredicate) predicate).getType();
-                    if (type == null) {
-                        type = predicateType;
-                    } else if (type != predicateType) {
-                        throw new IllegalStateException("Different object types specified."); //$NON-NLS-1$
-                    }
-                }
-            }
+
+    public static class RegistryObjectQuery {
+        private final ROAccessors.ObjectTypes objectType;
+        private final String prefix;
+        private final Collection<FilterPredicate> predicates;
+        private final TableHandler[] tableHandlers;
+
+        public RegistryObjectQuery(ROAccessors.ObjectTypes pObjectType, String pPrefix, Collection<FilterPredicate> pPredicates) {
+            objectType = pObjectType;
+            prefix = pPrefix;
+            predicates = pPredicates;
+            tableHandlers = getExtensionHandlers(pObjectType);
         }
-        return type;
-    }
 
-    /**
-     * Returns the set of extension handlers.
-     */
-    protected ExtensionHandler[] getExtensionHandlers() {
-        return extensionHandlers;
+        public TableHandler[] getTableHandlers() {
+            return tableHandlers;
+        }
+
+        public String getPrefix() {
+            return prefix;
+        }
+
+        public ROAccessors.ObjectTypes getObjectType() {
+            return objectType;
+        }
+
+        public Collection<FilterPredicate> getPredicates() {
+            return predicates;
+        }
     }
+    
+    private final String query;
+    private final Object[] parameters;
+    private final RegistryObjectQuery[] queries;
+    private String sep = " WHERE ";
 
-    private static ExtensionHandler[] getExtensionHandlers(ROAccessors.ObjectTypes pObjectType) {
+    private static TableHandler[] getExtensionHandlers(ROAccessors.ObjectTypes pObjectType) {
         if (pObjectType == null) {
             return EXTENSION_HANDLERS_NULL_TYPE;
         }
@@ -339,127 +452,152 @@ public class RegistryObjectLoader {
                 return EXTENSION_HANDLERS_CLASSIFICATION;
             case ASSOCIATION:
                 return EXTENSION_HANDLERS_ASSOCIATION;
+            case AUDITABLE_EVENT:
+            case EXTERNAL_IDENTIFIER:
+            case EXTERNAL_LINK:
+            case ORGANIZATION:
+            case SERVICE_BINDING:
+            case SPECIFICATION_LINK:
+            case USER:
+                return EXTENSION_HANDLERS_REGISTRY_OBJECT;
             default:
                 return null;
         }
     }
-    
+
+    static String getTable(String pPrefix, String pSuffix) {
+        if (pPrefix == null || pPrefix.length() == 0) {
+            return pSuffix;
+        }
+        return pPrefix + pSuffix;
+    }
+
+    static String getRoTable(String pPrefix) {
+        return getTable(pPrefix, "ro");
+    }
+
     /**
-     * Creates a new instance, which is searching for the given object type.
+     * Creates a new instance, which is searching for the given object types.
      */
-    public RegistryObjectLoader(ROAccessors.ObjectTypes pObjectType, Collection<Predicate> pPredicates)
+    public RegistryObjectLoader(RegistryObjectQuery[] pQueries, Collection<OrderPredicate> pOrderPredicates)
             throws JAXRException, SQLException {
-        objectType = getObjectType(pObjectType, pPredicates);
-        extensionHandlers = getExtensionHandlers(objectType);
+        queries = pQueries;
         final StringBuilder sb = new StringBuilder();
-        sb.append("SELECT ro.roKey, ro.roOwnerRestricting, ro.roOwnerCascading, ro.pos, ro.roType"); //$NON-NLS-1$
-        if (extensionHandlers == null) {
-            indexes = null;
-        } else {
-            indexes = new int[extensionHandlers.length];
-            int index = 6;
-            for (int i = 0;  i < extensionHandlers.length;  i++) {
-                indexes[i] = index;
-                index = extensionHandlers[i].addColumns(sb, index);
+        sb.append("SELECT ");
+        int index = 1;
+        for (RegistryObjectQuery q : queries) {
+            final TableHandler[] tableHandlers = q.getTableHandlers();
+            index = tableHandlers[0].addColumns(sb, q.getPrefix(), index);
+        }
+        for (RegistryObjectQuery q : queries) {
+            final TableHandler[] tableHandlers = q.getTableHandlers();
+            final String prefix = q.getPrefix();
+            for (int j = 1;  j < tableHandlers.length;  j++) {
+                index = tableHandlers[j].addColumns(sb, prefix, index);
             }
         }
-        sb.append(" FROM RegistryObjects ro"); //$NON-NLS-1$
         final List<Object> parameterList = new ArrayList<Object>();
-        if (extensionHandlers != null) {
-            for (int i = 0;  i < extensionHandlers.length;  i++) {
-                extensionHandlers[i].addJoin(sb, parameterList);
-            }
-        }
-        if (objectType != null) {
-            numPredicates++;
-            sb.append(" WHERE ro.roType=?"); //$NON-NLS-1$
-            parameterList.add(objectType);
-        }
-        if (pPredicates != null) {
-            for (Predicate predicate : pPredicates) {
-                if (predicate instanceof RegistryObjectTypePredicate) {
-                    continue;
-                }
-                if (predicate instanceof OrderPredicate) {
-                	continue;
-                }
-                if (numPredicates++ == 0) {
-                    sb.append(" WHERE "); //$NON-NLS-1$
-                } else {
-                    sb.append(" AND "); //$NON-NLS-1$
+        for (int i = 0;  i < queries.length;  i++) {
+            final RegistryObjectQuery q = queries[i];
+            final String table = getRoTable(q.getPrefix());
+            if (i > 0) {
+                sb.append(" JOIN RegistryObjects ");
+                sb.append(table);
+                final ObjectTypes objectType = q.getObjectType();
+                String objectTypeSep = " ON ";
+                if (objectType != null) {
+                    sb.append(objectTypeSep);
+                    objectTypeSep = " AND ";
+                    sb.append(table);
+                    sb.append(".roType=");
+                    sb.append(objectType.ordinal());
                 }
-                predicate.add(sb, parameterList);
+                final Collection<FilterPredicate> predicates = q.getPredicates();
+                appendToQuery(predicates, parameterList, objectTypeSep, sb, false);
+            } else {
+                sb.append(" FROM RegistryObjects ");
+                sb.append(table);
             }
-            int i = 0;
-            for (Predicate predicate : pPredicates) {
-            	if (predicate instanceof OrderPredicate) {
-            		if (i++ == 0) {
-            			sb.append(" ORDER BY "); //$NON-NLS-1$
-            		} else {
-            			sb.append(", "); //$NON-NLS-1$
-            		}
-            		predicate.add(sb, parameterList);
-            	}
+        }
+        for (RegistryObjectQuery q : queries) {
+            final TableHandler[] otTableHandlers = q.getTableHandlers();
+            for (int j = 1;  j < otTableHandlers.length;  j++) {
+                otTableHandlers[j].addJoin(sb, null, parameterList);
             }
         }
+        final RegistryObjectQuery q = queries[0];
+        final ObjectTypes objectType = q.getObjectType();
+        if (objectType != null) {
+            final String table = getRoTable(q.getPrefix());
+            sb.append(sep);
+            sep = " AND ";
+            sb.append(table);
+            sb.append(".roType=");
+            sb.append(objectType.ordinal());
+        }
+        final Collection<FilterPredicate> predicates = q.getPredicates();
+        appendToQuery(predicates, parameterList, sep, sb, true);
+        appendToQuery(pOrderPredicates, parameterList, sb);
         parameters = parameterList.toArray();
         query = sb.toString();
     }
 
     /**
-     * Creates a new instance with the given predicate list.
+     * Creates a new instance, which is searching for the given object type.
      */
-    public RegistryObjectLoader(Collection<Predicate> pPredicates)
-            throws SQLException, JAXRException {
-        this(null, pPredicates);
+    public RegistryObjectLoader(ROAccessors.ObjectTypes pObjectType, Collection<FilterPredicate> pFilterPredicates, Collection<OrderPredicate> pOrderPredicates)
+            throws JAXRException, SQLException {
+        this(new RegistryObjectQuery[]{new RegistryObjectQuery(pObjectType, null, pFilterPredicates)}, pOrderPredicates);
     }
 
     /**
      * Called to read multiple result objects by specifying additional predicates.
      */
     public <RO extends RegistryObject> List<RegistryObject> getResultList(RegistryService pRegistryService,
-            Collection<Predicate> pPredicates) throws JAXRException {
-        if (pPredicates == null  ||  pPredicates.size() == 0) {
+            Collection<FilterPredicate> pFilterPredicates, Collection<OrderPredicate> pOrderPredicates) throws JAXRException {
+        if ((pFilterPredicates == null  ||  pFilterPredicates.size() == 0)  &&
+            (pOrderPredicates == null  ||  pOrderPredicates.size() == 0)) {
             return getResultList(pRegistryService, query, parameters);
         }
         final StringBuilder sb = new StringBuilder(query);
-        final List<Object> params = appendToQuery(pPredicates, sb);
-        return getResultList(pRegistryService, sb.toString(), params.toArray());
-    }
-
-    private List<Object> appendToQuery(Collection<Predicate> pPredicates,
-            final StringBuilder sb) throws JAXRException {
-        final List<Object> params = new ArrayList<Object>(Arrays.asList(parameters));
-        int numPreds = numPredicates;
+        final List<Object> params = new ArrayList<Object>();
+        params.addAll(Arrays.asList(parameters));
         try {
-        	for (Predicate predicate : pPredicates) {
-        		if (predicate instanceof RegistryObjectTypePredicate) {
-        			if (((RegistryObjectTypePredicate) predicate).getType() == objectType) {
-        				continue;
-        			}
-        			throw new IllegalStateException("A different object type must not be specified."); //$NON-NLS-1$
-        		}
-        		if (predicate instanceof OrderPredicate) {
-        			continue;
-        		}
-        		sb.append((numPreds++ == 0) ? " WHERE " : " AND "); //$NON-NLS-1$ //$NON-NLS-2$
-        		predicate.add(sb, params);
-        	}
-        	int i = 0;
-        	for (Predicate predicate : pPredicates) {
-        		if (predicate instanceof OrderPredicate) {
-        			if (i++ == 0) {
-        				sb.append(" ORDER BY "); //$NON-NLS-1$
-        			} else {
-        				sb.append(", "); //$NON-NLS-1$
-        			}
-        			predicate.add(sb, params);
-        		}
-        	}
+            appendToQuery(pFilterPredicates, params, sep, sb, false);
+            appendToQuery(pOrderPredicates, params, sb);
+            return getResultList(pRegistryService, sb.toString(), params.toArray());
         } catch (SQLException e) {
             throw new JAXRException(e);
         }
-        return params;
+    }
+
+    private void appendToQuery(Collection<OrderPredicate> pPredicates,
+            final List<Object> pParams, final StringBuilder sb) throws JAXRException, SQLException {
+        if (pPredicates != null) {
+            String mySep = " ORDER BY ";
+            for (OrderPredicate predicate : pPredicates) {
+                sb.append(mySep);
+                mySep = ", ";
+                predicate.add(sb, pParams);
+            }
+        }
+    }
+
+    private void appendToQuery(Collection<FilterPredicate> pPredicates,
+            final List<Object> pParams, String pSep, final StringBuilder sb,
+            boolean pModifySep)
+            throws JAXRException, SQLException {
+        if (pPredicates != null) {
+            String mySep = pSep;
+            for (FilterPredicate predicate : pPredicates) {
+                sb.append(mySep);
+                mySep = " AND ";
+                if (pModifySep) {
+                    sep = mySep;
+                }
+                predicate.add(sb, pParams);
+            }
+        }
     }
 
     /**
@@ -478,7 +616,7 @@ public class RegistryObjectLoader {
             protected void action(ResultSet pResultSet) throws JAXRException,
                     SQLException {
                 while (pResultSet.next()) {
-                    int type = pResultSet.getInt(5);
+                    int type = pResultSet.getInt(2);
                     assert(!pResultSet.wasNull());
                     final ROAccessor<?> roAcc = ROAccessors.getROAccessor(type);
                     final String key = pResultSet.getString(1);
@@ -498,14 +636,19 @@ public class RegistryObjectLoader {
      */
     @SuppressWarnings("unchecked")
     public <RO extends RegistryObject> RO getResultObject(RegistryService pRegistryService,
-            Collection<Predicate> pPredicates) throws JAXRException {
+            Collection<FilterPredicate> pPredicates) throws JAXRException {
         final RegistryObject ro;
         if (pPredicates == null  ||  pPredicates.isEmpty()) {
             ro = getResultObject(pRegistryService, query, parameters);
         } else {
             final StringBuilder sb = new StringBuilder(query);
-            final List<Object> params = appendToQuery(pPredicates, sb);
-            ro = getResultObject(pRegistryService, sb.toString(), params.toArray());
+            final List<Object> params = new ArrayList<Object>();
+            try {
+                appendToQuery(pPredicates, params, sep, sb, false);
+                ro = getResultObject(pRegistryService, sb.toString(), params.toArray());
+            } catch (SQLException e) {
+                throw new JAXRException(e);
+            }
         }
         return (RO) ro;
     }
@@ -532,7 +675,7 @@ public class RegistryObjectLoader {
             protected void action(ResultSet pResultSet) throws JAXRException,
                     SQLException {
                 if (pResultSet.next()) {
-                    final int type = pResultSet.getInt(5);
+                    final int type = pResultSet.getInt(2);
                     assert(!pResultSet.wasNull());
                     final ROAccessor<?> roAcc = asROAccessor(ROAccessors.getROAccessor(type));
                     final String key = pResultSet.getString(1);
@@ -551,23 +694,10 @@ public class RegistryObjectLoader {
         final RegistryObjectImpl<?> ro = (RegistryObjectImpl<?>) pRegistryObject;
         ro.setState(ROState.loaded);
 
-        if (pRegistryObject instanceof OwnedRegistryObject<?>) {
-            final OwnedRegistryObject<?> oro = (OwnedRegistryObject<?>) ro;
-            final String ownerKeyRestricting = pResultSet.getString(2);
-            final String ownerKeyCascading = pResultSet.getString(3);
-            assert(ownerKeyRestricting == null  ||  ownerKeyCascading == null);
-            final String ownerKey = ownerKeyCascading == null ? ownerKeyRestricting : ownerKeyCascading;
-            assert(ownerKey != null);
-            oro.setOwner(new KeyImpl(ownerKey));
-            int pos = pResultSet.getInt(4);
-            assert(!pResultSet.wasNull());
-            oro.setPosition(pos);
-        }
-
-        if (extensionHandlers != null) {
-            for (int i = 0;  i < extensionHandlers.length;  i++) {
-                extensionHandlers[i].load(pResultSet, pRegistryObject, indexes[i]);
-            }
+        final TableHandler[] tableHandlers = queries[0].tableHandlers;
+        int index = 1;
+        for (int i = 0;  i < tableHandlers.length;  i++) {
+            index = tableHandlers[i].load(pResultSet, pRegistryObject, index);
         }
     }
 
@@ -576,9 +706,15 @@ public class RegistryObjectLoader {
      */
     public void load(RegistryService pRegistryService, final RegistryObject pRegistryObject)
             throws JAXRException {
-        final Predicate predicate = new KeyPredicate(Collections.singleton(pRegistryObject.getKey()));
+        final FilterPredicate predicate = new KeyPredicate(Collections.singleton(pRegistryObject.getKey()));
         final StringBuilder sb = new StringBuilder(query);
-        final List<Object> params = appendToQuery(Collections.singleton(predicate), sb);
+        final List<Object> params = new ArrayList<Object>();
+        params.addAll(Arrays.asList(parameters));
+        try {
+            appendToQuery(Collections.singleton(predicate), params, sep, sb, false);
+        } catch (SQLException e) {
+            throw new JAXRException(e);
+        }
         new ObjQueryUser(sb.toString(), params.toArray()){
             @Override
             protected void action(ResultSet pResultSet) throws JAXRException,
@@ -586,8 +722,8 @@ public class RegistryObjectLoader {
                 if (!pResultSet.next()) {
                     throw new IllegalStateException("Object not found: " + pRegistryObject.getKey()); //$NON-NLS-1$
                 }
-                final int type = pResultSet.getInt(5);
-                assert(!pResultSet.wasNull()  &&  type == objectType.ordinal());
+                final int type = pResultSet.getInt(2);
+                assert(!pResultSet.wasNull()  &&  type == queries[0].objectType.ordinal());
                 load(pRegistryObject, pResultSet);
                 if (pResultSet.next()) {
                     throw new IllegalStateException("Multiple objects found: " + pRegistryObject.getKey()); //$NON-NLS-1$

Modified: labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/sql/RegistryObjectTypePredicate.java
URL: http://svn.apache.org/viewvc/labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/sql/RegistryObjectTypePredicate.java?rev=983550&r1=983549&r2=983550&view=diff
==============================================================================
--- labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/sql/RegistryObjectTypePredicate.java (original)
+++ labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/sql/RegistryObjectTypePredicate.java Mon Aug  9 08:10:48 2010
@@ -29,7 +29,7 @@ import org.apache.labs.jaxmas.registry.a
 /**
  * Predicate for restricting a search to a particular registry object type.
  */
-public class RegistryObjectTypePredicate implements Predicate {
+public class RegistryObjectTypePredicate implements FilterPredicate {
     private final ROAccessors.ObjectTypes type;
 
     /**

Added: labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/sql/TableHandler.java
URL: http://svn.apache.org/viewvc/labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/sql/TableHandler.java?rev=983550&view=auto
==============================================================================
--- labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/sql/TableHandler.java (added)
+++ labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/sql/TableHandler.java Mon Aug  9 08:10:48 2010
@@ -0,0 +1,46 @@
+package org.apache.labs.jaxmas.registry.sql;
+
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.List;
+
+import javax.xml.registry.JAXRException;
+import javax.xml.registry.infomodel.RegistryObject;
+
+import org.apache.labs.jaxmas.registry.accessor.ROAccessors;
+
+/**
+ * Extension handlers are used for type specific extension tables.
+ */
+public abstract class TableHandler {
+    private final ROAccessors.ObjectTypes objectType;
+
+    /**
+     * Creates a new instance with the given object type.
+     */
+    public TableHandler(ROAccessors.ObjectTypes pObjectType) {
+        objectType = pObjectType;
+    }
+
+    /**
+     * Returns the extension handlers object type. May be null, if the
+     * object type is not specified.
+     */
+    protected ROAccessors.ObjectTypes getObjectType() {
+        return objectType;
+    }
+
+    /**
+     * Called to extend the column list of the SQL query for reading registry objects.
+     */
+    protected abstract int addColumns(StringBuilder pBuilder, String pPrefix, int pIndex);
+    /**
+     * Called to extend the FROM clause of the SQL query for reading registry objects.
+     */
+    protected abstract void addJoin(StringBuilder pBuilder, String pPrefix, List<?> pParameters);
+    /**
+     * Called to pull data from the result set when reading registry objects.
+     */
+    protected abstract int load(ResultSet pResultSet, RegistryObject pRegistryObject, int pIndex)
+        throws SQLException, JAXRException;
+}
\ No newline at end of file

Propchange: labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/sql/TableHandler.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: labs/jaxmas/trunk/JaxMas/src/test/java/org/apache/labs/jaxmas/registry/AbstractInitializedJaxMasTestCase.java
URL: http://svn.apache.org/viewvc/labs/jaxmas/trunk/JaxMas/src/test/java/org/apache/labs/jaxmas/registry/AbstractInitializedJaxMasTestCase.java?rev=983550&r1=983549&r2=983550&view=diff
==============================================================================
--- labs/jaxmas/trunk/JaxMas/src/test/java/org/apache/labs/jaxmas/registry/AbstractInitializedJaxMasTestCase.java (original)
+++ labs/jaxmas/trunk/JaxMas/src/test/java/org/apache/labs/jaxmas/registry/AbstractInitializedJaxMasTestCase.java Mon Aug  9 08:10:48 2010
@@ -22,6 +22,7 @@ import java.util.StringTokenizer;
 
 import javax.xml.registry.BusinessLifeCycleManager;
 import javax.xml.registry.BusinessQueryManager;
+import javax.xml.registry.Connection;
 import javax.xml.registry.JAXRException;
 import javax.xml.registry.infomodel.ClassificationScheme;
 import javax.xml.registry.infomodel.Concept;
@@ -31,7 +32,7 @@ import org.junit.After;
 import org.junit.AfterClass;
 import org.junit.Before;
 import org.junit.BeforeClass;
-
+import static org.junit.Assert.*;
 
 /**
  * Abstract base class for test cases, where an initialized database
@@ -49,7 +50,7 @@ public abstract class AbstractInitialize
     /**
      * Called to open a database connection.
      */
-    @Before @Override
+    @Before
     public void setUp() throws Exception {
         initConnection();
     }
@@ -58,7 +59,7 @@ public abstract class AbstractInitialize
      * Called to close the database connection, which has been
      * opened by {@link #setUp()}.
      */
-    @After @Override
+    @After
     public void tearDown() throws Exception {
         closeConnection();
     }
@@ -67,9 +68,9 @@ public abstract class AbstractInitialize
      * Called after the test is finished in order to shutdown the database.
      */
     @AfterClass
-    public void tearDownAfterClass() throws Exception {
-        initConnection();
-        RegistryServiceImpl.getDbDriver(getConnection().getRegistryService()).shutdown();
+    public static void tearDownAfterClass() throws Exception {
+        final Connection connection = newConnection();
+        RegistryServiceImpl.getDbDriver(connection.getRegistryService()).shutdown();
     }
     
     /**

Modified: labs/jaxmas/trunk/JaxMas/src/test/java/org/apache/labs/jaxmas/registry/AbstractJaxMasTestCase.java
URL: http://svn.apache.org/viewvc/labs/jaxmas/trunk/JaxMas/src/test/java/org/apache/labs/jaxmas/registry/AbstractJaxMasTestCase.java?rev=983550&r1=983549&r2=983550&view=diff
==============================================================================
--- labs/jaxmas/trunk/JaxMas/src/test/java/org/apache/labs/jaxmas/registry/AbstractJaxMasTestCase.java (original)
+++ labs/jaxmas/trunk/JaxMas/src/test/java/org/apache/labs/jaxmas/registry/AbstractJaxMasTestCase.java Mon Aug  9 08:10:48 2010
@@ -41,7 +41,7 @@ import org.apache.labs.jaxmas.registry.u
 /**
  * Abstract base class for deriving JaxMas test cases.
  */
-public abstract class AbstractJaxMasTestCase extends TestCase {
+public abstract class AbstractJaxMasTestCase {
     private static final Logger log = DefaultLoggerFactory.getInstance().newLogger(AbstractJaxMasTestCase.class);
     private static Properties properties;
     private static ConnectionFactory connFactory;
@@ -136,8 +136,9 @@ public abstract class AbstractJaxMasTest
     /**
      * This method is used to open a database connection.
      */
-    public void initConnection() throws Exception {
+    public Connection initConnection() throws Exception {
         connection = newConnection();
+        return connection;
     }
 
     /**

Modified: labs/jaxmas/trunk/JaxMas/src/test/java/org/apache/labs/jaxmas/registry/CustomTypeTest.java
URL: http://svn.apache.org/viewvc/labs/jaxmas/trunk/JaxMas/src/test/java/org/apache/labs/jaxmas/registry/CustomTypeTest.java?rev=983550&r1=983549&r2=983550&view=diff
==============================================================================
--- labs/jaxmas/trunk/JaxMas/src/test/java/org/apache/labs/jaxmas/registry/CustomTypeTest.java (original)
+++ labs/jaxmas/trunk/JaxMas/src/test/java/org/apache/labs/jaxmas/registry/CustomTypeTest.java Mon Aug  9 08:10:48 2010
@@ -17,6 +17,7 @@ import javax.xml.registry.infomodel.Regi
 import javax.xml.registry.infomodel.RegistryObject;
 
 import org.apache.labs.jaxmas.registry.infomodel.JaxMasQueryManager;
+import static org.junit.Assert.*;
 import org.junit.Test;
 
 

Modified: labs/jaxmas/trunk/JaxMas/src/test/java/org/apache/labs/jaxmas/registry/DbInitializationTest.java
URL: http://svn.apache.org/viewvc/labs/jaxmas/trunk/JaxMas/src/test/java/org/apache/labs/jaxmas/registry/DbInitializationTest.java?rev=983550&r1=983549&r2=983550&view=diff
==============================================================================
--- labs/jaxmas/trunk/JaxMas/src/test/java/org/apache/labs/jaxmas/registry/DbInitializationTest.java (original)
+++ labs/jaxmas/trunk/JaxMas/src/test/java/org/apache/labs/jaxmas/registry/DbInitializationTest.java Mon Aug  9 08:10:48 2010
@@ -23,6 +23,7 @@ import javax.xml.registry.Connection;
 import javax.xml.registry.infomodel.ClassificationScheme;
 
 import org.junit.Test;
+import static org.junit.Assert.*;
 
 
 /**
@@ -32,16 +33,14 @@ public class DbInitializationTest extend
     /**
 	 * Initializes the database.
 	 */
-	@Test
-	public void testInitDatabase() throws Exception {
+	@Test public void testInitDatabase() throws Exception {
 		super.initDatabase();
 	}
 
 	/**
 	 * Test loading the classification schemes.
 	 */
-	@Test
-	public void testLoadClassificationSchemes() throws Exception {
+	@Test public void testLoadClassificationSchemes() throws Exception {
 		Connection connection = newConnection();
 		final BulkResponse br = connection.getRegistryService().getBusinessQueryManager().findClassificationSchemes(null, null, null, null);
 		boolean objectTypesFound = false;

Modified: labs/jaxmas/trunk/JaxMas/src/test/java/org/apache/labs/jaxmas/registry/TaxonomiesTestCase.java
URL: http://svn.apache.org/viewvc/labs/jaxmas/trunk/JaxMas/src/test/java/org/apache/labs/jaxmas/registry/TaxonomiesTestCase.java?rev=983550&r1=983549&r2=983550&view=diff
==============================================================================
--- labs/jaxmas/trunk/JaxMas/src/test/java/org/apache/labs/jaxmas/registry/TaxonomiesTestCase.java (original)
+++ labs/jaxmas/trunk/JaxMas/src/test/java/org/apache/labs/jaxmas/registry/TaxonomiesTestCase.java Mon Aug  9 08:10:48 2010
@@ -41,6 +41,7 @@ import javax.xml.registry.infomodel.Regi
 import javax.xml.registry.infomodel.Slot;
 
 import org.apache.labs.jaxmas.registry.accessor.ROAccessors;
+import static org.junit.Assert.*;
 import org.junit.Test;
 
 
@@ -58,8 +59,7 @@ public class TaxonomiesTestCase extends 
 	/**
 	 * Tests creating a classification scheme.
 	 */
-	@Test
-	public void testCreateClasssificationScheme() throws Exception {
+	@Test public void testCreateClasssificationScheme() throws Exception {
         removeExistingClassificationScheme();
         final ClassificationScheme cs = createClassificationScheme();
 		deleteClassificationScheme(cs);
@@ -137,8 +137,7 @@ public class TaxonomiesTestCase extends 
     /**
      * Tests creating a concept.
      */
-    @Test
-    public void testCreateConcepts() throws Exception {
+    @Test public void testCreateConcepts() throws Exception {
         removeExistingClassificationScheme();
         final Concept concept = createConcept();
         final Concept otherConcept = loadConcept();
@@ -184,7 +183,7 @@ public class TaxonomiesTestCase extends 
     /**
      * Tests adding slots to a concept.
      */
-    public void testConceptSlots() throws Exception {
+    @Test public void testConceptSlots() throws Exception {
         removeExistingClassificationScheme();
         final Concept concept = createConcept();
         final Slot slot1 = getBusinessLifecycleManager().createSlot(TEST_SLOT1_NAME, "v1", null); //$NON-NLS-1$
@@ -214,7 +213,7 @@ public class TaxonomiesTestCase extends 
     /**
      * Tests the presence of object types.
      */
-    public void testObjectTypesPresent() throws Exception {
+    @Test public void testObjectTypesPresent() throws Exception {
         removeExistingClassificationScheme();
         final Concept concept = createConcept();
         final Concept conceptType = concept.getObjectType();
@@ -232,7 +231,7 @@ public class TaxonomiesTestCase extends 
     /**
      * Tests the creation of classifications.
      */
-    public void testClassifications() throws Exception {
+    @Test public void testClassifications() throws Exception {
         removeExistingClassificationScheme();
         final Concept concept = createConcept();
         final BusinessLifeCycleManager blcm = getBusinessLifecycleManager();
@@ -267,7 +266,7 @@ public class TaxonomiesTestCase extends 
     /**
      * Tests the creation of associations.
      */
-    public void testAssociations() throws Exception {
+    @Test public void testAssociations() throws Exception {
         removeExistingClassificationScheme();
         final Concept concept = createConcept();
         getBusinessLifecycleManager().saveObjects(Collections.singleton(concept));



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@labs.apache.org
For additional commands, e-mail: commits-help@labs.apache.org