aegif / CmisSync

Synchronize content between a CMIS repository and your desktop. Like Dropbox for Enterprise Content Management!
http://CmisSync.com
162 stars 123 forks source link

duplicate repository ids break CmisUtils (happens with ModeShape) #610

Open plutext opened 8 years ago

plutext commented 8 years ago

With current master running in Visual Studio and connecting to ModeShape via Atom, I was getting:

CmisUtils [(null)] - An item with the same key has already been added.

The problem is that https://github.com/aegif/CmisSync/blob/master/CmisSync.Lib/Cmis/CmisUtils.cs#L201 doesn't check whether the collection already contains repo.Id

With ModeShape's sample data, there are 4 repos, 3 of which have the same repo.Id:

sample artifacts x 3

A possible patch is to generate a unique key from the repo.Id

nicolas-raoul commented 8 years ago

Very cool that ModeShape has a CMIS connector! Thanks for spotting the problem! Do you think you might be able to provide a patch to fix it?

nicolas-raoul commented 8 years ago

Looking further into the problem right now... I had never imagined that a GetCmisRepositories request could return repositories with the same id. I wonder how that shows up in CMIS Workbench. Would you mind sending me the AtomPub response to the GetCmisRepositories request, so that I can have a look at how repositories are actually identified? Thanks!

plutext commented 8 years ago

I suspect its not a simple matter of just changing the repo id :-(

   at DotCMIS.Binding.AtomPub.AbstractAtomPubService.Read(UrlBuilder url) in DotCMIS\binding\atompub\atompub.cs:line 439
   at DotCMIS.Binding.AtomPub.AbstractAtomPubService.GetRepositoriesInternal(String repositoryId) in DotCMIS\binding\atompub\atompub.cs:line 728
   at DotCMIS.Binding.AtomPub.RepositoryService.GetRepositoryInfo(String repositoryId, IExtensionsData extension) in DotCMIS\binding\atompub\atompub.cs:line 887
   at DotCMIS.Binding.Impl.BindingRepositoryService.GetRepositoryInfo(String repositoryId, IExtensionsData extension) in DotCMIS\binding\binding-impl.cs:line 447
plutext commented 8 years ago
<?xml version='1.0' encoding='UTF-8'?>
<app:service xmlns:atom="http://www.w3.org/2005/Atom" 
             xmlns:cmis="http://docs.oasis-open.org/ns/cmis/core/200908/" 
             xmlns:cmisra="http://docs.oasis-open.org/ns/cmis/restatom/200908/" 
             xmlns:app="http://www.w3.org/2007/app">
  <app:workspace>
    <atom:title>sample</atom:title>
    <app:collection href="http://52.18.2.246:32771/modeshape-cmis/atom/sample/children?id=%5Broot%5D">
      <cmisra:collectionType>root</cmisra:collectionType>
      <atom:title type="text">Root Collection</atom:title>
      <app:accept>application/atom+xml;type=entry</app:accept>
      <app:accept>application/cmisatom+xml</app:accept>
    </app:collection>
    <app:collection href="http://52.18.2.246:32771/modeshape-cmis/atom/sample/types">
      <cmisra:collectionType>types</cmisra:collectionType>
      <atom:title type="text">Types Collection</atom:title>
      <app:accept></app:accept>
    </app:collection>
    <app:collection href="http://52.18.2.246:32771/modeshape-cmis/atom/sample/query">
      <cmisra:collectionType>query</cmisra:collectionType>
      <atom:title type="text">Query Collection</atom:title>
      <app:accept>application/cmisquery+xml</app:accept>
    </app:collection>
    <app:collection href="http://52.18.2.246:32771/modeshape-cmis/atom/sample/checkedout">
      <cmisra:collectionType>checkedout</cmisra:collectionType>
      <atom:title type="text">Checked Out Collection</atom:title>
      <app:accept>application/cmisatom+xml</app:accept>
    </app:collection>
    <app:collection href="http://52.18.2.246:32771/modeshape-cmis/atom/sample/update">
      <cmisra:collectionType>update</cmisra:collectionType>
      <atom:title type="text">Bulk Update Collection</atom:title>
      <app:accept>application/cmisatom+xml</app:accept>
    </app:collection>
    <cmisra:repositoryInfo>
      <cmis:repositoryId>sample</cmis:repositoryId>
      <cmis:repositoryName>ModeShape</cmis:repositoryName>
      <cmis:repositoryDescription>
        jcr.repository.name=ModeShape
        option.versioning.supported=true
        option.query.sql.supported=true
        node.type.management.multivalued.properties.supported=true
        node.type.management.overrides.supported=true
        level.1.supported=true
        jcr.specification.version=2.0
        node.type.management.update.in.use.suported=true
        query.full.text.search.supported=true
        option.lifecycle.supported=false
        option.node.and.property.with.same.name.supported=true
        option.retention.supported=false
        option.node.type.management.supported=true
        identifier.stability=identifier.stability.indefinite.duration
        option.simple.versioning.supported=false
        query.stored.queries.supported=true
        node.type.management.orderable.child.nodes.supported=true
        jcr.specification.name=Content Repository for Java Technology API
        option.unfiled.content.supported=false
        option.baselines.supported=false
        node.type.management.primary.item.name.supported=true
        level.2.supported=true
        option.activities.supported=false
        node.type.management.multiple.binary.properties.supported=true
        query.languages=null
        option.transactions.supported=true
        option.locking.supported=true
        custom.rep.workspace.names=null
        query.xpath.pos.index=false
        option.update.mixin.node.types.supported=true
        query.joins=query.joins.inner.outer
        option.update.primary.node.type.supported=true
        jcr.repository.version=4.3.0.Final
        option.journaled.observation.supported=false
        option.access.control.supported=true
        node.type.management.value.constraints.supported=true
        option.shareable.nodes.supported=true
        custom.rep.name=sample
        option.workspace.management.supported=true
        write.supported=true
        query.xpath.doc.order=false
        node.type.management.autocreated.definitions.supported=true
        option.observation.supported=true
        node.type.management.residual.definitions.supported=true
        jcr.repository.vendor=JBoss, a division of Red Hat
        option.xml.export.supported=true
        node.type.management.property.types=true
        node.type.management.inheritance=node.type.management.inheritance.multiple
        option.xml.import.supported=true
        node.type.management.same.name.siblings.supported=true
        jcr.repository.vendor.url=http://www.modeshape.org
      </cmis:repositoryDescription>
      <cmis:vendorName>OpenCMIS</cmis:vendorName>
      <cmis:productName>OpenCMIS JCR</cmis:productName>
      <cmis:productVersion>0.3</cmis:productVersion>
      <cmis:rootFolderId>[root]</cmis:rootFolderId>
      <cmis:capabilities>
        <cmis:capabilityACL>none</cmis:capabilityACL>
        <cmis:capabilityAllVersionsSearchable>false</cmis:capabilityAllVersionsSearchable>
        <cmis:capabilityChanges>objectidsonly</cmis:capabilityChanges>
        <cmis:capabilityContentStreamUpdatability>anytime</cmis:capabilityContentStreamUpdatability>
        <cmis:capabilityGetDescendants>true</cmis:capabilityGetDescendants>
        <cmis:capabilityGetFolderTree>true</cmis:capabilityGetFolderTree>
        <cmis:capabilityMultifiling>false</cmis:capabilityMultifiling>
        <cmis:capabilityPWCSearchable>false</cmis:capabilityPWCSearchable>
        <cmis:capabilityPWCUpdatable>true</cmis:capabilityPWCUpdatable>
        <cmis:capabilityQuery>bothcombined</cmis:capabilityQuery>
        <cmis:capabilityRenditions>none</cmis:capabilityRenditions>
        <cmis:capabilityUnfiling>false</cmis:capabilityUnfiling>
        <cmis:capabilityVersionSpecificFiling>false</cmis:capabilityVersionSpecificFiling>
        <cmis:capabilityJoin>none</cmis:capabilityJoin>
      </cmis:capabilities>
      <cmis:cmisVersionSupported>1.0</cmis:cmisVersionSupported>
      <cmis:thinClientURI></cmis:thinClientURI>
    </cmisra:repositoryInfo>
    <atom:link rel="http://docs.oasis-open.org/ns/cmis/link/200908/typedescendants" href="http://52.18.2.246:32771/modeshape-cmis/atom/sample/typedesc" type="application/atom+xml;type=feed"/>
    <atom:link rel="http://docs.oasis-open.org/ns/cmis/link/200908/foldertree" href="http://52.18.2.246:32771/modeshape-cmis/atom/sample/foldertree?id=%5Broot%5D" type="application/cmistree+xml"/>
    <atom:link rel="http://docs.oasis-open.org/ns/cmis/link/200908/rootdescendants" href="http://52.18.2.246:32771/modeshape-cmis/atom/sample/descendants?id=%5Broot%5D" type="application/cmistree+xml" cmisra:id="[root]"/>
    <atom:link rel="http://docs.oasis-open.org/ns/cmis/link/200908/changes" href="http://52.18.2.246:32771/modeshape-cmis/atom/sample/changes" type="application/atom+xml;type=feed"/>
    <cmisra:uritemplate>
      <cmisra:template>http://52.18.2.246:32771/modeshape-cmis/atom/sample/id?id={id}&amp;filter={filter}&amp;includeAllowableActions={includeAllowableActions}&amp;includeACL={includeACL}&amp;includePolicyIds={includePolicyIds}&amp;includeRelationships={includeRelationships}&amp;renditionFilter={renditionFilter}</cmisra:template>
      <cmisra:type>objectbyid</cmisra:type>
      <cmisra:mediatype>application/atom+xml;type=entry</cmisra:mediatype>
    </cmisra:uritemplate>
    <cmisra:uritemplate>
      <cmisra:template>http://52.18.2.246:32771/modeshape-cmis/atom/sample/path?path={path}&amp;filter={filter}&amp;includeAllowableActions={includeAllowableActions}&amp;includeACL={includeACL}&amp;includePolicyIds={includePolicyIds}&amp;includeRelationships={includeRelationships}&amp;renditionFilter={renditionFilter}</cmisra:template>
      <cmisra:type>objectbypath</cmisra:type>
      <cmisra:mediatype>application/atom+xml;type=entry</cmisra:mediatype>
    </cmisra:uritemplate>
    <cmisra:uritemplate>
      <cmisra:template>http://52.18.2.246:32771/modeshape-cmis/atom/sample/type?id={id}</cmisra:template>
      <cmisra:type>typebyid</cmisra:type>
      <cmisra:mediatype>application/atom+xml;type=entry</cmisra:mediatype>
    </cmisra:uritemplate>
    <cmisra:uritemplate>
      <cmisra:template>http://52.18.2.246:32771/modeshape-cmis/atom/sample/query?q={q}&amp;searchAllVersions={searchAllVersions}&amp;includeAllowableActions={includeAllowableActions}&amp;includeRelationships={includeRelationships}&amp;maxItems={maxItems}&amp;skipCount={skipCount}</cmisra:template>
      <cmisra:type>query</cmisra:type>
      <cmisra:mediatype>application/atom+xml;type=feed</cmisra:mediatype>
    </cmisra:uritemplate>
  </app:workspace>
  <app:workspace>
    <atom:title>artifacts</atom:title>
    <app:collection href="http://52.18.2.246:32771/modeshape-cmis/atom/artifacts/children?id=%5Broot%5D">
      <cmisra:collectionType>root</cmisra:collectionType>
      <atom:title type="text">Root Collection</atom:title>
      <app:accept>application/atom+xml;type=entry</app:accept>
      <app:accept>application/cmisatom+xml</app:accept>
    </app:collection>
    <app:collection href="http://52.18.2.246:32771/modeshape-cmis/atom/artifacts/types">
      <cmisra:collectionType>types</cmisra:collectionType>
      <atom:title type="text">Types Collection</atom:title>
      <app:accept></app:accept>
    </app:collection>
    <app:collection href="http://52.18.2.246:32771/modeshape-cmis/atom/artifacts/query">
      <cmisra:collectionType>query</cmisra:collectionType>
      <atom:title type="text">Query Collection</atom:title>
      <app:accept>application/cmisquery+xml</app:accept>
    </app:collection>
    <app:collection href="http://52.18.2.246:32771/modeshape-cmis/atom/artifacts/checkedout">
      <cmisra:collectionType>checkedout</cmisra:collectionType>
      <atom:title type="text">Checked Out Collection</atom:title>
      <app:accept>application/cmisatom+xml</app:accept>
    </app:collection>
    <app:collection href="http://52.18.2.246:32771/modeshape-cmis/atom/artifacts/update">
      <cmisra:collectionType>update</cmisra:collectionType>
      <atom:title type="text">Bulk Update Collection</atom:title>
      <app:accept>application/cmisatom+xml</app:accept>
    </app:collection>
    <cmisra:repositoryInfo>
      <cmis:repositoryId>artifacts</cmis:repositoryId>
      <cmis:repositoryName>ModeShape</cmis:repositoryName>
      <cmis:repositoryDescription>
        jcr.repository.name=ModeShape
        option.versioning.supported=true
        option.query.sql.supported=true
        node.type.management.multivalued.properties.supported=true
        node.type.management.overrides.supported=true
        level.1.supported=true
        jcr.specification.version=2.0
        node.type.management.update.in.use.suported=true
        query.full.text.search.supported=true
        option.lifecycle.supported=false
        option.node.and.property.with.same.name.supported=true
        option.retention.supported=false
        option.node.type.management.supported=true
        identifier.stability=identifier.stability.indefinite.duration
        option.simple.versioning.supported=false
        query.stored.queries.supported=true
        node.type.management.orderable.child.nodes.supported=true
        jcr.specification.name=Content Repository for Java Technology API
        option.unfiled.content.supported=false
        option.baselines.supported=false
        node.type.management.primary.item.name.supported=true
        level.2.supported=true
        option.activities.supported=false
        node.type.management.multiple.binary.properties.supported=true
        query.languages=null
        option.transactions.supported=true
        option.locking.supported=true
        custom.rep.workspace.names=null
        query.xpath.pos.index=false
        option.update.mixin.node.types.supported=true
        query.joins=query.joins.inner.outer
        option.update.primary.node.type.supported=true
        jcr.repository.version=4.3.0.Final
        option.journaled.observation.supported=false
        option.access.control.supported=true
        node.type.management.value.constraints.supported=true
        option.shareable.nodes.supported=true
        custom.rep.name=artifacts
        option.workspace.management.supported=true
        write.supported=true
        query.xpath.doc.order=false
        node.type.management.autocreated.definitions.supported=true
        option.observation.supported=true
        node.type.management.residual.definitions.supported=true
        jcr.repository.vendor=JBoss, a division of Red Hat
        option.xml.export.supported=true
        node.type.management.property.types=true
        node.type.management.inheritance=node.type.management.inheritance.multiple
        option.xml.import.supported=true
        node.type.management.same.name.siblings.supported=true
        jcr.repository.vendor.url=http://www.modeshape.org
      </cmis:repositoryDescription>
      <cmis:vendorName>OpenCMIS</cmis:vendorName>
      <cmis:productName>OpenCMIS JCR</cmis:productName>
      <cmis:productVersion>0.3</cmis:productVersion>
      <cmis:rootFolderId>[root]</cmis:rootFolderId>
      <cmis:capabilities>
        <cmis:capabilityACL>none</cmis:capabilityACL>
        <cmis:capabilityAllVersionsSearchable>false</cmis:capabilityAllVersionsSearchable>
        <cmis:capabilityChanges>objectidsonly</cmis:capabilityChanges>
        <cmis:capabilityContentStreamUpdatability>anytime</cmis:capabilityContentStreamUpdatability>
        <cmis:capabilityGetDescendants>true</cmis:capabilityGetDescendants>
        <cmis:capabilityGetFolderTree>true</cmis:capabilityGetFolderTree>
        <cmis:capabilityMultifiling>false</cmis:capabilityMultifiling>
        <cmis:capabilityPWCSearchable>false</cmis:capabilityPWCSearchable>
        <cmis:capabilityPWCUpdatable>true</cmis:capabilityPWCUpdatable>
        <cmis:capabilityQuery>bothcombined</cmis:capabilityQuery>
        <cmis:capabilityRenditions>none</cmis:capabilityRenditions>
        <cmis:capabilityUnfiling>false</cmis:capabilityUnfiling>
        <cmis:capabilityVersionSpecificFiling>false</cmis:capabilityVersionSpecificFiling>
        <cmis:capabilityJoin>none</cmis:capabilityJoin>
      </cmis:capabilities>
      <cmis:cmisVersionSupported>1.0</cmis:cmisVersionSupported>
      <cmis:thinClientURI></cmis:thinClientURI>
    </cmisra:repositoryInfo>
    <atom:link rel="http://docs.oasis-open.org/ns/cmis/link/200908/typedescendants" href="http://52.18.2.246:32771/modeshape-cmis/atom/artifacts/typedesc" type="application/atom+xml;type=feed"/>
    <atom:link rel="http://docs.oasis-open.org/ns/cmis/link/200908/foldertree" href="http://52.18.2.246:32771/modeshape-cmis/atom/artifacts/foldertree?id=%5Broot%5D" type="application/cmistree+xml"/>
    <atom:link rel="http://docs.oasis-open.org/ns/cmis/link/200908/rootdescendants" href="http://52.18.2.246:32771/modeshape-cmis/atom/artifacts/descendants?id=%5Broot%5D" type="application/cmistree+xml" cmisra:id="[root]"/>
    <atom:link rel="http://docs.oasis-open.org/ns/cmis/link/200908/changes" href="http://52.18.2.246:32771/modeshape-cmis/atom/artifacts/changes" type="application/atom+xml;type=feed"/>
    <cmisra:uritemplate>
      <cmisra:template>http://52.18.2.246:32771/modeshape-cmis/atom/artifacts/id?id={id}&amp;filter={filter}&amp;includeAllowableActions={includeAllowableActions}&amp;includeACL={includeACL}&amp;includePolicyIds={includePolicyIds}&amp;includeRelationships={includeRelationships}&amp;renditionFilter={renditionFilter}</cmisra:template>
      <cmisra:type>objectbyid</cmisra:type>
      <cmisra:mediatype>application/atom+xml;type=entry</cmisra:mediatype>
    </cmisra:uritemplate>
    <cmisra:uritemplate>
      <cmisra:template>http://52.18.2.246:32771/modeshape-cmis/atom/artifacts/path?path={path}&amp;filter={filter}&amp;includeAllowableActions={includeAllowableActions}&amp;includeACL={includeACL}&amp;includePolicyIds={includePolicyIds}&amp;includeRelationships={includeRelationships}&amp;renditionFilter={renditionFilter}</cmisra:template>
      <cmisra:type>objectbypath</cmisra:type>
      <cmisra:mediatype>application/atom+xml;type=entry</cmisra:mediatype>
    </cmisra:uritemplate>
    <cmisra:uritemplate>
      <cmisra:template>http://52.18.2.246:32771/modeshape-cmis/atom/artifacts/type?id={id}</cmisra:template>
      <cmisra:type>typebyid</cmisra:type>
      <cmisra:mediatype>application/atom+xml;type=entry</cmisra:mediatype>
    </cmisra:uritemplate>
    <cmisra:uritemplate>
      <cmisra:template>http://52.18.2.246:32771/modeshape-cmis/atom/artifacts/query?q={q}&amp;searchAllVersions={searchAllVersions}&amp;includeAllowableActions={includeAllowableActions}&amp;includeRelationships={includeRelationships}&amp;maxItems={maxItems}&amp;skipCount={skipCount}</cmisra:template>
      <cmisra:type>query</cmisra:type>
      <cmisra:mediatype>application/atom+xml;type=feed</cmisra:mediatype>
    </cmisra:uritemplate>
  </app:workspace>
  <app:workspace>
    <atom:title>artifacts</atom:title>
    <app:collection href="http://52.18.2.246:32771/modeshape-cmis/atom/artifacts/children?id=%5Broot%5D">
      <cmisra:collectionType>root</cmisra:collectionType>
      <atom:title type="text">Root Collection</atom:title>
      <app:accept>application/atom+xml;type=entry</app:accept>
      <app:accept>application/cmisatom+xml</app:accept>
    </app:collection>
    <app:collection href="http://52.18.2.246:32771/modeshape-cmis/atom/artifacts/types">
      <cmisra:collectionType>types</cmisra:collectionType>
      <atom:title type="text">Types Collection</atom:title>
      <app:accept></app:accept>
    </app:collection>
    <app:collection href="http://52.18.2.246:32771/modeshape-cmis/atom/artifacts/query">
      <cmisra:collectionType>query</cmisra:collectionType>
      <atom:title type="text">Query Collection</atom:title>
      <app:accept>application/cmisquery+xml</app:accept>
    </app:collection>
    <app:collection href="http://52.18.2.246:32771/modeshape-cmis/atom/artifacts/checkedout">
      <cmisra:collectionType>checkedout</cmisra:collectionType>
      <atom:title type="text">Checked Out Collection</atom:title>
      <app:accept>application/cmisatom+xml</app:accept>
    </app:collection>
    <app:collection href="http://52.18.2.246:32771/modeshape-cmis/atom/artifacts/update">
      <cmisra:collectionType>update</cmisra:collectionType>
      <atom:title type="text">Bulk Update Collection</atom:title>
      <app:accept>application/cmisatom+xml</app:accept>
    </app:collection>
    <cmisra:repositoryInfo>
      <cmis:repositoryId>artifacts</cmis:repositoryId>
      <cmis:repositoryName>ModeShape</cmis:repositoryName>
      <cmis:repositoryDescription>
        jcr.repository.name=ModeShape
        option.versioning.supported=true
        option.query.sql.supported=true
        node.type.management.multivalued.properties.supported=true
        node.type.management.overrides.supported=true
        level.1.supported=true
        jcr.specification.version=2.0
        node.type.management.update.in.use.suported=true
        query.full.text.search.supported=true
        option.lifecycle.supported=false
        option.node.and.property.with.same.name.supported=true
        option.retention.supported=false
        option.node.type.management.supported=true
        identifier.stability=identifier.stability.indefinite.duration
        option.simple.versioning.supported=false
        query.stored.queries.supported=true
        node.type.management.orderable.child.nodes.supported=true
        jcr.specification.name=Content Repository for Java Technology API
        option.unfiled.content.supported=false
        option.baselines.supported=false
        node.type.management.primary.item.name.supported=true
        level.2.supported=true
        option.activities.supported=false
        node.type.management.multiple.binary.properties.supported=true
        query.languages=null
        option.transactions.supported=true
        option.locking.supported=true
        custom.rep.workspace.names=null
        query.xpath.pos.index=false
        option.update.mixin.node.types.supported=true
        query.joins=query.joins.inner.outer
        option.update.primary.node.type.supported=true
        jcr.repository.version=4.3.0.Final
        option.journaled.observation.supported=false
        option.access.control.supported=true
        node.type.management.value.constraints.supported=true
        option.shareable.nodes.supported=true
        custom.rep.name=artifacts
        option.workspace.management.supported=true
        write.supported=true
        query.xpath.doc.order=false
        node.type.management.autocreated.definitions.supported=true
        option.observation.supported=true
        node.type.management.residual.definitions.supported=true
        jcr.repository.vendor=JBoss, a division of Red Hat
        option.xml.export.supported=true
        node.type.management.property.types=true
        node.type.management.inheritance=node.type.management.inheritance.multiple
        option.xml.import.supported=true
        node.type.management.same.name.siblings.supported=true
        jcr.repository.vendor.url=http://www.modeshape.org
      </cmis:repositoryDescription>
      <cmis:vendorName>OpenCMIS</cmis:vendorName>
      <cmis:productName>OpenCMIS JCR</cmis:productName>
      <cmis:productVersion>0.3</cmis:productVersion>
      <cmis:rootFolderId>[root]</cmis:rootFolderId>
      <cmis:capabilities>
        <cmis:capabilityACL>none</cmis:capabilityACL>
        <cmis:capabilityAllVersionsSearchable>false</cmis:capabilityAllVersionsSearchable>
        <cmis:capabilityChanges>objectidsonly</cmis:capabilityChanges>
        <cmis:capabilityContentStreamUpdatability>anytime</cmis:capabilityContentStreamUpdatability>
        <cmis:capabilityGetDescendants>true</cmis:capabilityGetDescendants>
        <cmis:capabilityGetFolderTree>true</cmis:capabilityGetFolderTree>
        <cmis:capabilityMultifiling>false</cmis:capabilityMultifiling>
        <cmis:capabilityPWCSearchable>false</cmis:capabilityPWCSearchable>
        <cmis:capabilityPWCUpdatable>true</cmis:capabilityPWCUpdatable>
        <cmis:capabilityQuery>bothcombined</cmis:capabilityQuery>
        <cmis:capabilityRenditions>none</cmis:capabilityRenditions>
        <cmis:capabilityUnfiling>false</cmis:capabilityUnfiling>
        <cmis:capabilityVersionSpecificFiling>false</cmis:capabilityVersionSpecificFiling>
        <cmis:capabilityJoin>none</cmis:capabilityJoin>
      </cmis:capabilities>
      <cmis:cmisVersionSupported>1.0</cmis:cmisVersionSupported>
      <cmis:thinClientURI></cmis:thinClientURI>
    </cmisra:repositoryInfo>
    <atom:link rel="http://docs.oasis-open.org/ns/cmis/link/200908/typedescendants" href="http://52.18.2.246:32771/modeshape-cmis/atom/artifacts/typedesc" type="application/atom+xml;type=feed"/>
    <atom:link rel="http://docs.oasis-open.org/ns/cmis/link/200908/foldertree" href="http://52.18.2.246:32771/modeshape-cmis/atom/artifacts/foldertree?id=%5Broot%5D" type="application/cmistree+xml"/>
    <atom:link rel="http://docs.oasis-open.org/ns/cmis/link/200908/rootdescendants" href="http://52.18.2.246:32771/modeshape-cmis/atom/artifacts/descendants?id=%5Broot%5D" type="application/cmistree+xml" cmisra:id="[root]"/>
    <atom:link rel="http://docs.oasis-open.org/ns/cmis/link/200908/changes" href="http://52.18.2.246:32771/modeshape-cmis/atom/artifacts/changes" type="application/atom+xml;type=feed"/>
    <cmisra:uritemplate>
      <cmisra:template>http://52.18.2.246:32771/modeshape-cmis/atom/artifacts/id?id={id}&amp;filter={filter}&amp;includeAllowableActions={includeAllowableActions}&amp;includeACL={includeACL}&amp;includePolicyIds={includePolicyIds}&amp;includeRelationships={includeRelationships}&amp;renditionFilter={renditionFilter}</cmisra:template>
      <cmisra:type>objectbyid</cmisra:type>
      <cmisra:mediatype>application/atom+xml;type=entry</cmisra:mediatype>
    </cmisra:uritemplate>
    <cmisra:uritemplate>
      <cmisra:template>http://52.18.2.246:32771/modeshape-cmis/atom/artifacts/path?path={path}&amp;filter={filter}&amp;includeAllowableActions={includeAllowableActions}&amp;includeACL={includeACL}&amp;includePolicyIds={includePolicyIds}&amp;includeRelationships={includeRelationships}&amp;renditionFilter={renditionFilter}</cmisra:template>
      <cmisra:type>objectbypath</cmisra:type>
      <cmisra:mediatype>application/atom+xml;type=entry</cmisra:mediatype>
    </cmisra:uritemplate>
    <cmisra:uritemplate>
      <cmisra:template>http://52.18.2.246:32771/modeshape-cmis/atom/artifacts/type?id={id}</cmisra:template>
      <cmisra:type>typebyid</cmisra:type>
      <cmisra:mediatype>application/atom+xml;type=entry</cmisra:mediatype>
    </cmisra:uritemplate>
    <cmisra:uritemplate>
      <cmisra:template>http://52.18.2.246:32771/modeshape-cmis/atom/artifacts/query?q={q}&amp;searchAllVersions={searchAllVersions}&amp;includeAllowableActions={includeAllowableActions}&amp;includeRelationships={includeRelationships}&amp;maxItems={maxItems}&amp;skipCount={skipCount}</cmisra:template>
      <cmisra:type>query</cmisra:type>
      <cmisra:mediatype>application/atom+xml;type=feed</cmisra:mediatype>
    </cmisra:uritemplate>
  </app:workspace>
  <app:workspace>
    <atom:title>artifacts</atom:title>
    <app:collection href="http://52.18.2.246:32771/modeshape-cmis/atom/artifacts/children?id=%5Broot%5D">
      <cmisra:collectionType>root</cmisra:collectionType>
      <atom:title type="text">Root Collection</atom:title>
      <app:accept>application/atom+xml;type=entry</app:accept>
      <app:accept>application/cmisatom+xml</app:accept>
    </app:collection>
    <app:collection href="http://52.18.2.246:32771/modeshape-cmis/atom/artifacts/types">
      <cmisra:collectionType>types</cmisra:collectionType>
      <atom:title type="text">Types Collection</atom:title>
      <app:accept></app:accept>
    </app:collection>
    <app:collection href="http://52.18.2.246:32771/modeshape-cmis/atom/artifacts/query">
      <cmisra:collectionType>query</cmisra:collectionType>
      <atom:title type="text">Query Collection</atom:title>
      <app:accept>application/cmisquery+xml</app:accept>
    </app:collection>
    <app:collection href="http://52.18.2.246:32771/modeshape-cmis/atom/artifacts/checkedout">
      <cmisra:collectionType>checkedout</cmisra:collectionType>
      <atom:title type="text">Checked Out Collection</atom:title>
      <app:accept>application/cmisatom+xml</app:accept>
    </app:collection>
    <app:collection href="http://52.18.2.246:32771/modeshape-cmis/atom/artifacts/update">
      <cmisra:collectionType>update</cmisra:collectionType>
      <atom:title type="text">Bulk Update Collection</atom:title>
      <app:accept>application/cmisatom+xml</app:accept>
    </app:collection>
    <cmisra:repositoryInfo>
      <cmis:repositoryId>artifacts</cmis:repositoryId>
      <cmis:repositoryName>ModeShape</cmis:repositoryName>
      <cmis:repositoryDescription>
        jcr.repository.name=ModeShape
        option.versioning.supported=true
        option.query.sql.supported=true
        node.type.management.multivalued.properties.supported=true
        node.type.management.overrides.supported=true
        level.1.supported=true
        jcr.specification.version=2.0
        node.type.management.update.in.use.suported=true
        query.full.text.search.supported=true
        option.lifecycle.supported=false
        option.node.and.property.with.same.name.supported=true
        option.retention.supported=false
        option.node.type.management.supported=true
        identifier.stability=identifier.stability.indefinite.duration
        option.simple.versioning.supported=false
        query.stored.queries.supported=true
        node.type.management.orderable.child.nodes.supported=true
        jcr.specification.name=Content Repository for Java Technology API
        option.unfiled.content.supported=false
        option.baselines.supported=false
        node.type.management.primary.item.name.supported=true
        level.2.supported=true
        option.activities.supported=false
        node.type.management.multiple.binary.properties.supported=true
        query.languages=null
        option.transactions.supported=true
        option.locking.supported=true
        custom.rep.workspace.names=null
        query.xpath.pos.index=false
        option.update.mixin.node.types.supported=true
        query.joins=query.joins.inner.outer
        option.update.primary.node.type.supported=true
        jcr.repository.version=4.3.0.Final
        option.journaled.observation.supported=false
        option.access.control.supported=true
        node.type.management.value.constraints.supported=true
        option.shareable.nodes.supported=true
        custom.rep.name=artifacts
        option.workspace.management.supported=true
        write.supported=true
        query.xpath.doc.order=false
        node.type.management.autocreated.definitions.supported=true
        option.observation.supported=true
        node.type.management.residual.definitions.supported=true
        jcr.repository.vendor=JBoss, a division of Red Hat
        option.xml.export.supported=true
        node.type.management.property.types=true
        node.type.management.inheritance=node.type.management.inheritance.multiple
        option.xml.import.supported=true
        node.type.management.same.name.siblings.supported=true
        jcr.repository.vendor.url=http://www.modeshape.org
      </cmis:repositoryDescription>
      <cmis:vendorName>OpenCMIS</cmis:vendorName>
      <cmis:productName>OpenCMIS JCR</cmis:productName>
      <cmis:productVersion>0.3</cmis:productVersion>
      <cmis:rootFolderId>[root]</cmis:rootFolderId>
      <cmis:capabilities>
        <cmis:capabilityACL>none</cmis:capabilityACL>
        <cmis:capabilityAllVersionsSearchable>false</cmis:capabilityAllVersionsSearchable>
        <cmis:capabilityChanges>objectidsonly</cmis:capabilityChanges>
        <cmis:capabilityContentStreamUpdatability>anytime</cmis:capabilityContentStreamUpdatability>
        <cmis:capabilityGetDescendants>true</cmis:capabilityGetDescendants>
        <cmis:capabilityGetFolderTree>true</cmis:capabilityGetFolderTree>
        <cmis:capabilityMultifiling>false</cmis:capabilityMultifiling>
        <cmis:capabilityPWCSearchable>false</cmis:capabilityPWCSearchable>
        <cmis:capabilityPWCUpdatable>true</cmis:capabilityPWCUpdatable>
        <cmis:capabilityQuery>bothcombined</cmis:capabilityQuery>
        <cmis:capabilityRenditions>none</cmis:capabilityRenditions>
        <cmis:capabilityUnfiling>false</cmis:capabilityUnfiling>
        <cmis:capabilityVersionSpecificFiling>false</cmis:capabilityVersionSpecificFiling>
        <cmis:capabilityJoin>none</cmis:capabilityJoin>
      </cmis:capabilities>
      <cmis:cmisVersionSupported>1.0</cmis:cmisVersionSupported>
      <cmis:thinClientURI></cmis:thinClientURI>
    </cmisra:repositoryInfo>
    <atom:link rel="http://docs.oasis-open.org/ns/cmis/link/200908/typedescendants" href="http://52.18.2.246:32771/modeshape-cmis/atom/artifacts/typedesc" type="application/atom+xml;type=feed"/>
    <atom:link rel="http://docs.oasis-open.org/ns/cmis/link/200908/foldertree" href="http://52.18.2.246:32771/modeshape-cmis/atom/artifacts/foldertree?id=%5Broot%5D" type="application/cmistree+xml"/>
    <atom:link rel="http://docs.oasis-open.org/ns/cmis/link/200908/rootdescendants" href="http://52.18.2.246:32771/modeshape-cmis/atom/artifacts/descendants?id=%5Broot%5D" type="application/cmistree+xml" cmisra:id="[root]"/>
    <atom:link rel="http://docs.oasis-open.org/ns/cmis/link/200908/changes" href="http://52.18.2.246:32771/modeshape-cmis/atom/artifacts/changes" type="application/atom+xml;type=feed"/>
    <cmisra:uritemplate>
      <cmisra:template>http://52.18.2.246:32771/modeshape-cmis/atom/artifacts/id?id={id}&amp;filter={filter}&amp;includeAllowableActions={includeAllowableActions}&amp;includeACL={includeACL}&amp;includePolicyIds={includePolicyIds}&amp;includeRelationships={includeRelationships}&amp;renditionFilter={renditionFilter}</cmisra:template>
      <cmisra:type>objectbyid</cmisra:type>
      <cmisra:mediatype>application/atom+xml;type=entry</cmisra:mediatype>
    </cmisra:uritemplate>
    <cmisra:uritemplate>
      <cmisra:template>http://52.18.2.246:32771/modeshape-cmis/atom/artifacts/path?path={path}&amp;filter={filter}&amp;includeAllowableActions={includeAllowableActions}&amp;includeACL={includeACL}&amp;includePolicyIds={includePolicyIds}&amp;includeRelationships={includeRelationships}&amp;renditionFilter={renditionFilter}</cmisra:template>
      <cmisra:type>objectbypath</cmisra:type>
      <cmisra:mediatype>application/atom+xml;type=entry</cmisra:mediatype>
    </cmisra:uritemplate>
    <cmisra:uritemplate>
      <cmisra:template>http://52.18.2.246:32771/modeshape-cmis/atom/artifacts/type?id={id}</cmisra:template>
      <cmisra:type>typebyid</cmisra:type>
      <cmisra:mediatype>application/atom+xml;type=entry</cmisra:mediatype>
    </cmisra:uritemplate>
    <cmisra:uritemplate>
      <cmisra:template>http://52.18.2.246:32771/modeshape-cmis/atom/artifacts/query?q={q}&amp;searchAllVersions={searchAllVersions}&amp;includeAllowableActions={includeAllowableActions}&amp;includeRelationships={includeRelationships}&amp;maxItems={maxItems}&amp;skipCount={skipCount}</cmisra:template>
      <cmisra:type>query</cmisra:type>
      <cmisra:mediatype>application/atom+xml;type=feed</cmisra:mediatype>
    </cmisra:uritemplate>
  </app:workspace>
</app:service>
plutext commented 8 years ago

On cursory visual inspection, they look like duplicates

nicolas-raoul commented 8 years ago

The CMIS 1.1 specification says:

The service link relation when provided on a CMIS resource MUST point to an AtomPub service document with only one workspace element.

That AtomPub service document MUST then only contain one workspace element which MUST be the workspace representing the repository containing the Atom Entry or Atom Feed document.

The service document MUST contain only one workspace element.

The rest of the specification always speaks about using singular (never plural) about "the workspace element".

Therefore, I guess it is a CMIS implementation bug in ModeShape. Maybe the XML node is indeed just duplicated?

nicolas-raoul commented 8 years ago

Would you mind reporting the issue to ModeShape? Thanks a lot, looking forward to having CmisSync work with ModeShape! :-)

nicolas-raoul commented 8 years ago

Meanwhile, if they are really duplicate, a temporary workaround might be to drop any repository with the same id? A pull request for this would be welcome :-)

plutext commented 8 years ago

See https://developer.jboss.org/thread/262265

It looks like a 1 line fix to ignore duplicate repo.Id:

if (!result.ContainsKey(repo.Id))

but my ModeSpan is not starting properly at the moment, so I can't test it.