Alfresco CMIS多方面具有相同的属性名称

时间:2014-12-08 14:43:19

标签: alfresco cmis opencmis

这是对情况的简短描述:

我在私有Jar文件中声明一个新bean,以添加两个新的Aspects以匹配CMIS 1.1规范中的Secondary Type特性。

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE beans PUBLIC '-//SPRING//DTD BEAN//EN' 'http://www.springframework.org/dtd/spring-beans.dtd'>
<beans>
    <!-- Registration of new models --> 
    <bean id="myExtension" parent="dictionaryModelBootstrap" depends-on="dictionaryBootstrap">
        <property name="models">
            <list>
                <value>alfresco/extension/my-extension-model_1.xml</value>
                <value>alfresco/extension/my-extension-model_2.xml</value>
            </list>
        </property>
    </bean>
</beans>

以下是my-extension-model_1.xml的代码:

<?xml version="1.0" encoding="UTF-8"?>

<!-- Definition of new Model -->

<!-- The important part here is the name - Note: the use of the my: namespace 
    which is defined further on in the document -->
<model name="my:model_1" xmlns="http://www.alfresco.org/model/dictionary/1.0">

    <!-- Optional meta-data about the model -->
    <description>Model 1</description>
    <author>mtyc</author>
    <version>1.0</version>

    <!-- Imports are required to allow references to definitions in other models -->
    <imports>
        <!-- Import Alfresco Dictionary Definitions -->
        <import uri="http://www.alfresco.org/model/dictionary/1.0" prefix="d" />
        <!-- Import Alfresco Content Domain Model Definitions -->
        <import uri="http://www.alfresco.org/model/content/1.0" prefix="cm" />
    </imports>

    <!-- Introduction of new namespaces defined by this model -->
    <!-- NOTE: The following namespace my.new.model should be changed to reflect 
        your own namespace -->
    <namespaces>
        <namespace uri="http://www.mycompany.com/model/content/1.0" prefix="my" />
    </namespaces>

    <aspects>
        <aspect name="my:model_1_DedicatedAspect">
            <title>My model 1 aspect</title>
            <properties>
                <property name="my:supplierId">
                    <type>d:text</type>
                    <mandatory>true</mandatory>
                </property>
                <property name="my:companyId">
                    <type>d:text</type>
                    <mandatory>true</mandatory>
                </property>
                <property name="my:orderId">
                     <type>d:text</type>
                </property>
            </properties>
        </aspect>
    </aspects>
</model>

以下是my-extension-model_2.xml的代码:

<?xml version="1.0" encoding="UTF-8"?>

<!-- Definition of new Model -->

<!-- The important part here is the name - Note: the use of the my: namespace 
    which is defined further on in the document -->
<model name="my:model_2" xmlns="http://www.alfresco.org/model/dictionary/1.0">

    <!-- Optional meta-data about the model -->
    <description>Model 2</description>
    <author>mtyc</author>
    <version>1.0</version>

    <!-- Imports are required to allow references to definitions in other models -->
    <imports>
        <!-- Import Alfresco Dictionary Definitions -->
        <import uri="http://www.alfresco.org/model/dictionary/1.0" prefix="d" />
        <!-- Import Alfresco Content Domain Model Definitions -->
        <import uri="http://www.alfresco.org/model/content/1.0" prefix="cm" />
    </imports>

    <!-- Introduction of new namespaces defined by this model -->
    <!-- NOTE: The following namespace my.new.model should be changed to reflect 
        your own namespace -->
    <namespaces>
        <namespace uri="http://www.mycompany.com/model/content/1.0" prefix="my" />
    </namespaces>

    <aspects>
        <aspect name="my:model_2_DedicatedAspect">
            <title>My model 2 aspect</title>
            <properties>
                <property name="my:supplierId">
                    <type>d:text</type>
                    <mandatory>true</mandatory>
                </property>
                <property name="my:companyId">
                    <type>d:text</type>
                    <mandatory>true</mandatory>
                </property>
            </properties>
        </aspect>
    </aspects>
</model>    

然后我将它构建为一个jar并在Alfresco下部署它,它成功启动并加载我的模型。

在我正在开发的应用程序中,我正在与我的露天实例进行通信,我创建了方面为my:model_1_DedicatedAspect的文档和方面为my:model_2_DedicatedAspect的文档。

我想使用此CMIS查询按方面my:companyId my:model_1_DedicatedAspect搜索文档:

private static ItemIterable<QueryResult> searchClaimsByCompanyId(Session session, String companyId) {
    String query = "SELECT d.*, t.* FROM cmis:document as d JOIN my:model_1_DedicatedAspect as t ON d.cmis:objectId = t.cmis:objectId where t.my:companyId = '" + companyId + "'";
    ItemIterable<QueryResult> result = session.query(query, false);
    return result;
}

问题是:结果包含使用方面my:model_1_DedicatedAspect创建的文档但是使用方面my:model_2_DedicatedAspect创建的文档。

经过深入测试后,我观察到当我使用my:model_1_DedicatedAspect创建文档时,文档也与方面my:model_2_DedicatedAspect相关联。

问题:我做错了吗?这是一个错误吗?还有更好的方法吗?

非常感谢您的回答, 最大

1 个答案:

答案 0 :(得分:1)

我不确定为什么它没有在启动时出错。但在Alfresco,一个属性必须是独一无二的。所以 my:companyId 在不同方面使用了两次。

最佳做法是创建一个名为my:company的方面,其中包含 my:companyId 属性。

您可以定义没有属性的方面来检查或搜索它们。

顺便说一句,CMIS查询可以更轻松: SELECT * FROM my:model_1_DedicatedAspect

所以不需要额外的连接。

<强> ---------- ---------- UPDATE

由于Alfresco的某个版本(我猜它是4.x),您不再需要向节点添加某个方面。如果您在案例 my:companyId 中添加aspects属性,那么它将确定自动添加哪个方面。所以Alfresco看到具有相同属性的2个方面并添加它们。

我还没有收到你的消息“为什么”你这样做?从内容模型的角度来看,这没有任何意义。 方面只是Alfresco为不同内容类型添加动态属性的方法。

在你的情况下,我会使用继承来包含所需的属性。