Esta página ajuda a estender as funcionalidades do Gerenciador de vários sites:
Esta página deve ser lida junto com Reutilizar conteúdo: Gerenciador de vários sites.
As seguintes seções da reestruturação do repositório de sites no AEM 6.4 também podem ser de interesse:
O Multi Site Manager e sua API são usados ao criar um site, portanto, são destinados ao uso somente em um ambiente de criação.
O gerenciamento de vários sites consiste nos seguintes pacotes:
Os principais objetos de API MSM interagem da seguinte maneira (consulte também Termos usados):
Blueprint
Um Blueprint
(como em configuração do blueprint) especifica as páginas das quais uma live copy pode herdar conteúdo.
O uso de uma configuração do blueprint ( Blueprint
) é opcional, mas:
LiveRelationship
O LiveRelationship
especifica a conexão (relação) entre um recurso na ramificação da live copy e seu recurso equivalente de origem/blueprint.
Os relacionamentos são usados ao realizar a herança e a implantação.
LiveRelationship
Os objetos fornecem acesso (referências) às configurações de implementação ( RolloutConfig
), LiveCopy
e aos LiveStatus
objetos relacionados ao relacionamento.
Por exemplo, uma live copy é criada em /content/copy/us
a partir do blueprint/fonte em /content/we-retail/language-masters
. Os recursos /content/we.retail/language-masters/en/jcr:content
e /content/copy/us/en/jcr:content
formam uma relação.
LiveCopy
LiveCopy
contém os detalhes de configuração para os relacionamentos ( LiveRelationship
) entre os recursos de Live Copy e seus recursos de origem/blueprint.
Use a classe LiveCopy
para acessar o caminho da página, o caminho da página de origem/blueprint, as configurações de implementação e se as páginas filhas também estão incluídas no LiveCopy
.
Um nó LiveCopy
é criado sempre que Criar Site ou Criar Live Copy for usado.
LiveStatus
LiveStatus
Os objetos fornecem acesso ao status de tempo de execução de um LiveRelationship
. Use para consultar o status de sincronização de uma live copy.
LiveAction
Um LiveAction
é uma ação que é executada em cada recurso envolvido na implantação.
LiveActionFactory
Cria LiveAction
objetos considerando uma configuração LiveAction
. As configurações são armazenadas como recursos no repositório.
RolloutConfig
O RolloutConfig
mantém uma lista de LiveActions
, a ser usada quando acionada. O LiveCopy
herda o RolloutConfig
e o resultado está presente no LiveRelationship
.
Crie ações de sincronização personalizadas para usar com suas configurações de implementação. Crie uma ação de sincronização quando as ações instaladas não atenderem aos requisitos específicos do aplicativo. Para fazer isso, crie duas classes:
com.day.cq.wcm.msm.api.LiveAction
que executa a ação.com.day.cq.wcm.msm.api.LiveActionFactory
e cria instâncias da sua classe LiveAction
.O LiveActionFactory
cria instâncias da classe LiveAction
para uma determinada configuração:
LiveAction
As classes incluem os seguintes métodos:
getName
: Retorna o nome da ação O nome é usado para fazer referência à ação, por exemplo, em configurações de implementação.execute
: Executa as tarefas da ação.LiveActionFactory
As classes incluem os seguintes membros:
LIVE_ACTION_NAME
: Um campo que contém o nome do LiveAction
associado. Esse nome deve coincidir com o valor retornado pelo método getName
da classe LiveAction
.
createAction
: Cria uma instância do LiveAction
. O parâmetro Resource
opcional pode ser usado para fornecer informações de configuração.
createsAction
: Retorna o nome do LiveAction
associado.
Use o nó de configuração LiveAction
no repositório para armazenar informações que afetam o comportamento em tempo de execução da instância LiveAction
. O nó no repositório que armazena a configuração LiveAction
está disponível para o objeto LiveActionFactory
no tempo de execução. Portanto, você pode adicionar propriedades ao nó de configuração e usá-las na implementação LiveActionFactory
, conforme necessário.
Por exemplo, um LiveAction
precisa armazenar o nome do autor do blueprint. Uma propriedade do nó de configuração inclui o nome da propriedade da página do blueprint que armazena as informações. No tempo de execução, o LiveAction
recupera o nome da propriedade da configuração e obtém o valor da propriedade.
O parâmetro do método [LiveActionFactory](https://helpx.adobe.com/experience-manager/6-5/sites/developing/using/reference-materials/javadoc/com/day/cq/wcm/msm/api/LiveActionFactory.html).createAction
é um objeto Resource
. Esse objeto Resource
representa o nó cq:LiveSyncAction
para essa ação em tempo real na configuração de implementação; consulte Criação de uma configuração de implementação. Como de costume ao usar um nó de configuração, você deve adaptá-lo a um objeto 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);
}
Os seguintes objetos são fornecidos como parâmetros do método execute
do objeto LiveAction
:
Um objeto Resource
que representa a origem da Live Copy.
Um objeto Resource
que representa o destino da Live Copy.
O objeto LiveRelationship
para a live copy.
O valor autoSave
indica se LiveAction
deve salvar as alterações feitas no repositório.
O valor de redefinição indica o modo de redefinição de implementação.
Nesses objetos, você pode obter todas as informações sobre o LiveCopy
. Também é possível usar os objetos Resource
para obter os objetos ResourceResolver
, Session
e Node
. Esses objetos são úteis para manipular o conteúdo do repositório:
Na primeira linha do código a seguir, source é o objeto Resource
da página de origem:
ResourceResolver resolver = source.getResourceResolver();
Session session = resolver.adaptTo(javax.jcr.Session.class);
Node sourcenode = source.adaptTo(javax.jcr.Node.class);
Os argumentos Resource
podem ser objetos null
ou Resources
que não se adaptam a objetos Node
, como objetos NonExistingResource
.
Crie uma configuração de implementação quando as configurações de implementação instaladas não atenderem aos requisitos do aplicativo:
A nova configuração de implementação estará disponível para você quando definir configurações de implementação em um blueprint ou página de Live Copy.
Consulte também as práticas recomendadas para personalizar implantações.
Para criar uma nova configuração de implementação:
CRXDE Lite aberto; por exemplo:
http://localhost:4502/crx/de
Vá até :
/apps/msm/<your-project>/rolloutconfigs
Esta é a versão personalizada do seu projeto:
/libs/msm/wcm/rolloutconfigs
Deve ser criada se essa for a primeira configuração.
Você não deve alterar nada no caminho /libs.
Isso ocorre porque o conteúdo de /libs é substituído na próxima vez que você atualizar sua instância (e pode ser substituído quando você aplicar um hotfix ou pacote de recursos).
O método recomendado para configuração e outras alterações é:
Sob este Crie um nó com as seguintes propriedades:
contentCopy
ou workflow
.cq:RolloutConfig
Adicione as seguintes propriedades a este nó:
Nome: jcr:title
Tipo: String
Valor: Um título de identificação que será exibido na interface do usuário.
Nome: jcr:description
Tipo: String
Valor: Uma descrição opcional.
Nome: cq:trigger
Tipo: String
Valor: O Acionador de implantação a ser usado. Selecione de:
rollout
modification
publish
deactivate
Clique em Salvar tudo.
As configurações de implementação são armazenadas abaixo do nó de configuração de implementação que você criou no nó /apps/msm/<your-project>/rolloutconfigs
.
Adicione nós secundários do tipo cq:LiveSyncAction
para adicionar ações de sincronização à configuração de implementação. A ordem dos nós de ação de sincronização determina a ordem em que as ações ocorrem.
Ainda no CRXDE Lite, selecione o nó Configuração de implantação.
Por exemplo:
/apps/msm/myproject/rolloutconfigs/myrolloutconfig
Crie um nó com as seguintes propriedades do nó:
contentCopy
ou workflow
.cq:LiveSyncAction
Adicione e configure quantos nós de ação de sincronização forem necessários. Reorganize os nós de ação para que sua ordem corresponda à ordem em que você deseja que ocorram. O nó de ação mais superior ocorre primeiro.
Siga os procedimentos nesta seção para desenvolver um LiveActionFactory
e usá-lo em uma configuração de implementação. Os procedimentos usam Maven e Eclipse para desenvolver e implantar o LiveActionFactory
:
LiveActionFactory
e implante o pacote OSGi.O projeto Maven e o código-fonte da classe Java estão disponíveis no repositório Git público.
CÓDIGO NO GITHUB
Você pode encontrar o código desta página no GitHub
O procedimento a seguir requer que você tenha adicionado o perfil público da adobe ao arquivo de configurações Maven.
Abra um terminal ou uma sessão de linha de comando e altere o diretório para apontar para o local de criação do projeto.
Digite o seguinte comando:
mvn archetype:generate -DarchetypeGroupId=com.day.jcr.vault -DarchetypeArtifactId=multimodule-content-package-archetype -DarchetypeVersion=1.0.0 -DarchetypeRepository=adobe-public-releases
Especifique os seguintes valores no prompt interativo:
groupId
: com.adobe.example.msm
artifactId
: MyLiveActionFactory
version
: 1.0-SNAPSHOT
package
: MyPackage
appsFolderName
: myapp
artifactName
: MyLiveActionFactory package
packageGroup
: myPackages
Inicie o Eclipse e importe o projeto Maven.
Adicione dependências para que o compilador Eclipse possa fazer referência às classes usadas no código LiveActionFactory
.
No Eclipse Project Explorer, abra o arquivo :
MyLiveActionFactory/pom.xml
No editor, clique na guia pom.xml
e localize a seção project/dependencyManagement/dependencies
.
Adicione o XML a seguir dentro do elemento dependencyManagement
e salve o arquivo.
<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>
Abra o arquivo POM para o pacote a partir de Project Explorer em MyLiveActionFactory-bundle/pom.xml
.
No editor, clique na guia pom.xml
e localize a seção projeto/dependências. Adicione o seguinte XML dentro do elemento de dependências e salve o arquivo:
<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>
A classe LiveActionFactory
a seguir implementa um LiveAction
que registra mensagens sobre as páginas de origem e de destino e copia a propriedade cq:lastModifiedBy
do nó de origem para o nó de destino. O nome da ação ao vivo é exampleLiveAction
.
No Eclipse Project Explorer, clique com o botão direito do mouse no pacote MyLiveActionFactory-bundle/src/main/java/com.adobe.example.msm
e clique em New > Class. Para o Nome, digite ExampleLiveActionFactory
e clique em Concluir.
Abra o arquivo ExampleLiveActionFactory.java
, substitua o conteúdo pelo seguinte código e salve o arquivo.
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 {
}
}
}
Usando o terminal ou a sessão de comando, altere o diretório para o diretório MyLiveActionFactory
(o diretório do projeto Maven). Em seguida, digite o seguinte comando:
mvn -PautoInstallPackage clean install
O arquivo AEM error.log
deve indicar que o pacote foi iniciado.
Por exemplo, https://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]
Crie a configuração de implantação do MSM que usa o LiveActionFactory
que você criou:
Crie e configure uma Configuração de implementação com o procedimento padrão - e usando as propriedades:
publish
Configure a configuração de implementação criada no procedimento anterior para que ela use a classe ExampleLiveActionFactory
.
CRXDE Lite aberto; por exemplo, https://localhost:4502/crx/de.
Crie o seguinte nó em /apps/msm/rolloutconfigs/examplerolloutconfig/jcr:content
:
exampleLiveAction
cq:LiveSyncAction
Clique em Salvar tudo.
Selecione o nó exampleLiveAction
e adicione a seguinte propriedade:
repLastModBy
Boolean
true
Essa propriedade indica para a classe ExampleLiveAction
que a propriedade cq:LastModifiedBy
deve ser replicada da origem para o nó de destino.
Clique em Salvar tudo.
Crie uma live copy da ramificação Inglês/Produtos do site de referência We.Retail usando sua configuração de implementação:
Fonte: /content/we-retail/language-masters/en/products
Configuração de implantação: Exemplo de configuração de implementação
Ative a página Products (inglês) da ramificação de origem e observe as mensagens de log geradas pela classe 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 usa um conjunto padrão de códigos de idioma e país.
O MSM usa uma lista armazenada de códigos de idioma e país para determinar o nome do país associado ao nome da versão de idioma da sua página. Você pode alterar os seguintes aspectos da lista, se necessário:
en
, de
, entre outros)A lista de idiomas é armazenada abaixo do nó /libs/wcm/core/resources/languages
. Cada nó filho representa um idioma ou um país de idioma:
O nome do nó é o código do idioma (como en
ou de
) ou o código do idioma_país (como en_us
ou de_ch
).
A propriedade language
do nó armazena o nome completo do idioma para o código.
A propriedade country
do nó armazena o nome completo do país para o código.
Quando o nome do nó consiste apenas em um código de idioma (como en
), a propriedade country é *
, e uma propriedade defaultCountry
adicional armazena o código do país de idioma para indicar o país a ser usado.
Para modificar os idiomas:
Abra o CRXDE Lite no navegador da Web; por exemplo, https://localhost:4502/crx/de
Selecione a pasta /apps
e clique em Criar, em seguida em Criar pasta.
Nomeie a nova pasta wcm
.
Repita a etapa anterior para criar a árvore de pastas /apps/wcm/core
. Crie um nó do tipo sling:Folder
em core
chamado resources
.
Clique com o botão direito do mouse no nó /libs/wcm/core/resources/languages
e clique em Copiar.
Clique com o botão direito do mouse na pasta /apps/wcm/core/resources
e clique em Colar. Modifique os nós secundários conforme necessário.
Clique em Salvar tudo.
Clique em Ferramentas, Operações e depois em Console da Web. Nesse console, clique em OSGi, em seguida em Configuração.
Localize e clique em Day CQ WCM Language Manager, altere o valor de Language List para /apps/wcm/core/resources/languages
e clique em Save.
Ao criar uma propriedade de página personalizada, talvez seja necessário considerar se a nova propriedade deve ser qualificada para implantação em qualquer live copy.
Por exemplo, se duas novas propriedades de página estiverem sendo adicionadas:
Email de contato:
Estilo visual principal:
Em seguida, é necessário garantir que:
Email de contato:
Estilo visual principal:
Se uma propriedade de página está sujeita a implantação e, portanto, sujeita a cancelamento/reintegração da herança ao editar, é controlada pela propriedade de diálogo:
cq-msm-lockable
é aplicável a itens em uma caixa de diálogo da interface habilitada para toque
criará o símbolo de vínculo de cadeia na caixa de diálogo
permite editar somente se a herança for cancelada (o vínculo da cadeia está quebrado)
se aplica somente ao primeiro nível filho do recurso
Tipo: String
Valor: seja titular do nome da propriedade em questão (e seja comparável ao valor da propriedade name
; por exemplo, consulte
/libs/foundation/components/page/cq:dialog/content/items/tabs/items/basic/items/column/items/title/items/title
Quando cq-msm-lockable
tiver sido definido, quebrar/fechar a cadeia interage com o MSM da seguinte forma:
se o valor de cq-msm-lockable
for:
Relativo (por exemplo, myProperty
ou ./myProperty
)
cq:propertyInheritanceCancelled
.Absoluto (por exemplo, /image
)
quebrar a cadeia cancelará a herança adicionando a mesclagem cq:LiveSyncCancelled
a ./image
e definindo cq:isCancelledForChildren
como true
.
fechar a cadeia reverterá a herança.
cq-msm-lockable
se aplica ao primeiro nível filho do recurso a ser editado e não é funcional em nenhum ancestral de nível mais profundo, independentemente se o valor for definido como absoluto ou relativo.
Quando você reativa a herança, a propriedade da página de Live Copy não é sincronizada automaticamente com a propriedade de origem. Você pode solicitar manualmente uma sincronização, se necessário.