Author: jochen
Date: Mon Aug 31 13:30:54 2009
New Revision: 809581

URL: http://svn.apache.org/viewvc?rev=809581&view=rev
Log:
Added support for custom object type queries via the JaxMasQueryManager.

Added:
    
labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/infomodel/JaxMasQueryManager.java
    
labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/sql/CustomObjectTypePredicate.java
Modified:
    
labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/accessor/OrganizationAccessor.java
    
labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/accessor/RegistryEntryAccessor.java
    
labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/infomodel/BusinessQueryManagerImpl.java
    
labs/jaxmas/trunk/JaxMas/src/test/java/org/apache/labs/jaxmas/registry/CustomTypeTest.java

Modified: 
labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/accessor/OrganizationAccessor.java
URL: 
http://svn.apache.org/viewvc/labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/accessor/OrganizationAccessor.java?rev=809581&r1=809580&r2=809581&view=diff
==============================================================================
--- 
labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/accessor/OrganizationAccessor.java
 (original)
+++ 
labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/accessor/OrganizationAccessor.java
 Mon Aug 31 13:30:54 2009
@@ -31,12 +31,14 @@
 import javax.xml.registry.infomodel.Key;
 import javax.xml.registry.infomodel.Organization;
 
+import org.apache.labs.jaxmas.registry.accessor.ROAccessors.ObjectTypes;
 import org.apache.labs.jaxmas.registry.infomodel.NLSStrings;
 import org.apache.labs.jaxmas.registry.infomodel.OrganizationImpl;
 import org.apache.labs.jaxmas.registry.infomodel.RegistryServiceImpl;
 import org.apache.labs.jaxmas.registry.sql.NamePredicate;
 import org.apache.labs.jaxmas.registry.sql.Predicate;
 import org.apache.labs.jaxmas.registry.sql.RegistryObjectLoader;
+import org.apache.labs.jaxmas.registry.sql.RegistryObjectTypePredicate;
 
 
 /**
@@ -104,6 +106,7 @@
                        Collection<?> pSpecifications, Collection<?> 
pExternalIdentifiers,
                        Collection<?> pExternalLinks) throws JAXRException {
            final List<Predicate> predicates = new ArrayList<Predicate>();
+           predicates.add(new 
RegistryObjectTypePredicate(ObjectTypes.ORGANIZATION));
            if (pFindQualifiers != null  &&  !pFindQualifiers.isEmpty()) {
                for (Object o : pFindQualifiers) {
                        if (!FindQualifier.EXACT_NAME_MATCH.equals(o)) {

Modified: 
labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/accessor/RegistryEntryAccessor.java
URL: 
http://svn.apache.org/viewvc/labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/accessor/RegistryEntryAccessor.java?rev=809581&r1=809580&r2=809581&view=diff
==============================================================================
--- 
labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/accessor/RegistryEntryAccessor.java
 (original)
+++ 
labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/accessor/RegistryEntryAccessor.java
 Mon Aug 31 13:30:54 2009
@@ -20,14 +20,25 @@
 
 import java.lang.reflect.UndeclaredThrowableException;
 import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
 
+import javax.xml.registry.FindQualifier;
 import javax.xml.registry.JAXRException;
+import javax.xml.registry.RegistryService;
 import javax.xml.registry.infomodel.Key;
 import javax.xml.registry.infomodel.RegistryEntry;
 
+import org.apache.labs.jaxmas.registry.accessor.ROAccessors.ObjectTypes;
+import org.apache.labs.jaxmas.registry.infomodel.NLSStrings;
 import org.apache.labs.jaxmas.registry.infomodel.RegistryEntryImpl;
 import org.apache.labs.jaxmas.registry.infomodel.RegistryServiceImpl;
+import org.apache.labs.jaxmas.registry.sql.CustomObjectTypePredicate;
+import org.apache.labs.jaxmas.registry.sql.NamePredicate;
+import org.apache.labs.jaxmas.registry.sql.Predicate;
 import org.apache.labs.jaxmas.registry.sql.RegistryObjectLoader;
+import org.apache.labs.jaxmas.registry.sql.RegistryObjectTypePredicate;
 
 
 /**
@@ -75,4 +86,45 @@
     public RegistryObjectLoader getRegistryObjectLoader() {
         return rol;
     }
+
+    @SuppressWarnings("unchecked")
+       private static List<RegistryEntry> asRegistryEntryList(List<?> pList) {
+       return (List<RegistryEntry>) pList;
+    }
+    
+       public List<RegistryEntry> findRegistryEntries(RegistryService 
pRegistryService,
+                       Collection<String> pFindQualifiers,
+                       Collection<String> pObjectTypes, Collection<String> 
pNamePatterns,
+                       Collection<String> pDescriptionPatterns,
+                       Collection<?> pClassifications, Collection<?> 
pExternalIdentifiers,
+                       Collection<?> pExternalLinks) throws JAXRException {
+           final List<Predicate> predicates = new ArrayList<Predicate>();
+           predicates.add(new 
RegistryObjectTypePredicate(ObjectTypes.REGISTRY_ENTRY));
+           if (pFindQualifiers != null  &&  !pFindQualifiers.isEmpty()) {
+               for (Object o : pFindQualifiers) {
+                       if (!FindQualifier.EXACT_NAME_MATCH.equals(o)) {
+                               throw new 
JAXRException(RegistryServiceImpl.getNLSStrings(pRegistryService).format(NLSStrings.UNSUPPORTED_PARAMETER,
 "pFindQualifiers")); //$NON-NLS-1$
+                       }
+               }
+               }
+           if (pObjectTypes != null  &&  !pObjectTypes.isEmpty()) {
+               predicates.add(new CustomObjectTypePredicate(pObjectTypes));
+           }
+               if (pNamePatterns != null  &&  !pNamePatterns.isEmpty()) {
+                   predicates.add(new NamePredicate(pNamePatterns));
+               }
+               if (pDescriptionPatterns != null  &&  
!pDescriptionPatterns.isEmpty()) {
+                       throw new 
JAXRException(RegistryServiceImpl.getNLSStrings(pRegistryService).format(NLSStrings.UNSUPPORTED_PARAMETER,
 "pDescriptionPatterns")); //$NON-NLS-1$
+               }
+               if (pClassifications != null  &&  !pClassifications.isEmpty()) {
+                       throw new 
JAXRException(RegistryServiceImpl.getNLSStrings(pRegistryService).format(NLSStrings.UNSUPPORTED_PARAMETER,
 "pClassifications")); //$NON-NLS-1$
+               }
+               if (pExternalIdentifiers != null  &&  
!pExternalIdentifiers.isEmpty()) {
+                       throw new 
JAXRException(RegistryServiceImpl.getNLSStrings(pRegistryService).format(NLSStrings.UNSUPPORTED_PARAMETER,
 "pExternalIdentifiers")); //$NON-NLS-1$
+               }
+               if (pExternalLinks != null  &&  !pExternalLinks.isEmpty()) {
+                       throw new 
JAXRException(RegistryServiceImpl.getNLSStrings(pRegistryService).format(NLSStrings.UNSUPPORTED_PARAMETER,
 "pExternalLinks")); //$NON-NLS-1$
+               }
+               return asRegistryEntryList(rol.getResultList(pRegistryService, 
predicates));
+       }
 }

Modified: 
labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/infomodel/BusinessQueryManagerImpl.java
URL: 
http://svn.apache.org/viewvc/labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/infomodel/BusinessQueryManagerImpl.java?rev=809581&r1=809580&r2=809581&view=diff
==============================================================================
--- 
labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/infomodel/BusinessQueryManagerImpl.java
 (original)
+++ 
labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/infomodel/BusinessQueryManagerImpl.java
 Mon Aug 31 13:30:54 2009
@@ -31,10 +31,12 @@
 import javax.xml.registry.infomodel.Concept;
 import javax.xml.registry.infomodel.Key;
 import javax.xml.registry.infomodel.Organization;
+import javax.xml.registry.infomodel.RegistryEntry;
 
 import org.apache.labs.jaxmas.registry.accessor.AssociationAccessor;
 import org.apache.labs.jaxmas.registry.accessor.ClassificationSchemeAccessor;
 import org.apache.labs.jaxmas.registry.accessor.OrganizationAccessor;
+import org.apache.labs.jaxmas.registry.accessor.RegistryEntryAccessor;
 import org.apache.labs.jaxmas.registry.sql.AssociationSourcePredicate;
 import org.apache.labs.jaxmas.registry.sql.AssociationTargetPredicate;
 import org.apache.labs.jaxmas.registry.sql.AssociationTypePredicate;
@@ -44,7 +46,7 @@
 /**
  * Default implementation of {...@link BusinessQueryManager}.
  */
-public class BusinessQueryManagerImpl extends QueryManagerImpl implements 
BusinessQueryManager {
+public class BusinessQueryManagerImpl extends QueryManagerImpl implements 
BusinessQueryManager, JaxMasQueryManager {
        /**
         * Creates a new instance with the given registry service.
         */
@@ -195,4 +197,17 @@
                        Collection pSpecificationa) throws JAXRException {
         throw new JAXRException(NLSStrings.OPERATION_NOT_IMPLEMENTED);
        }
+
+       @Override
+       public BulkResponse findObjects(Collection<String> pFindQualifiers,
+                       Collection<String> pObjectTypes, Collection<String> 
pNamePatterns,
+                       Collection<String> pDescriptionPatterns,
+                       Collection<?> pClassifications, Collection<?> 
pExternalIdentifiers,
+                       Collection<?> pExternalLinks) throws JAXRException {
+               final List<RegistryEntry> list = 
RegistryEntryAccessor.getInstance().findRegistryEntries(getRegistryService(),
+                               pFindQualifiers,
+                               pObjectTypes, pNamePatterns, 
pDescriptionPatterns, pClassifications,
+                               pExternalIdentifiers, pExternalLinks);
+               return new BulkResponseImpl(list);
+       }
 }

Added: 
labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/infomodel/JaxMasQueryManager.java
URL: 
http://svn.apache.org/viewvc/labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/infomodel/JaxMasQueryManager.java?rev=809581&view=auto
==============================================================================
--- 
labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/infomodel/JaxMasQueryManager.java
 (added)
+++ 
labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/infomodel/JaxMasQueryManager.java
 Mon Aug 31 13:30:54 2009
@@ -0,0 +1,23 @@
+package org.apache.labs.jaxmas.registry.infomodel;
+
+import java.util.Collection;
+
+import javax.xml.registry.BulkResponse;
+import javax.xml.registry.BusinessQueryManager;
+
+
+/**
+ * JaxMas proprietary extension of {...@link BusinessQueryManager} with
+ * support for query to custom object types, closely modeled after
+ * the <a 
href="http://documentation.softwareag.com/webmethods/soal8/jd/metamodelAPIclient/com/centrasite/jaxr/CentraSiteQueryManager.html";>CentraSiteQueryManager</a>.
+ */
+public interface JaxMasQueryManager extends BusinessQueryManager {
+       BulkResponse findObjects(Collection<String> pFindQualifiers,
+            Collection<String> pObjectTypes,
+            Collection<String> pNamePatterns,
+            Collection<String> pDescriptionPatterns,
+            Collection<?> pClassifications,
+            Collection<?> pExternalIdentifiers,
+            Collection<?> pExternalLinks)
+        throws javax.xml.registry.JAXRException;
+}

Added: 
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=809581&view=auto
==============================================================================
--- 
labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/sql/CustomObjectTypePredicate.java
 (added)
+++ 
labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/sql/CustomObjectTypePredicate.java
 Mon Aug 31 13:30:54 2009
@@ -0,0 +1,80 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.labs.jaxmas.registry.sql;
+
+import java.sql.SQLException;
+import java.util.Collection;
+import java.util.List;
+
+import javax.xml.registry.JAXRException;
+
+import 
org.apache.labs.jaxmas.registry.accessor.ROAccessors.ClassificationSchemes;
+import org.apache.labs.jaxmas.registry.accessor.ROAccessors.ObjectTypes;
+
+
+/**
+ * Predicate for restricting a search to a particular registry object type.
+ */
+public class CustomObjectTypePredicate implements Predicate {
+    private final Collection<String> types;
+
+    /**
+     * Creates a new instance, which restricts the search to the given
+     * type.
+     */
+    public CustomObjectTypePredicate(Collection<String> pTypes) {
+       if (pTypes == null  ||  pTypes.isEmpty()) {
+               throw new IllegalArgumentException("The list of custom object 
types must not be null."); //$NON-NLS-1$
+       }
+       types = pTypes;
+    }
+
+    /**
+     * Returns the collection of custom object types.
+     */
+    public Collection<String> getTypes() {
+        return types;
+    }
+
+    @Override
+    public void add(StringBuilder pBuffer, List<Object> pParameters) throws 
SQLException, JAXRException {
+       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()));
+       pParameters.add(ClassificationSchemes.OBJECT_TYPE.getId());
+       if (customTypes.size() == 1) {
+               pBuffer.append("ctco.value=?"); //$NON-NLS-1$
+               pParameters.add(customTypes.iterator().next());
+       } else {
+               pBuffer.append("ctco.value IN ("); //$NON-NLS-1$
+               boolean first = true;
+               for (String s : customTypes) {
+                       if (first) {
+                               first = false;
+                       } else {
+                               pBuffer.append(',');
+                       }
+                       pBuffer.append('?');
+                       pParameters.add(s);
+               }
+               pBuffer.append(')');
+       }
+       pBuffer.append(')');
+    }
+}

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=809581&r1=809580&r2=809581&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 31 13:30:54 2009
@@ -1,16 +1,22 @@
 package org.apache.labs.jaxmas.registry;
 
+import java.util.Arrays;
+import java.util.Collection;
 import java.util.Collections;
 
+import javax.xml.registry.BulkResponse;
 import javax.xml.registry.Connection;
+import javax.xml.registry.FindQualifier;
 import javax.xml.registry.JAXRException;
 import javax.xml.registry.LifeCycleManager;
+import javax.xml.registry.RegistryService;
 import javax.xml.registry.infomodel.Classification;
 import javax.xml.registry.infomodel.ClassificationScheme;
 import javax.xml.registry.infomodel.Concept;
 import javax.xml.registry.infomodel.RegistryEntry;
 import javax.xml.registry.infomodel.RegistryObject;
 
+import org.apache.labs.jaxmas.registry.infomodel.JaxMasQueryManager;
 import org.junit.Test;
 
 
@@ -20,6 +26,7 @@
 public class CustomTypeTest extends AbstractInitializedJaxMasTestCase {
        private static final String MY_TYPE1 = 
"{http://namespaces.foo.com/jaxr}MyType1";; //$NON-NLS-1$
        private static final String MY_TYPE2 = 
"{http://namespaces.foo.com/jaxr}MyType2";; //$NON-NLS-1$
+       private static final String RO_NAME = CustomTypeTest.class.getName();
 
        private Concept findObjectType(Connection pConnection, String pName, 
String pValue) throws JAXRException {
                final ClassificationScheme objectTypes = 
findClassificationScheme("ObjectType"); //$NON-NLS-1$
@@ -30,8 +37,31 @@
                }
                return concept;
        }
+
+       @SuppressWarnings("unchecked")
+       private static Collection<RegistryEntry> 
asRegistryEntryCollection(Collection<?> pCollection) {
+               return (Collection<RegistryEntry>) pCollection;
+       }
+       
+       private RegistryEntry findObjectsByObjectType(RegistryService pService, 
Collection<String> pObjectTypes, String pName)
+                       throws JAXRException {
+               final JaxMasQueryManager jqm = (JaxMasQueryManager) 
pService.getBusinessQueryManager();
+               final BulkResponse br = 
jqm.findObjects(Collections.singleton(FindQualifier.EXACT_NAME_MATCH),
+                               pObjectTypes, Collections.singleton(pName), 
null,
+                               null, null, null);
+               final Collection<RegistryEntry> list = 
asRegistryEntryCollection(br.getCollection());
+               switch (list.size()) {
+                       case 0:
+                               return null;
+                       case 1:
+                               return list.iterator().next();
+                       default:
+                               throw new IllegalStateException("Multiple 
matching objects named " + pName + " found.");  //$NON-NLS-1$//$NON-NLS-2$
+               }
+       }
        
        @Test public void testCreateCustomObjectType() throws Exception {
+               final String name = RO_NAME + '-' + System.currentTimeMillis();
                final Concept myType1, myType2;
                final RegistryEntry registryEntry;
                Connection conn = newConnection();
@@ -45,6 +75,7 @@
                        assertEquals(myType1.getParent(), myType2.getParent());
 
                        registryEntry = (RegistryEntry) 
conn.getRegistryService().getBusinessLifeCycleManager().createObject(LifeCycleManager.REGISTRY_ENTRY);
+                       
registryEntry.setName(conn.getRegistryService().getBusinessLifeCycleManager().createInternationalString(name));
                        final Concept registryEntryType = 
registryEntry.getObjectType();
                        assertTrue(!registryEntryType.equals(myType1));
                        assertTrue(!registryEntryType.equals(myType2));
@@ -78,9 +109,18 @@
 
                conn = newConnection();
                try {
-                       final RegistryObject ro2 = 
conn.getRegistryService().getBusinessQueryManager().getRegistryObject(registryEntry.getKey().getId());
+                       final RegistryService rs = conn.getRegistryService();
+                       final RegistryObject ro2 = 
rs.getBusinessQueryManager().getRegistryObject(registryEntry.getKey().getId());
                        assertEquals(myType2, ro2.getObjectType());
 
+                       assertNull(findObjectsByObjectType(rs, 
Collections.singleton(MY_TYPE1), name));
+                       final RegistryObject ro3 = findObjectsByObjectType(rs, 
Arrays.asList(new String[]{MY_TYPE1, MY_TYPE2}), name);
+                       assertNotNull(ro3);
+                       assertEquals(ro2, ro3);
+                       final RegistryObject ro4 = findObjectsByObjectType(rs, 
Collections.singleton(MY_TYPE2), name);
+                       assertNotNull(ro4);
+                       assertEquals(ro2, ro4);
+                       
                        conn.close();
                        conn = null;
                } finally {



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to