Criando uma Nova Ação de Sincronização
Crie ações de sincronização personalizadas para usar com suas configurações de implementação. Crie uma ação de sincronização quando a variável ações instaladas não atenda aos requisitos específicos de seu aplicativo. Para fazer isso, crie duas classes:
- A implementação da
com.day.cq.wcm.msm.api.LiveAction
interface que executa a ação. - Um componente OSGI que implementa o
com.day.cq.wcm.msm.api.LiveActionFactory
e cria instâncias deLiveAction
classe .
O LiveActionFactory
cria instâncias do LiveAction
classe 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 doLiveAction
. Esse nome deve coincidir com o valor retornado pelogetName
do métodoLiveAction
classe .createAction
: Cria uma instância doLiveAction
. OResource
pode ser usado para fornecer informações de configuração.createsAction
: Retorna o nome doLiveAction
.
Acessar o nó de configuração do LiveAction
Use o LiveAction
nó de configuração no repositório para armazenar informações que afetam o comportamento em tempo de execução do LiveAction
instância. O nó no repositório que armazena o LiveAction
está disponível para a LiveActionFactory
em tempo de execução. Portanto, você pode adicionar propriedades ao nó de configuração e usá-las em 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, a variável LiveAction
recupera o nome da propriedade da configuração e obtém o valor da propriedade.
O parâmetro da variável LiveActionFactory
.createAction
é um método Resource
objeto. Essa Resource
o objeto representa a variável cq:LiveSyncAction
nó para essa ação em tempo real na configuração de implementação; see 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 ValueMap
objeto:
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);
}
Acessar nós do Target, nós de origem e o LiveRelationship
Os seguintes objetos são fornecidos como parâmetros da variável execute
do método LiveAction
objeto:
-
A
Resource
objeto que representa a origem da Live Copy. -
A
Resource
objeto que representa o destino da Live Copy. -
O
LiveRelationship
objeto para a live copy. -
O
autoSave
indica se suaLiveAction
O 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 a variável LiveCopy
. Também é possível usar a variável Resource
objetos a obter ResourceResolver
, Session
e Node
objetos. Esses objetos são úteis para manipular o conteúdo do repositório:
Na primeira linha do código a seguir, source é o Resource
objeto 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);
Resource
argumentos podem ser null
ou Resources
objetos que não se adaptam a Node
objetos, como NonExistingResource
objetos.Criação de uma nova configuração de implementação
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ê ao definir configurações de implementação em um blueprint ou página de Live Copy.
Criar a configuração de implementação
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
NOTE
Esta é a versão personalizada do seu projeto:/libs/msm/wcm/rolloutconfigs
Deve ser criada se essa for a primeira configuração.NOTE
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 é:- Recrie o item necessário (ou seja, como ele existe em /libs) em /apps
- Faça alterações em /apps
-
Nos termos do Criar um nó com as seguintes propriedades:
- Nome: O nome do nó da configuração de implementação. md#installed-synchronization-actions), por exemplo
contentCopy
ouworkflow
. - Tipo:
cq:RolloutConfig
- Nome: O nome do nó da configuração de implementação. md#installed-synchronization-actions), por exemplo
-
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 da implantação a ser usado. Selecione de:rollout
modification
publish
deactivate
-
-
Clique em Salvar tudo.
Adicionar Ações de Sincronização à Configuração de Implantação
As configurações de implementação são armazenadas abaixo da variável nó de configuração de implementação que você criou em /apps/msm/<your-project>/rolloutconfigs
nó .
Adicionar nós filhos 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 Configuração de implantação nó .
Por exemplo:
/apps/msm/myproject/rolloutconfigs/myrolloutconfig
-
Criar um nó com as seguintes propriedades de nó:
- Nome: O nome do nó da ação de sincronização.
O nome deve ser igual ao Nome da ação no quadro em Ações de sincronização, por exemplocontentCopy
ouworkflow
. - Tipo:
cq:LiveSyncAction
- Nome: O nome do nó da ação de sincronização.
-
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.
-
Clique em Salvar tudo.
Criação e uso de uma classe LiveActionFactory simples
Siga os procedimentos desta seção para desenvolver um LiveActionFactory
e usá-lo em uma configuração de implementação. Os procedimentos usam o Maven e o Eclipse para desenvolver e implantar o LiveActionFactory
:
- Criar o projeto maven e importe-o para o Eclipse.
- Adicionar dependências para o arquivo POM.
- Implemente o
LiveActionFactory
interface e implante o pacote OSGi. - Criar a configuração de implementação.
- Criar a live copy.
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
- Abra o projeto experiencemanager-java-msmrollout no GitHub
- Baixe o projeto como um arquivo ZIP
Criar o projeto Maven
O procedimento a seguir requer que você tenha adicionado o perfil público da adobe ao arquivo de configurações Maven.
- Para obter informações sobre o perfil adobe-public, consulte Obter o plug-in Content Package Maven
- Para obter informações sobre o arquivo de configurações Maven, consulte o Maven Referência de configurações.
-
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 importar o projeto Maven.
Adicionar dependências ao arquivo POM
Adicione dependências para que o compilador do Eclipse possa fazer referência às classes usadas no LiveActionFactory
código.
-
No Eclipse Project Explorer, abra o arquivo :
MyLiveActionFactory/pom.xml
-
No editor, clique no botão
pom.xml
e localize aproject/dependencyManagement/dependencies
seção. -
Adicione o XML a seguir dentro do
dependencyManagement
e depois 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 do pacote a partir de Explorador de projetos at
MyLiveActionFactory-bundle/pom.xml
. -
No editor, clique no botão
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>
Implementar o LiveActionFactory
O seguinte LiveActionFactory
classe implementa um LiveAction
que registra mensagens sobre as páginas de origem e de destino e copia a variável cq:lastModifiedBy
propriedade 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
MyLiveActionFactory-bundle/src/main/java/com.adobe.example.msm
e clique em Novo > Classe. Para o Nome, insiraExampleLiveActionFactory
e, em seguida, clique em Concluir. -
Abra o
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
MyLiveActionFactory
diretório (o diretório do projeto Maven). Em seguida, digite o seguinte comando:mvn -PautoInstallPackage clean install
O AEM
error.log
deve indicar que o pacote foi iniciado.Por exemplo, 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]
Criar a configuração de implantação de exemplo
Crie a configuração de implantação do MSM que usa a variável LiveActionFactory
que você criou:
-
Criar e configurar um Implementar a configuração com o procedimento padrão - e utilizando as propriedades:
- Título: Exemplo de configuração de implementação
- Nome: examplerolloutconfig
- cq:trigger:
publish
Adicionar a ação em tempo real à configuração de implantação de exemplo
Configure a configuração de implementação criada no procedimento anterior para que ela use a variável ExampleLiveActionFactory
classe .
-
CRXDE Lite aberto; por exemplo, http://localhost:4502/crx/de.
-
Crie o seguinte nó em
/apps/msm/rolloutconfigs/examplerolloutconfig/jcr:content
:- Nome:
exampleLiveAction
- Tipo:
cq:LiveSyncAction
- Nome:
-
Clique em Salvar tudo.
-
Selecione o
exampleLiveAction
e adicione a seguinte propriedade:- Nome:
repLastModBy
- Tipo:
Boolean
- Valor:
true
Essa propriedade indica para a variável
ExampleLiveAction
quecq:LastModifiedBy
deve ser replicada da origem para o nó de destino. - Nome:
-
Clique em Salvar tudo.
Criar a Live Copy
Criar uma live copy da ramificação Inglês/Produtos do site de referência We.Retail usando sua configuração de implementação:
-
Origem:
/content/we-retail/language-masters/en/products
-
Configuração de implantação: Exemplo de configuração de implementação
Ative o Produtos (inglês) da ramificação de origem e observe as mensagens de log que a variável LiveAction
classe gera:
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 ***
Alteração de nomes de idioma e países padrão
AEM usa um conjunto padrão de códigos de idioma e país.
- O código de idioma padrão é o código de duas letras minúsculas, conforme definido pela ISO-639-1.
- O código do país padrão é o código de duas letras em letras minúsculas ou maiúsculas, conforme definido pela ISO 3166.
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:
- Títulos de idioma
- Nomes de países
- Países padrão para idiomas (para códigos como
en
,de
, entre outros)
A lista de idiomas é armazenada abaixo do /libs/wcm/core/resources/languages
nó . Cada nó filho representa um idioma ou um país de idioma:
-
O nome do nó é o código do idioma (como
en
oude
) ou o código language_country (comoen_us
oude_ch
). -
O
language
A propriedade do nó armazena o nome completo do idioma para o código. -
O
country
A propriedade 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 umdefaultCountry
armazena o código do país do idioma para indicar o país a ser usado.
Para modificar os idiomas:
-
Abra o CRXDE Lite no navegador da Web; por exemplo, http://localhost:4502/crx/de
-
Selecione o
/apps
e clique em Criar, em seguida Criar pasta.Dê um nome para a nova pasta
wcm
. -
Repita a etapa anterior para criar a variável
/apps/wcm/core
árvore de pastas. Criar um nó do tiposling:Folder
no núcleo chamadoresources
. -
Clique com o botão direito do mouse no
/libs/wcm/core/resources/languages
e clique em Copiar. -
Clique com o botão direito do mouse no
/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 then Console da Web. Nesse console, clique em OSGi, em seguida Configuração.
-
Localize e clique em Gerenciador de Idioma do Day CQ WCM e alterar o valor de Lista de idiomas para
/apps/wcm/core/resources/languages
, depois clique em Salvar.
Configuração de bloqueios do MSM em propriedades de página (interface de usuário habilitada para toque)
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:
- Essa propriedade não precisa ser distribuída, pois será diferente em cada país (ou marca, etc).
-
Estilo visual principal:
- O requisito do projeto é que essa propriedade seja distribuída como é (normalmente) comum a todos os países (ou marcas, etc).
Em seguida, é necessário garantir que:
-
Email de contato:
- Está excluído das propriedades implantadas; see Excluindo propriedades e tipos de nó da sincronização.
-
Estilo visual principal:
- Certifique-se de que você não tem permissão para editar essa propriedade na interface habilitada para toque, a menos que a herança seja cancelada, e também que você possa restabelecer a herança; isso é controlado clicando nos links de cadeia/cadeia quebrada que são alternados para indicar o status da conexão.
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: detém o nome da propriedade em consideração (e é 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
-
When cq-msm-lockable
tiver sido definida, a quebra/fechamento da cadeia interagirá com o MSM da seguinte forma:
-
se o valor de
cq-msm-lockable
é:-
Relativo (por exemplo,
myProperty
ou./myProperty
)- ela adicionará e removerá a propriedade do
cq:propertyInheritanceCancelled
.
- ela adicionará e removerá a propriedade do
-
Absoluto (por exemplo,
/image
)- quebrar a cadeia cancelará a herança adicionando a variável
cq:LiveSyncCancelled
mixin to./image
e configuraçãocq:isCancelledForChildren
paratrue
. - fechar a cadeia reverterá a herança.
- quebrar a cadeia cancelará a herança adicionando a variável
-