ここでは、Multi Site Manager の機能を拡張する方法について説明します。
このページは、次の項目と組み合わせて読む必要があります。
Multi Site Manager とその API は Web サイトのオーサリング時に使用するものなので、オーサー環境での使用のみを目的としています。
Multi Site Management は、以下のパッケージで構成されています。
主要な MSM API オブジェクトは、次のような関係にあります(使用される用語も参照してください)。
Blueprint
A Blueprint
( BluePrint設定の場合と同様)は、ライブコピーがコンテンツを継承できるページを指定します。
ブループリント設定(Blueprint
)の使用は任意ですが、これを使用すると、
LiveRelationship
ライブコピーブランチのリソースと、それに対応するソース/ブループリントリソースとの接続(関係)を LiveRelationship
指定します。
LiveRelationship
オブジェクトは、関係に関連するロールアウト設定( RolloutConfig
)、 LiveCopy
、および LiveStatus
オブジェクトへのアクセス(参照)を提供します。/content/we-retail/language-masters
のsource/blueprintから/content/copy/us
にライブコピーが作成されます。 リソース/content/we.retail/language-masters/en/jcr:content
と/content/copy/us/en/jcr:content
が関係を形成します。LiveCopy
は、ライブコピーリソースとそのソース/ブループリントリソース間の関係( LiveRelationship
)の構成の詳細を保持します。
LiveCopy
クラスを使用して、ページのパス、ソース/ブループリントページのパス、ロールアウト設定、子ページもLiveCopy
に含めるかどうかにアクセスします。LiveCopy
ノードは、サイトを作成またはライブコピーを作成が使用されるたびに作成されます。LiveStatus
オブジェクトは、LiveRelationship
の実行時ステータスへのアクセスを可能にします。このオブジェクトを使用して、ライブコピーの同期ステータスを問い合わせます。
LiveAction
は、ロールアウトに関連する各リソースで実行されるアクションです。
LiveActionFactory
設定が指定された LiveAction
オブジェクトを作成 LiveAction
します。設定は、リポジトリ内にリソースとして保存されます。
RolloutConfig
は、トリガされたときに使用さ LiveActions
れる、のリストを保持します。LiveCopy
はRolloutConfig
を継承し、結果はLiveRelationship
に存在します。
カスタム同期アクションを作成して、ロールアウト設定と併用します。インストール済みのアクションが特定のアプリケーション要件を満たさない場合に同期アクションを作成します。同期アクションを作成するには、次の 2 つのクラスを作成します。
com.day.cq.wcm.msm.api.LiveAction
インターフェイスの実装。com.day.cq.wcm.msm.api.LiveActionFactory
インターフェイスを実装し、LiveAction
クラスのインスタンスを作成する OSGi コンポーネント。LiveActionFactory
は、指定した設定に対してLiveAction
クラスのインスタンスを作成します。
LiveAction
クラスには次のメソッドが含まれます。
getName
:アクション名を返します。この名前は、ロールアウト設定などで、アクションを参照するために使用します。
execute
:アクションのタスクを実行します。LiveActionFactory
クラスには次のメンバーが含まれます。
LIVE_ACTION_NAME
:関連付けられたフィールドの名前を含むフィールド LiveAction
。この名前は、getName
クラスの LiveAction
メソッドが返す値と一致する必要があります。createAction
:のインスタンスを作成し LiveAction
ます。オプションの Resource
パラメーターを使用して、設定情報を提供できます。createsAction
:関連付けられたの名前を返し LiveAction
ます。リポジトリ内の LiveAction
設定ノードを使用して、LiveAction
インスタンスの実行時動作に影響を与える情報を保存します。LiveAction
設定を保存するリポジトリ内のノードは、実行時に LiveActionFactory
オブジェクトに使用できます。そのため、設定ノードにプロパティを追加し、必要に応じて LiveActionFactory
実装内で使用することができます。
例えば、LiveAction
にはブループリント作成者の名前を保存する必要があります。設定ノードのプロパティには、情報を保存するブループリントページのプロパティ名が含まれます。実行時、LiveAction
は設定からプロパティ名を取得して、そのプロパティ値を取得します。
LiveActionFactory
.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);
}
execute
オブジェクトの LiveAction
メソッドのパラメーターとして、以下のオブジェクトを指定します。
ライブコピーのソースを表す Resource
オブジェクト。
ライブコピーのターゲットを表す Resource
オブジェクト。
ライブコピーの LiveRelationship
オブジェクト。
値 autoSave
は、LiveAction
がリポジトリに対しておこなわれた変更を保存する必要があることを示します。
値 reset は、ロールアウトのリセットモードを示します。
これらのオブジェクトから、LiveCopy
に関するすべての情報を取得できます。Resource
オブジェクトを使用して、ResourceResolver
、Session
、およびNode
オブジェクトを取得することもできます。 これらのオブジェクトは、リポジトリコンテンツの操作に役立ちます。
以下のコードの先頭行で、source はソースページの Resource
オブジェクトです。
ResourceResolver resolver = source.getResourceResolver();
Session session = resolver.adaptTo(javax.jcr.Session.class);
Node sourcenode = source.adaptTo(javax.jcr.Node.class);
Resource
引数には、NonExistingResource
オブジェクトなど、Node
オブジェクトに適合しないnull
またはResources
オブジェクトを指定できます。
インストールされるロールアウト設定がアプリケーションの要件を満たさない場合は、ロールアウト設定を作成します。
ブループリントまたはライブコピーページでロールアウト設定を指定すると、新しいロールアウト設定が使用可能になります。
ロールアウトのカスタマイズのベストプラクティスも参照してください。
新しいロールアウト設定を作成するには:
CRXDE Liteを開く;例:
http://localhost:4502/crx/de
次の URL に移動します。
/apps/msm/<your-project>/rolloutconfigs
これは、プロジェクトのカスタマイズバージョン:
/libs/msm/wcm/rolloutconfigs
これが最初の設定の場合は、作成する必要があります。
/libs パス内の設定は一切変更しないでください。
/libs のコンテンツは、インスタンスを次回アップグレードするとき(場合によってはホットフィックスまたは機能パックを適用したとき)に上書きされるからです。
設定およびその他の変更に推奨される方法は次のとおりです。
このCreate a node with the following properties:
contentCopy
、workflow
。cq:RolloutConfig
このノードに次のプロパティを追加します。
名前:jcr:title
型:String
値:UIに表示される識別タイトル。
名前:jcr:description
型:String
値:オプションの説明。
名前:cq:trigger
型:String
値:使用する ロールアウト トリガ。次から選択:
rollout
modification
publish
deactivate
「すべて保存」をクリックします。
ロールアウト設定は、/apps/msm/<your-project>/rolloutconfigs
ノードの下に作成したロールアウト設定ノードの下に保存されます。
タイプcq:LiveSyncAction
の追加子ノードを使用して、ロールアウト設定に同期アクションを追加します。 同期アクションノードの順序によって、アクションが実行される順序が決まります。
CRXDE Liteのまま、設定のロールアウトノードを選択します。
次に例を示します。
/apps/msm/myproject/rolloutconfigs/myrolloutconfig
次のノードプロパティを持つノードを 作成します。
contentCopy
、workflow
)。cq:LiveSyncAction
必要に応じてさらに同期アクションノードを追加して設定します。アクションノードを実行する順序に並べ替えます。一番上のアクションノードが最初に実行されます。
「すべて保存」をクリックします。
この節の手順を実行して LiveActionFactory
を作成し、ロールアウト設定で使用します。この手順では、Maven と Eclipse を使用して、LiveActionFactory
を作成およびデプロイします。
LiveActionFactory
インターフェイスを実装し、OSGi バンドルをデプロイします。MavenプロジェクトとJavaクラスのソースコードは、パブリックGitリポジトリで使用できます。
GitHub のコード
このページのコードは GitHub にあります
以下の手順では、adobe-public プロファイルを Maven 設定ファイルに追加している必要があります。
端末またはコマンドラインセッションを開き、ディレクトリがプロジェクトを作成する場所を指すように変更します。
以下のコマンドを入力します。
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.msm
artifactId
: MyLiveActionFactory
version
: 1.0-SNAPSHOT
package
: MyPackage
appsFolderName
: myapp
artifactName
: MyLiveActionFactory package
packageGroup
: myPackages
Eclipse を起動して、Maven プロジェクトを読み込みます。
LiveActionFactory
コード内で使用されるクラスを Eclipse コンパイラーが参照できるようにするために、依存関係を追加します。
Eclipse Project Explorer から次のファイルを開きます。
MyLiveActionFactory/pom.xml
エディターで「pom.xml
」タブをクリックし、「project/dependencyManagement/dependencies
」セクションを探します。
次の XML を dependencyManagement
要素内に追加して、ファイルを保存します。
<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>
Project Explorer から、バンドルの POM ファイル MyLiveActionFactory-bundle/pom.xml
を開きます。
エディターで、「pom.xml
」タブをクリックし、project/dependencies セクションを探します。次の XML を dependencies 要素内に追加して、ファイルを保存します。
<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>
次の LiveActionFactory
クラスは、ソースページとターゲットページに関するメッセージをログに記録し、ソースノードからターゲットノードに LiveAction
プロパティをコピーする cq:lastModifiedBy
を実装します。ライブアクションの名前はexampleLiveAction
です。
Eclipse Project Explorerで、MyLiveActionFactory-bundle/src/main/java/com.adobe.example.msm
パッケージを右クリックし、新規/クラスをクリックします。 「Name」に「ExampleLiveActionFactory
」と入力し、「Finish」をクリックします。
ExampleLiveActionFactory.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 プロジェクトディレクトリ)に変更します。以下のコマンドを入力します。
mvn -PautoInstallPackage clean install
AEM の error.log
ファイルに、バンドルが開始されたことが記録されます。
例えば、http://localhost:4502/system/console/status-slinglogs は次のようになります。
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]
作成した LiveActionFactory
を使用する MSM ロールアウト設定を作成します。
次のプロパティと標準の手順を使用して、ロールアウト設定を作成および設定します。
publish
前の手順で作成したロールアウト設定を設定し、ExampleLiveActionFactory
クラスを使用するようにします。
CRXDE Lite を開きます。例:http://localhost:4502/crx/de
/apps/msm/rolloutconfigs/examplerolloutconfig/jcr:content
の下に次のノードを作成します。
exampleLiveAction
cq:LiveSyncAction
「すべて保存」をクリックします。
exampleLiveAction
ノードを選択して、次のプロパティを追加します。
repLastModBy
Boolean
true
このプロパティは、ExampleLiveAction
プロパティをソースノードからターゲットノードにレプリケートする必要がある cq:LastModifiedBy
クラスを示します。
「すべて保存」をクリックします。
ロールアウト設定を使用して、We.Retail 参照サイトの English/Products ブランチのライブコピーを作成します。
ソース: /content/we-retail/language-masters/en/products
ロールアウト設定:ロールアウト設定例
ソースブランチの Products(english)ページをアクティベートし、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 ***
AEM では、言語コードと国コードのデフォルトセットを使用します。
MSM は、保存されている言語コードと国コードのリストを使用して、ページの言語バージョン名に関連付けられている国名を判断します。必要に応じて、リストの次の要素を変更できます。
en
、de
などのコード用)言語リストは/libs/wcm/core/resources/languages
ノードの下に保存されます。 各子ノードは、言語または言語-国を表します。
ノードの名前は、言語コード(en
やde
など)、またはlanguage_countryコード(en_us
やde_ch
など)です。
ノードの language
プロパティには、そのコードが表す言語の正式名称が格納されます。
ノードの country
プロパティには、そのコードが表す国の正式名称が格納されます。
ノード名が言語コード(en
など)のみで構成されている場合、countryプロパティは*
で、追加のdefaultCountry
プロパティは、使用する国を示す言語 — 国のコードを保存します。
言語の変更手順
Web ブラウザーで CRXDE Lite を開きます。例:http://localhost:4502/crx/de
/apps
フォルダーを選択し、「作成」、「フォルダーを作成」の順にクリックします。
新しいフォルダーにwcm
という名前を付けます。
前の手順を繰り返して/apps/wcm/core
フォルダーツリーを作成します。 resources
という名前のコアにsling:Folder
型のノードを作成します。
/libs/wcm/core/resources/languages
ノードを右クリックし、「コピー」をクリックします。
/apps/wcm/core/resources
フォルダーを右クリックし、貼り付けをクリックします。 必要に応じて子ノードを変更します。
「すべて保存」をクリックします。
ツール/操作/Web コンソールの順にクリックします。このコンソールから「OSGi」をクリックし、次に「設定」をクリックします。
「Day CQ WCM Language Manager」を探してクリックし、言語リストの値を/apps/wcm/core/resources/languages
に変更して、保存をクリックします。
カスタムページプロパティの作成時に、新しいプロパティをすべてのライブコピーへのロールアウトの対象にするかどうかを検討しなければならない場合があります。
例えば、次の 2 つのページプロパティを追加する場合は、
連絡先電子メール:
キービジュアルのスタイル:
次のことを保証する必要があります。
連絡先電子メール:
キービジュアルのスタイル:
ページプロパティをロールアウトの対象にするかどうか(したがって編集時に継承をキャンセルまたは復元するかどうか)は、次のダイアログプロパティで制御されます。
cq-msm-lockable
タッチ操作対応 UI ダイアログの項目に適用されます。
ダイアログ内にチェーンリンクシンボルを作成します。
継承がキャンセルされている(チェーンリンクが解除されている)場合は、編集のみ可能です。
リソースの最初の子レベルにのみ適用されます
型:String
値:は、検討中のプロパティの名前を保持します(かつ、プロパティの値に相当 name
します。例えば、
/libs/foundation/components/page/cq:dialog/content/items/tabs/items/basic/items/column/items/title/items/title
cq-msm-lockable
が定義されている場合は、次の方法でチェーンの解除またはクローズを MSM と連携できます。
cq-msm-lockable
の値が次の場合:
相対 (例: myProperty
または ./myProperty
)
cq:propertyInheritanceCancelled
にプロパティを追加したり、<a0/>からプロパティを削除したりします。絶対 (例: /image
)
cq:LiveSyncCancelled
ミックスインを./image
に追加し、cq:isCancelledForChildren
をtrue
に設定することで継承がキャンセルされます。cq-msm-lockableは、編集対象のリソースの最初の子レベルに適用され、値が絶対値または相対値として定義されている場合でも、より深いレベルの親レベルでは機能しません。
継承を再度有効にしても、ライブコピーページのプロパティはソースのプロパティとは自動的には同期されません。必要な場合は、手動で同期をリクエストできます。