创建基于查询参数的包

目录

\u0026#xD;\n

要求

\u0026#xD;\n

用户级别

\u0026#xD;\n

入门级

\u0026#xD;\n

示例文件

\u0026#xD;\n

在使用内容管理系统时,我们往往需要根据某些参数提取内容。一种极其常见的用例就是依据最后一次同步的日期或者生产系统中内容的最后修改日期,更新生产中的存储或者开发系统。我们可以通过编写一个简单的组件来轻松解决这个问题,首先查询存储库,并使用搜索结果来在服务器上创建包。

\u0026#xD;\n

查询存储库

\u0026#xD;\n

Day OOTB 提供了搜索存储库的组件,例如http://localhost:4502/libs/cq/search/content/querydebug.hmlhttp://localhost:4502/crx/ui/search.jsp

\u0026#xD;\n

我们可以根据查询参数进行查询,也可在一次查询中指定 XPath/SQL(例如,搜索在 2010 年 4 月 1 日之后更改的所有内容)。

\u0026#xD;\n

基于参数的搜索

\u0026#xD;\n

Onhttp://localhost:4502/libs/cq/search/content/querydebug.html, type the params in the text area below:

\u0026#xD;\n

http://localhost:4502/libs/cq/search/content/querydebug.html 中,在文本区域内输入以下参数:

\u0026#xD;\n
\u0026#xD;\ntype=cq:Page \u0026#xD;\npath=/content \u0026#xD;\ndaterange.property=jcr:content/cq:lastModified \u0026#xD;\ndaterange.lowerBound=2010-04-01 \u0026#xD;\norderby=@jcr:content/cq:lastModified \u0026#xD;\norderby.index=true \u0026#xD;\norderby.sort=asc 
\u0026#xD;\n

基于 XPath 的查询

\u0026#xD;\n

http://localhost:5502/crx/ui/search.jsp 中使用 XPath,如下所示:

\u0026#xD;\n
\u0026#xD;\n/jcr:root/content//element(*, cq:Page) \u0026#xD;\n[ \u0026#xD;\n(@jcr:content/cq:lastModified \u0026gt; xs:dateTime('2010-04-01T00:00:00.000+05:30')) \u0026#xD;\n] \u0026#xD;\norder by jcr:content/@cq:lastModified 
\u0026#xD;\n

我们还可以创建自己的组件来进行搜素,方法是创建一个基于所传入的属性(参数)的 PredicateGroup,随后即可利用一个生成器对象(使用 predicateGroup 和可用 jcr 会话创建)来创建查询,如下所示:

\u0026#xD;\n
\u0026#xD;\nQueryBuilder builder = resource.getResourceResolver().adaptTo(QueryBuilder.class); \u0026#xD;\nSession session = resource.getResourceResolver().adaptTo(Session.class); \u0026#xD;\nString queryParam = request.getParameter(“query”); \u0026#xD;\nProperties props = new Properties(); \u0026#xD;\nprops.load(new ByteArrayInputStream(queryParam.getBytes(“ISO-8859-1″))); \u0026#xD;\nPredicateGroup root = PredicateConverter.createPredicates(props); \u0026#xD;\n// avoid slow //* queries \u0026#xD;\nif (!root.isEmpty()) \u0026#xD;\n{ \u0026#xD;\n    query = builder.createQuery(root, session); \u0026#xD;\n    query.setHitsPerPage(0); \u0026#xD;\n} \u0026#xD;\n

SearchResult result = query.getResult();

\u0026#xD;\n

在 SearchResult 对象中,我们可以提取 Hits (result.getHits),并遍历列表来显示结果。我们可以使用相同的列表来创建包,如下一节所述。

\u0026#xD;\n

通过节点列表创建包

\u0026#xD;\n

如果拥有节点列表,就可以通过创建过滤器并使用相同的过滤器来进行 Jcr 包定义,从而轻松创建包:

\u0026#xD;\n
\u0026#xD;\nDefaultWorkspaceFilter filter = new DefaultWorkspaceFilter(); \u0026#xD;\nfor (Hit hit: hits) \u0026#xD;\n{ \u0026#xD;\n    PathFilterSet pathFilterSet = new PathFilterSet(hit.getPath()); \u0026#xD;\n    filter.add(pathFilterSet); \u0026#xD;\n} \u0026#xD;\nJcrPackage jcrPackage = packMgr.create(“testGroup”,”testPackage”); \u0026#xD;\nJcrPackageDefinition jcrPackageDefinition = jcrPackage.getDefinition(); \u0026#xD;\njcrPackageDefinition.setFilter(filter, false); \u0026#xD;\nPrintWriter pkgout = new PrintWriter(System.out); \u0026#xD;\npackMgr.assemble(jcrPackage, new DefaultProgressListener(pkgout)); 
\u0026#xD;\n

在执行由组名称为“testGroup”的一个包及其中的一个包构成的组合时,将创建一个“testPackage”包,并可通过包管理器访问。

\u0026#xD;\n

我已经创建了一个示例组件,方法是扩展创建组名称为 testGroup 的包的默认搜索组件。如果已经存在具有相同名称的包,则将忽略请求,不会覆盖现有包。您可以在这里获得示例组件。

\u0026#xD;\n

访问http://servername:port/apps/packages/createPkgWithQuery/createPkg.html,安装并使用包。您可以使用类似于下面这样的参数:

\u0026#xD;\n
\u0026#xD;\ntype=cq:Page\u0026#xD;\npath=/content\u0026#xD;\ndaterange.property=jcr:content/cq:lastModified\u0026#xD;\ndaterange.lowerBound=2010-04-01\u0026#xD;\norderby=@jcr:content/cq:lastModified\u0026#xD;\norderby.index=true\u0026#xD;\norderby.sort=asc 
\u0026#xD;\n

\"clip_image004\"

\u0026#xD;\n

本文遵守知识共享—署名-非商业性使用-相同方式共享3.0 Unported License (Creative Commons Attribution-Noncommercial-Share Alike 3.0 Unported License)许可条件。

\u0026#xD;\n

查看原文:Creating packages based on query parameters

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值