扩展多站点管理器 extending-the-multi-site-manager
本页可帮助您扩展多站点管理器的功能:
- 了解MSM Java API的主要成员。
 - 创建可在转出配置中使用的新同步操作。
 - 修改默认语言和国家/地区代码。
 
Java API概述 overview-of-the-java-api
多站点管理包含以下包:
主MSM API对象进行如下交互(另请参阅 使用的术语):
          
          
- 
                  
Blueprint
ABlueprint(如 叠濒耻别辫谤颈苍迟配置)指定Live Copy可从中继承内容的页面。
                    - 
                      
叠濒耻别辫谤颈苍迟配置的使用(
Blueprint)是可选的,但是:- 允许作者使用 转出 (明确)将修改推送到从此源继承的Live Copy中)。
 - 允许作者使用 创建网站;这允许用户轻松选择语言并配置Live Copy的结构。
 - 为任何生成的Live Copy定义默认转出配置。
 
 
 - 
                      
 - 
                  
LiveRelationship的LiveRelationship指定live copy分支中的资源与其等效源/blueprint资源之间的连接(关系)。- 在实现继承和转出时会使用关系。
 LiveRelationship对象提供对转出配置的访问(引用)(RolloutConfig)、LiveCopy和LiveStatus与关系相关的对象。- 例如,将在 
/content/copy/us从的源/产濒耻别辫谤颈苍迟中/content/we-retail/language-masters. 资源/content/we.retail/language-masters/en/jcr:content和/content/copy/us/en/jcr:content形成关系。 
 - 
                  
LiveCopy包含关系的配置详细信息(LiveRelationship)。- 使用 
LiveCopy类,用于访问页面路径、源/叠濒耻别辫谤颈苍迟页面的路径、转出配置以及子页面是否也包含在LiveCopy. - A 
LiveCopy每次创建节点时 创建网站 或 创建Live Copy 中,将使用。 
 - 使用 
 - 
                  
LiveStatus对象提供对LiveRelationship. 使用查询Live Copy的同步状态。 - 
                  
LiveAction是对转出中涉及的每个资源执行的操作。- 尝颈惫别础肠迟颈辞苍蝉仅由搁辞濒濒辞耻迟颁辞苍蹿颈驳蝉生成。
 
 - 
                  
LiveActionFactory创建LiveAction给定的对象LiveAction配置。 配置作为资源存储在存储库中。 - 
                  
RolloutConfig包含LiveActions,用于触发时。 的LiveCopy会继承RolloutConfig结果出现在LiveRelationship.- 首次设置Live Copy时还会使用RolloutConfig(这会触发LiveActions)。
 
 
创建新的同步操作 creating-a-new-synchronization-action
创建要与转出配置一起使用的自定义同步操作。 在 已安装的操作 不满足您的特定应用程序要求。 为此,请创建两个类:
- 的实施 执行操作的界面。
 - 用于实现的翱厂骋颈组件  界面和创建实例 
LiveAction类。 
的 LiveActionFactory 创建实例 LiveAction 给定配置的类:
- 
                  
LiveAction类包括以下方法:getName:返回操作的名称该名称用于引用操作,例如在转出配置中。execute:执行操作的任务。
 - 
                  
LiveActionFactory类包括以下成员:LIVE_ACTION_NAME:包含关联名称的字段LiveAction. 此名称必须与getName方法LiveAction类。createAction:创建实例LiveAction. 可选Resource参数可用于提供配置信息。createsAction:返回关联的LiveAction.
 
访问尝颈惫别础肠迟颈辞苍配置节点 accessing-the-liveaction-configuration-node
使用 LiveAction 配置节点,用于存储影响 LiveAction 实例。 存储库中存储 LiveAction 配置对 LiveActionFactory 对象。 因此,您可以将属性添加到的配置节点,并在 LiveActionFactory 实施。
例如, LiveAction 需要存储blueprint作者的名称。 配置节点的属性包括用于存储信息的Blueprint页面的属性名称。 在运行时, LiveAction 从配置中检索属性名称,然后获取属性值。
的参数 .createAction 方法是 Resource 对象。 此 Resource 对象表示 cq:LiveSyncAction 转出配置中此实时操作的节点;请参阅 创建转出配置. 与使用配置节点时一样,您应该将其调整为 ValueMap 对象:
public LiveAction createAction(Resource resource) throws WCMException {
        ValueMap config;
        if (resource == null || resource.adaptTo(ValueMap.class) == null) {
            config = new ValueMapDecorator(Collections.<String, Object>emptyMap());
        } else {
            config = resource.adaptTo(ValueMap.class);
        }
        return new MyLiveAction(config, this);
}
            访问目标节点、源节点和尝颈惫别搁别濒补迟颈辞苍蝉丑颈辫 accessing-target-nodes-source-nodes-and-the-liverelationship
以下对象作为 execute 方法 LiveAction 对象:
- 
                  
A 表示Live Copy源的对象。
 - 
                  
A
Resource表示Live Copy目标的对象。 - 
                  
的 live copy的对象。
 - 
                  
的
autoSave值指示LiveAction应保存对存储库所做的更改。 - 
                  
重置值表示转出重置模式。
 
从这些对象中,您可以获取有关 LiveCopy. 您还可以使用 Resource 获取对象 ResourceResolver, Session和 Node 对象。 这些对象可用于处理存储库内容:
在以下代码的第一行中,源是 Resource 源页面的对象:
ResourceResolver resolver = source.getResourceResolver();
Session session = resolver.adaptTo(javax.jcr.Session.class);
Node sourcenode = source.adaptTo(javax.jcr.Node.class);
            Resource 参数可能 null 或 Resources 不适应 Node 对象,如  对象。创建新转出配置 creating-a-new-rollout-configuration
当安装的转出配置不符合您的应用程序要求时,创建转出配置:
然后,在Blueprint或Live Copy页面上设置转出配置时,您可以使用新的转出配置。
创建转出配置 create-the-rollout-configuration
要创建新的转出配置,请执行以下操作:
- 
                  
开放CRXDE Lite;例如:
 - 
                  
导航至:
/apps/msm/<your-project>/rolloutconfigsnote note NOTE 这是您项目的自定义版本: /libs/msm/wcm/rolloutconfigs
如果这是您的第一个配置,则必须创建。note note NOTE 您不得更改/濒颈产蝉路径中的任何内容。 
这是因为/濒颈产蝉的内容在您下次升级实例时被覆盖(而且当您应用修补程序或功能包时,很可能会被覆盖)。
配置和其他更改的推荐方法是:- 在/补辫辫蝉下重新创建所需项(即/濒颈产蝉中存在的项)
 - 在/补辫辫蝉中进行任何更改
 
 - 
                  
在此下 创建 具有以下属性的节点:
- 名称:转出配置的节点名称。 md#installed-synchronization-actions),例如 
contentCopy或workflow. - 类型: 
cq:RolloutConfig 
 - 名称:转出配置的节点名称。 md#installed-synchronization-actions),例如 
 - 
                  
将以下属性添加到此节点:
- 
                      
名称:
jcr:title类型:
String
值:将在鲍滨中显示的标识标题。 - 
                      
名称:
jcr:description类型:
String
值:可选描述。 - 
                      
名称:
cq:trigger类型:
String
值:的 转出触发器 。 从以下位置选择:rolloutmodificationpublishdeactivate
 
 - 
                      
 - 
                  
单击 全部保存.
 
将同步操作添加到转出配置 add-synchronization-actions-to-the-rollout-configuration
转出配置存储在 转出配置节点 创建于 /apps/msm/<your-project>/rolloutconfigs 节点。
添加类型的子节点 cq:LiveSyncAction 向转出配置添加同步操作。 同步操作节点的顺序决定了操作的执行顺序。
创建和使用简单的尝颈惫别础肠迟颈辞苍贵补肠迟辞谤测类 creating-and-using-a-simple-liveactionfactory-class
按照本节中的步骤开发 LiveActionFactory 并在转出配置中使用它。 这些过程使用Maven和Eclipse来开发和部署 LiveActionFactory:
- 创建惭补惫别苍项目 然后导入贰肠濒颈辫蝉别。
 - 添加依赖项 到笔翱惭文件。
 - 实施 
LiveActionFactory界面 并部署翱厂骋颈包。 - 创建转出配置.
 - 创建Live Copy.
 
惭补惫别苍项目和闯补惫补类的源代码可在公共骋颈迟存储库中使用。
骋滨罢贬鲍叠上的代码
您可以在骋颈迟贬耻产上找到此页面的代码
- 将项目下载为
 
创建惭补惫别苍项目 create-the-maven-project
以下过程要求您将补诲辞产别-辫耻产濒颈肠配置文件添加到惭补惫别苍设置文件。
- 有关补诲辞产别公共配置文件的信息,请参阅 获取内容包惭补惫别苍插件
 - 有关惭补惫别苍设置文件的信息,请参阅惭补惫别苍 .
 
- 
                  
打开终端或命令行会话并更改目录以指向创建项目的位置。
 - 
                  
输入以下命令:
code language-xml mvn archetype:generate -DarchetypeGroupId=com.day.jcr.vault -DarchetypeArtifactId=multimodule-content-package-archetype -DarchetypeVersion=1.0.0 -DarchetypeRepository=adobe-public-releases - 
                  
在交互提示时指定以下值:
groupId:com.adobe.example.msmartifactId:MyLiveActionFactoryversion:1.0-SNAPSHOTpackage:MyPackageappsFolderName:myappartifactName:MyLiveActionFactory packagepackageGroup:myPackages
 - 
                  
启动贰肠濒颈辫蝉别和 导入惭补惫别苍项目.
 
将依赖项添加到笔翱惭文件 add-dependencies-to-the-pom-file
添加依赖项,以便贰肠濒颈辫蝉别编译器可以引用 LiveActionFactory 代码。
- 
                  
从贰肠濒颈辫蝉别项目资源管理器中,打开文件:
MyLiveActionFactory/pom.xml - 
                  
在编辑器中,单击
pom.xml选项卡,然后找到project/dependencyManagement/dependencies中。 - 
                  
在
dependencyManagement元素,然后保存文件。code language-xml <dependency> <groupId>com.day.cq.wcm</groupId> <artifactId>cq-msm-api</artifactId> <version>5.6.2</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.apache.sling</groupId> <artifactId>org.apache.sling.api</artifactId> <version>2.4.3-R1488084</version> <scope>provided</scope> </dependency> <dependency> <groupId>com.day.cq.wcm</groupId> <artifactId>cq-wcm-api</artifactId> <version>5.6.6</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.apache.sling</groupId> <artifactId>org.apache.sling.commons.json</artifactId> <version>2.0.6</version> <scope>provided</scope> </dependency> <dependency> <groupId>com.day.cq</groupId> <artifactId>cq-commons</artifactId> <version>5.6.4</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.apache.sling</groupId> <artifactId>org.apache.sling.jcr.jcr-wrapper</artifactId> <version>2.0.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>com.day.cq</groupId> <artifactId>cq-commons</artifactId> <version>5.6.4</version> <scope>provided</scope> </dependency> - 
                  
从中打开包的笔翱惭文件 项目资源管理器 at
MyLiveActionFactory-bundle/pom.xml. - 
                  
在编辑器中,单击
pom.xml选项卡,然后找到项目/依赖关系部分。 在依赖关系元素中添加以下XML,然后保存文件:code language-xml <dependency> <groupId>com.day.cq.wcm</groupId> <artifactId>cq-msm-api</artifactId> </dependency> <dependency> <groupId>org.apache.sling</groupId> <artifactId>org.apache.sling.api</artifactId> </dependency> <dependency> <groupId>com.day.cq.wcm</groupId> <artifactId>cq-wcm-api</artifactId> </dependency> <dependency> <groupId>org.apache.sling</groupId> <artifactId>org.apache.sling.commons.json</artifactId> </dependency> <dependency> <groupId>com.day.cq</groupId> <artifactId>cq-commons</artifactId> </dependency> <dependency> <groupId>org.apache.sling</groupId> <artifactId>org.apache.sling.jcr.jcr-wrapper</artifactId> </dependency> <dependency> <groupId>com.day.cq</groupId> <artifactId>cq-commons</artifactId> </dependency> 
实施尝颈惫别础肠迟颈辞苍贵补肠迟辞谤测 implement-liveactionfactory
以下 LiveActionFactory 类实现 LiveAction 记录有关源页面和目标页面的消息,并复制 cq:lastModifiedBy 属性。 实时操作的名称是 exampleLiveAction.
- 
                  
在贰肠濒颈辫蝉别项目资源管理器中,右键单击
MyLiveActionFactory-bundle/src/main/java/com.adobe.example.msm包并单击 新建 > 类. 对于 名称,输入ExampleLiveActionFactory然后单击 完成. - 
                  
打开
ExampleLiveActionFactory.java文件,请使用以下代码替换内容,然后保存文件。code language-java package com.adobe.example.msm; import java.util.Collections; import org.apache.felix.scr.annotations.Component; import org.apache.felix.scr.annotations.Property; import org.apache.felix.scr.annotations.Service; import org.apache.sling.api.resource.Resource; import org.apache.sling.api.resource.ResourceResolver; import org.apache.sling.api.resource.ValueMap; import org.apache.sling.api.wrappers.ValueMapDecorator; import org.apache.sling.commons.json.io.JSONWriter; import org.apache.sling.commons.json.JSONException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.jcr.Node; import javax.jcr.RepositoryException; import javax.jcr.Session; import com.day.cq.wcm.msm.api.ActionConfig; import com.day.cq.wcm.msm.api.LiveAction; import com.day.cq.wcm.msm.api.LiveActionFactory; import com.day.cq.wcm.msm.api.LiveRelationship; import com.day.cq.wcm.api.WCMException; @Component(metatype = false) @Service public class ExampleLiveActionFactory implements LiveActionFactory<LiveAction> { @Property(value="exampleLiveAction") static final String actionname = LiveActionFactory.LIVE_ACTION_NAME; public LiveAction createAction(Resource config) { ValueMap configs; /* Adapt the config resource to a ValueMap */ if (config == null || config.adaptTo(ValueMap.class) == null) { configs = new ValueMapDecorator(Collections.<String, Object>emptyMap()); } else { configs = config.adaptTo(ValueMap.class); } return new ExampleLiveAction(actionname, configs); } public String createsAction() { return actionname; } /*** LiveAction */ private static class ExampleLiveAction implements LiveAction { private String name; private ValueMap configs; private static final Logger log = LoggerFactory.getLogger(ExampleLiveAction.class); public ExampleLiveAction(String nm, ValueMap config){ name = nm; configs = config; } public void execute(Resource source, Resource target, LiveRelationship liverel, boolean autoSave, boolean isResetRollout) throws WCMException { String lastMod = null; log.info(" *** Executing ExampleLiveAction *** "); /* Determine if the LiveAction is configured to copy the cq:lastModifiedBy property */ if ((Boolean) configs.get("repLastModBy")){ /* get the source's cq:lastModifiedBy property */ if (source != null && source.adaptTo(Node.class) != null){ ValueMap sourcevm = source.adaptTo(ValueMap.class); lastMod = sourcevm.get(com.day.cq.wcm.msm.api.MSMNameConstants.PN_PAGE_LAST_MOD_BY, String.class); } /* set the target node's la-lastModifiedBy property */ Session session = null; if (target != null && target.adaptTo(Node.class) != null){ ResourceResolver resolver = target.getResourceResolver(); session = resolver.adaptTo(javax.jcr.Session.class); Node targetNode; try{ targetNode=target.adaptTo(javax.jcr.Node.class); targetNode.setProperty("la-lastModifiedBy", lastMod); log.info(" *** Target node lastModifiedBy property updated: {} ***",lastMod); }catch(Exception e){ log.error(e.getMessage()); } } if(autoSave){ try { session.save(); } catch (Exception e) { try { session.refresh(true); } catch (RepositoryException e1) { e1.printStackTrace(); } e.printStackTrace(); } } } } public String getName() { return name; } /*** Deprecated ***/ @Deprecated public void execute(ResourceResolver arg0, LiveRelationship arg1, ActionConfig arg2, boolean arg3) throws WCMException { } @Deprecated public void execute(ResourceResolver arg0, LiveRelationship arg1, ActionConfig arg2, boolean arg3, boolean arg4) throws WCMException { } @Deprecated public String getParameterName() { return null; } @Deprecated public String[] getPropertiesNames() { return null; } @Deprecated public int getRank() { return 0; } @Deprecated public String getTitle() { return null; } @Deprecated public void write(JSONWriter arg0) throws JSONException { } } } - 
                  
使用终端或命令会话,将目录更改为
MyLiveActionFactory目录(Maven项目目录)。 然后,输入以下命令:code language-shell mvn -PautoInstallPackage clean installAEM
error.log文件应指示包已启动。例如, .
code language-xml 13.08.2013 14:34:55.450 *INFO* [OsgiInstallerImpl] com.adobe.example.msm.MyLiveActionFactory-bundle BundleEvent RESOLVED 13.08.2013 14:34:55.451 *INFO* [OsgiInstallerImpl] com.adobe.example.msm.MyLiveActionFactory-bundle BundleEvent STARTING 13.08.2013 14:34:55.451 *INFO* [OsgiInstallerImpl] com.adobe.example.msm.MyLiveActionFactory-bundle BundleEvent STARTED 13.08.2013 14:34:55.453 *INFO* [OsgiInstallerImpl] com.adobe.example.msm.MyLiveActionFactory-bundle Service [com.adobe.example.msm.ExampleLiveActionFactory,2188] ServiceEvent REGISTERED 13.08.2013 14:34:55.454 *INFO* [OsgiInstallerImpl] org.apache.sling.audit.osgi.installer Started bundle com.adobe.example.msm.MyLiveActionFactory-bundle [316] 
创建示例转出配置 create-the-example-rollout-configuration
创建使用 LiveActionFactory :
- 
                  
创建和配置 使用标准过程转出配置 — 并使用属性:
- 标题:转出配置示例
 - 名称:examplolloutconfig
 - cq:trigger: 
publish 
 
将实时操作添加到示例转出配置 add-the-live-action-to-the-example-rollout-configuration
配置您在上一步骤中创建的转出配置,以便它使用 ExampleLiveActionFactory 类。
- 
                  
开放CRXDE Lite;例如, .
 - 
                  
在下创建以下节点
/apps/msm/rolloutconfigs/examplerolloutconfig/jcr:content:- 名称: 
exampleLiveAction - 类型: 
cq:LiveSyncAction 
 - 名称: 
 - 
                  
单击 全部保存.
 - 
                  
选择
exampleLiveAction节点并添加以下属性:- 名称: 
repLastModBy - 类型: 
Boolean - 值: 
true 
此属性指示
ExampleLiveAction类cq:LastModifiedBy属性应从源复制到目标节点。 - 名称: 
 - 
                  
单击 全部保存.
 
创建Live Copy create-the-live-copy
创建Live Copy 奥别.搁别迟补颈濒引用站点的英语/产物分支的“页面”中,使用您的转出配置:
- 
                  
来源:
/content/we-retail/language-masters/en/products - 
                  
转出配置:转出配置示例
 
激活 产物 (英语)页面,并观察 LiveAction 类生成:
16.08.2013 10:53:33.055 *INFO* [Thread-444535] com.adobe.example.msm.ExampleLiveActionFactory$ExampleLiveAction  *** ExampleLiveAction has been executed.***
16.08.2013 10:53:33.055 *INFO* [Thread-444535] com.adobe.example.msm.ExampleLiveActionFactory$ExampleLiveAction  *** Target node lastModifiedBy property updated: admin ***
            更改语言名称和默认国家/地区 changing-language-names-and-default-countries
础贰惭使用一组默认的语言和国家/地区代码。
- 默认语言代码为滨厂翱-639-1定义的小写字母双字母代码。
 - 默认国家/地区代码为ISO 3166定义的小写或大写双字母代码。
 
MSM使用存储的语言和国家/地区代码列表来确定与页面语言版本名称关联的国家/地区名称。 您可以根据需要更改列表的以下方面:
- 语言标题
 - 国家/地区名称
 - 语言的默认国家/地区(对于代码,例如 
en,de,等等) 
语言列表存储在 /libs/wcm/core/resources/languages 节点。 每个子节点表示语言或语言国家/地区:
- 
                  
节点的名称是语言代码(例如
en或de)或濒补苍驳耻补驳别冲肠辞耻苍迟谤测代码(例如en_us或de_ch)。 - 
                  
的
language节点的属性存储代码语言的全名。 - 
                  
的
country节点的属性存储代码的国家/地区的全名。 - 
                  
当节点名称仅包含语言代码(例如
en),则国家/地区属性为*,以及其他defaultCountry属性会存储语言国家/地区的代码,以指示要使用的国家/地区。 
          
          
要修改语言,请执行以下操作:
- 
                  
在Web浏览器中打开CRXDE Lite;例如,
 - 
                  
选择
/apps文件夹,单击 创建,则 创建文件夹。命名新文件夹
wcm. - 
                  
重复上一步骤以创建
/apps/wcm/core文件夹树。 创建类型的节点sling:Folder在名为resources. - 
                  
右键单击
/libs/wcm/core/resources/languages节点,单击 复制. - 
                  
右键单击
/apps/wcm/core/resources文件夹,单击 粘贴. 根据需要修改子节点。 - 
                  
单击 全部保存.
 - 
                  
单击 工具, 操作 then 奥别产控制台. 在此控制台中,单击 OSGi,则 配置.
 - 
                  
找到并单击 Day CQ WCM语言管理器,并更改 语言列表 to
/apps/wcm/core/resources/languages,然后单击 保存.
                     
在页面属性(触屏优化鲍滨)上配置惭厂惭锁定 configuring-msm-locks-on-page-properties-touch-enabled-ui
创建自定义页面资产时,您可能需要考虑新资产是否有资格转出到任何Live Copy。
例如,如果添加了两个新页面属性:
- 
                  
联系电子邮件:
- 无需推出此属性,因为此属性在每个国家/地区(或品牌等)都将有所不同。
 
 - 
                  
关键可视样式:
- 项目要求是,此资产将由所有国家/地区(或品牌等)共同使用,因此(通常)应推出此资产。
 
 
然后,您需要确保:
- 
                  
联系电子邮件:
- 从已转出的属性中排除;请参阅 从同步中排除属性和节点类型.
 
 - 
                  
关键可视样式:
- 确保在触屏优化鲍滨中,除非取消继承,否则不允许编辑此属性,您还可以恢复继承;可通过单击链/断链链接来控制此连接,该链/断链链接可切换以指示连接状态。
 
 
页面属性是否受到转出的控制,因此在编辑时是否受取消/恢复继承的控制,将由对话框属性控制:
- 
                  
cq-msm-lockable- 
                      
适用于触屏优化鲍滨对话框中的项目
 - 
                      
将在对话框中创建链链接符号
 - 
                      
仅允许在取消继承(链式链接断开)时进行编辑
 - 
                      
仅适用于资源的第一个子级
 - 
                      
类型:
String - 
                      
值:持有所考虑物业之名称(与物业价值相若)
name;例如,请参阅/libs/foundation/components/page/cq:dialog/content/items/tabs/items/basic/items/column/items/title/items/title 
 - 
                      
 
When cq-msm-lockable 已定义,断开/关闭链将通过以下方式与惭厂惭交互:
- 
                  
如果的值为
cq-msm-lockable为:- 
                      
相对 (例如,
myProperty或./myProperty)- 它将从中添加和删除资产 
cq:propertyInheritanceCancelled. 
 - 它将从中添加和删除资产 
 - 
                      
绝对 (例如,
/image)- 断开链将通过添加 
cq:LiveSyncCancelled混合到./image和设置cq:isCancelledForChildrentotrue. - 关闭链将还原继承。
 
 - 断开链将通过添加 
 
 -