论坛首页 Java企业应用论坛

Compass学习之三:附带Library例子的分析(二)

浏览 2185 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-06-19  
2.2.1.2.3.1       Book.cpm.xml

映射文件中元素分析:

 

1、  类别名

l         每个检索类在通用元数据定义文件中都应该有对应描述。

<class name="Book" alias="${library.book}">

alias属性所对应的值起到了一个映射作用。它将一个实体与这个实体的元数据定义连接起来。该元数据定义在.cmd.xml文件中。

library.cmd.xml文件中对应的:

<alias id="book" displayName="Book">

            <description>Book alias</description>

            <uri>http://compass/sample/library/alias/book</uri>

            <name>book</name>

</alias>

     很显然,其中使用了3个元数据来定义这个检索类。它们分别是<description><uri><name>

 

2<id name="id" />

每一个root级的检索类至少有一个索引id。可以用annotationxml配置的方式注册该索引id。如果没有注册,compass会默认给一个内部id

 

3property

<property name="keywords">

         <meta-data boost="2">${library.keyword}</meta-data>

 </property>

l         Property对应检索类中的域。

l         每个索引域在通用元数据定义文件中都应该有对应的别名。

其中meta-data中的boost=2是指多重引导关系(= bootstrap)。

2.2.1.2.3.2       Author.cpm.xml

1<constant>

    <constant>可以构建索引常量。可以在类中用annotation的方式注入,也可以在xml文件中定义。

索引常量的xml定义方式:在一个索引实体的映射文件中通过<constant>定义一个常量名,并用一列值与之对应。

<constant>

            <meta-data>${library.type}</meta-data>

            <meta-data-value>${library.type.mdPerson}</meta-data-value>

            <meta-data-value>${library.type.mdAuthor}</meta-data-value>

        </constant>

结合通用元数据定义文件,我们可以翻译一下,结果如下:

<constant>

            <meta-data>type</meta-data>

            <meta-data-value>person</meta-data-value>

            <meta-data-value>author</meta-data-value>

        </constant>

    由此可以得到一个索引常量元数据:type,它有2个对应的值:personauthor

 

2<component><reference>

<component name="name" ref-alias="${library.article}" />

该类中定义了三个与Author关联的类或者由类组成List

private Name name;

private List articles = new ArrayList();

private List books = new ArrayList();

其中Article属于非root型的检索类,而Name是属于辅助类,所以它们跟Author之间的关系都是:component。而Bookroot型的检索类,它跟Author之间的关系只能是:reference

    不能单独搜索ArticleName,必须通过Author来调用它们。

 

注:很明显该映射文件的以下部分设置有误:

<component name="name" ref-alias="${library.name.md}" />

应该改成:<component name="name" ref-alias="${library.name}" />

至于为什么配置错了还不影响结果,没有仔细看其源代码,所以不得知。有人明白其中道理的,不妨一说,愿洗耳恭听:)

 

2.2.1.2.3.3       Article.cpm.xml

1<class>

<class name="Article" alias="${library.article}" root="false">

其中root="false"的含义:

 

     root属性是用于标识该实体是否为一个可以被独立查找的检索实体。当该属性的值为true时,用户可以直接通过关键字的查找来得到这样的实体信息;若该属性的值为false,用户使用相同的关键字进行搜索,只能得到该实体所依附的真正实体的实体。这时,需要再通过该真正实体的实例,进一步获取所需要的实体。

 

     本例来看,用户可以通过输入关键字在Compass进行查找,最终找到AuthorBook这样的实体对象,却不可以直接得到Article这个对象。因为Articleroot属性为false。如果需要取得Article的实例,则只能先取得Author的实例,进而通过Author中的articleList,来获取Article的对象。

     <class>root属性默认为true

2.2.1.2.4       通用元数据定义文件

1、概述

Library.cmd.xml文件中的cmdCommon Metadata Definition的缩写。其中,元数据是用于描述数据的数据。在该文件中,存储了一些与实体相关的元数据信息。同时,在*.cpm.xml文件中,所有被使用到的变量都在这里有明确的定义。即那些通过${library.*}调用的。

 

    2uri

        在该定义文件中<meta-data>uri是可以重复的,例如以下2个定的uri是相同的:

        <alias id="name" displayName="Name">

            <description>Name alias</description>

            <uri>http://compass/sample/library/alias/name</uri>

            <name>name</name>

        </alias>

        ---------------------------------------------------

        <meta-data id="isbn" displayName="ISBN">

            <description>ISBN of the book</description>

            <uri>http://compass/sample/library/name</uri>

            <name>name</name>

        </meta-data>

 

2.2.1.2.5        测试类

    通过测试类,我们可以了解Compass索引建立和检索的全过程。

 

对于test*()方法我们就不作主要关注,那些都是单元测试的方法。不过,这也算是提供了写compass应用时的单元测试范例。

我们从main方法进入,看看compass运行的过程:

 

 

论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics