diff --git a/config/alfresco/model/cmisModel.xml b/config/alfresco/model/cmisModel.xml index 3aa34ab615..cb4e8f812d 100644 --- a/config/alfresco/model/cmisModel.xml +++ b/config/alfresco/model/cmisModel.xml @@ -11,7 +11,31 @@ + + + + org.alfresco.repo.search.impl.lucene.analysis.AlfrescoStandardAnalyser + java.lang.String + + + + org.alfresco.repo.search.impl.lucene.analysis.AlfrescoStandardAnalyser + java.lang.String + + + + org.alfresco.repo.search.impl.lucene.analysis.AlfrescoStandardAnalyser + java.lang.String + + + + org.alfresco.repo.search.impl.lucene.analysis.AlfrescoStandardAnalyser + java.lang.String + + + + @@ -82,7 +106,7 @@ Version series id The version series id - d:noderef + cmis:id true true false @@ -111,7 +135,7 @@ Version Series Checked Out Id The checked out version series id - d:noderef + cmis:id true false false @@ -174,7 +198,7 @@ Content Stream URI The content stream URI - d:text + cmis:uri true false false @@ -182,6 +206,7 @@ + cmis:Core cmis:Named @@ -193,7 +218,7 @@ Parent Id The parent id of the folder - d:noderef + cmis:id true true false @@ -204,7 +229,7 @@ Allowed Child Object Types Ids The allowed child object type ids - d:qname + cmis:id true false true @@ -212,6 +237,7 @@ + cmis:Core cmis:Named @@ -223,7 +249,7 @@ Source Id The source id for the relationship - d:noderef + cmis:id true true false @@ -232,7 +258,7 @@ Target Id The target id for the relationship - d:noderef + cmis:id true true false @@ -288,7 +314,7 @@ Object Id The unique object id (a node ref) - d:noderef + cmis:id true true false @@ -299,7 +325,7 @@ URI URI - d:text + cmis:uri true false false @@ -308,7 +334,7 @@ Object Type Id The object type id - d:qname + cmis:id true true false @@ -373,7 +399,6 @@ - cmis:Core Name diff --git a/source/java/org/alfresco/cmis/dictionary/CMISMapping.java b/source/java/org/alfresco/cmis/dictionary/CMISMapping.java index ada23cf43e..bceda6ce79 100644 --- a/source/java/org/alfresco/cmis/dictionary/CMISMapping.java +++ b/source/java/org/alfresco/cmis/dictionary/CMISMapping.java @@ -60,6 +60,14 @@ public class CMISMapping * The QName for the Alfresco CMIS Model. */ public static QName CMIS_MODEL_QNAME = QName.createQName(CMIS_MODEL_URI, CMIS_MODEL_NAME); + + /** + * The QNames for CMIS Data Types. + */ + public static QName CMIS_DATATYPE_ID = QName.createQName(CMIS_MODEL_URI, "id"); + public static QName CMIS_DATATYPE_URI = QName.createQName(CMIS_MODEL_URI, "uri"); + public static QName CMIS_DATATYPE_XML = QName.createQName(CMIS_MODEL_URI, "xml"); + public static QName CMIS_DATATYPE_HTML = QName.createQName(CMIS_MODEL_URI, "html"); /** * Type id for CMIS documents, from the spec. @@ -179,7 +187,7 @@ public class CMISMapping private static HashMap alfrescoToCmisTypes = new HashMap(); - private static HashMap alfrescoPropertyTypesToCimsPropertyTypes = new HashMap(); + private static HashMap alfrescoPropertyTypesToCmisPropertyTypes = new HashMap(); /** * Set up mappings @@ -199,24 +207,28 @@ public class CMISMapping alfrescoToCmisTypes.put(ContentModel.TYPE_CONTENT, DOCUMENT_QNAME); alfrescoToCmisTypes.put(ContentModel.TYPE_FOLDER, FOLDER_QNAME); - alfrescoPropertyTypesToCimsPropertyTypes.put(DataTypeDefinition.ANY, null); - alfrescoPropertyTypesToCimsPropertyTypes.put(DataTypeDefinition.ASSOC_REF, null); - alfrescoPropertyTypesToCimsPropertyTypes.put(DataTypeDefinition.BOOLEAN, CMISPropertyTypeEnum.BOOLEAN); - alfrescoPropertyTypesToCimsPropertyTypes.put(DataTypeDefinition.CATEGORY, CMISPropertyTypeEnum.ID); - alfrescoPropertyTypesToCimsPropertyTypes.put(DataTypeDefinition.CHILD_ASSOC_REF, null); - alfrescoPropertyTypesToCimsPropertyTypes.put(DataTypeDefinition.CONTENT, null); - alfrescoPropertyTypesToCimsPropertyTypes.put(DataTypeDefinition.DATE, CMISPropertyTypeEnum.DATETIME); - alfrescoPropertyTypesToCimsPropertyTypes.put(DataTypeDefinition.DATETIME, CMISPropertyTypeEnum.DATETIME); - alfrescoPropertyTypesToCimsPropertyTypes.put(DataTypeDefinition.DOUBLE, CMISPropertyTypeEnum.DECIMAL); - alfrescoPropertyTypesToCimsPropertyTypes.put(DataTypeDefinition.FLOAT, CMISPropertyTypeEnum.DECIMAL); - alfrescoPropertyTypesToCimsPropertyTypes.put(DataTypeDefinition.INT, CMISPropertyTypeEnum.INTEGER); - alfrescoPropertyTypesToCimsPropertyTypes.put(DataTypeDefinition.LOCALE, null); - alfrescoPropertyTypesToCimsPropertyTypes.put(DataTypeDefinition.LONG, CMISPropertyTypeEnum.INTEGER); - alfrescoPropertyTypesToCimsPropertyTypes.put(DataTypeDefinition.MLTEXT, CMISPropertyTypeEnum.STRING); - alfrescoPropertyTypesToCimsPropertyTypes.put(DataTypeDefinition.NODE_REF, CMISPropertyTypeEnum.ID); - alfrescoPropertyTypesToCimsPropertyTypes.put(DataTypeDefinition.PATH, null); - alfrescoPropertyTypesToCimsPropertyTypes.put(DataTypeDefinition.QNAME, null); - alfrescoPropertyTypesToCimsPropertyTypes.put(DataTypeDefinition.TEXT, CMISPropertyTypeEnum.STRING); + alfrescoPropertyTypesToCmisPropertyTypes.put(DataTypeDefinition.ANY, null); + alfrescoPropertyTypesToCmisPropertyTypes.put(DataTypeDefinition.ASSOC_REF, null); + alfrescoPropertyTypesToCmisPropertyTypes.put(DataTypeDefinition.BOOLEAN, CMISPropertyTypeEnum.BOOLEAN); + alfrescoPropertyTypesToCmisPropertyTypes.put(DataTypeDefinition.CATEGORY, CMISPropertyTypeEnum.ID); + alfrescoPropertyTypesToCmisPropertyTypes.put(DataTypeDefinition.CHILD_ASSOC_REF, null); + alfrescoPropertyTypesToCmisPropertyTypes.put(DataTypeDefinition.CONTENT, null); + alfrescoPropertyTypesToCmisPropertyTypes.put(DataTypeDefinition.DATE, CMISPropertyTypeEnum.DATETIME); + alfrescoPropertyTypesToCmisPropertyTypes.put(DataTypeDefinition.DATETIME, CMISPropertyTypeEnum.DATETIME); + alfrescoPropertyTypesToCmisPropertyTypes.put(DataTypeDefinition.DOUBLE, CMISPropertyTypeEnum.DECIMAL); + alfrescoPropertyTypesToCmisPropertyTypes.put(DataTypeDefinition.FLOAT, CMISPropertyTypeEnum.DECIMAL); + alfrescoPropertyTypesToCmisPropertyTypes.put(DataTypeDefinition.INT, CMISPropertyTypeEnum.INTEGER); + alfrescoPropertyTypesToCmisPropertyTypes.put(DataTypeDefinition.LOCALE, null); + alfrescoPropertyTypesToCmisPropertyTypes.put(DataTypeDefinition.LONG, CMISPropertyTypeEnum.INTEGER); + alfrescoPropertyTypesToCmisPropertyTypes.put(DataTypeDefinition.MLTEXT, CMISPropertyTypeEnum.STRING); + alfrescoPropertyTypesToCmisPropertyTypes.put(DataTypeDefinition.NODE_REF, CMISPropertyTypeEnum.ID); + alfrescoPropertyTypesToCmisPropertyTypes.put(DataTypeDefinition.PATH, null); + alfrescoPropertyTypesToCmisPropertyTypes.put(DataTypeDefinition.QNAME, null); + alfrescoPropertyTypesToCmisPropertyTypes.put(DataTypeDefinition.TEXT, CMISPropertyTypeEnum.STRING); + alfrescoPropertyTypesToCmisPropertyTypes.put(CMIS_DATATYPE_ID, CMISPropertyTypeEnum.ID); + alfrescoPropertyTypesToCmisPropertyTypes.put(CMIS_DATATYPE_URI, CMISPropertyTypeEnum.URI); + alfrescoPropertyTypesToCmisPropertyTypes.put(CMIS_DATATYPE_XML, CMISPropertyTypeEnum.XML); + alfrescoPropertyTypesToCmisPropertyTypes.put(CMIS_DATATYPE_HTML, CMISPropertyTypeEnum.HTML); } private DictionaryService dictionaryService; @@ -624,18 +636,7 @@ public class CMISMapping } QName dQName = dataTypeDefinition.getName(); - if (propertyQName.getNamespaceURI().equals(CMIS_MODEL_URI)) - { - if (dQName.equals(DataTypeDefinition.QNAME) || dQName.equals(DataTypeDefinition.NODE_REF)) - { - return CMISPropertyTypeEnum.ID; - } - else - { - alfrescoPropertyTypesToCimsPropertyTypes.get(dQName); - } - } - return alfrescoPropertyTypesToCimsPropertyTypes.get(dQName); + return alfrescoPropertyTypesToCmisPropertyTypes.get(dQName); } diff --git a/source/java/org/alfresco/cmis/property/CMISPropertyServiceImpl.java b/source/java/org/alfresco/cmis/property/CMISPropertyServiceImpl.java index 5006e72235..1ec5291fd6 100644 --- a/source/java/org/alfresco/cmis/property/CMISPropertyServiceImpl.java +++ b/source/java/org/alfresco/cmis/property/CMISPropertyServiceImpl.java @@ -245,7 +245,7 @@ public class CMISPropertyServiceImpl implements CMISPropertyService, Initializin addNamedPropertyAccessor(getContentStreamLengthPropertyAccessor()); addNamedPropertyAccessor(getContentStreamMimetypePropertyAccessor()); addNamedPropertyAccessor(getSimplePropertyAccessor(CMISMapping.PROP_CONTENT_STREAM_FILENAME, ContentModel.PROP_NAME, CMISScope.DOCUMENT)); - addNamedPropertyAccessor(getFixedValuePropertyAccessor(CMISMapping.PROP_CONTENT_STREAM_URI, null, CMISScope.DOCUMENT)); + addNamedPropertyAccessor(getContentStreamUriPropertyAccessor()); // CMIS Folder addNamedPropertyAccessor(getParentPropertyAccessor()); @@ -393,6 +393,14 @@ public class CMISPropertyServiceImpl implements CMISPropertyService, Initializin return accessor; } + public NamedPropertyAccessor getContentStreamUriPropertyAccessor() + { + ContentStreamUriPropertyAccessor accessor = new ContentStreamUriPropertyAccessor(); + accessor.setServiceRegistry(serviceRegistry); + accessor.setCMISMapping(cmisMapping); + return accessor; + } + public NamedPropertyAccessor getParentPropertyAccessor() { ParentPropertyAccessor accessor = new ParentPropertyAccessor(); diff --git a/source/java/org/alfresco/cmis/property/ContentStreamUriPropertyAccessor.java b/source/java/org/alfresco/cmis/property/ContentStreamUriPropertyAccessor.java new file mode 100644 index 0000000000..8244b79052 --- /dev/null +++ b/source/java/org/alfresco/cmis/property/ContentStreamUriPropertyAccessor.java @@ -0,0 +1,180 @@ +/* + * Copyright (C) 2005-2007 Alfresco Software Limited. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + * As a special exception to the terms and conditions of version 2.0 of + * the GPL, you may redistribute this Program in connection with Free/Libre + * and Open Source Software ("FLOSS") applications as described in Alfresco's + * FLOSS exception. You should have recieved a copy of the text describing + * the FLOSS exception, and it is also available here: + * http://www.alfresco.com/legal/licensing" + */ +package org.alfresco.cmis.property; + +import java.io.Serializable; +import java.util.Collection; + +import org.alfresco.cmis.dictionary.CMISMapping; +import org.alfresco.cmis.dictionary.CMISScope; +import org.alfresco.model.ContentModel; +import org.alfresco.repo.search.impl.lucene.LuceneQueryParser; +import org.alfresco.repo.search.impl.lucene.ParseException; +import org.alfresco.repo.search.impl.querymodel.PredicateMode; +import org.alfresco.service.cmr.repository.NodeRef; +import org.apache.lucene.search.Query; + +/** + * Accessor for CMIS content stream length property + * + * @author andyh + */ +public class ContentStreamUriPropertyAccessor extends AbstractNamedPropertyAccessor +{ + + public Serializable getProperty(NodeRef nodeRef) + { + StringBuilder sb = new StringBuilder(); + sb.append("/api/node/"); + sb.append(nodeRef.getStoreRef().getProtocol()); + sb.append("/"); + sb.append(nodeRef.getStoreRef().getIdentifier()); + sb.append("/"); + sb.append(nodeRef.getId()); + sb.append("/content."); + sb.append(getServiceRegistry().getNodeService().getProperty(nodeRef, ContentModel.PROP_NAME)); + return sb.toString(); + } + + @Override + public String getPropertyName() + { + return CMISMapping.PROP_CONTENT_STREAM_URI; + } + + @Override + public CMISScope getScope() + { + return CMISScope.DOCUMENT; + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneEquality(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneEquality(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException + { + return null; + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneExists(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.lang.Boolean) + */ + public Query buildLuceneExists(LuceneQueryParser lqp, String propertyName, Boolean not) throws ParseException + { + return null; + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneGreaterThan(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneGreaterThan(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException + { + return null; + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneGreaterThanOrEquals(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneGreaterThanOrEquals(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException + { + return null; + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneIn(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.util.Collection, java.lang.Boolean, + * org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneIn(LuceneQueryParser lqp, String propertyName, Collection values, Boolean not, PredicateMode mode) throws ParseException + { + return null; + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneInequality(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneInequality(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException + { + return null; + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneLessThan(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneLessThan(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException + { + return null; + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneLessThanOrEquals(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, org.alfresco.repo.search.impl.querymodel.PredicateMode) + */ + public Query buildLuceneLessThanOrEquals(LuceneQueryParser lqp, String propertyName, Serializable value, PredicateMode mode) throws ParseException + { + return null; + } + + /* + * (non-Javadoc) + * + * @see org.alfresco.cmis.property.NamedPropertyAccessor#buildLuceneLike(org.alfresco.repo.search.impl.lucene.LuceneQueryParser, + * java.lang.String, java.io.Serializable, java.lang.Boolean) + */ + public Query buildLuceneLike(LuceneQueryParser lqp, String propertyName, Serializable value, Boolean not) throws ParseException + { + return null; + } + + /* (non-Javadoc) + * @see org.alfresco.cmis.property.NamedPropertyAccessor#getLuceneSortField(java.lang.String) + */ + public String getLuceneSortField(String propertyName) + { + return null; + } +}