Merge from SEAMIST3

git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@10730 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
David Caruana
2008-09-04 11:08:13 +00:00
parent a6e263078e
commit 3e303a86d5
16 changed files with 237 additions and 708 deletions

View File

@@ -24,7 +24,8 @@
*/
package org.alfresco.repo.cmis.rest;
import org.alfresco.repo.cmis.rest.CMISService.TypesFilter;
import org.alfresco.cmis.CMISService;
import org.alfresco.cmis.CMISService.TypesFilter;
import org.alfresco.repo.jscript.BaseScopableProcessorExtension;
import org.alfresco.repo.jscript.ScriptNode;
import org.alfresco.repo.model.Repository;
@@ -41,7 +42,7 @@ import org.alfresco.service.cmr.repository.NodeRef;
*
* @author davic
*/
public class CMISScript extends BaseScopableProcessorExtension
public class CMISScript extends BaseScopableProcessorExtension
{
private static final TypesFilter defaultTypesFilter = TypesFilter.FoldersAndDocuments;
@@ -91,6 +92,16 @@ public class CMISScript extends BaseScopableProcessorExtension
this.cmisService = cmisService;
}
/**
* Gets the supported CMIS Version
*
* @return CMIS version
*/
public String getVersion()
{
return cmisService.getCMISVersion();
}
/**
* Gets the default root folder path
*

View File

@@ -1,440 +0,0 @@
/*
* Copyright (C) 2005-2008 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.repo.cmis.rest;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.alfresco.error.AlfrescoRuntimeException;
import org.alfresco.model.ContentModel;
import org.alfresco.repo.model.Repository;
import org.alfresco.repo.search.QueryParameterDefImpl;
import org.alfresco.repo.security.authentication.AuthenticationUtil;
import org.alfresco.repo.security.authentication.AuthenticationUtil.RunAsWork;
import org.alfresco.repo.tenant.TenantDeployer;
import org.alfresco.repo.tenant.TenantDeployerService;
import org.alfresco.repo.transaction.RetryingTransactionHelper;
import org.alfresco.repo.transaction.RetryingTransactionHelper.RetryingTransactionCallback;
import org.alfresco.service.cmr.dictionary.DataTypeDefinition;
import org.alfresco.service.cmr.dictionary.DictionaryService;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.NodeService;
import org.alfresco.service.cmr.repository.StoreRef;
import org.alfresco.service.cmr.search.QueryParameterDefinition;
import org.alfresco.service.cmr.search.ResultSet;
import org.alfresco.service.cmr.search.SearchParameters;
import org.alfresco.service.cmr.search.SearchService;
import org.alfresco.service.namespace.NamespaceService;
import org.alfresco.service.namespace.QName;
import org.alfresco.util.AbstractLifecycleBean;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationListener;
/**
* CMIS Service
*
* @author davidc
*/
public class CMISService implements ApplicationContextAware, ApplicationListener, TenantDeployer
{
/**
* Types Filter
*
* @author davidc
*/
public enum TypesFilter
{
Folders,
FoldersAndDocuments,
Documents
};
/** Query Parameters */
private static final QName PARAM_PARENT = QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI, "parent");
private static final QName PARAM_USERNAME = QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI, "username");
/** Shallow search for all files and folders */
private static final String LUCENE_QUERY_SHALLOW_FOLDERS =
"+PARENT:\"${cm:parent}\" " +
"-TYPE:\"" + ContentModel.TYPE_SYSTEM_FOLDER + "\" " +
"+TYPE:\"" + ContentModel.TYPE_FOLDER + "\"";
/** Shallow search for all files and folders */
private static final String LUCENE_QUERY_SHALLOW_FILES =
"+PARENT:\"${cm:parent}\" " +
"-TYPE:\"" + ContentModel.TYPE_SYSTEM_FOLDER + "\" " +
"+TYPE:\"" + ContentModel.TYPE_CONTENT + "\" " +
"-ASPECT:\"" + ContentModel.ASPECT_WORKING_COPY + "\"";
private static final String LUCENE_QUERY_CHECKEDOUT =
"+@cm\\:workingCopyOwner:${cm:username}";
private static final String LUCENE_QUERY_CHECKEDOUT_IN_FOLDER =
"+@cm\\:workingCopyOwner:${cm:username} " +
"+PARENT:\"${cm:parent}\"";
// dependencies
private Repository repository;
private RetryingTransactionHelper retryingTransactionHelper;
private DictionaryService dictionaryService;
private SearchService searchService;
private NodeService nodeService;
private TenantDeployerService tenantDeployerService;
private ProcessorLifecycle lifecycle = new ProcessorLifecycle();
// default CMIS store and path
private String defaultRootPath;
private Map<String, NodeRef> defaultRootNodeRefs;
// data types for query
private DataTypeDefinition nodeRefDataType;
private DataTypeDefinition textDataType;
/**
* Sets the default root path
*
* store_type/store_id/path...
*
* @param path store_type/store_id/path...
*/
public void setDefaultRootPath(String path)
{
defaultRootPath = path;
}
/**
* Sets the tenant deployer service
*
* @param tenantDeployerService
*/
public void setTenantDeployerService(TenantDeployerService tenantDeployerService)
{
this.tenantDeployerService = tenantDeployerService;
}
/**
* Sets helper that provides transaction callbacks
*/
public void setTransactionHelper(RetryingTransactionHelper retryingTransactionHelper)
{
this.retryingTransactionHelper = retryingTransactionHelper;
}
/**
* @param dictionaryService
*/
public void setDictionaryService(DictionaryService dictionaryService)
{
this.dictionaryService = dictionaryService;
}
/**
* @param searchService
*/
public void setSearchService(SearchService searchService)
{
this.searchService = searchService;
}
/**
* @param nodeService
*/
public void setNodeService(NodeService nodeService)
{
this.nodeService = nodeService;
}
/**
* @param repository
*/
public void setRepository(Repository repository)
{
this.repository = repository;
}
/* (non-Javadoc)
* @see org.springframework.context.ApplicationContextAware#setApplicationContext(org.springframework.context.ApplicationContext)
*/
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException
{
lifecycle.setApplicationContext(applicationContext);
}
/* (non-Javadoc)
* @see org.springframework.context.ApplicationListener#onApplicationEvent(org.springframework.context.ApplicationEvent)
*/
public void onApplicationEvent(ApplicationEvent event)
{
lifecycle.onApplicationEvent(event);
}
/**
* Hooks into Spring Application Lifecycle
*/
private class ProcessorLifecycle extends AbstractLifecycleBean
{
@Override
protected void onBootstrap(ApplicationEvent event)
{
init();
}
@Override
protected void onShutdown(ApplicationEvent event)
{
}
}
/* (non-Javadoc)
* @see org.alfresco.repo.tenant.TenantDeployer#onEnableTenant()
*/
public void onEnableTenant()
{
init();
}
/* (non-Javadoc)
* @see org.alfresco.repo.tenant.TenantDeployer#onDisableTenant()
*/
public void onDisableTenant()
{
destroy();
}
/* (non-Javadoc)
* @see org.alfresco.repo.tenant.TenantDeployer#init()
*/
public void init()
{
// initialise data types
nodeRefDataType = dictionaryService.getDataType(DataTypeDefinition.NODE_REF);
textDataType = dictionaryService.getDataType(DataTypeDefinition.TEXT);
// initialise root node ref
tenantDeployerService.register(this);
if (defaultRootNodeRefs == null)
{
defaultRootNodeRefs = new HashMap<String, NodeRef>(1);
}
getDefaultRootNodeRef();
}
/* (non-Javadoc)
* @see org.alfresco.repo.tenant.TenantDeployer#destroy()
*/
public void destroy()
{
defaultRootNodeRefs.remove(tenantDeployerService.getCurrentUserDomain());
}
/**
* Gets the default root node path
*
* @return root node path
*/
public String getDefaultRootPath()
{
return defaultRootPath;
}
/**
* Gets the default root node ref
*
* @return root node ref
*/
public NodeRef getDefaultRootNodeRef()
{
String tenantDomain = tenantDeployerService.getCurrentUserDomain();
NodeRef defaultNodeRef = defaultRootNodeRefs.get(tenantDomain);
if (defaultNodeRef == null)
{
defaultNodeRef = AuthenticationUtil.runAs(new RunAsWork<NodeRef>()
{
public NodeRef doWork() throws Exception
{
return retryingTransactionHelper.doInTransaction(new RetryingTransactionCallback<NodeRef>()
{
public NodeRef execute() throws Exception
{
return repository.findNodeRef("path", defaultRootPath.split("/"));
};
});
}
}, AuthenticationUtil.getSystemUserName());
if (defaultNodeRef == null)
{
throw new AlfrescoRuntimeException("Default root folder path '" + defaultRootPath + "' not found");
}
defaultRootNodeRefs.put(tenantDomain, defaultNodeRef);
}
return defaultNodeRef;
}
/**
* Gets the default store ref
*
* @return store ref
*/
public StoreRef getDefaultRootStoreRef()
{
return getDefaultRootNodeRef().getStoreRef();
}
/**
* Query for node children
*
* @param parent node to query children for
* @param typesFilter types filter
* @return children of node
*/
public NodeRef[] getChildren(NodeRef parent, TypesFilter typesFilter)
{
if (typesFilter == TypesFilter.FoldersAndDocuments)
{
NodeRef[] folders = queryChildren(parent, TypesFilter.Folders);
NodeRef[] docs = queryChildren(parent, TypesFilter.Documents);
NodeRef[] foldersAndDocs = new NodeRef[folders.length + docs.length];
System.arraycopy(folders, 0, foldersAndDocs, 0, folders.length);
System.arraycopy(docs, 0, foldersAndDocs, folders.length, docs.length);
return foldersAndDocs;
}
else if (typesFilter == TypesFilter.Folders)
{
NodeRef[] folders = queryChildren(parent, TypesFilter.Folders);
return folders;
}
else if (typesFilter == TypesFilter.Documents)
{
NodeRef[] docs = queryChildren(parent, TypesFilter.Documents);
return docs;
}
return new NodeRef[0];
}
/**
* Query for checked out items
*
* @param username for user
* @param folder (optional) within folder
* @param includeDescendants true => include descendants of folder, false => only children of folder
* @return checked out items
*/
public NodeRef[] getCheckedOut(String username, NodeRef folder, boolean includeDescendants)
{
SearchParameters params = new SearchParameters();
params.setLanguage(SearchService.LANGUAGE_LUCENE);
QueryParameterDefinition usernameDef = new QueryParameterDefImpl(PARAM_USERNAME, textDataType, true, username);
params.addQueryParameterDefinition(usernameDef);
if (folder == null)
{
// get all checked-out items
params.setQuery(LUCENE_QUERY_CHECKEDOUT);
params.addStore(getDefaultRootStoreRef());
}
else
{
// get all checked-out items within folder
// NOTE: special-case for all descendants in root folder (treat as all checked-out items)
if (includeDescendants && nodeService.getRootNode(folder.getStoreRef()) == folder)
{
// get all checked-out items within specified folder store
params.setQuery(LUCENE_QUERY_CHECKEDOUT);
params.addStore(folder.getStoreRef());
}
else
{
// TODO: implement descendants of folder
params.setQuery(LUCENE_QUERY_CHECKEDOUT_IN_FOLDER);
params.addStore(folder.getStoreRef());
QueryParameterDefinition parentDef = new QueryParameterDefImpl(PARAM_PARENT, nodeRefDataType, true, folder.toString());
params.addQueryParameterDefinition(parentDef);
}
}
ResultSet resultSet = null;
try
{
resultSet = searchService.query(params);
List<NodeRef> results = resultSet.getNodeRefs();
NodeRef[] nodeRefs = new NodeRef[results.size()];
return results.toArray(nodeRefs);
}
finally
{
if (resultSet != null) resultSet.close();
}
}
/**
* Query children helper
*
* NOTE: Queries for folders only or documents only
*
* @param parent node to query children for
* @param typesFilter folders or documents
* @return node children
*/
private NodeRef[] queryChildren(NodeRef parent, TypesFilter typesFilter)
{
SearchParameters params = new SearchParameters();
params.setLanguage(SearchService.LANGUAGE_LUCENE);
params.addStore(parent.getStoreRef());
QueryParameterDefinition parentDef = new QueryParameterDefImpl(PARAM_PARENT, nodeRefDataType, true, parent.toString());
params.addQueryParameterDefinition(parentDef);
if (typesFilter == TypesFilter.Folders)
{
params.setQuery(LUCENE_QUERY_SHALLOW_FOLDERS);
}
else if (typesFilter == TypesFilter.Documents)
{
params.setQuery(LUCENE_QUERY_SHALLOW_FILES);
}
ResultSet resultSet = null;
try
{
resultSet = searchService.query(params);
List<NodeRef> results = resultSet.getNodeRefs();
NodeRef[] nodeRefs = new NodeRef[results.size()];
return results.toArray(nodeRefs);
}
finally
{
if (resultSet != null) resultSet.close();
}
}
}

View File

@@ -473,10 +473,7 @@ public class CMISTest extends BaseCMISWebScriptTest
{
// retrieve test folder for checkouts
Entry testFolder = createTestFolder("testGetCheckedOut");
Link childrenLink = testFolder.getLink(CMISConstants.REL_CHILDREN);
Feed scope = getFeed(childrenLink.getHref());
assertNotNull(scope);
CMISProperties props = scope.getExtension(CMISConstants.PROPERTIES);
CMISProperties props = testFolder.getExtension(CMISConstants.PROPERTIES);
String scopeId = props.getObjectId();
assertNotNull(scopeId);
@@ -497,10 +494,9 @@ public class CMISTest extends BaseCMISWebScriptTest
// retrieve test folder for checkouts
Entry testFolder = createTestFolder("testCheckout");
Link childrenLink = testFolder.getLink(CMISConstants.REL_CHILDREN);
Feed scope = getFeed(childrenLink.getHref());
// create document for checkout
Entry document = createDocument(scope.getSelfLink().getHref(), "testCheckout");
Entry document = createDocument(childrenLink.getHref(), "testCheckout");
Response documentRes = sendRequest(new GetRequest(document.getSelfLink().getHref().toString()), 200, getAtomValidator());
assertNotNull(documentRes);
String documentXML = documentRes.getContentAsString();
@@ -528,10 +524,9 @@ public class CMISTest extends BaseCMISWebScriptTest
// retrieve test folder for checkouts
Entry testFolder = createTestFolder("testCancelCheckout");
Link childrenLink = testFolder.getLink(CMISConstants.REL_CHILDREN);
Feed scope = getFeed(childrenLink.getHref());
// create document for checkout
Entry document = createDocument(scope.getSelfLink().getHref(), "testCancelCheckout");
Entry document = createDocument(childrenLink.getHref(), "testCancelCheckout");
Response documentRes = sendRequest(new GetRequest(document.getSelfLink().getHref().toString()), 200, getAtomValidator());
assertNotNull(documentRes);
String xml = documentRes.getContentAsString();
@@ -574,10 +569,9 @@ public class CMISTest extends BaseCMISWebScriptTest
// retrieve test folder for checkins
Entry testFolder = createTestFolder("testCheckIn");
Link childrenLink = testFolder.getLink(CMISConstants.REL_CHILDREN);
Feed scope = getFeed(childrenLink.getHref());
// create document for checkout
Entry document = createDocument(scope.getSelfLink().getHref(), "testCheckin");
Entry document = createDocument(childrenLink.getHref(), "testCheckin");
Response documentRes = sendRequest(new GetRequest(document.getSelfLink().getHref().toString()), 200, getAtomValidator());
assertNotNull(documentRes);
String xml = documentRes.getContentAsString();
@@ -648,10 +642,9 @@ public class CMISTest extends BaseCMISWebScriptTest
// retrieve test folder for checkins
Entry testFolder = createTestFolder("testUpdateOnCheckIn");
Link childrenLink = testFolder.getLink(CMISConstants.REL_CHILDREN);
Feed scope = getFeed(childrenLink.getHref());
// create document for checkout
Entry document = createDocument(scope.getSelfLink().getHref(), "testUpdateOnCheckIn");
Entry document = createDocument(childrenLink.getHref(), "testUpdateOnCheckIn");
Response documentRes = sendRequest(new GetRequest(document.getSelfLink().getHref().toString()), 200, getAtomValidator());
assertNotNull(documentRes);
String xml = documentRes.getContentAsString();
@@ -711,10 +704,9 @@ public class CMISTest extends BaseCMISWebScriptTest
// retrieve test folder for checkins
Entry testFolder = createTestFolder("testGetAllVersions");
Link childrenLink = testFolder.getLink(CMISConstants.REL_CHILDREN);
Feed scope = getFeed(childrenLink.getHref());
// create document for checkout
Entry document = createDocument(scope.getSelfLink().getHref(), "testGetAllVersions");
Entry document = createDocument(childrenLink.getHref(), "testGetAllVersions");
Response documentRes = sendRequest(new GetRequest(document.getSelfLink().getHref().toString()), 200, getAtomValidator());
assertNotNull(documentRes);
String xml = documentRes.getContentAsString();

View File

@@ -1,55 +1,45 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
-*- rnc -*-
RELAX NG Compact Syntax Grammar for the
Atom Format Specification Version 11
-->
<xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified"
targetNamespace="http://www.w3.org/2007/app"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:app="http://www.w3.org/2007/app"
xmlns:cmis="http://www.cmis.org/2008/05"
>
<xs:import namespace="http://www.w3.org/2005/Atom" schemaLocation="ATOM4CMIS.xsd"/>
<xs:import namespace="http://www.cmis.org/2008/05" schemaLocation="CMIS-REST.xsd"/>
<xs:element name="service" type="app:appServiceType"></xs:element>
<xs:complexType name="appServiceType">
<xs:sequence>
<xs:element ref="atom:author" minOccurs="0" maxOccurs="1"></xs:element>
<xs:element ref="app:workspace" minOccurs="1" maxOccurs="unbounded"></xs:element>
<xs:any minOccurs="0" maxOccurs="unbounded" processContents="lax" namespace="##other"/>
</xs:sequence>
</xs:complexType>
<xs:element name="workspace" type="app:appWorkspaceType"></xs:element>
<xs:complexType name="appWorkspaceType">
<xs:sequence>
<xs:element ref="atom:title"></xs:element>
<xs:element ref="cmis:repositoryInfo" minOccurs="0" maxOccurs="1"></xs:element>
<xs:element ref="app:collection" minOccurs="0" maxOccurs="unbounded"></xs:element>
</xs:sequence>
<xs:attribute ref="cmis:id"></xs:attribute>
<xs:attribute ref="cmis:repositoryRelationship"></xs:attribute>
</xs:complexType>
<xs:element name="collection" type="app:appCollectionType"></xs:element>
<xs:complexType name="appCollectionType">
<xs:sequence>
<xs:element ref="atom:title"></xs:element>
</xs:sequence>
<xs:attribute ref="cmis:id"></xs:attribute>
<xs:attribute ref="cmis:collectionType"></xs:attribute>
<xs:attribute name="href" type="xs:anyURI"></xs:attribute>
</xs:complexType>
<xs:attribute name="href" type="xs:anyURI"></xs:attribute>
<!--
-*- rnc -*- RELAX NG Compact Syntax Grammar for the Atom Format
Specification Version 11
-->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified" targetNamespace="http://www.w3.org/2007/app"
xmlns:atom="http://www.w3.org/2005/Atom" xmlns:app="http://www.w3.org/2007/app"
xmlns:cmis="http://www.cmis.org/2008/05">
<xs:import namespace="http://www.w3.org/2005/Atom"
schemaLocation="ATOM4CMIS.xsd" />
<xs:import namespace="http://www.cmis.org/2008/05"
schemaLocation="CMIS-REST.xsd" />
<xs:element name="service" type="app:appServiceType"></xs:element>
<xs:complexType name="appServiceType">
<xs:sequence>
<xs:element ref="atom:author" minOccurs="0" maxOccurs="1"></xs:element>
<xs:element ref="app:workspace" minOccurs="1" maxOccurs="unbounded"></xs:element>
<xs:any minOccurs="0" maxOccurs="unbounded" processContents="lax"
namespace="##other" />
</xs:sequence>
</xs:complexType>
<xs:element name="workspace" type="app:appWorkspaceType"></xs:element>
<xs:complexType name="appWorkspaceType">
<xs:sequence>
<xs:element ref="atom:title"></xs:element>
<xs:element ref="cmis:repositoryInfo" minOccurs="0"
maxOccurs="1"></xs:element>
<xs:element ref="app:collection" minOccurs="0" maxOccurs="unbounded"></xs:element>
</xs:sequence>
<xs:attribute ref="cmis:id"></xs:attribute>
<xs:attribute ref="cmis:repositoryRelationship"></xs:attribute>
</xs:complexType>
<xs:element name="collection" type="app:appCollectionType"></xs:element>
<xs:complexType name="appCollectionType">
<xs:sequence>
<xs:element ref="atom:title"></xs:element>
</xs:sequence>
<xs:attribute ref="cmis:id"></xs:attribute>
<xs:attribute ref="cmis:collectionType"></xs:attribute>
<xs:attribute name="href" type="xs:anyURI"></xs:attribute>
</xs:complexType>
<xs:attribute name="href" type="xs:anyURI"></xs:attribute>
</xs:schema>
<!-- EOF -->
<!-- EOF -->

View File

@@ -1,20 +1,15 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
-*- rnc -*-
RELAX NG Compact Syntax Grammar for the
Atom Format Specification Version 11
-->
<!--
-*- rnc -*- RELAX NG Compact Syntax Grammar for the Atom Format
Specification Version 11
-->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified"
targetNamespace="http://www.cmis.org/2008/05"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:xhtml="http://www.w3.org/1999/xhtml"
elementFormDefault="qualified" targetNamespace="http://www.cmis.org/2008/05"
xmlns:atom="http://www.w3.org/2005/Atom" xmlns:xhtml="http://www.w3.org/1999/xhtml"
xmlns:cmis="http://www.cmis.org/2008/05">
<xs:import namespace="http://www.w3.org/XML/1998/namespace" />
<xs:attribute name="id" type="xs:string" />
<xs:attribute name="index" type="xs:int" />
<xs:attribute name="index" type="xs:integer" />
<xs:attribute name="collectionType">
<xs:simpleType>
<xs:restriction base="xs:string">
@@ -26,9 +21,7 @@
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="repositoryRelationship" type="xs:string" />
<xs:element name="repositoryInfo" type="cmis:repositoryInfoType" />
<xs:element name="property" type="cmis:propertyDefinitionType" />
<xs:element name="parentId" type="xs:string" />
@@ -37,26 +30,24 @@
<xs:element name="description" type="xs:string" />
<xs:element name="isQueryable" type="xs:boolean" />
<xs:element name="isCreatable" type="xs:boolean" />
<xs:element name="isFileable" type="xs:boolean" />
<xs:element name="queryName" type="xs:string" />
<xs:element name="baseTypeQueryName" type="xs:string" />
<xs:element name="isContentStreamAllowed" type="xs:boolean" />
<xs:element name="AllowedSourceTypes" type="xs:string" />
<xs:element name="AllowedTargetTypes" type="xs:string" />
<xs:element name="constraints" type="xs:string" />
<xs:element name="objectId" type="xs:string" />
<xs:element name="type" type="cmis:typeType" />
<xs:element name="parentUrl" type="xs:anyURI" />
<xs:element name="maxLength" type="xs:int" />
<xs:element name="maxLength" type="xs:integer" />
<xs:element name="schemaURI" type="xs:string" />
<xs:element name="encoding" type="xs:string" />
<xs:element name="isOpenChoice" type="xs:boolean" />
<xs:element name="isRequired" type="xs:boolean" />
<xs:element name="defaultValue" type="xs:string" />
<xs:element name="creationDate" type="xs:dateTime" />
<xs:element name="lastModifiedBy" type="xs:dateTime" />
<xs:element name="baseType" type="cmis:baseObjectType" />
<xs:element name="canDelete" type="xs:boolean" />
<xs:element name="canUpdateProperties" type="xs:boolean" />
<xs:element name="canGetProperties" type="xs:boolean" />
@@ -76,22 +67,23 @@
<xs:element name="canRemovePolicy" type="xs:boolean" />
<xs:element name="canGetChildren" type="xs:boolean" />
<xs:element name="canGetDescendants" type="xs:boolean" />
<xs:element name="canGetRelationships" type="xs:boolean" />
<xs:element name="isControllable" type="xs:boolean" />
<xs:element name="source" type="xs:string" />
<xs:element name="target" type="xs:string" />
<xs:element name="isImmutable" type="xs:boolean" />
<xs:element name="hasMoreItems" type="xs:boolean" />
<xs:element name="allowableActions" type="cmis:allowableActions" />
<xs:element name="allowableActions" type="cmis:allowableActionsType" />
<xs:element name="query" type="cmis:queryType" />
<xs:element name="isOrderable" type="xs:boolean" />
<xs:element name="statement" type="xs:string" />
<xs:element name="pageSize" type="xs:int" />
<xs:element name="skipCount" type="xs:int" />
<xs:element name="pageSize" type="xs:integer" />
<xs:element name="skipCount" type="xs:integer" />
<xs:element name="returnAllowableActions" type="xs:boolean" />
<xs:element name="searchAllVersions" type="xs:boolean" />
<xs:element name="isInherited" type="xs:boolean" />
<xs:element name="propertyName" type="xs:string" />
<xs:element name="propertyId" type="xs:string" />
<xs:element name="propertyType">
<xs:simpleType>
<xs:restriction base="xs:string">
@@ -108,7 +100,15 @@
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="contentStreamAllowed">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="notallowed" />
<xs:enumeration value="allowed" />
<xs:enumeration value="required" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="cardinality">
<xs:simpleType>
<xs:restriction base="xs:string">
@@ -117,18 +117,15 @@
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="choices">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="index"
type="xs:positiveInteger" />
<xs:attribute name="index" type="xs:positiveInteger" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:element name="updateability">
<xs:simpleType>
<xs:restriction base="xs:string">
@@ -138,52 +135,38 @@
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:complexType name="repositoryInfoType">
<xs:sequence minOccurs="1">
<xs:element name="repositoryId" type="xs:string"
minOccurs="1" />
<xs:element name="repositoryName" type="xs:string"
minOccurs="1" />
<xs:element name="repositoryDescription" type="xs:string"
minOccurs="1" />
<xs:element name="vendorName" type="xs:string" />
<xs:element name="productName" type="xs:string" />
<xs:element name="productVersion" type="xs:string" />
<xs:element name="capabilities"
type="cmis:RepositoryInfoCapabilities" />
<xs:element name="repositorySpecificInformation"
type="xs:string" maxOccurs="1" minOccurs="0" />
<xs:any namespace="##other" processContents="skip"
minOccurs="0" maxOccurs="unbounded" />
<xs:element name="capabilities" type="cmis:RepositoryInfoCapabilities" />
<xs:element name="cmisVersionsSupported" type="xs:string" />
<xs:element name="repositorySpecificInformation" type="xs:string"
maxOccurs="1" minOccurs="0" />
<xs:any namespace="##other" processContents="lax" minOccurs="0"
maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="RepositoryInfoCapabilities">
<xs:sequence>
<xs:element name="capabilityMultifiling" type="xs:boolean"
minOccurs="1" maxOccurs="1" />
<xs:element name="capabilityUnfiling" type="xs:boolean"
minOccurs="1" maxOccurs="1" />
<xs:element name="capabilityVersionSpecificFiling"
type="xs:boolean" minOccurs="1" maxOccurs="1" />
<xs:element name="capabilityVersionSpecificFiling" type="xs:boolean"
minOccurs="1" maxOccurs="1" />
<xs:element name="capabilityPWCUpdateable" type="xs:boolean"
minOccurs="1" maxOccurs="1" />
<xs:element name="capabilityAllVersionsSearchable"
type="xs:boolean" minOccurs="1" maxOccurs="1" />
<xs:element name="capabilityJoin" minOccurs="1"
maxOccurs="1">
<xs:element name="capabilityAllVersionsSearchable" type="xs:boolean"
minOccurs="1" maxOccurs="1" />
<xs:element name="capabilityJoin" minOccurs="1" maxOccurs="1">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="noJoin" />
@@ -201,9 +184,10 @@
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:any namespace="##other" processContents="skip" minOccurs="0"
maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
<xs:simpleType name="baseObjectType">
<xs:restriction base="xs:string">
<xs:enumeration value="document" />
@@ -212,7 +196,6 @@
<xs:enumeration value="policy" />
</xs:restriction>
</xs:simpleType>
<xs:element name="contentStreamMimetype">
<xs:simpleType>
<xs:restriction base="xs:string">
@@ -220,197 +203,140 @@
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:complexType name="propertyDefinitionType">
<xs:sequence>
<xs:element ref="cmis:propertyName" minOccurs="1"
maxOccurs="1" />
<xs:element ref="cmis:propertyId" minOccurs="1" maxOccurs="1" />
<xs:element ref="cmis:displayName" minOccurs="1"
maxOccurs="1" />
<xs:element ref="cmis:description" minOccurs="0"
maxOccurs="1" />
<xs:element ref="cmis:isInherited" minOccurs="0"
maxOccurs="1" />
<xs:element ref="cmis:propertyType" minOccurs="1"
maxOccurs="1" />
<xs:element ref="cmis:cardinality" minOccurs="1"
maxOccurs="1" />
<xs:element ref="cmis:maxLength" minOccurs="0"
maxOccurs="1" />
<xs:element ref="cmis:schemaURI" minOccurs="0"
maxOccurs="1" />
<xs:element ref="cmis:maxLength" minOccurs="0" maxOccurs="1" />
<xs:element ref="cmis:schemaURI" minOccurs="0" maxOccurs="1" />
<xs:element ref="cmis:encoding" minOccurs="0" maxOccurs="1" />
<xs:element ref="cmis:choices" minOccurs="0"
maxOccurs="unbounded" />
<xs:element ref="cmis:choices" minOccurs="0" maxOccurs="unbounded" />
<xs:element ref="cmis:isOpenChoice" minOccurs="0"
maxOccurs="1" />
<xs:element ref="cmis:isRequired" minOccurs="1"
maxOccurs="1" />
<xs:element ref="cmis:isRequired" minOccurs="1" maxOccurs="1" />
<xs:element ref="cmis:defaultValue" minOccurs="0"
maxOccurs="unbounded" />
<xs:element ref="cmis:updateability" minOccurs="1"
maxOccurs="1" />
<xs:element ref="cmis:isQueryable" minOccurs="1"
maxOccurs="1" />
<xs:element ref="cmis:isOrderable" minOccurs="1"
maxOccurs="1" />
<xs:any processContents="lax" namespace="##other" minOccurs="0"
maxOccurs="unbounded" />
</xs:sequence>
<xs:attribute ref="cmis:id" />
</xs:complexType>
<xs:complexType name="allowableActions">
<xs:all>
<xs:element ref="cmis:canDelete" minOccurs="0"
maxOccurs="1" />
<xs:complexType name="allowableActionsType">
<xs:sequence>
<xs:element ref="cmis:parentId" minOccurs="0" maxOccurs="1" />
<xs:element ref="cmis:parentUrl" minOccurs="0"
maxOccurs="1" />
<xs:element ref="cmis:parentUrl" minOccurs="0" maxOccurs="1" />
<xs:element ref="cmis:canDelete" minOccurs="0" maxOccurs="1" />
<xs:element ref="cmis:canUpdateProperties" minOccurs="0"
maxOccurs="1" />
<xs:element ref="cmis:canGetProperties" minOccurs="0"
maxOccurs="1" />
<xs:element ref="cmis:canGetRelationships" minOccurs="0"
maxOccurs="1" />
<xs:element ref="cmis:canGetParents" minOccurs="0"
maxOccurs="1" />
<xs:element ref="cmis:canGetDescendants" minOccurs="0"
maxOccurs="1" />
<xs:element ref="cmis:canMove" minOccurs="0" maxOccurs="1" />
<xs:element ref="cmis:canDeleteVersion" minOccurs="0"
maxOccurs="1" />
<xs:element ref="cmis:canDeleteContent" minOccurs="0"
maxOccurs="1" />
<xs:element ref="cmis:canCheckout" minOccurs="0"
maxOccurs="1" />
<xs:element ref="cmis:canCancelCheckout" minOccurs="0"
maxOccurs="1" />
<xs:element ref="cmis:canCheckin" minOccurs="0"
maxOccurs="1" />
<xs:element ref="cmis:canCheckin" minOccurs="0" maxOccurs="1" />
<xs:element ref="cmis:canSetContent" minOccurs="0"
maxOccurs="1" />
<xs:element ref="cmis:canGetAllVersions" minOccurs="0"
maxOccurs="1" />
<xs:element ref="cmis:canAddToFolder" minOccurs="0"
maxOccurs="1" />
<xs:element ref="cmis:canRemoveFromFolder" minOccurs="0"
maxOccurs="1" />
<xs:element ref="cmis:canViewContent" minOccurs="0"
maxOccurs="1" />
<xs:element ref="cmis:canAddPolicy" minOccurs="0"
maxOccurs="1" />
<xs:element ref="cmis:canRemovePolicy" minOccurs="0"
maxOccurs="1" />
<xs:element ref="cmis:canGetChildren" minOccurs="0"
maxOccurs="1" />
</xs:all>
</xs:complexType>
<xs:complexType name="queryType">
<xs:sequence>
<xs:element ref="cmis:statement" minOccurs="1"
maxOccurs="1" />
<xs:element ref="cmis:searchAllVersions" minOccurs="0"
maxOccurs="1" />
<xs:element ref="cmis:pageSize" minOccurs="0" maxOccurs="1" />
<xs:element ref="cmis:skipCount" minOccurs="0"
maxOccurs="1" />
<xs:element ref="cmis:returnAllowableActions" minOccurs="0"
maxOccurs="1" />
<xs:any namespace="##other" minOccurs="0" maxOccurs="unbounded"
processContents="lax" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="queryType">
<xs:sequence>
<xs:element ref="cmis:statement" minOccurs="1" maxOccurs="1" />
<xs:element ref="cmis:searchAllVersions" minOccurs="0"
maxOccurs="1" />
<xs:element ref="cmis:pageSize" minOccurs="0" maxOccurs="1" />
<xs:element ref="cmis:skipCount" minOccurs="0" maxOccurs="1" />
<xs:element ref="cmis:returnAllowableActions" minOccurs="0"
maxOccurs="1" />
<xs:any namespace="##other" minOccurs="0" maxOccurs="unbounded"
processContents="lax" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="typeType">
<xs:sequence>
<xs:element ref="cmis:objectId" minOccurs="1" maxOccurs="1" />
<xs:element ref="cmis:baseType" minOccurs="1" maxOccurs="1" />
<xs:element ref="cmis:lastModifiedBy" minOccurs="1"
maxOccurs="1" />
<xs:element ref="cmis:creationDate" minOccurs="1"
maxOccurs="1" />
<xs:element ref="cmis:queryName" minOccurs="1"
maxOccurs="1" />
<xs:element ref="cmis:queryName" minOccurs="1" maxOccurs="1" />
<xs:element ref="cmis:displayName" minOccurs="1"
maxOccurs="1" />
<xs:element ref="cmis:baseTypeQueryName" minOccurs="1"
maxOccurs="1" />
<xs:element ref="cmis:parentId" minOccurs="1" maxOccurs="1" />
<xs:element ref="cmis:description" minOccurs="0"
maxOccurs="1" />
<xs:element ref="cmis:isCreatable" minOccurs="1"
maxOccurs="1" />
<xs:element ref="cmis:isVersionable" minOccurs="1"
maxOccurs="1" />
<xs:element ref="cmis:isFileable" minOccurs="1" maxOccurs="1" />
<xs:element ref="cmis:isQueryable" minOccurs="1"
maxOccurs="1" />
<xs:element ref="cmis:isContentStreamAllowed" minOccurs="1"
maxOccurs="1" />
<xs:element ref="cmis:isControllable" minOccurs="1"
maxOccurs="1" />
<xs:element ref="cmis:isVersionable" minOccurs="1"
maxOccurs="1" />
<xs:element ref="cmis:contentStreamAllowed" minOccurs="1"
maxOccurs="1" />
<xs:element ref="cmis:AllowedSourceTypes" minOccurs="0"
maxOccurs="1" />
<xs:element ref="cmis:AllowedTargetTypes" minOccurs="0"
maxOccurs="1" />
<xs:element ref="cmis:property" minOccurs="0"
maxOccurs="unbounded" />
<xs:element ref="cmis:property" minOccurs="0" maxOccurs="unbounded" />
<xs:element ref="cmis:type" minOccurs="0" maxOccurs="unbounded" />
<xs:any namespace="##other" minOccurs="0" maxOccurs="unbounded"
processContents="lax" />
</xs:sequence>
</xs:complexType>
<!-- properties -->
<xs:element name="properties" type="cmis:propertiesType" />
<xs:complexType name="propertiesType">
<xs:sequence>
<xs:element ref="cmis:propertyBoolean" minOccurs="0"
@@ -419,8 +345,7 @@
maxOccurs="unbounded" />
<xs:element ref="cmis:propertyDecimal" minOccurs="0"
maxOccurs="unbounded" />
<xs:element ref="cmis:propertyID" minOccurs="0"
maxOccurs="unbounded" />
<xs:element ref="cmis:propertyID" minOccurs="0" maxOccurs="unbounded" />
<xs:element ref="cmis:propertyInteger" minOccurs="0"
maxOccurs="unbounded" />
<xs:element ref="cmis:propertyString" minOccurs="0"
@@ -431,12 +356,10 @@
maxOccurs="unbounded" />
<xs:element ref="cmis:propertyHTML" minOccurs="0"
maxOccurs="unbounded" />
<xs:any namespace="##other" processContents="lax"
minOccurs="0" maxOccurs="unbounded" />
<xs:any namespace="##other" processContents="lax" minOccurs="0"
maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
<xs:element name="propertyString">
<xs:complexType>
<xs:simpleContent>
@@ -447,7 +370,6 @@
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:element name="propertyHTML">
<xs:complexType>
<xs:simpleContent>
@@ -458,8 +380,6 @@
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:element name="propertyXML">
<xs:complexType>
<xs:simpleContent>
@@ -470,7 +390,6 @@
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:element name="propertyBoolean">
<xs:complexType>
<xs:simpleContent>
@@ -481,7 +400,6 @@
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:element name="propertyID">
<xs:complexType>
<xs:simpleContent>
@@ -492,7 +410,6 @@
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:element name="propertyURI">
<xs:complexType>
<xs:simpleContent>
@@ -503,19 +420,16 @@
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:element name="propertyDecimal">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:float">
<xs:extension base="xs:decimal">
<xs:attribute ref="cmis:name" />
<xs:attribute ref="cmis:index" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:element name="propertyDateTime">
<xs:complexType>
<xs:simpleContent>
@@ -526,18 +440,16 @@
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:element name="propertyInteger">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:int">
<xs:extension base="xs:integer">
<xs:attribute ref="cmis:name" />
<xs:attribute ref="cmis:index" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:attribute name="name" type="xs:string" />
</xs:schema>
<!-- EOF -->
<!-- EOF -->

View File

@@ -5,12 +5,12 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.w3.org/2005/Atom ATOM4CMIS.xsd http://www.cmis.org/2008/05 CMIS-REST.xsd ">
<!-- all -->
<cmis:canDelete>true</cmis:canDelete>
<!-- if not embedded in entry -->
<cmis:parentId>cmis:parentId</cmis:parentId>
<cmis:parentUrl>http://tempuri.org</cmis:parentUrl>
<!-- all -->
<cmis:canDelete>true</cmis:canDelete>
<!-- all -->
<cmis:canUpdateProperties>true</cmis:canUpdateProperties>
@@ -46,4 +46,4 @@
</cmis:allowableActions>
</cmis:allowableActions>

View File

@@ -23,6 +23,7 @@
<cmis:capabilityJoin>innerAndOuter</cmis:capabilityJoin>
<cmis:capabilityFullText>fulltextandstructured</cmis:capabilityFullText>
</cmis:capabilities>
<cmis:cmisVersionsSupported>0.43</cmis:cmisVersionsSupported>
<cmis:repositorySpecificInformation>Welcome to ACME 99</cmis:repositorySpecificInformation>
</cmis:repositoryInfo>
<app:collection cmis:collectionType="unfiled" href="http://www.cmis.org/rep1/unfiled">

View File

@@ -13,17 +13,21 @@
<cmis:baseTypeQueryName>document</cmis:baseTypeQueryName>
<cmis:parentId></cmis:parentId>
<cmis:description>The document type</cmis:description>
<cmis:isCreatable>true</cmis:isCreatable>
<cmis:isVersionable>true</cmis:isVersionable>
<cmis:isFileable>true</cmis:isFileable>
<cmis:isQueryable>true</cmis:isQueryable>
<cmis:isContentStreamAllowed>true</cmis:isContentStreamAllowed>
<cmis:isControllable>true</cmis:isControllable>
<cmis:isVersionable>true</cmis:isVersionable>
<cmis:contentStreamAllowed>allowed</cmis:contentStreamAllowed>
<!-- optional property definitions -->
<cmis:property cmis:id="foo1">
<cmis:propertyName>foo1</cmis:propertyName>
<cmis:propertyId>propIdForFoo1</cmis:propertyId>
<cmis:displayName>foo1</cmis:displayName>
<cmis:description>Description of foo1</cmis:description>
<cmis:isInherited>false</cmis:isInherited>
<cmis:propertyType>String</cmis:propertyType>
<cmis:cardinality>Single</cmis:cardinality>
<cmis:maxLength>64</cmis:maxLength>
@@ -36,4 +40,4 @@
<cmis:isOrderable>true</cmis:isOrderable>
</cmis:property>
</cmis:type>
</cmis:type>