Friday, December 18, 2015

How to configure Caching algorithm for better performance in Hybris platform?

How to configure Caching algorithm for better performance in Hybris platform?

In local.properties file add/change the values of the following properties.

#Possible vales are FIFO(default), LRU and LFU. Default value is FIFO
cache.evictionpolicy=FIFO
#Possible vales are FIFO (default), LFU and LRU. Default value is FIFO
regioncache.entityregion.evictionpolicy=FIFO

#Possible vales are FIFO (default), LFU and LRU. Default value is FIFO
regioncache.typesystemregion.evictionpolicy=FIFO

#Possible vales are FIFO (default), LFU and LRU. Default value is FIFO
regioncache.querycacheregion.evictionpolicy=FIFO

Change the algorithm to either LFU or LRU based on your requirements for better performance.

How to disable all the cron jobs in Hybris platform?

How to disable all the cron jobs in Hybris platform


In local.properties file change the cronjob.timertask.loadonstartup property to false

cronjob.timertask.loadonstartup=false

Add the property if it is not there already.

This flag will not allow the system to start the cron jobs automatically after server restart.

Saturday, December 12, 2015

Issue with migrating BPEL from Orace SOA 11g to Oracle SOA 12C - An unexpected Server error has occurred in JDeveloper

Issue with migrating  BPEL from Orace SOA 11g to Oracle SOA 12C - An unexpected Server error has occurred in JDeveloper

Issue:

Trying to migrate some composites from Oracle SOA 11.1.1.5 to 12c. But after I load the project in JDeveloper 12c, its throwing the error "An unexpected Server error has occurred in JDeveloper" and its giving the options like 1)"save all files and exit" 2) Exit without saving 3) continue.

Selected “continue" option and after that tried opening "*.BPEL" file and its completely blank and also all the wires were disappeared from "Composite.xml".

1) Open your SOA project in JDeveloper version 11.1.1.5 and create the SAR ( deployable ) file into your deploy folder. ( Ex: scaSample_rev001.jar )

2) Close the JDeveloper 11.1.1.5 and now open JDeveloper 12c ,

3) File -> Import -> select "SOA Archive Into SOA Project" -> OK -> Next -> Composite Archive Browse to the above SAR file created ( Ex: scaSample_rev001.jar )

4) The composite.xml  and BPEL file will show the content now

Extension function error: Method not found 'setFlowInstanceTitle – Oracle SOA 12C(12.1.3)

Extension function error: Method not found 'setFlowInstanceTitle – Oracle SOA 12C(12.1.3)

We were getting the below exception while trying to set the title for composite instance in 12.1.3

<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/<https://urldefense.proofpoint.com/v2/url?u=http-3A__schemas.xmlsoap.org_soap_envelope_&d=AwMFAw&c=4ZIZThykDLcoWk-GVjSLm9hvvvzvGv0FLoWSRuCSs5Q&r=8qQMQBAbDh32F7DyV0m3CH9kXdKLrWigXrO0p0cWQEir0H7fTd2J8_NC1cElkvWv&m=dRon_z2evK4VjWGP0oY9FibkrtcDAvecx7CgL26qjC0&s=7zNuyckO1P0yz595V1RJcVFjt7td9IRnkJf6OEWgRdE&e=>">
  <env:Header>
     <tracking:faultId xmlns:tracking="http://oracle.soa.tracking.core.TrackingProperty<https://urldefense.proofpoint.com/v2/url?u=http-3A__oracle.soa.tracking.core.trackingproperty_&d=AwMFAw&c=4ZIZThykDLcoWk-GVjSLm9hvvvzvGv0FLoWSRuCSs5Q&r=8qQMQBAbDh32F7DyV0m3CH9kXdKLrWigXrO0p0cWQEir0H7fTd2J8_NC1cElkvWv&m=dRon_z2evK4VjWGP0oY9FibkrtcDAvecx7CgL26qjC0&s=DwqbKOWHhDFBuDf9yc8Ur29O_D7KfSBO_exS-pWTjNE&e=>">10002</tracking:faultId>
  </env:Header>
  <env:Body>
     <env:Fault>
        <faultcode>env:Server</faultcode>
        <faultstring>An error occurs while processing the XPath expression; the expression is oraext:setFlowInstanceTitle("Title").</faultstring>
        <faultactor/>
        <detail>
           <exception>XPath expression failed to execute.
An error occurs while processing the XPath expression; the expression is oraext:setFlowInstanceTitle("Title").
The XPath expression failed to execute; the reason was: Extension function error: Method not found 'setFlowInstanceTitle'.
Check the detailed root cause described in the exception message text and verify that the XPath query is correct.</exception>
        </detail>
     </env:Fault>
  </env:Body>
</env:Envelope>


To resolve the issue apply the patch with no 18310693.

Sunday, December 6, 2015

Configuring same short URL/Vanity URL for different sites with https – AEM/Adobe CQ5

This post will explain how to configure same short URL/Vanity URL for different sites that is accessible through https in Adobe CQ5/AEM.

Recently we had a scenario to be implemented, two different websites needs to be accessed with same URL and with https protocol.
e.g
https://example1.com/en.html
https://example2.com/en.html

Both the sites are mapped to different nodes as below

https://example1.com/en.html  --> /content/example1/en
https://example2.com/en.html --> /content/example2/en

Create the redirect rules in dispatchers, inside the corresponding virtual host (httpd.conf) to redirect the http request to https and to shorten the URL’s .

RewriteRule ^/content/example1/(.*)$  /$1 [NE,L,R=301]

RewriteCond %{HTTPS} off
RewriteRule ^/$ https:// example1.com/en.html
RewriteRule ^/en.html https:// example1.com/en.html
RewriteRule ^/en/(.*)$ https:// example1.com/en/$1

Repeat the same for example2.com and for all the dispatchers.

Mapping in publisher :

Go to <<AEM Publisher Host>>:4503/system/console/configMgr with admin credentials. Search for Apache Sling Resource Resolver, and change the value of mapping location from /etc/map to /etc/map.publish


Sunday, October 4, 2015

Upgrading the dispatcher module in Adobe Experience Manager(AEM)

Upgrading the dispatcher module in Adobe Experience Manager(AEM)

Download the required dispatcher module version from the following URL 

https://www.adobeaemcloud.com/content/companies/public/adobe/dispatcher/dispatcher.html 

Extract the dispatcher module 

tar -xvzf <dispatcher-xxxxxxxx.tar.gz> (linux) 

Copy the extracted dispatcher-xxxxxxxxxx.so file to the module folder of the server. 



Modify the /etc/httpd/conf/httpd.conf file - remove the previous dispatcher module and add the new version. 

Saturday, October 3, 2015

Server startup failed (FAILED_NOT_RESTARTABLE) with ORA-01882: timezone region not found error - Oracle SOA 12C

Server startup failed (FAILED_NOT_RESTARTABLE) with ORA-01882: timezone region not found error - Oracle SOA 12C

The server startup failed and the status changed to "FAILED_NOT_RESTARTABLE" with the following error. 

Caused by: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd): org.eclipse.persistence.exceptions.DatabaseException 
Internal Exception: java.sql.SQLException: ORA-00604: error occurred at recursive SQL level 1 
ORA-01882: timezone region not found 

Error Code: 604 
        at org.eclipse.persistence.exceptions.DatabaseException.sqlException(DatabaseException.java:331) 
        at org.eclipse.persistence.exceptions.DatabaseException.sqlException(DatabaseException.java:326) 
        at org.eclipse.persistence.sessions.DefaultConnector.connect(DefaultConnector.java:138) 
        at org.eclipse.persistence.sessions.DatasourceLogin.connectToDatasource(DatasourceLogin.java:162) 
        at org.eclipse.persistence.internal.sessions.DatabaseSessionImpl.setOrDetectDatasource(DatabaseSessionImpl.java:204) 
        at org.eclipse.persistence.internal.sessions.DatabaseSessionImpl.loginAndDetectDatasource(DatabaseSessionImpl.java:741) 
        at org.eclipse.persistence.internal.jpa.EntityManagerFactoryProvider.login(EntityManagerFactoryProvider.java:239) 
        at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.deploy(EntityManagerSetupImpl.java:685) 
        ... 93 more 
Caused by: java.sql.SQLException: ORA-00604: error occurred at recursive SQL level 1 
ORA-01882: timezone region not found 

        at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:466) 
        at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:399) 
        at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:391) 
        at oracle.jdbc.driver.T4CTTIfun.processError(T4CTTIfun.java:1126) 
        at oracle.jdbc.driver.T4CTTIoauthenticate.processError(T4CTTIoauthenticate.java:507) 

The root cause of the issue is, the server not able to get the time zone configuration 
To fix the issue add "-Duser.timezone=UTC" to the server startup parameters - change the timezone with the value supported by database server, 



ADFC-0619: Authorization check failed: User 'weblogic' does not have 'VIEW' permission on 'jsf.resourcesPageDef'. - Oracle SOA 12C

ADFC-0619: Authorization check failed: User 'weblogic' does not have 'VIEW' permission on 'jsf.resourcesPageDef'. - Oracle SOA 12C

We were receiving the following exception while accessing the OSB console in Oracle SOA 12C.

[2014-10-15T09:18:45.702-04:00] [AdminServer] [ERROR] [] [oracle.help.web.rich.OHWFilter] [tid: [ACTIVE].ExecuteThread: '21' for queue: 'weblogic.kernel.Default
(self-tuning)'] [userId: weblogic] [ecid: bf088c45-bbd9-4379-a8f7-4e3fb8639324-0000017d,0] [APP: service-bus] [DSID: 0000K^JuMDh0ZrALnax0iZ1KFb1b000003] ADFC-0619: Authorization check failed: User 'weblogic' does not have 'VIEW' permission on 'jsf.resourcesPageDef'.[[
oracle.adf.controller.security.AuthorizationException: ADFC-0619: Authorization check failed: User 'weblogic' does not have 'VIEW' permission on 'jsf.resourcesPageDef'.
  at oracle.adf.controller.internal.security.AuthorizationEnforcer.handleFailure(AuthorizationEnforcer.java:198)
  at oracle.adf.controller.internal.security.AuthorizationEnforcer.internalCheckPermission(AuthorizationEnforcer.java:166)
  at oracle.adf.controller.internal.security.AuthorizationEnforcer.checkPermission(AuthorizationEnforcer.java:120)


This is caused by using an incorrect JDK version(1.8).
All Fusion Middlleware 12.1.3 products will run on JDK 1.7.55+ version.

To fix the issue downgrade the JDK to supported version.

Downgrade the JDK:

Change all the JDK location referred in the following paths:

<<Middleware_Home>>/Oracle_Home/user_projects/SOA_domain/bin/setDomainEnv.sh

<<Middleware_Home>>/Oracle_Home/oracle_common/common/bin/commEnv.sh

<<Middleware_Home>>/Oracle_Home/user_projects/SOA_domain/nodemanager/nodemanager.properties

Restart the servers.

Friday, October 2, 2015

ORA-01882: timezone region not found while creating schemas through RCU utility - Oracle SOA 12C

 ORA-01882: timezone region not found while creating schemas through RCU utility - Oracle SOA 12C

We were receiving the following exception while running the RCU Utility to create the required schema's in Oracle SOA 12C

ORA-01882: timezone region not found while creating schema's through RCU utility - Oracle SOA 12C


This can be resolved by setting the TZ environment variable before starting the RCU Utility with the supported Timezone of database machine

e.g.

export TZ='UTC'
echo $TZ

Restart the RCU utility.

Node Manager startup fails in Oracle SOA 12C

Node Manager startup fails in Oracle SOA 12C

The Node Manager failed to start in Oracle SOA Suite 12C with the following error.

[Sat Nov 09 01:29:46 2013] [I] [RunJavaApp] Invoking main class
<Nov 9, 2013 1:29:47 AM GMT> <INFO> <Loading domains file:
C:\Oracle\Middleware\Oracle_Home\user_projects\domains\base_domain\nodemanager
\nodemanager.domains>
<Nov 9, 2013 1:29:50 AM GMT> <INFO> <Loading identity key store:
FileName=C:\Oracle\Middleware\Oracle_Home\user_projects\domains\base_domain\nodemanager\security\DemoIdentity.jks, Type=jks, PassPhraseUsed=true>
<Nov 9, 2013 1:29:50 AM GMT> <SEVERE> <Fatal error in NodeManager server> weblogic.nodemanager.common.ConfigException: Identity key store file not found:
C:\Oracle\Middleware\Oracle_Home\user_projects\domains\base_domain\nodemanager\security\DemoIdentity.jks
at weblogic.nodemanager.server.SSLConfig.loadKeyStoreConfig(SSLConfig.java:170)

The actual root cause of the problem is the jks file is not configured properly for nodemanager.

To fix the issue:-

Copy the file <domainhome>\security\DemoIdentity.jks to  <domainhome>\nodemanager\security\DemoIdentity.jks

Tuesday, September 29, 2015

502 Bad Gateway while accessing /libs/cq/security/userinfo.json via telnet after upgrading to Adobe Experience Manager(AEM) 6.1

502 Bad Gateway while accessing /libs/cq/security/userinfo.json via telnet after upgrading to Adobe Experience Manager(AEM) 6.1

We were using /libs/cq/security/userinfo.json url in BIG-IP via telnet to check the staus of the server(heartbeat check of Adobe Experience Manager(AEM) servers) to control the availablity of servers in BIG-IP.

This is working fine in Adobe Experience Manager(AEM) 5.6.1 but it stopped working after upgrading AEM to 6.1(the server status is down in BIG-IP even though the server is up).

The same URL is working fine using wget,curl command and also from browsers, only not working via telnet(This issue is only via dispatcher but it is working fine directly with publisher)

Trying 10.xxx.xxx.xxx...
Connected to 10.xxx.xxx.xxx.
Escape character is '^]'.
GET /libs/cq/security/userinfo.json
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>502 Bad Gateway</title>
</head><body>
<h1>Bad Gateway</h1>
<p>The proxy server received an invalid
response from an upstream server.<br />
</p>
<hr>
<address>Apache/2.2.15 (Oracle) Server at xxxxxxxxxxx Port 80</address>
</body></html>
Connection closed by foreign host.

The actual root cause of the issue is the dispatcher module is not upgared as per the requirement.

The issue got resolved after upgrading the dispatcher module to latest version 4.1.10.

bash-3.2$ telnet 10.xxx.xxx.xxx 80
Trying 10.xxx.xxx.xxx...
Connected to 10.xxx.xxx.xxx.
Escape character is '^]'.
GET /libs/cq/security/userinfo.json
{"userID":"anonymous","userName":"anonymous","userName_xss":"anonymous","home":"/home/users/a/anonymous","impersonated":false,"allowedApps":[],"preferences":{}}
Connection to 10.xxx.xxx.xxx closed by foreign host.

org.apache.sling.commons.json.JSONException: Misplaced array - JSONWriter

org.apache.sling.commons.json.JSONException: Misplaced array - JSONWriter

The Misplaced array exception is thrown,While we are trying to create the JSON Array of objects from the servlet using - org.apache.sling.commons.json.io.JSONWriter.

Code:-

JSONWriter writer=new JSONWriter(response.getWriter());
try {
writer.object();
writer.key("authorName").value("test");
writer.key("biography").value("test");
writer.key("image").value("test");
writer.array();
writer.object();
writer.key("authorName").value("test");
writer.key("biography").value("test");
writer.endObject();
writer.endArray();
writer.endObject();
} catch (JSONException e) {

}

The root cause of the exception is not providing the key for initialized array(there will be different scenarios we will receive this exception)

To fix the issue as shown below in the code, add the key before starting the array.

JSONWriter writer=new JSONWriter(response.getWriter());
try {
writer.object();
writer.key("authorName").value("test");
writer.key("biography").value("test");
writer.key("image").value("test");
writer.key("list");
writer.array();
writer.object();
writer.key("authorName").value("test");
writer.key("biography").value("test");
writer.endObject();
writer.endArray();
writer.endObject();
} catch (JSONException e) {

}  

O/P

{"authorName":"test","biography":"test","image":"test","list":[{"authorName":"test","biography":"test"}]}       

Saturday, September 26, 2015

java.lang.NullPointerException:null at com.adobe.granite.workflow.core.WorkflowSessionFactory.isSuperUser(WorkflowSessionFactory.java:298) - AEM/Adobe CQ5

java.lang.NullPointerException:null at com.adobe.granite.workflow.core.WorkflowSessionFactory.isSuperUser(WorkflowSessionFactory.java:298) - AEM/Adobe CQ5

The components are not listed in sidekick and the sidekick is empty while opening the pages in author with the following exception.


 26.09.2015 07:29:40.868 *ERROR* [10.194.0.83 [1443270580848] GET /libs/wcm/core/content/pageinfo.json HTTP/1.1] org.apache.sling.engine.impl.SlingRequestProcessorImpl service: Uncaught Throwable
java.lang.NullPointerException: null at com.adobe.granite.workflow.core.WorkflowSessionFactory.isSuperUser(WorkflowSessionFactory.java:298) at com.adobe.granite.workflow.core.WorkflowSessionFactory.getWorkflowSession(WorkflowSessionFactory.java:326) at com.adobe.granite.workflow.core.WorkflowSessionFactory.getAdapter(WorkflowSessionFactory.java:461) at org.apache.sling.adapter.internal.AdapterManagerImpl.getAdapter(AdapterManagerImpl.java:147)
 at com.day.cq.workflow.impl.CQWorkflowService.getWorkflowSession(CQWorkflowService.java:148) at com.day.cq.wcm.core.impl.DefaultPageStatusProvider.updatePageInfo(DefaultPageStatusProvider.java:155) at com.day.cq.wcm.core.impl.servlets.PageInfoServlet.doGet(PageInfoServlet.java:188)
 at org.apache.sling.api.servlets.SlingSafeMethodsServlet.mayService(SlingSafeMethodsServlet.java:269) at org.apache.sling.api.servlets.SlingSafeMethodsServlet.service(SlingSafeMethodsServlet.java:345)
 at org.apache.sling.api.servlets.SlingSafeMethodsServlet.service(SlingSafeMethodsServlet.java:376)
 at org.apache.sling.engine.impl.request.RequestData.service(RequestData.java:533)        at org.apache.sling.engine.impl.filter.SlingComponentFilterChain.render(SlingComponentFilterChain.java:44)

The actual root cause of the issue is the workflow super user group configured in /apps/system/config/com.adobe.granite.workflow.core.WorkflowSessionFactory.config is not available in the system.     

cq.workflow.superuser=["admin","administrators","workflow-superuser"]
cq.workflow.workspace="crx.default"
adapter.condition="If\\\ the\\\ ResourceResolver\\\ is\\\ a\\\ JcrResourceResolver\\\ or\\\ a\\\ Session."
cq.workflow.models="/etc/workflow/models"
cq.workflow.instances="/etc/workflow/instances"
cq.workflow.job.retry=I"3"
granite.workflow.inboxQuerySize=I"2000"


The issue got resolved after creating the user group(workflow-superuser) in the system with the required workflow permissions.

Thursday, September 24, 2015

Taxonomy/Tag issue after upgrading to Adobe Experience Manager(AEM) 6.1

Taxonomy/Tag issue after upgrading to Adobe Experience Manager(AEM) 6.1

Taxonomy/Tags are used for search purpose. These tags are used by external search tool to provide the details.

Issue being discussed here is about the Meta tags not being displayed.


This issue is expected to be seen after upgrading the environment to Adobe Experience Manager(AEM) 6.1 version and the root cause is due to change in the user permission.

To resolve this issue provide the required permissions, go to Useradmin. Give permission (Read, Modify, Create, Delete, and Replicate) to /etc/tags folder for the group everyone.

Only Read access is sufficient for publisher instance.

Thursday, September 17, 2015

a:ActionNotSupported: The message with Action '"' cannot be processed at the receiver, due to a ContractFilter mismatch at the EndpointDispatcher.

a:ActionNotSupported: The message with Action '"' cannot be processed at the receiver, due to a ContractFilter mismatch at the EndpointDispatcher.

Getting the below error while invoking the SOAP service via WebServiceTemplate.

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
<s:Fault>
<faultcode xmlns:a="http://schemas.microsoft.com/ws/2005/05/addressing/none">a:ActionNotSupported</faultcode>
<faultstring xml:lang="en-US">The message with Action '"' cannot be processed at the receiver, due to a ContractFilter mismatch at the EndpointDispatcher. This may be because of either a contract mismatch (mismatched Actions between sender and receiver) or a binding/security mismatch between the sender and the receiver.  Check that sender and receiver have the same contract and the same binding (including security requirements, e.g. Message, Transport, None).</faultstring>
</s:Fault>
</s:Body>
</s:Envelope>

The root cause of the issue is the SOAPAction is not set in the request header while invoking the service.

To fix the issue set the SOAPAction specified in the WSDL binding while invoking the service.

  <binding name="binding" type="service">
    <binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
    <operation name="process">
      <operation soapAction="process" style="document"/>
      <input>
        <body namespace="request" use="literal"/>
      </input>
      <output>
        <body namespace="response" use="literal"/>
      </output>
    </operation>
  </binding>

webServiceTemplate.marshalSendAndReceive(url,request, new WebServiceMessageCallback() {

    public void doWithMessage(WebServiceMessage message) {
        ((SoapMessage)message).setSoapAction("process");
    }
});

Upgrading AEM/Adobe CQ5 version 5.6.1 to AEM/Adobe CQ5 version 6.1

Upgrading AEM/Adobe CQ5 version 5.6.1 to AEM/Adobe CQ5 version  6.1

Wednesday, August 5, 2015

java.lang.RuntimeException: ConfigurationManagerImpl disabled : Adobe CQ5/Adobe AEM 6.1

java.lang.RuntimeException: ConfigurationManagerImpl disabled : Adobe CQ5/Adobe AEM 6.1

We are receiving the the following exception after upgrading Adobe CQ5/Adobe AEM 5.6.1 to Adobe CQ5/Adobe AEM 6.1.

org.apache.sling.engine.impl.SlingRequestProcessorImpl service: Uncaught SlingException - java.lang.RuntimeException: ConfigurationManagerImpl disabled

Because of this the components are not able fetch the configuration details and failed to render.

The root cause of the issue is ConfigurationManagerImpl OSGI component is not enabled(default it will be disabled for security).

The issue got resolved after enabling the same.

The following steps can be followed to enable ConfigurationManagerImpl.

Login to system console - http://localhost:4502/system/console/components
Search for ConfigurationManagerImpl



Click on configure
Select Enabled and Save the configuration.


Sunday, July 5, 2015

BEA-382510:javax.xml.transform.TransformerException: com.sun.org.apache.xml.internal.utils.WrappedRuntimeException: Content is not allowed in prolog.

BEA-382510:javax.xml.transform.TransformerException: com.sun.org.apache.xml.internal.utils.WrappedRuntimeException: Content is not allowed in prolog.

We were getting the below exception(BEA-382510) intermittently in OSB assign activity in run time.

OSB Assign action failed updating variable "var1": javax.xml.transform.TransformerException: com.sun.org.apache.xml.internal.utils.WrappedRuntimeException: Content is not allowed in prolog.


This is the known issue in SOA Suite 11.1.1.5.0 version and fixed from 11.1.1.6.0.

The issue got fixed in 11.1.1.5.0 version after installing the patch 10086559.

Friday, July 3, 2015

Internationalization i18n labels are not displaying: Adobe CQ5/Adobe AEM

Internationalization i18n labels are not displaying: Adobe CQ5/Adobe AEM.

We were facing the issue with displaying  the ii18 labels in Adobe Experience Manager(AEM) pages, the key is getting displayed instead of the message.

<fmt:message key="login"/>

The key "login" is displayed as label instead of the message "Login".

The root cause of the issue is, the bundle "Apache Sling Internationalization Support (org.apache.sling.i18n)" is in resolved state.

The issue got resolved after restarting the "Apache Sling Internationalization Support (org.apache.sling.i18n)" bundle.


Wednesday, July 1, 2015

Programatically Set/Get the metadata of an Asset: Adobe CQ5/Adobe AEM

Programatically Set/Get the metadata of an Asset: Adobe CQ5/Adobe AEM

The Adobe Experience Manager(AEM) version referred here is 5.6.1

@Reference
private ResourceResolverFactory resolverFactory;

ResourceResolver resourceResolver =null;
try
{
String resourcePath = "/content/dam/geometrixx-outdoors/banners/adventure.jpg";
resourceResolver= resolverFactory.getAdministrativeResourceResolver(null);
   Resource res = resourceResolver.getResource(resourcePath);
   
   Resource metadataRes =res.getChild("jcr:content/metadata");
   ModifiableValueMap map = metadataRes.adaptTo(ModifiableValueMap.class);
     
   //set metadata
   map.put("dc:samplemetadata", "sample metadata");
   resourceResolver.commit();
     
   //get metadata  
   String metadata=map.get("dc:samplemetadata").toString();  
     
}catch(Exception e)
{

}finally
{
resourceResolver.close();
}



Dependency in pom.xml

<dependency>
<groupId>org.apache.sling</groupId>
<artifactId>org.apache.sling.api</artifactId>
<version>2.4.0</version>
<scope>provided</scope>
</dependency>

Tuesday, June 30, 2015

How to enable Debugging for OSB modules

How to enable Debugging for Oracle Service Bus(OSB) modules

Make sure server log is set to debug (Weblogic console -> Environment-->Servers -><<OSB Server>>--> Logging -> Advanced)

Stop the servers .
Open file <DOMAIN_HOME>/alsbdebug.xml
Set the value to true for the required modules.


Open file <DOMAIN_HOME>/configfwkdebug.xml
Set the value to true for the required modules.


Restart the server
Server log will have the details.

Thursday, June 25, 2015

Install Adobe Experience Manager(AEM) package through CURL command

Install Adobe Experience Manager(AEM) package through CURL command

curl -u <<User Name>>:<<Password>> -F file=@"<<Package Path>>" -F name="<<Package Name>>" -F force=true -F install=true http://<<Server Host Name>>:<<Port>>/crx/packmgr/service.jsp

e.g

curl -u admin:admin -F file=@"/appserver/package/package-1.0.1-SNAPSHOT.zip" -F name="package-1.0.1-SNAPSHOT" -F force=true -F install=true http://localhost:4502/crx/packmgr/service.jsp


If the Adobe Experience Manager(AEM) server is behind the proxy then execute the below command to set the proxy server

export http_proxy=http://<<Proxy Server Host Name>>:<<Port>>

Wednesday, June 17, 2015

Deploying bundles/packages to different environments through Maven: Adobe AEM/Adobe CQ5

Deploying bundles/packages to different environments through Maven: Adobe AEM/Adobe CQ5

Create a folder cq-sample-all(projectname-all) under cq-sample(parent folder)
Create cq-sample-all/pom.xml and configure the environment specific properties, module dependencies and different profiles - refer the sample below

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLotrion="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

<modelVersion>4.0.0</modelVersion>
<parent>
             <groupId>my-group-id</groupId> <!-- Change the groupid and artifactId of the paraent -->
             <artifactId>cq-sample</artifactId>
             <version>1.0-SNAPSHOT</version>
        </parent>

<artifactId>cq-sample-all</artifactId> <!-- Change the artifcatId -->
<packaging>content-package</packaging>
<name>${project.groupId} - ${project.artifactId}</name>

<properties>
<cq.dev.author.server>aem-dev-author</cq.dev.author.server>
<cq.dev.author.host>localhost</cq.dev.author.host>
<cq.dev.author.port>4502</cq.dev.author.port>
<cq.dev.author.protocol>http</cq.dev.author.protocol>
<cq.dev.publisher1.server>aem-dev-publisher</cq.dev.publisher1.server>
<cq.dev.publisher1.host>localhost</cq.dev.publisher1.host>
<cq.dev.publisher1.port>4503</cq.dev.publisher1.port>
<cq.dev.publisher1.protocol>http</cq.dev.publisher1.protocol>
<!-- Add the other server details-->
</properties>
<!-- Add all the  bundle/content modules as part of dependency. Change the artifactId of the modules-->

<dependencies>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>cq-sample-content</artifactId>
<version>${project.version}</version>
<type>content-package</type>
</dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>cq-sample-bundle</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>com.day.jcr.vault</groupId>
<artifactId>maven-vault-plugin</artifactId>
<extensions>true</extensions>
<executions>
<execution>
<goals>
<goal>package</goal>
</goals>
<configuration>
<embeddedTarget>/apps/cq-sample/install</embeddedTarget> <!-- change the folder name(cq-sample) accordingly -->
<embeddeds>
<embedded>
<groupId>${project.groupId}</groupId>
<artifactId>cq-sample-bundle</artifactId>
<filter>true</filter>
</embedded>
<!-- Add additional bundle modules here as embedded -->
</embeddeds>
<subPackages>
<subPackage>
<groupId>${project.groupId}</groupId>
<artifactId>cq-sample-content</artifactId>
<filter>true</filter>
</subPackage>
<!-- Add additional content modules here as subPackage -->
</subPackages>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>

<profiles>
<!-- Profile for Development deployments -->
<!--Create the profile for different environments -->
<profile>
<id>Development</id>
<build>
<plugins>
<plugin>
<groupId>com.day.jcr.vault</groupId>
<artifactId>content-package-maven-plugin</artifactId>
<executions>
<execution>
<id>install-content-package-author</id>
<phase>install</phase>
<goals>
<goal>install</goal>
</goals>
<configuration>
<failOnError>true</failOnError>
<useProxy>false</useProxy>
<packageFile>${project.build.directory}/${project.build.finalName}.zip</packageFile>
<targetURL>${cq.dev.author.protocol}://${cq.dev.author.host}:${cq.dev.author.port}/crx/packmgr/service.jsp</targetURL>
<serverId>${cq.dev.author.server}</serverId>
</configuration>
</execution>
<execution>
<id>install-content-package-publisher1</id>
<phase>install</phase>
<goals>
<goal>install</goal>
</goals>
<configuration>
<failOnError>true</failOnError>
<useProxy>false</useProxy>
<packageFile>${project.build.directory}/${project.build.finalName}.zip</packageFile>
<targetURL>${cq.dev.publisher1.protocol}://${cq.dev.publisher1.host}:${cq.dev.publisher1.port}/crx/packmgr/service.jsp</targetURL>
<serverId>${cq.dev.publisher1.server}</serverId>
</configuration>
</execution>
<!-- Add execution for additional publisher with different id(increment the last digit)-->
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
</project>


How to disable Geolocation feature : Adobe AEM/Adobe CQ5

How to disable Geolocation feature : Adobe AEM/Adobe CQ5

The Geolocation feature can be disabled for all the sites by renaming the following component to different name

Rename /libs/cq/personalization/components/contextstores/geolocation to /libs/cq/personalization/components/contextstores/geolocation_new


Unresolveable build extension: Error resolving version for plugin 'com.day.jcr.vault:maven-vault-plugin' / Unknown packaging: content-package while deploying through Maven : Adobe AEM/Adobe CQ5

Unresolveable build extension: Error resolving version for plugin 'com.day.jcr.vault:maven-vault-plugin' / Unknown packaging: content-package while deploying through Maven : Adobe AEM/Adobe CQ5

We are getting the below exception while deploying the package to Adobe AEM/Adobe CQ5 through Maven.

[ERROR] Unresolveable build extension: Error resolving version for plugin 'com.day.jcr.vault:maven-vault-plugin' from the repositories
[local (D:\Albin\Projects\.m2\repository), adobe (http://repo.adobe.com/nexus/content/groups/public/),
central (http://repo.maven.apache.org/maven2)]: Plugin not found in any plugin repository -> [Help 2]
[ERROR]     Unknown packaging: content-package @ my-group-id:cq-sample-all:[unknown-version],
D:\Albin\SW\apache-maven-3.2.2-bin\apache-maven-3.2.2\bin\cq-sample\cq-sample-all\pom.xml, line 13, column 13
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/ProjectBuildingException
[ERROR] [Help 2] http://cwiki.apache.org/confluence/display/MAVEN/PluginVersionResolutionException

To resolve this issue add the vault plugin to parent pom.xml

<plugin>
<groupId>com.day.jcr.vault</groupId>
<artifactId>maven-vault-plugin</artifactId>
<version>0.0.10</version>
<configuration>
<verbose>true</verbose>
</configuration>
</plugin>

Friday, June 5, 2015

Enabling basic authentication for specific website in dispatcher : Adobe CQ5/Adobe AEM

Enabling basic authentication for specific website in dispatcher : Adobe CQ5/Adobe AEM

Create a file dispatcher.htaccess in dispatcher.
Create the required users by using the following commands.

htpasswd -c /etc/httpd/conf/dispatcher.htaccess user1

Add the following configurations to the httpd.conf, change the site URL and AuthUserFile accordingly:

# unsets authorization header when sending request to AEM
RequestHeader unset Authorization
SetEnvIf Request_URI ^/content/en* auth=1
AuthName "Please login to access english part"
AuthType Basic
AuthUserFile /etc/httpd/conf/dispatcher.htaccess
# first, allow everybody
Order Allow,Deny
Satisfy any
Allow from all
Require valid-user
# then, deny only if required
Deny from env=auth

This will enable the the basic authentication for the website path starts with /content/en

If the site is enabled for https then add the following content to the ssl.conf file

<Location />
# unsets authorization header when sending request to AEM
RequestHeader unset Authorization
SetEnvIf Request_URI ^/content/en* auths=1
AuthName "Please login to access english part"
AuthType Basic
AuthUserFile /etc/httpd/conf/dispatcher.htaccess
# first, allow everybody
Order Allow,Deny
Satisfy any
Allow from all
Require valid-user
# then, deny only if required
Deny from env=auths
</Location>

Sunday, May 31, 2015

org.springframework.a op.framework.AopConfigException: Could not generate CGLIB subclass of class [class net.sf.ehcache.CacheManager]

org.springframework.a op.framework.AopConfigException: Could not generate CGLIB subclass of class [class net.sf.ehcache.CacheManager]

While using Ehcache with spring, spring context initialization fails with the below exception

Caused by: org.springframework.beans.factory.BeanCreationException: Error creati
ng bean with name 'com.googlecode.ehcache.annotations.impl.CacheAttributeSourceI
mpl#0': Cannot resolve reference to bean 'ehcacheManager' while setting bean pro
perty 'cacheManager'; nested exception is org.springframework.beans.factory.Bean
CreationException: Error creating bean with name 'ehcacheManager': Post-processi
ng of the FactoryBean's object failed; nested exception is org.springframework.a
op.framework.AopConfigException: Could not generate CGLIB subclass of class [cla
ss net.sf.ehcache.CacheManager]: Common causes of this problem include using a f
inal class or a non-visible class; nested exception is org.springframework.cglib
.core.CodeGenerationException: net.sf.ehcache.CacheException-->Another unnamed C
acheManager already exists in the same VM. Please provide unique names for each
CacheManager in the config or do one of following:
1. Use one of the CacheManager.create() static factory methods to reuse same Cac
heManager with same name or create one if necessary
2. Shutdown the earlier cacheManager before creating new one with same name.
The source of the existing CacheManager is: InputStreamConfigurationSource [stre
am=java.io.BufferedInputStream@128647a]

Configuration Details:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xmlns:ehcache="http://ehcache-spring-annotations.googlecode.com/svn/schema/ehcache-spring"
     xsi:schemaLocation="
     http://www.springframework.org/schema/beans
     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
     http://ehcache-spring-annotations.googlecode.com/svn/schema/ehcache-spring
     http://ehcache-spring-annotations.googlecode.com/svn/schema/ehcache-spring/ehcache-spring-1.1.xsd">

<ehcache:annotation-driven cache-manager="cacheManager"/>

<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
  <property name="configLocation" value="classpath:config/ehcache/ehcache.xml" />
  <property name="shared" value="true" />
</bean>
</beans>

Saturday, May 23, 2015

How to get all the configurations from a configurationFactory - Adobe CQ5/Adobe AEM

How to get all the configurations from a configurationFactory - Adobe CQ5/Adobe AEM

@Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY, policy = ReferencePolicy.STATIC)
private ConfigurationAdmin configAdmin;
try {
Configuration[] confArray = configAdmin.listConfigurations("(service.factoryPid= com.service.config.impl.ConfigFactoryServiceImpl)");

//Retrieve the configurations - Iterate through confArray
final Configuration conf = confArray[0];
final String property1 = (String) conf.getProperties().get("property1");

} catch (Exception e) {

}

service.factoryPid:



Adobe CQ/Adobe AEM: Configuration Services for Multiple Sites through configurationFactory

Adobe CQ/Adobe AEM: Configuration Services for Multiple Sites through configurationFactory

Sometimes, we have to define configuration services that will differ only with configuration values. For e.g we will have different sites that will use the same configuration service but with different configuration values specific to sites.

In this scenario, we have to create a site specific configuration service for all the sites (multiple services) but OSGI provides the concept of ServiceFactories, the service factory can be used to create configuration services with same set of properties and different values.

As an example let’s assume, we have two different sites that will use the same configuration service but require site specific configuration values. The configurationFactory can be used to create configuration service for different sites.

configurationFactory to create site specific cconfigurations and to retrieve the site specific configuration properties.

import java.util.Dictionary;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.lang.StringUtils;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.ConfigurationPolicy;
import org.apache.felix.scr.annotations.Properties;
import org.apache.felix.scr.annotations.Property;
import org.apache.felix.scr.annotations.Reference;
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.ResourceResolverFactory;
import org.osgi.framework.BundleContext;
import org.osgi.framework.Constants;
import org.osgi.service.cm.Configuration;
import org.osgi.service.cm.ConfigurationAdmin;
import org.osgi.service.component.ComponentContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@Component(configurationFactory = true, policy = ConfigurationPolicy.REQUIRE, immediate = true, label = "Config Factory Service", description = "Global configuration Factory Service", metatype = true)
@Properties({ @Property(name = Constants.SERVICE_DESCRIPTION, value = "Common Configuration Factory Service") })
@Service(value = ConfigFactoryServiceImpl.class)
public class ConfigFactoryServiceImpl{

private static final Logger LOG = LoggerFactory.getLogger(ConfigFactoryServiceImpl.class);

private static ResourceResolverFactory resourceResolverFactory;
private static BundleContext bundleContext;

@Reference
private ResourceResolverFactory resourceResolverFactoryInit;

private static final String SERVICE_PID = "service.pid";

private static final String DEFAULT_CONFIG = "DEFAULT";

private static Map<String, String> svcPIDMap = new HashMap<String, String>();

@Property(label = "Site Root Path", value = "DEFAULT", description = "Root path for site (e.g. - /content/sample).")
public static final String SITE_ROOT_PATH = "siteRootPath";

@Property(label = "Property1", value = "Property1: ", description = "Property1.")
public static final String PROPERTY1 = "PROPERTY1";

@Property(label = "Property2", value = "Property2: ", description = "Property2.")
public static final String PROPERTY2 = "PROPERTY2";

@Property(label = "Property3", value = "Property3: ", description = "Property3.")
public static final String PROPERTY3 = "PROPERTY3";

protected String getSiteRootPath() {
return SITE_ROOT_PATH;
}

protected void activate(ComponentContext context) {
try {
bundleContext = context.getBundleContext();
resourceResolverFactory = resourceResolverFactoryInit;
// Get the current config
Dictionary<?, ?> props = context.getProperties();
// Save the service.pid to static map
String servicePID = (String) props.get(SERVICE_PID);
setServicePID(props, servicePID);
} catch (Exception e) {

}
}

private void setServicePID(Dictionary<?, ?> props, String servicePID) {
String siteRootPath = (String) props.get(getSiteRootPath());
if(!siteRootPath.equals("DEFAULT") && !siteRootPath.startsWith("/"))
{
siteRootPath="/"+siteRootPath;
}
if (!StringUtils.isEmpty(siteRootPath)) {
svcPIDMap.put(siteRootPath, servicePID);
}
}

public static String getConfig(HttpServletRequest request, String key) {
return getConfig(request, null, key);
}

public static String getConfig(HttpServletRequest request, String uri,String key) {
String property = null;
Object configObj = null;
try {
configObj = getConfigObj(request, uri, key);
} catch (Exception e) {

}
if (null != configObj) {
property = configObj.toString();
}
return property;
}

public static Object getConfigObj(HttpServletRequest request,String pagePath, String key) {
Configuration conf;
String resourcePath = null;
try {
if (!("DEFAULT").equals(pagePath)) {
resourcePath = getResourcePath(request, pagePath);
conf = locateConfiguration(resourcePath);
} else {
conf = locateConfiguration(DEFAULT_CONFIG);
}

if (null != conf && null != conf.getProperties()) {
Object obj = conf.getProperties().get(key);
return obj;
} else {
throw new Exception("Could not find matching configuration");
}
} catch (Exception e) {

}
return null;
}

private static Configuration locateConfiguration(String resourcePath) {
Configuration locatedConfig = null;
try {
String siteRootPath = getSiteRootPath(resourcePath);
String svcPID = svcPIDMap.get(siteRootPath);
ConfigurationAdmin bundleConfigAdmin = (ConfigurationAdmin) bundleContext.
getService(bundleContext.getServiceReference(ConfigurationAdmin.class.getName()));
locatedConfig = bundleConfigAdmin.getConfiguration(svcPID);
} catch (Exception e) {

}
return locatedConfig;
}

protected static String getResourcePath(HttpServletRequest request,String pagePath) {
String resourcePath = null;
String uri = request.getRequestURI();
ResourceResolver resourceResolver = null;
try {
resourceResolver = resourceResolverFactory.getResourceResolver(null);
Resource resolvedResource;
if (null == pagePath) {
resolvedResource = resourceResolver.resolve(request, uri);
} else {
resolvedResource = resourceResolver.resolve(request, pagePath);
}
resourcePath = resolvedResource.getPath();
} catch (Exception e) {

} finally {
if (null != resourceResolver) {
resourceResolver.close();
}
}

return resourcePath;
}

protected static String getSiteRootPath(String resourcePath) {
if (StringUtils.isEmpty(resourcePath)) {
return null;
}

if (resourcePath.equalsIgnoreCase(DEFAULT_CONFIG)) {
return resourcePath;
}

String siteRootPath = null;
String[] path = resourcePath.split("/");
if (path.length > 2) {
siteRootPath = "/" + path[1] + "/" + path[2];
LOG.error("siteRootPath= "+siteRootPath);
}

return siteRootPath;
}
}

Friday, May 22, 2015

how to Delete/Disable the users through Java API in Adobe Experience Manager(AEM)

how to Delete/Disable the users through Java API in Adobe Experience Manager(AEM)

This post will explain how to Delete/Disable the users through Java API in Adobe Experience Manager(AEM).

 @Reference
 ResourceResolverFactory resolverFactory;

 ResourceResolver adminResolver = null;
 Session adminSession=null;

 try {  
adminResolver = resolverFactory.getAdministrativeResourceResolver(null);
        adminSession = adminResolver.adaptTo(Session.class);
        final UserManager userManager= adminResolver.adaptTo(UserManager.class);
             
      Authorizable authorizable = userManager.getAuthorizable("userName");
      if (authorizable instanceof User) {
         User user = (User)authorizable;
         user.remove(); //Remove the user

        user.disable() // Disable the user.
    }
                       
 } catch (Exception e) {
e.printStackTrace();
 } finally {
        if (adminResolver != null) adminResolver.close();              
 }

Saturday, May 16, 2015

Suppressing the Selection Failure exception in Assign activity – Oracle SOA Suite

Suppressing the Selection Failure exception in Assign activity – Oracle SOA Suite

This post will explain how to suppress the Selection Failure exception BPEL Assign activity – Oracle SOA Suite
In BPEL Assign activity if the xpath returns empty result then SelectionFailure RuntimeFault will be thrown by the engine.

But some cases we may need to suppress the selectionFailure error while assigning the optional elements.

In my case I have a assign activity that will mapthe elements  input and input1 from inputVariable to result and result1 of outputVariable.


The input2 is optional and somecases input2 element  will not be available in the request payload.

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sup="http://xmlns.oracle.com/Application1/SuppressSelectionFailure/SuppressSelectionFailure">
   <soapenv:Header/>
   <soapenv:Body>
      <sup:process>
         <sup:input>?</sup:input>
      </sup:process>
   </soapenv:Body>
</soapenv:Envelope>