You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@stanbol.apache.org by su...@apache.org on 2011/08/06 11:42:32 UTC

svn commit: r1154473 - in /incubator/stanbol/trunk/cmsadapter: cmis/src/main/java/org/apache/stanbol/cmsadapter/cmis/processor/ core/ core/src/main/java/org/apache/stanbol/cmsadapter/core/mapping/ jcr/src/main/java/org/apache/stanbol/cmsadapter/jcr/pro...

Author: suat
Date: Sat Aug  6 09:42:32 2011
New Revision: 1154473

URL: http://svn.apache.org/viewvc?rev=1154473&view=rev
Log:
STANBOL 307:
-Removed dependencies to jcr and cmis bundles from core bundle
-JCRNodeTypeLifter and CMISNodeTypeLifter has become SCR component and service so that they can be accessible from the MappingEngineImpl. They also implement TypeLifter interface.

Added:
    incubator/stanbol/trunk/cmsadapter/servicesapi/src/main/java/org/apache/stanbol/cmsadapter/servicesapi/processor/TypeLifter.java
    incubator/stanbol/trunk/cmsadapter/servicesapi/src/main/java/org/apache/stanbol/cmsadapter/servicesapi/processor/TypeLifterManager.java
Modified:
    incubator/stanbol/trunk/cmsadapter/cmis/src/main/java/org/apache/stanbol/cmsadapter/cmis/processor/CMISNodeTypeLifter.java
    incubator/stanbol/trunk/cmsadapter/core/pom.xml
    incubator/stanbol/trunk/cmsadapter/core/src/main/java/org/apache/stanbol/cmsadapter/core/mapping/MappingEngineImpl.java
    incubator/stanbol/trunk/cmsadapter/jcr/src/main/java/org/apache/stanbol/cmsadapter/jcr/processor/JCRNodeTypeLifter.java

Modified: incubator/stanbol/trunk/cmsadapter/cmis/src/main/java/org/apache/stanbol/cmsadapter/cmis/processor/CMISNodeTypeLifter.java
URL: http://svn.apache.org/viewvc/incubator/stanbol/trunk/cmsadapter/cmis/src/main/java/org/apache/stanbol/cmsadapter/cmis/processor/CMISNodeTypeLifter.java?rev=1154473&r1=1154472&r2=1154473&view=diff
==============================================================================
--- incubator/stanbol/trunk/cmsadapter/cmis/src/main/java/org/apache/stanbol/cmsadapter/cmis/processor/CMISNodeTypeLifter.java (original)
+++ incubator/stanbol/trunk/cmsadapter/cmis/src/main/java/org/apache/stanbol/cmsadapter/cmis/processor/CMISNodeTypeLifter.java Sat Aug  6 09:42:32 2011
@@ -27,10 +27,13 @@ import org.apache.chemistry.opencmis.cli
 import org.apache.chemistry.opencmis.commons.definitions.PropertyDefinition;
 import org.apache.chemistry.opencmis.commons.exceptions.CmisInvalidArgumentException;
 import org.apache.chemistry.opencmis.commons.exceptions.CmisObjectNotFoundException;
+import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.Service;
 import org.apache.stanbol.cmsadapter.cmis.repository.CMISModelMapper;
 import org.apache.stanbol.cmsadapter.servicesapi.helper.OntologyResourceHelper;
 import org.apache.stanbol.cmsadapter.servicesapi.mapping.MappingEngine;
 import org.apache.stanbol.cmsadapter.servicesapi.model.web.PropType;
+import org.apache.stanbol.cmsadapter.servicesapi.processor.TypeLifter;
 import org.apache.stanbol.cmsadapter.servicesapi.repository.RepositoryAccessException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -39,7 +42,9 @@ import com.hp.hpl.jena.ontology.OntClass
 import com.hp.hpl.jena.ontology.OntProperty;
 import com.hp.hpl.jena.rdf.model.Resource;
 
-public class CMISNodeTypeLifter {
+@Component(immediate = true)
+@Service
+public class CMISNodeTypeLifter implements TypeLifter {
     private static final Logger logger = LoggerFactory.getLogger(CMISNodeTypeLifter.class);
     // FIXME Make adjustable
     private static final int DESCENDANT_DEPTH = 1000;
@@ -47,6 +52,11 @@ public class CMISNodeTypeLifter {
     private Session session;
     private OntologyResourceHelper orh;
 
+    //dummy constructor
+    public CMISNodeTypeLifter() {
+        
+    }
+    
     public CMISNodeTypeLifter(MappingEngine engine) {
         this.session = (Session) engine.getSession();
         this.orh = engine.getOntologyResourceHelper();
@@ -111,7 +121,11 @@ public class CMISNodeTypeLifter {
      * @param mappingFileContent
      * @throws Exception
      */
-    public void liftNodes() throws RepositoryAccessException {
+    @Override
+    public void liftNodeTypes(MappingEngine engine) throws RepositoryAccessException {
+        this.orh = engine.getOntologyResourceHelper();
+        this.session = (Session) engine.getSession();
+
         try {
             // Create classes for Folder Object Type and its descendants
             createClassesForObjectTypes(getAllFolderTypes());
@@ -124,7 +138,6 @@ public class CMISNodeTypeLifter {
         }
     }
 
-    // TODO ID ler icin gereken deisiklik 2-
     /**
      * Creates classes for the given Object Types Furthermore, creates subsumption relations using the
      * parentId field
@@ -216,4 +229,9 @@ public class CMISNodeTypeLifter {
         }
         return false;
     }
+
+    @Override
+    public boolean canLift(String type) {
+        return type.contentEquals("CMIS");
+    }
 }

Modified: incubator/stanbol/trunk/cmsadapter/core/pom.xml
URL: http://svn.apache.org/viewvc/incubator/stanbol/trunk/cmsadapter/core/pom.xml?rev=1154473&r1=1154472&r2=1154473&view=diff
==============================================================================
--- incubator/stanbol/trunk/cmsadapter/core/pom.xml (original)
+++ incubator/stanbol/trunk/cmsadapter/core/pom.xml Sat Aug  6 09:42:32 2011
@@ -60,10 +60,6 @@
 			<groupId>org.apache.stanbol</groupId>
 			<artifactId>org.apache.stanbol.cmsadapter.servicesapi</artifactId>
 		</dependency>
-		<dependency>
-			<groupId>org.apache.stanbol</groupId>
-			<artifactId>org.apache.stanbol.cmsadapter.jcr</artifactId>
-		</dependency>
 
 		<!-- Enhancer -->
 		<dependency>
@@ -128,10 +124,6 @@
 			<artifactId>commons-collections</artifactId>
 		</dependency>
 		<dependency>
-			<groupId>org.apache.stanbol</groupId>
-			<artifactId>org.apache.stanbol.cmsadapter.cmis</artifactId>
-		</dependency>
-		<dependency>
 			<groupId>com.sun.jersey</groupId>
 			<artifactId>jersey-client</artifactId>
 		</dependency>

Modified: incubator/stanbol/trunk/cmsadapter/core/src/main/java/org/apache/stanbol/cmsadapter/core/mapping/MappingEngineImpl.java
URL: http://svn.apache.org/viewvc/incubator/stanbol/trunk/cmsadapter/core/src/main/java/org/apache/stanbol/cmsadapter/core/mapping/MappingEngineImpl.java?rev=1154473&r1=1154472&r2=1154473&view=diff
==============================================================================
--- incubator/stanbol/trunk/cmsadapter/core/src/main/java/org/apache/stanbol/cmsadapter/core/mapping/MappingEngineImpl.java (original)
+++ incubator/stanbol/trunk/cmsadapter/core/src/main/java/org/apache/stanbol/cmsadapter/core/mapping/MappingEngineImpl.java Sat Aug  6 09:42:32 2011
@@ -22,19 +22,13 @@ import java.util.Collections;
 import java.util.Comparator;
 import java.util.Iterator;
 import java.util.List;
-import java.util.Map;
 
-import javax.jcr.RepositoryException;
-
-import org.apache.felix.scr.annotations.Activate;
 import org.apache.felix.scr.annotations.Component;
 import org.apache.felix.scr.annotations.Reference;
 import org.apache.felix.scr.annotations.ReferenceCardinality;
 import org.apache.felix.scr.annotations.ReferencePolicy;
 import org.apache.felix.scr.annotations.Service;
-import org.apache.stanbol.cmsadapter.cmis.processor.CMISNodeTypeLifter;
 import org.apache.stanbol.cmsadapter.core.decorated.DObjectFactoryImp;
-import org.apache.stanbol.cmsadapter.jcr.processor.JCRNodeTypeLifter;
 import org.apache.stanbol.cmsadapter.servicesapi.helper.OntologyResourceHelper;
 import org.apache.stanbol.cmsadapter.servicesapi.mapping.MappingConfiguration;
 import org.apache.stanbol.cmsadapter.servicesapi.mapping.MappingEngine;
@@ -45,6 +39,8 @@ import org.apache.stanbol.cmsadapter.ser
 import org.apache.stanbol.cmsadapter.servicesapi.model.web.decorated.DObjectAdapter;
 import org.apache.stanbol.cmsadapter.servicesapi.processor.Processor;
 import org.apache.stanbol.cmsadapter.servicesapi.processor.ProcessorProperties;
+import org.apache.stanbol.cmsadapter.servicesapi.processor.TypeLifter;
+import org.apache.stanbol.cmsadapter.servicesapi.processor.TypeLifterManager;
 import org.apache.stanbol.cmsadapter.servicesapi.repository.RepositoryAccess;
 import org.apache.stanbol.cmsadapter.servicesapi.repository.RepositoryAccessException;
 import org.apache.stanbol.cmsadapter.servicesapi.repository.RepositoryAccessManager;
@@ -69,7 +65,11 @@ public class MappingEngineImpl implement
     private List<Processor> processors = new ArrayList<Processor>();
 
     @Reference
+    private TypeLifterManager typeLifterManager;
+
+    @Reference
     private RestClient storeClient;
+
     @Reference
     private RepositoryAccessManager accessManager;
 
@@ -82,11 +82,6 @@ public class MappingEngineImpl implement
     private DObjectAdapter adapter;
     private NamingStrategy namingStrategy;
 
-    @Activate
-    protected void activate(final Map<?,?> properties) {
-        // TODO need to do something here?
-    }
-
     private void runProcessors(List<Object> cmsObjects, String mode) {
         Iterator<Processor> processorIterator;
         synchronized (processors) {
@@ -114,20 +109,16 @@ public class MappingEngineImpl implement
         initializeEngine(conf);
 
         long t1 = System.currentTimeMillis();
-        try {
-            String connectionType = conf.getConnectionInfo().getConnectionType();
-            if (connectionType.contentEquals("JCR")) {
-                new JCRNodeTypeLifter(this).lift();
-            } else if (connectionType.contentEquals("CMIS")) {
-                new CMISNodeTypeLifter(this).liftNodes();
-            } else {
-                throw new IllegalArgumentException("Connection type must be one of JCR or CMIS.");
-            }
-        } catch (RepositoryException e) {
-            logger.warn("Lifting error", e);
-            return;
+        String connectionType = conf.getConnectionInfo().getConnectionType();
+        if (connectionType != null
+            && !(connectionType.contentEquals("JCR") || connectionType.contentEquals("CMIS"))) {
+            throw new IllegalArgumentException("Connection type must be one of JCR or CMIS.");
         }
 
+        // lift type defintions
+        TypeLifter typeLifter = typeLifterManager.getRepositoryAccessor(connectionType);
+        typeLifter.liftNodeTypes(this);
+
         runProcessors(null, "create");
         OntologyResourceHelper.saveConnectionInfo(conf.getConnectionInfo(), this.ontModel);
         OntologyResourceHelper.saveBridgeDefinitions(conf.getBridgeDefinitions(), this.ontModel);
@@ -311,14 +302,14 @@ public class MappingEngineImpl implement
         storeClient.saveOntology(ontologyContentAsString, ontologyURI, "UTF-8");
     }
 
-    public void bindProcessor(Processor processor) {
+    protected void bindProcessor(Processor processor) {
         synchronized (processors) {
             processors.add(processor);
             Collections.sort(processors, COMPARATOR);
         }
     }
 
-    public void unbindProcessor(Processor processor) {
+    protected void unbindProcessor(Processor processor) {
         synchronized (processors) {
             processors.remove(processor);
         }

Modified: incubator/stanbol/trunk/cmsadapter/jcr/src/main/java/org/apache/stanbol/cmsadapter/jcr/processor/JCRNodeTypeLifter.java
URL: http://svn.apache.org/viewvc/incubator/stanbol/trunk/cmsadapter/jcr/src/main/java/org/apache/stanbol/cmsadapter/jcr/processor/JCRNodeTypeLifter.java?rev=1154473&r1=1154472&r2=1154473&view=diff
==============================================================================
--- incubator/stanbol/trunk/cmsadapter/jcr/src/main/java/org/apache/stanbol/cmsadapter/jcr/processor/JCRNodeTypeLifter.java (original)
+++ incubator/stanbol/trunk/cmsadapter/jcr/src/main/java/org/apache/stanbol/cmsadapter/jcr/processor/JCRNodeTypeLifter.java Sat Aug  6 09:42:32 2011
@@ -26,13 +26,16 @@ import javax.jcr.nodetype.NodeTypeIterat
 import javax.jcr.nodetype.NodeTypeManager;
 import javax.jcr.nodetype.PropertyDefinition;
 
+import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.Service;
 import org.apache.stanbol.cmsadapter.jcr.repository.JCRModelMapper;
-import org.apache.stanbol.cmsadapter.servicesapi.helper.CMSAdapterVocabulary;
 import org.apache.stanbol.cmsadapter.servicesapi.helper.OntologyResourceHelper;
 import org.apache.stanbol.cmsadapter.servicesapi.mapping.MappingEngine;
 import org.apache.stanbol.cmsadapter.servicesapi.model.web.ObjectTypeDefinition;
 import org.apache.stanbol.cmsadapter.servicesapi.model.web.PropType;
+import org.apache.stanbol.cmsadapter.servicesapi.processor.TypeLifter;
 import org.apache.stanbol.cmsadapter.servicesapi.repository.RepositoryAccess;
+import org.apache.stanbol.cmsadapter.servicesapi.repository.RepositoryAccessException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -40,9 +43,10 @@ import com.hp.hpl.jena.ontology.Datatype
 import com.hp.hpl.jena.ontology.ObjectProperty;
 import com.hp.hpl.jena.ontology.OntClass;
 import com.hp.hpl.jena.rdf.model.Resource;
-import com.hp.hpl.jena.vocabulary.OWL;
 
-public class JCRNodeTypeLifter {
+@Component(immediate = true)
+@Service
+public class JCRNodeTypeLifter implements TypeLifter {
     private static final Logger logger = LoggerFactory.getLogger(JCRNodeTypeLifter.class);
 
     private MappingEngine engine;
@@ -50,92 +54,89 @@ public class JCRNodeTypeLifter {
     private RepositoryAccess accessor;
     private OntologyResourceHelper ontologyResourceHelper;
 
-    public JCRNodeTypeLifter(MappingEngine mappingEngine) {
-        this.engine = mappingEngine;
-        this.session = (Session) engine.getSession();
-        this.ontologyResourceHelper = this.engine.getOntologyResourceHelper();
-        this.accessor = this.engine.getRepositoryAccessManager()
-                .getRepositoryAccess(this.engine.getSession());
-        if (this.accessor == null) {
-            throw new IllegalArgumentException("Can not find suitable accessor");
-        }
-    }
-
-    public void lift() throws RepositoryException {
-        // initializeDefaultResources();
-
-        NodeTypeManager nodeTypeManager = session.getWorkspace().getNodeTypeManager();
-        NodeTypeIterator nodeTypesItr = nodeTypeManager.getAllNodeTypes();
-        while (nodeTypesItr.hasNext()) {
-            NodeType curNodeType = nodeTypesItr.nextNodeType();
-            // create the class
-            ObjectTypeDefinition otd = JCRModelMapper.getObjectTypeDefinition(curNodeType);
-            OntClass nodeTypeClass = ontologyResourceHelper.createOntClassByObjectTypeDefinition(otd);
-            if (nodeTypeClass == null) {
-                logger.warn("Failed to create OntClass for object type definition {}", otd.getLocalname());
-                continue;
-            }
-
-            // create subsumption relationships
-            NodeType[] supertypes = curNodeType.getDeclaredSupertypes();
-            for (NodeType supertype : supertypes) {
-                otd = JCRModelMapper.getObjectTypeDefinition(supertype);
-                OntClass s = ontologyResourceHelper.createOntClassByObjectTypeDefinition(otd);
-                if (s == null) {
+    @Override
+    public void liftNodeTypes(MappingEngine engine) throws RepositoryAccessException {
+        initialize(engine);
+        try {
+            NodeTypeManager nodeTypeManager = session.getWorkspace().getNodeTypeManager();
+            NodeTypeIterator nodeTypesItr = nodeTypeManager.getAllNodeTypes();
+            while (nodeTypesItr.hasNext()) {
+                NodeType curNodeType = nodeTypesItr.nextNodeType();
+                // create the class
+                ObjectTypeDefinition otd = JCRModelMapper.getObjectTypeDefinition(curNodeType);
+                OntClass nodeTypeClass = ontologyResourceHelper.createOntClassByObjectTypeDefinition(otd);
+                if (nodeTypeClass == null) {
                     logger.warn("Failed to create OntClass for object type definition {}", otd.getLocalname());
                     continue;
                 }
-                nodeTypeClass.addSuperClass(s);
-            }
 
-            // create properties
-            PropertyDefinition[] propertyDefinitionList = curNodeType.getDeclaredPropertyDefinitions();
-            for (PropertyDefinition jcrPropDef : propertyDefinitionList) {
-                org.apache.stanbol.cmsadapter.servicesapi.model.web.PropertyDefinition propDef = JCRModelMapper
-                        .getPropertyDefinition(jcrPropDef);
-                if (jcrPropDef.getName().equals("*")) {
-                    // TODO decide how to handle * named properties
-                } else {
-                    if ((propDef.getPropertyType() == PropType.NAME)
-                        || (propDef.getPropertyType() == PropType.PATH)
-                        || (propDef.getPropertyType() == PropType.REFERENCE)) {
-
-                        ObjectProperty op = ontologyResourceHelper.createObjectPropertyByPropertyDefinition(
-                            propDef, Arrays.asList(new Resource[] {nodeTypeClass}),
-                            new ArrayList<Resource>());
-
-                        if (op == null) {
-                            logger.warn("Failed to create ObjectProperty for property definition {}",
-                                propDef.getLocalname());
-                        }
+                // create subsumption relationships
+                NodeType[] supertypes = curNodeType.getDeclaredSupertypes();
+                for (NodeType supertype : supertypes) {
+                    otd = JCRModelMapper.getObjectTypeDefinition(supertype);
+                    OntClass s = ontologyResourceHelper.createOntClassByObjectTypeDefinition(otd);
+                    if (s == null) {
+                        logger.warn("Failed to create OntClass for object type definition {}",
+                            otd.getLocalname());
+                        continue;
+                    }
+                    nodeTypeClass.addSuperClass(s);
+                }
 
+                // create properties
+                PropertyDefinition[] propertyDefinitionList = curNodeType.getDeclaredPropertyDefinitions();
+                for (PropertyDefinition jcrPropDef : propertyDefinitionList) {
+                    org.apache.stanbol.cmsadapter.servicesapi.model.web.PropertyDefinition propDef = JCRModelMapper
+                            .getPropertyDefinition(jcrPropDef);
+                    if (jcrPropDef.getName().equals("*")) {
+                        // TODO decide how to handle * named properties
                     } else {
-                        DatatypeProperty dtp = ontologyResourceHelper
-                                .createDatatypePropertyByPropertyDefinition(propDef,
-                                    Arrays.asList(new Resource[] {nodeTypeClass}));
-
-                        if (dtp == null) {
-                            logger.warn("Failed to create DatatypeProperty for property definition {}",
-                                propDef.getLocalname());
+                        if ((propDef.getPropertyType() == PropType.NAME)
+                            || (propDef.getPropertyType() == PropType.PATH)
+                            || (propDef.getPropertyType() == PropType.REFERENCE)) {
+
+                            ObjectProperty op = ontologyResourceHelper
+                                    .createObjectPropertyByPropertyDefinition(propDef,
+                                        Arrays.asList(new Resource[] {nodeTypeClass}),
+                                        new ArrayList<Resource>());
+
+                            if (op == null) {
+                                logger.warn("Failed to create ObjectProperty for property definition {}",
+                                    propDef.getLocalname());
+                            }
+
+                        } else {
+                            DatatypeProperty dtp = ontologyResourceHelper
+                                    .createDatatypePropertyByPropertyDefinition(propDef,
+                                        Arrays.asList(new Resource[] {nodeTypeClass}));
+
+                            if (dtp == null) {
+                                logger.warn("Failed to create DatatypeProperty for property definition {}",
+                                    propDef.getLocalname());
+                            }
                         }
                     }
                 }
             }
+        } catch (RepositoryException e) {
+            throw new RepositoryAccessException("Repository exception while lifting node type definitions ",
+                    e);
         }
     }
 
-    private void initializeDefaultResources() {
-        addPathProperty();
+    @Override
+    public boolean canLift(String type) {
+        return type.contentEquals("JCR");
     }
 
-    private void addPathProperty() {
-        String propName = CMSAdapterVocabulary.CMS_ADAPTER_VOCABULARY_PREFIX + ":"
-                          + CMSAdapterVocabulary.CMSAD_PATH_PROP_NAME;
-        org.apache.stanbol.cmsadapter.servicesapi.model.web.PropertyDefinition propertyDefinition = new org.apache.stanbol.cmsadapter.servicesapi.model.web.PropertyDefinition();
-        propertyDefinition.setLocalname(propName);
-        propertyDefinition.setPropertyType(PropType.STRING);
-        propertyDefinition.setUniqueRef(propName);
-        ontologyResourceHelper.createDatatypePropertyByPropertyDefinition(propertyDefinition,
-            Arrays.asList(new Resource[] {OWL.Thing}));
+    private void initialize(MappingEngine engine) {
+        this.engine = engine;
+        this.session = (Session) engine.getSession();
+        this.ontologyResourceHelper = this.engine.getOntologyResourceHelper();
+        this.accessor = this.engine.getRepositoryAccessManager()
+                .getRepositoryAccess(this.engine.getSession());
+        if (this.accessor == null) {
+            throw new IllegalArgumentException("Can not find suitable accessor");
+        }
     }
-}
+}
\ No newline at end of file

Added: incubator/stanbol/trunk/cmsadapter/servicesapi/src/main/java/org/apache/stanbol/cmsadapter/servicesapi/processor/TypeLifter.java
URL: http://svn.apache.org/viewvc/incubator/stanbol/trunk/cmsadapter/servicesapi/src/main/java/org/apache/stanbol/cmsadapter/servicesapi/processor/TypeLifter.java?rev=1154473&view=auto
==============================================================================
--- incubator/stanbol/trunk/cmsadapter/servicesapi/src/main/java/org/apache/stanbol/cmsadapter/servicesapi/processor/TypeLifter.java (added)
+++ incubator/stanbol/trunk/cmsadapter/servicesapi/src/main/java/org/apache/stanbol/cmsadapter/servicesapi/processor/TypeLifter.java Sat Aug  6 09:42:32 2011
@@ -0,0 +1,39 @@
+package org.apache.stanbol.cmsadapter.servicesapi.processor;
+
+import org.apache.stanbol.cmsadapter.servicesapi.helper.OntologyResourceHelper;
+import org.apache.stanbol.cmsadapter.servicesapi.mapping.MappingEngine;
+import org.apache.stanbol.cmsadapter.servicesapi.repository.RepositoryAccessException;
+
+/**
+ * This interface provides a uniform way to semantically lift node/object type definitions in content
+ * management systems.
+ * 
+ * @author suat
+ * 
+ */
+public interface TypeLifter {
+    /**
+     * This method takes all node/object type definitions in the repository and creates related ontological
+     * resources namely classes, object and data properties. It creates a class for each object/node type and
+     * object properties for property definitions having types PATH, REFERENCE, etc.; and data properties for
+     * property definitions takes literal values.
+     * 
+     * @param mappingEngine
+     *            is the {@link MappingEngine} instance of which acts as context for the implementations of
+     *            this interface. It provides context variables such as Session to access repository or
+     *            {@link OntologyResourceHelper} to create ontology resources.
+     * @throws RepositoryAccessException
+     */
+
+    void liftNodeTypes(MappingEngine mappingEngine) throws RepositoryAccessException;
+
+    /**
+     * Takes a protocol type e.g JCR/CMIS and returns whether implementation of this interface is capable of
+     * lifting type definitions through the specified protocol
+     * 
+     * @param type
+     *            protocol type e.g JCR/CMIS
+     * @return
+     */
+    boolean canLift(String type);
+}

Added: incubator/stanbol/trunk/cmsadapter/servicesapi/src/main/java/org/apache/stanbol/cmsadapter/servicesapi/processor/TypeLifterManager.java
URL: http://svn.apache.org/viewvc/incubator/stanbol/trunk/cmsadapter/servicesapi/src/main/java/org/apache/stanbol/cmsadapter/servicesapi/processor/TypeLifterManager.java?rev=1154473&view=auto
==============================================================================
--- incubator/stanbol/trunk/cmsadapter/servicesapi/src/main/java/org/apache/stanbol/cmsadapter/servicesapi/processor/TypeLifterManager.java (added)
+++ incubator/stanbol/trunk/cmsadapter/servicesapi/src/main/java/org/apache/stanbol/cmsadapter/servicesapi/processor/TypeLifterManager.java Sat Aug  6 09:42:32 2011
@@ -0,0 +1,40 @@
+package org.apache.stanbol.cmsadapter.servicesapi.processor;
+
+import java.util.List;
+import java.util.concurrent.CopyOnWriteArrayList;
+
+import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.Reference;
+import org.apache.felix.scr.annotations.ReferenceCardinality;
+import org.apache.felix.scr.annotations.ReferencePolicy;
+import org.apache.felix.scr.annotations.Service;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+@Component(immediate = true)
+@Service(value = TypeLifterManager.class)
+public class TypeLifterManager {
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_MULTIPLE, referenceInterface = TypeLifter.class, policy = ReferencePolicy.DYNAMIC, bind = "bindTypeLifter", unbind = "unbindTypeLifter")
+    private List<TypeLifter> typeLifters = new CopyOnWriteArrayList<TypeLifter>();
+
+    private static final Logger logger = LoggerFactory.getLogger(TypeLifterManager.class);
+
+    public TypeLifter getRepositoryAccessor(String connectionType) {
+        for (TypeLifter typeLifter : typeLifters) {
+            if (typeLifter.canLift(connectionType)) {
+                return typeLifter;
+            }
+        }
+
+        logger.warn("No suitable type lifter implementation for connection type: {} ", connectionType);
+        return null;
+    }
+
+    protected void bindTypeLifter(TypeLifter typeLifter) {
+        typeLifters.add(typeLifter);
+    }
+
+    protected void unbindTypeLifter(TypeLifter typeLifter) {
+        typeLifters.remove(typeLifter);
+    }
+}