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/09/06 08:59:57 UTC

svn commit: r1165513 - in /incubator/stanbol/trunk/cmsadapter: cmis/src/main/java/org/apache/stanbol/cmsadapter/cmis/repository/ core/src/main/java/org/apache/stanbol/cmsadapter/core/mapping/ servicesapi/src/main/java/org/apache/stanbol/cmsadapter/serv...

Author: suat
Date: Tue Sep  6 06:59:56 2011
New Revision: 1165513

URL: http://svn.apache.org/viewvc?rev=1165513&view=rev
Log:
STANBOL-306:
-Implemented mechanism for generating RDF from content repositories supporting CMIS specification.
-Revised the implementation for updating CMIS content repository based on RDF data such that instead of creating a folder and two documents for each object annotated in the RDF, a folder or a document is created in the repository based on the assertions related with that object e.g child, type assertions etc. Also an additional metadata document holding RDF data related with the object is created at the same level with the actual object.

Modified:
    incubator/stanbol/trunk/cmsadapter/cmis/src/main/java/org/apache/stanbol/cmsadapter/cmis/repository/CMISRDFMapper.java
    incubator/stanbol/trunk/cmsadapter/core/src/main/java/org/apache/stanbol/cmsadapter/core/mapping/RDFBridgeHelper.java
    incubator/stanbol/trunk/cmsadapter/servicesapi/src/main/java/org/apache/stanbol/cmsadapter/servicesapi/helper/CMSAdapterVocabulary.java

Modified: incubator/stanbol/trunk/cmsadapter/cmis/src/main/java/org/apache/stanbol/cmsadapter/cmis/repository/CMISRDFMapper.java
URL: http://svn.apache.org/viewvc/incubator/stanbol/trunk/cmsadapter/cmis/src/main/java/org/apache/stanbol/cmsadapter/cmis/repository/CMISRDFMapper.java?rev=1165513&r1=1165512&r2=1165513&view=diff
==============================================================================
--- incubator/stanbol/trunk/cmsadapter/cmis/src/main/java/org/apache/stanbol/cmsadapter/cmis/repository/CMISRDFMapper.java (original)
+++ incubator/stanbol/trunk/cmsadapter/cmis/src/main/java/org/apache/stanbol/cmsadapter/cmis/repository/CMISRDFMapper.java Tue Sep  6 06:59:56 2011
@@ -20,6 +20,8 @@ import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.InputStream;
 import java.math.BigInteger;
+import java.util.ArrayList;
+import java.util.Calendar;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
@@ -28,17 +30,23 @@ import java.util.Map;
 import org.apache.chemistry.opencmis.client.api.CmisObject;
 import org.apache.chemistry.opencmis.client.api.Document;
 import org.apache.chemistry.opencmis.client.api.Folder;
+import org.apache.chemistry.opencmis.client.api.Property;
 import org.apache.chemistry.opencmis.client.api.Session;
 import org.apache.chemistry.opencmis.commons.PropertyIds;
 import org.apache.chemistry.opencmis.commons.data.ContentStream;
 import org.apache.chemistry.opencmis.commons.enums.BaseTypeId;
+import org.apache.chemistry.opencmis.commons.enums.PropertyType;
 import org.apache.chemistry.opencmis.commons.enums.VersioningState;
 import org.apache.chemistry.opencmis.commons.exceptions.CmisObjectNotFoundException;
 import org.apache.chemistry.opencmis.commons.impl.dataobjects.ContentStreamImpl;
+import org.apache.clerezza.rdf.core.LiteralFactory;
 import org.apache.clerezza.rdf.core.MGraph;
 import org.apache.clerezza.rdf.core.NonLiteral;
 import org.apache.clerezza.rdf.core.Triple;
+import org.apache.clerezza.rdf.core.UriRef;
 import org.apache.clerezza.rdf.core.impl.SimpleMGraph;
+import org.apache.clerezza.rdf.core.impl.TripleImpl;
+import org.apache.clerezza.rdf.core.serializedform.Parser;
 import org.apache.clerezza.rdf.core.serializedform.Serializer;
 import org.apache.clerezza.rdf.core.serializedform.SupportedFormat;
 import org.apache.felix.scr.annotations.Component;
@@ -47,7 +55,8 @@ import org.apache.felix.scr.annotations.
 import org.apache.stanbol.cmsadapter.core.mapping.BaseRDFMapper;
 import org.apache.stanbol.cmsadapter.core.mapping.RDFBridgeHelper;
 import org.apache.stanbol.cmsadapter.servicesapi.helper.CMSAdapterVocabulary;
-import org.apache.stanbol.cmsadapter.servicesapi.mapping.RDFBridge;
+import org.apache.stanbol.cmsadapter.servicesapi.helper.NamespaceEnum;
+import org.apache.stanbol.cmsadapter.servicesapi.mapping.RDFBridgeException;
 import org.apache.stanbol.cmsadapter.servicesapi.mapping.RDFMapper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -55,9 +64,14 @@ import org.slf4j.LoggerFactory;
 /**
  * Implementation of {@link RDFMapper} for CMIS repositories.
  * <p>
- * As CMIS specification does not allow hierarchy in the documents and custom properties for documents and
- * folders, a folder-document mix workaround is applied to represent hierarchical structures. See the
- * explanations in {@link #storeRDFinRepository(Object, MGraph)} and
+ * While updating the content repository based on an RDF data, this implementation creates an additional
+ * document containing metadata for each CMS object processed as CMIS specification does not allow adding
+ * custom properties for content repository objects. For detailed explanation about updating content
+ * repository based on RDF data see {@link #storeRDFinRepository(Object, MGraph)}.
+ * <p>
+ * While generating RDF from content repository, this implementation process all content repository object
+ * located under a given path. All properties of objects are transformed into RDF. Furthermore, hierarchical
+ * structure of the content repository is reflected to the generated RDF. For more detailed explanation see
  * {@link #generateRDFFromRepository(Object, String)}.
  * 
  * @author suat
@@ -75,19 +89,22 @@ public class CMISRDFMapper extends BaseR
     @Reference
     Serializer serializer;
 
+    @Reference
+    Parser parser;
+
     /**
      * This implementation of {@link RDFMapper#storeRDFinRepository(Object, MGraph)} realizes a workaround to
-     * come up with the restriction of not being able to create hierarchical documents and set custom
-     * properties to documents.
+     * come up with the restriction of not being able to set custom properties to content repository objects.
      * <p>
-     * The workaround is to create 3 object in the content repository for each object that will normally be
-     * created from the RDF data. For example if a single object named <b>MyObject</b> is expected to be
-     * created from the annotated RDF data in the content repository, first of all a {@link Folder} named
-     * <b>MyObject</b> will be created. In this folder a {@link Document} named <b>MyObject</b> representing
-     * the actual object and another document named <b>MyObject_metadata</b> will be created.
+     * For each resource having {@link CMSAdapterVocabulary#CMS_OBJECT} as rdf:type in the RDF, an additional
+     * document containing all resources about a certain content repository object is created in the same
+     * folder with the actual object. For example, if a single object named <b>MyObject</b> is assumed to be
+     * created from the annotated RDF data in the content repository, an additional document named
+     * <b>MyObject_metadata</b> will be created.
      * <p>
-     * Child relations between is set through the folder hierarchy and <b>MyObject_metadata</b> contains an
-     * RDF data formed by the {@link RDFBridge}.
+     * The type of the object to be created is determined according to assertions in the RDF. More details can
+     * be found in
+     * {@link #createStructureForDocument(String, NonLiteral, NonLiteral, Folder, Session, MGraph)}.
      * 
      * @param session
      *            {@link Session} object to access the repository
@@ -103,57 +120,150 @@ public class CMISRDFMapper extends BaseR
             String documentPath = getObjectPath(root, documentName, annotatedGraph);
             Folder rootFolder = checkCreateParentFolders(documentPath, (Session) session);
             if (rootFolder != null) {
-                createDocument(rootFolder, root, documentName, annotatedGraph, (Session) session);
+                createObject(rootFolder, root, null, documentName, annotatedGraph, (Session) session);
             } else {
                 log.warn("Failed to get Folder for path: {}", documentPath);
             }
         }
     }
 
-    private void createDocument(Folder parent,
-                                NonLiteral documentURI,
-                                String documentName,
-                                MGraph graph,
-                                Session session) {
+    private void createObject(Folder parent,
+                              NonLiteral documentURI,
+                              NonLiteral parentURI,
+                              String documentName,
+                              MGraph graph,
+                              Session session) {
 
-        Folder containerFolder = createStructureForDocument(documentName, documentURI, parent, session, graph);
+        Folder containerFolder = createStructureForDocument(documentName, documentURI, parentURI, parent,
+            session, graph);
 
         Iterator<Triple> it = graph.filter(null, CMSAdapterVocabulary.CMS_OBJECT_PARENT_REF, documentURI);
         while (it.hasNext()) {
             NonLiteral childSubject = it.next().getSubject();
             String childName = RDFBridgeHelper.getResourceStringValue(childSubject,
                 CMSAdapterVocabulary.CMS_OBJECT_NAME, graph);
-            createDocument(containerFolder, childSubject, childName, graph, session);
+            createObject(containerFolder, childSubject, documentURI, childName, graph, session);
         }
     }
 
-    private Folder createStructureForDocument(String documentName,
+    /**
+     * This method creates the actual object in the content repository. The type of the object to be created
+     * is determined by following conditions:
+     * <p>
+     * First if its base type is set by {@link CMSAdapterVocabulary#BASE_TYPE_ID} predicate and it is set as
+     * <b>cmis:folder</b> or <b>cmis:document</b>.
+     * <p>
+     * If the base type of the object is not set, its parent assertion is checked. If it has a parent
+     * assertion through {@link CMSAdapterVocabulary#CMS_OBJECT_PARENT_REF}, is rdf:type assertion is checked.
+     * If the URI specified in <code>parentURI</code> is one of the <b>rdf:type</b>s of processed object. The
+     * object is created as a {@link Document} under the folder specified by <code>parentFolder</code>.
+     * Otherwise, it is created as a {@link Folder} even if it does not have any children. This assumption is
+     * done based on the idea that the created object is a part of a hierarchy.
+     * <p>
+     * If the parent assertion of the processed object is not set, this means that a root object is being
+     * created. If this object has any child objects it is created as a {@link Folder}, otherwise it is
+     * created as a {@link Document} based on the assumption that the object represents a single
+     * {@link Document}.
+     * <p>
+     * For any object created an additional metadata document is created. This document has the name <b>
+     * <code>objectName + {@link #DOCUMENT_RDF}</code></b>. This document is created so that content
+     * management systems would manage semantic information content repository object within their own
+     * systems.
+     * 
+     * @param objectName
+     * @param documentURI
+     * @param parentURI
+     * @param parentFolder
+     * @param session
+     * @param graph
+     * @return
+     */
+    private Folder createStructureForDocument(String objectName,
                                               NonLiteral documentURI,
+                                              NonLiteral parentURI,
                                               Folder parentFolder,
                                               Session session,
                                               MGraph graph) {
 
-        String documentPath;
+        String objectPath;
         String parentPath = parentFolder.getPath();
+        boolean createFolder = true;
         if (parentPath.endsWith("/")) {
-            documentPath = parentPath + documentName;
+            objectPath = parentPath + objectName;
         } else {
-            documentPath = parentPath + "/" + documentName;
+            objectPath = parentPath + "/" + objectName;
         }
 
-        Folder containerFolder = createFolderByPath(parentFolder, documentName, documentPath, session);
-        if (containerFolder != null) {
-            String rdfDocumentName = documentName + DOCUMENT_RDF;
-            createDocumentByPath(containerFolder, rdfDocumentName, documentPath + "/" + rdfDocumentName,
-                getDocumentContentStream(rdfDocumentName, documentURI, graph), session);
-            createDocumentByPath(containerFolder, documentName, documentPath + "/" + documentName, null,
-                session);
+        // determine whether a document or a folder will be created
+        @SuppressWarnings("rawtypes")
+        Class type = hasBaseType(documentURI, graph);
+        if (type != null) {
+            if (type.equals(Document.class)) {
+                createFolder = false;
+            }
+        } else {
+            if (parentURI == null) {
+                // root object is being created
+                if (!hasChildren(documentURI, graph)) {
+                    createFolder = false;
+                }
+            } else {
+                if (hasParentAsType(documentURI, parentURI, graph)) {
+                    createFolder = false;
+                }
+            }
+        }
+
+        Folder createdFolder = null;
+        CmisObject createdObject;
+        if (createFolder) {
+            createdFolder = createFolderByPath(parentFolder, objectName, objectPath, session);
+            createdObject = createdFolder;
+        } else {
+            createdObject = createDocumentByPath(parentFolder, objectName, objectPath, null, session);
         }
-        return containerFolder;
+
+        String rdfDocumentName = objectName + DOCUMENT_RDF;
+        String rdfDocumentPath = objectPath + DOCUMENT_RDF;
+
+        createDocumentByPath(parentFolder, rdfDocumentName, rdfDocumentPath,
+            getDocumentContentStream(createdObject, rdfDocumentName, documentURI, graph), session);
+        return createdFolder;
+    }
+
+    @SuppressWarnings("rawtypes")
+    private Class hasBaseType(NonLiteral uri, MGraph graph) {
+        Iterator<Triple> it = graph.filter(uri, CMSAdapterVocabulary.BASE_TYPE_ID, null);
+        if (it.hasNext()) {
+            String type = RDFBridgeHelper.parseStringValue(it.next().getObject().toString());
+            if (type.contentEquals(BaseTypeId.CMIS_FOLDER.value())) {
+                return Folder.class;
+            } else if (type.contentEquals(BaseTypeId.CMIS_DOCUMENT.value())) {
+                return Document.class;
+            } else {
+                log.warn("Base type: {} is not supported yet", type);
+                return null;
+            }
+        } else {
+            return null;
+        }
+    }
+
+    private boolean hasChildren(NonLiteral uri, MGraph graph) {
+        Iterator<Triple> it = graph.filter(null, CMSAdapterVocabulary.CMS_OBJECT_PARENT_REF, uri);
+        return it.hasNext();
+    }
+
+    private boolean hasParentAsType(NonLiteral uri, NonLiteral parentURI, MGraph graph) {
+        Iterator<Triple> it = graph.filter(uri, RDFBridgeHelper.RDF_TYPE, parentURI);
+        return it.hasNext();
     }
 
-    private ContentStream getDocumentContentStream(String documentName, NonLiteral documentURI, MGraph graph) {
-        MGraph documentMGraph = collectedDocumentResources(documentURI, graph);
+    private ContentStream getDocumentContentStream(CmisObject createdObject,
+                                                   String documentName,
+                                                   NonLiteral documentURI,
+                                                   MGraph graph) {
+        MGraph documentMGraph = collectedDocumentResources(createdObject, documentURI, graph);
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
         serializer.serialize(baos, documentMGraph, SupportedFormat.RDF_XML);
         byte[] serializedGraph = baos.toByteArray();
@@ -164,11 +274,22 @@ public class CMISRDFMapper extends BaseR
         return contentStream;
     }
 
-    private MGraph collectedDocumentResources(NonLiteral subject, MGraph graph) {
+    private MGraph collectedDocumentResources(CmisObject createdObject, NonLiteral subject, MGraph graph) {
+        boolean sameObject = true;
+        if (createdObject.getId().contentEquals(RDFBridgeHelper.removeEndCharacters(subject.toString()))) {
+            sameObject = false;
+        }
         MGraph documentMGraph = new SimpleMGraph();
         Iterator<Triple> it = graph.filter(subject, null, null);
         while (it.hasNext()) {
-            documentMGraph.add(it.next());
+            Triple t = it.next();
+            if (sameObject) {
+                UriRef pURI = t.getPredicate();
+                if (pURI.toString().contains(NamespaceEnum.cmis.getNamespace())) {
+                    continue;
+                }
+            }
+            documentMGraph.add(t);
         }
         return documentMGraph;
     }
@@ -229,6 +350,9 @@ public class CMISRDFMapper extends BaseR
             CmisObject o = session.getObjectByPath(path);
             if (hasType(o, BaseTypeId.CMIS_DOCUMENT)) {
                 d = (Document) o;
+                if (contentStream != null) {
+                    d.setContentStream(contentStream, true);
+                }
             } else {
                 log.warn(
                     "Object having path: {} does not have Folder base type. It should have Folder base type to allow create documents in it",
@@ -255,8 +379,185 @@ public class CMISRDFMapper extends BaseR
     }
 
     @Override
-    public MGraph generateRDFFromRepository(Object session, String rootPath) {
-        throw new UnsupportedOperationException("This method is not implemented yet");
+    public MGraph generateRDFFromRepository(Object session, String rootPath) throws RDFBridgeException {
+        MGraph cmsGraph = new SimpleMGraph();
+        Session cmisSession = (Session) session;
+
+        Iterator<CmisObject> cmisObjectIt;
+        CmisObject rootObject;
+        try {
+            rootObject = cmisSession.getObjectByPath(rootPath);
+        } catch (CmisObjectNotFoundException e) {
+            throw new RDFBridgeException(String.format("There is Cmis Object in the path: %s", rootPath), e);
+        }
+        if (hasType(rootObject, BaseTypeId.CMIS_FOLDER)) {
+            cmisObjectIt = ((Folder) rootObject).getChildren().iterator();
+        } else {
+            throw new RDFBridgeException(String.format("A folder object is expected at the path: %s",
+                rootPath));
+        }
+
+        while (cmisObjectIt.hasNext()) {
+            CmisObject o = cmisObjectIt.next();
+            cmsGraph.addAll(getGraphForObject(o, (Folder) rootObject, null));
+        }
+        return cmsGraph;
+    }
+
+    private MGraph getGraphForObject(CmisObject o, Folder parentFolder, NonLiteral parentURI) {
+        MGraph graph = new SimpleMGraph();
+        // check metadata
+        if (o.getName().endsWith(DOCUMENT_RDF)) {
+            return graph;
+        }
+
+        MGraph metadata = new SimpleMGraph();
+        metadata = checkMetadata(parentFolder, o);
+
+        // create CMS Object annotation
+        NonLiteral subject = getObjectURI(o, metadata);
+        graph.add(new TripleImpl(subject, RDFBridgeHelper.RDF_TYPE, CMSAdapterVocabulary.CMS_OBJECT));
+
+        // add parent assertion
+        if (parentURI != null) {
+            graph.add(new TripleImpl(subject, CMSAdapterVocabulary.CMS_OBJECT_PARENT_REF, parentURI));
+        }
+
+        if (hasType(o, BaseTypeId.CMIS_FOLDER)) {
+            Folder f = (Folder) o;
+            putObjectPropertiesIntoGraph(f, subject, metadata, graph);
+
+            // process children
+            Iterator<CmisObject> childIt = f.getChildren().iterator();
+            while (childIt.hasNext()) {
+                CmisObject child = childIt.next();
+                graph.addAll(getGraphForObject(child, f, subject));
+            }
+        } else if (hasType(o, BaseTypeId.CMIS_DOCUMENT)) {
+            putObjectPropertiesIntoGraph(o, subject, metadata, graph);
+            if (parentURI != null) {
+                graph.add(new TripleImpl(subject, RDFBridgeHelper.RDF_TYPE, parentURI));
+            }
+        }
+        return graph;
+    }
+
+    private void putObjectPropertiesIntoGraph(CmisObject o, NonLiteral subject, MGraph metadata, MGraph g) {
+        g.addAll(metadata);
+        LiteralFactory literalFactory = LiteralFactory.getInstance();
+
+        List<Property<?>> docProps = o.getProperties();
+        for (Property<?> p : docProps) {
+            PropertyType t = p.getType();
+            UriRef pURI = getPropertyURI(p);
+            if (pURI == null) {
+                continue;
+            }
+
+            List<Object> values = new ArrayList<Object>();
+            if (p.isMultiValued()) {
+                values.addAll(getTypedPropertyValues(t, p.getValues()));
+            } else {
+                values.add(getTypedPropertyValue(t, p.getValue()));
+            }
+
+            for (Object val : values) {
+                if (val != null) {
+                    if (val instanceof UriRef) {
+                        g.add(new TripleImpl(subject, pURI, (UriRef) val));
+                    } else {
+                        g.add(new TripleImpl(subject, pURI, literalFactory.createTypedLiteral(val)));
+                    }
+                }
+            }
+        }
+        /*
+         * TODO handle multiple paths both transforming an RDF into repository and generating an RDF from
+         * repository
+         */
+        String path = "";
+        if (o instanceof Folder) {
+            path = ((Folder) o).getPath();
+        } else if (o instanceof Document) {
+            path = ((Document) o).getPaths().get(0);
+        }
+        RDFBridgeHelper.createDefaultPropertiesForRDF(subject, g, path, o.getName());
+    }
+
+    private List<Object> getTypedPropertyValues(PropertyType property, List<?> values) {
+        List<Object> typedValues = new ArrayList<Object>();
+        if (values != null) {
+            for (Object v : values) {
+                typedValues.add(getTypedPropertyValue(property, v));
+            }
+        }
+        return typedValues;
+    }
+
+    private Object getTypedPropertyValue(PropertyType propertyType, Object value) {
+        if (value == null) {
+            return value;
+        }
+        switch (propertyType) {
+            case BOOLEAN:
+                return (Boolean) value;
+            case DECIMAL:
+                return (Integer) value;
+            case DATETIME:
+                return ((Calendar) value).getTime();
+            case HTML:
+                // not meet with this property
+                return null;
+            case ID:
+                return value.toString();
+            case INTEGER:
+                return ((BigInteger) value).intValue();
+            case STRING:
+                return value;
+            case URI:
+                // not meet with this property
+                return new UriRef(value.toString());
+            default:
+                return value.toString();
+        }
+    }
+
+    private NonLiteral getObjectURI(CmisObject o, MGraph metadata) {
+        Iterator<Triple> it = metadata.filter(null, null, null);
+        if (it.hasNext()) {
+            return it.next().getSubject();
+        }
+        String baseURI = CMSAdapterVocabulary.CMS_ADAPTER_VOCABULARY_URI;
+        String nodeURI = RDFBridgeHelper.appendLocalName(baseURI, o.getId());
+        return new UriRef(nodeURI);
+    }
+
+    private static UriRef getPropertyURI(Property<?> p) {
+        String name = p.getQueryName();
+        if (!name.contains(":")) {
+            name = NamespaceEnum.cms.getPrefix() + ":" + name;
+        }
+        if (RDFBridgeHelper.isShortNameResolvable(name)) {
+            return new UriRef(NamespaceEnum.getFullName(name));
+        } else {
+            log.warn("Failed to resolve property: {}", name);
+            return null;
+        }
+    }
+
+    private MGraph checkMetadata(Folder parentFolder, CmisObject object) {
+        MGraph metadata = new SimpleMGraph();
+        Iterator<CmisObject> it = parentFolder.getChildren().iterator();
+        while (it.hasNext()) {
+            CmisObject o = it.next();
+            if (o instanceof Document) {
+                if (o.getName().contentEquals(object.getName() + DOCUMENT_RDF)) {
+                    ContentStream cs = ((Document) o).getContentStream();
+                    parser.parse(metadata, cs.getStream(), SupportedFormat.RDF_XML);
+                }
+            }
+        }
+        return metadata;
     }
 
     @Override

Modified: incubator/stanbol/trunk/cmsadapter/core/src/main/java/org/apache/stanbol/cmsadapter/core/mapping/RDFBridgeHelper.java
URL: http://svn.apache.org/viewvc/incubator/stanbol/trunk/cmsadapter/core/src/main/java/org/apache/stanbol/cmsadapter/core/mapping/RDFBridgeHelper.java?rev=1165513&r1=1165512&r2=1165513&view=diff
==============================================================================
--- incubator/stanbol/trunk/cmsadapter/core/src/main/java/org/apache/stanbol/cmsadapter/core/mapping/RDFBridgeHelper.java (original)
+++ incubator/stanbol/trunk/cmsadapter/core/src/main/java/org/apache/stanbol/cmsadapter/core/mapping/RDFBridgeHelper.java Tue Sep  6 06:59:56 2011
@@ -3,6 +3,8 @@ package org.apache.stanbol.cmsadapter.co
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 import org.apache.clerezza.rdf.core.Literal;
 import org.apache.clerezza.rdf.core.LiteralFactory;
@@ -41,6 +43,8 @@ public class RDFBridgeHelper {
     public static final UriRef xsdDouble = dataTypeURI("double");
     public static final UriRef xsdAnyURI = dataTypeURI("anyURI");
 
+    private static Pattern pattern = Pattern.compile("\"(.*?)\"");
+
     /**
      * Extracts a list of {@link NonLiteral} which indicates URIs of resources representing the root objects
      * in the graph e.g the object that do not have {@code CMSAdapterVocabulary#CMS_OBJECT_PARENT_REF}
@@ -365,4 +369,41 @@ public class RDFBridgeHelper {
         String fullName = NamespaceEnum.getFullName(shortURI);
         return !fullName.contentEquals(shortURI);
     }
+
+    public static void createDefaultPropertiesForRDF(NonLiteral subject,
+                                                     MGraph graph,
+                                                     String path,
+                                                     String name) {
+        if (valueCheck(path)) {
+            checkDefaultPropertyInitialization(subject, CMSAdapterVocabulary.CMS_OBJECT_PATH, path, graph);
+        }
+
+        if (valueCheck(name)) {
+            checkDefaultPropertyInitialization(subject, CMSAdapterVocabulary.CMS_OBJECT_NAME, name, graph);
+        }
+    }
+
+    public static String parseStringValue(String typedString) {
+        Matcher matcher = pattern.matcher(typedString);
+        if (matcher.find()) {
+            return matcher.group(1);
+        } else {
+            return typedString;
+        }
+    }
+
+    private static void checkDefaultPropertyInitialization(NonLiteral subject,
+                                                           UriRef property,
+                                                           String value,
+                                                           MGraph graph) {
+        LiteralFactory literalFactory = LiteralFactory.getInstance();
+        String oldValue = RDFBridgeHelper.getResourceStringValue(subject, property, graph);
+        if (oldValue.contentEquals("")) {
+            graph.add(new TripleImpl(subject, property, literalFactory.createTypedLiteral(value)));
+        }
+    }
+
+    private static boolean valueCheck(String s) {
+        return s != null && !s.trim().contentEquals("");
+    }
 }

Modified: incubator/stanbol/trunk/cmsadapter/servicesapi/src/main/java/org/apache/stanbol/cmsadapter/servicesapi/helper/CMSAdapterVocabulary.java
URL: http://svn.apache.org/viewvc/incubator/stanbol/trunk/cmsadapter/servicesapi/src/main/java/org/apache/stanbol/cmsadapter/servicesapi/helper/CMSAdapterVocabulary.java?rev=1165513&r1=1165512&r2=1165513&view=diff
==============================================================================
--- incubator/stanbol/trunk/cmsadapter/servicesapi/src/main/java/org/apache/stanbol/cmsadapter/servicesapi/helper/CMSAdapterVocabulary.java (original)
+++ incubator/stanbol/trunk/cmsadapter/servicesapi/src/main/java/org/apache/stanbol/cmsadapter/servicesapi/helper/CMSAdapterVocabulary.java Tue Sep  6 06:59:56 2011
@@ -153,4 +153,12 @@ public class CMSAdapterVocabulary {
      * in the original RDF.
      */
     public static final UriRef CMS_OBJECT_HAS_URI = new UriRef(CMS_ADAPTER_VOCABULARY_URI + "#hasURI");
+    
+    /*
+     * CMIS Specific URI references
+     */
+    /**
+     * The predicate representing the base type of CMIS content repository objects
+     */
+    public static final UriRef BASE_TYPE_ID = new UriRef(NamespaceEnum.cmis + "baseTypeId");
 }