Tuesday, April 1, 2014

Oracle SOA Suite Composite Deployment - Global Type declaration/definition of name *are duplicated - Part2

Oracle SOA Suite Composite Deployment - Global Type declaration/definition of name *are duplicated - Part2

We were receiving the following exception while trying to invoke a composite(A) from other composite(B) in Oracle SOA Suite.

Error(284): part "payload" of variable "SFDCIN" is defined as XML element "{http://trm.com:I100:OrderProcessing:orderToQuote_Recieve}MT_BackfillStatus" whose definition cannot be resolved because "Global Type declaration/definition of name '{http://trm.com:I100:OrderProcessing:orderToQuote_Recieve}DT_BackfillStatus' are duplicated at the following locations: http://localhost:8000/soa-infra/services/CRMSYNC/SFDCOMQT_EventManager/xsd/SAP.MSG.EAI_610_OLIStatus_Quote.xsd [line#: 4] http://localhost:8000/soa-infra/services/CRMSYNC/SFDCOMQT_EventManager/sfdcomqt_eventmanager_client_ep?XSD=xsd/SAP.MSG.EAI_610_OLIStatus_Quote.xsd [line#: 5] There are at least two of them looking different: http://localhost:8000/soa-infra/services/CRMSYNC/SFDCOMQT_EventManager/xsd/SAP.MSG.EAI_610_OLIStatus_Quote.xsd [difference starting at line#:6] http://localhost:8000/soa-infra/services/CRMSYNC/SFDCOMQT_EventManager/sfdcomqt_eventmanager_client_ep?XSD=xsd/SAP.MSG.EAI_610_OLIStatus_Quote.xsd [difference starting at line#:7] ".

But the deployment of the composite(A) is success and we were able to test the composite(A) successfully from SOAP UI but while trying to invoke from other composite(B), the deployment of the invoking composite(B) failed with the above exception.

The both the differences pointing to the same xsd in the same component, one is design time xsd and another one is run time xsd.

While comparing, we were able to see some small differences between these two xsd's but unfortunately we could not able to correct it because both are pointing to the same xsd.

After a long struggle i was able to find out the root cause, the actual root cause is the annotations defined in the xsd.


After removing the annotation sections from the specified schema and redeploying the composite(A), i was able to invoke successfully from other composite(B).

It seems to be when the xsd's have the annotation defined , the BPEL run time generated xsd has difference compare to the original local schema.

Thursday, March 27, 2014

java.lang.ClassNotFoundException: oracle.adf.share.weblogic.listeners.ADFApplicationLifecycleListener

java.lang.ClassNotFoundException: oracle.adf.share.weblogic.listeners.ADFApplicationLifecycleListener

While deploying Oracle ADF application sometimes we may receive the following exception

weblogic.management.DeploymentException:
at weblogic.application.internal.flow.BaseLifecycleFlow$CreateListenerAction.run(BaseLifecycleFlow.java:184)
at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:120)
at weblogic.application.internal.flow.BaseLifecycleFlow$BaseAction.invoke(BaseLifecycleFlow.java:112)
at weblogic.application.internal.flow.HeadLifecycleFlow.createListener(HeadLifecycleFlow.java:117)
at weblogic.application.internal.flow.HeadLifecycleFlow.createListener(HeadLifecycleFlow.java:103)
at weblogic.application.internal.flow.HeadLifecycleFlow.createListeners(HeadLifecycleFlow.java:175)
at weblogic.application.internal.flow.HeadLifecycleFlow.prepare(HeadLifecycleFlow.java:281)
at weblogic.application.internal.BaseDeployment$1.next(BaseDeployment.java:648)
at weblogic.application.utils.StateMachineDriver.nextState(StateMachineDriver.java:52)
at weblogic.application.internal.BaseDeployment.prepare(BaseDeployment.java:191)
at weblogic.application.internal.EarDeployment.prepare(EarDeployment.java:59)
at weblogic.application.internal.DeploymentStateChecker.prepare(DeploymentStateChecker.java:154)
at weblogic.deploy.internal.targetserver.AppContainerInvoker.prepare(AppContainerInvoker.java:61)
at weblogic.work.SelfTuningWorkManagerImpl$WorkAdapterImpl.run(SelfTuningWorkManagerImpl.java:545)
at weblogic.work.ExecuteThread.execute(ExecuteThread.java:256)
at weblogic.work.ExecuteThread.run(ExecuteThread.java:221)
Caused By: java.lang.ClassNotFoundException: oracle.adf.share.weblogic.listeners.ADFApplicationLifecycleListener
at weblogic.utils.classloaders.GenericClassLoader.findLocalClass(GenericClassLoader.java:297)
at weblogic.utils.classloaders.GenericClassLoader.findClass(GenericClassLoader.java:270)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
at weblogic.utils.classloaders.GenericClassLoader.loadClass(GenericClassLoader.java:179)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:249)
at

The issue is due to  missing ADF web Run-time libraries in the war file.This can be resolved by adding the ADF web Runtime libraries into the war file.

Steps to resolve the issue

If you are deploying through JDeveloper then follow the below steps.

Add the ADF Web Runtime to the project libraries.


Include the ADF Web Runtime library as part of the war. 
    Project Properties-->Edit the deployment profile.
    Select the ADF Web Runtime library as part of WEB-INF/lib contributors.



Getting the Audit Detail of a BPEL instance in JAVA - Oracle SOA Suite

Getting the Audit Detail of a BPEL instance in JAVA - Oracle SOA Suite

In Oracle SOA Suite 11g and Oracle SOA Suite 12c,the audit trail of the BPEL is stored in the table AUDIT_TRAIL.If the size of the payload crossed the threshold size configured in the EM console then the details are stored in the AUDIT_DETAILS table.


The payload in the AUDIT_DETAILS table is in compressed binary form, you can use the below approach to get the actual payload.

import java.sql.*;
import java.util.Hashtable;
import javax.naming.Context;
import javax.naming.InitialContext;
public class GetPayload {
    public static Connection getConnection() throws Exception {
        Context ctx = null;
        Hashtable ht = new Hashtable();
        ht.put(Context.INITIAL_CONTEXT_FACTORY,"weblogic.jndi.WLInitialContextFactory");
        ht.put(Context.PROVIDER_URL, "t3://:8000");
        ctx = new InitialContext(ht);
        javax.sql.DataSource ds =(javax.sql.DataSource)ctx.lookup("jdbc/SOADataSource");
        return ds.getConnection();
    }

    public static String getPayload() {

        Statement stmt = null;
        Connection connection = null;
        ResultSet rs = null;
        
        String query="select  UTL_COMPRESS.LZ_UNCOMPRESS(b.bin) DOC from audit_details b where cikey='5148077' and rownum<2";
       
        String payload = "";
        try {
            connection = getConnection();
            stmt = connection.createStatement();
            rs = stmt.executeQuery(query);
            while (rs.next()) {                    
                Blob blob=rs.getBlob("DOC");
                byte[] sdata = blob.getBytes(1, (int) blob.length());;
                payload = new String(sdata);             
                
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (rs != null)
                    rs.close();
                if (stmt != null)
                    stmt.close();
                if (connection != null)
                    connection.close();
            } catch (Exception e) {

            }
        }
        return payload;

    }
}


Wednesday, March 26, 2014

Recovering the composites to JDeveloper from MDS - Oracle SOA Suite

Recovering the composites to JDeveloper from MDS - Oracle SOA Suite

Sometimes there is a possibility the latest code changes of the deployed composite in JDeveloper might have lost in other hand some cases we will not be having the implementation code for the deployed composites.

These scenarios the Oracle SOA Suite composite artifacts can be exported from MDS through em console and the same can be converted to design time artifact in JDeveloper.

This post will explain the steps to recover the composite to JDeveloper from MDS.

Steps to recover the composite from MDS

Login to Em console, right click on the particular composite and click on Export


Select the appropriate options as shown and click on Export

Tuesday, March 18, 2014

Not able to save the projects into the JWS file(Application) in JDeveloper

Not able to save the projects into the JWS file(Application) in JDeveloper

I was facing a issue while saving the project to the application JWS file and getting "Unable to save GettingPayload.jws".

Receiving the following exception in the JDeveloper console.

java.io.IOException
at oracle.ide.marshal.xml.StructureIO.loadUsingSAX(StructureIO.java:251)
at oracle.ide.marshal.xml.StructureIO.loadImpl(StructureIO.java:167)
at oracle.ide.marshal.xml.StructureIO.loadImpl(StructureIO.java:156)
at oracle.ide.marshal.xml.HashStructureIO.load(HashStructureIO.java:46)
at oracle.ideimpl.extension.RoleManagerImpl.getRolePreferences(RoleManagerImpl.java:80)
at oracle.ideimpl.extension.ExtensionManagerImpl.runRoleSelectionDialog(ExtensionManagerImpl.java:1112)
at oracle.ideimpl.extension.ExtensionManagerImpl.initialize(ExtensionManagerImpl.java:943)
at javax.ide.Service.getService(Service.java:68)
at javax.ide.extension.ExtensionRegistry.getExtensionRegistry(ExtensionRegistry.java:400)
at oracle.ide.ExtensionRegistry.getExtensionRegistry(ExtensionRegistry.java:191)
at oracle.ide.IdeCore.startupImpl(IdeCore.java:1384)
at oracle.ide.Ide.startup(Ide.java:703)

While restating the JDeveloper,  i could not able to see the projects listed under the corresponding applications, i have to manually add them to the application.

Not able to connect to Remote Oracle SOA Suite Server through JDeveloper – Oracle SOA Suite

Not able to connect to Remote Oracle SOA Suite Server through JDeveloper – Oracle SOA Suite 

Sometimes we could have faced the issue to establish the connection to remote Oracle SOA Suite Server through JDeveloper; this might be due to different reasons. Below are some of the basic steps to resolve the connection issue.

Verify whether the Weblogic Server’s user name, password, IP Address, Port and the domain name are entered in the connection wizard properly.



Make sure the option “Always use SSL” in the connection wizard has not been set.


Make sure the option “Use HTTP Proxy Server” in the JDeveloper has not been set. Disable the proxy settings: Tools -> Preferences -> Web Browser and Proxy -> Uncheck 'Use HTTP Proxy Server' option.

Wednesday, March 12, 2014

weblogic.management.ManagementException: [Deployer:149014]Target 'wlsbJMSServer' is not defined.

weblogic.management.ManagementException: [Deployer:149014]Target 'wlsbJMSServer' is not defined.

Sometimes we may receive the following exception when trying to deploy a web application from JDeveloper to weblogic server.

[02:44:09 PM] ----  Deployment started.  ----
[02:44:09 PM] Target platform is  (Weblogic 10.3).
[02:44:12 PM] Retrieving existing application information
[02:44:12 PM] Running dependency analysis...
[02:44:12 PM] Building...
[02:44:17 PM] ****  One or more compilation errors prevented deployment from continuing.
[02:44:17 PM] ****  Please correct all compilation errors before deploying.
[02:44:17 PM] ####  Deployment incomplete.  ####
[02:44:17 PM] ****  One or more compilation errors prevented deployment from continuing. (oracle.adfdt.common.deploy.impl.AdfLibraryBuildDeployer)
[02:45:08 PM] ----  Deployment started.  ----
[02:45:08 PM] Target platform is  (Weblogic 10.3).
[02:45:09 PM] Retrieving existing application information
[02:45:09 PM] Running dependency analysis...
[02:45:09 PM] Building...
[02:45:10 PM] Deploying profile...
[02:45:11 PM] Wrote Web Application Module to C:\JDeveloper\mywork\GettingPayload\GetPayloadWeb\deploy\GetPayloadWeb.war
[02:45:11 PM] Deploying Application...
[02:45:24 PM] Weblogic Server Exception: weblogic.management.ManagementException: [Deployer:149014]Target 'wlsbJMSServer' is not defined.
[02:45:24 PM]   See server logs or server console for more details.
[02:45:24 PM] weblogic.management.ManagementException: [Deployer:149014]Target 'wlsbJMSServer' is not defined.
[02:45:24 PM] ####  Deployment incomplete.  ####
[02:45:24 PM] Remote deployment failed (oracle.jdevimpl.deploy.common.Jsr88RemoteDeployer)

The issue is due to wlsbJMSServer target is not defined in weblogic server.

We can avoid this error and continue with the deployment by selecting the option as Deploy to selected instances in the domain and selecting the particular server or cluster instead of selecting the option as Deploy to all instances in the domain from the JDeveloper deployment wizard.




This is a temporary solution to continue with the deployment but we have to correct the Target issue.

Wednesday, March 5, 2014

Wildcard SSL HostnameVerifier in Weblogic Server

Wildcard SSL HostnameVerifier in Weblogic Server

Before WLS release 10.3.5, weblogic  servers's hostname verification code did not supports the wildcard certificate by default we have to create a custom hostname verification code to handle this scenario but from WLS release 10.3.5, weblogic servers  hostname verification code  by default supports the wildcard certificates.

Wildcard SSL Certificates work the same way as a regular SSL Certificate, allowing you to secure the connection between the client and server(www.abc.com) but a single Wildcard SSL Certificate covers any and all of the sub-domains of the main domain(*.abc.com)

Configuring Wildcard SSL HostnameVerifier:

  • Launch WLS console
  • Click on Environment -> Servers and click on the server
  • Then go to SSL tab
  • Lock & Edit
  • Scroll down and expand advanced section
  • Change Hostname verification entry to Custom Hostname Verifier
  • Enter Below in Custom Hostname verifier "weblogic.security.utils.SSLWLSWildcardHostnameVerifier"

  • Make sure the option Use JSSE SSL is selected.


  • Restart the weblogic server.

Tuesday, February 25, 2014

SOA-INFRA app is not starting up - Oracle SOA Suite 11g

SOA-INFRA app is not starting up - Oracle SOA Suite 11g:

When we restarted the soa server, the soa server came up properly except the SOA-INFRA app.
The status of the SOA-INFRA app in weblogic console is failed and also the SOA node in the em console is not displayed.



We could not able to find any particular error from log files including diagnostic log except schema mismatch error with some of the composites.It  seems due to some reason the status of the soa-infra application is failed and the server is restarted without fixing the actual issue then even after fixing the issue and restarting the server the soa-infra app is not Active.

We have tried deleting the following folders from $DOMAIN_HOME/servers/AdminServer
data
temp 
cache 

Unfortunately even after deleting the above folders the SOA-INFRA app did not come up. 

Tried starting the SOA-INFRA app manually from weblogic console, this time the SOA-INFRA app came up and we could able to see the SOA in em console.



Tuesday, January 28, 2014

ODL handler configuration through WLST script - Oracle SOA Suite

ODL handler configuration through WLST script - Oracle SOA Suite:

Oracle Fusion Middleware components write diagnostic log files in the Oracle Diagnostic Logging (ODL) format. Log file naming and the format of the contents of log files conforms to an Oracle standard. By default, the diagnostic messages are written in text format.

ODL provides the following benefits:

The capability to limit the total amount of diagnostic information saved. You can set the level of information saved and you can specify the maximum size of the log file and the log file directory.

When you reach the specified size, older segment files are removed and newer segment files are saved in chronological fashion.

Components can remain active, and do not need to be shutdown, when older diagnostic logging files are deleted.

The ODL configuration can be changed from EM console or WLST script.

Below is the WLST script help us to change the ODL handler setting.

Configureodlloghandlers.py

folderPath="/oracle/product/soa/11g/fmw/fmwlogs/SOACoreDomain"
domainAdminUserName = "weblogic"
domainAdminPassword = "welcome1"
connect(domainAdminUserName, domainAdminPassword, "t3://localhost:7001")
servers = adminHome.getMBeansByType('Server')
for s in servers:
edit()
startEdit()
serverName1 = s.getName()
path = '/Servers/' + serverName1
cd(path)
lh = listLogHandlers()
for l in lh:
lname = l.get('name')
odlfile = folderPath + '/logs/' + serverName1 + '/' + serverName1 + '-' + lname + '-diagnostic.log'
print 'Diagnostic path===>',odlfile
configureLogHandler(target=serverName1,name=lname, path=odlfile)
save()
activate()

The other details like maxFileSize,rotationFrequency and retentionPeriod  etc can also be changed through configureLogHandler method.

Executing the script:

$MIDDLEWARE_HOME/Oracle_SOA/common/bin/wlst.sh Configureodlloghandlers.py

Tuesday, January 14, 2014

Polling the Message from WebSphere MQ using MQ Transport in OSB

Polling the Message from WebSphere MQ using MQ Transport in OSB

OSB MQ transport help us to post/receive message from the WebSphere MQ. The MQ transport can be configured to poll the queue for the new messages.


This blog explains how to configure the OSB Proxy Service to poll the Queue for new messages.

Steps to configure the OSB Proxy Service to poll the Queue for new messages

Create a OSB Project and Create a Resource of  type MQ Connection.


Provide the MQ Connection details like host name,port number,Queue Manager Name, Channel Name and also provide Connection Pool Size, Connection Timeout and Connection Max Wait. Provide the Static Service Account if User Name/Password is required to connect to MQ and leave the Connection type as default value(tcp mode). Save the connection details.



Monday, January 13, 2014

Remote Java Client to Post the Message to IBM MQ

Remote Java Client to Post the Message to IBM MQ

The below java code will help us to post the message to remote IBM MQ.

package mqclient;
import com.ibm.mq.jms.*;
import javax.jms.*;

public class MQJavaClient {
 
    public static void main(String[] args)
     {
      try {
       MQQueueConnectionFactory cf = new MQQueueConnectionFactory();
       cf.setHostName("10.130.134.178");        
       cf.setPort(2022);    
       cf.setTransportType(JMSC.MQJMS_TP_CLIENT_MQ_TCPIP);  
       cf.setQueueManager("EAI1");
       cf.setChannel("T_CRM_FUSION_CLIENT");
       
       MQQueueConnection connection = (MQQueueConnection) cf.createQueueConnection();
       MQQueueSession session = (MQQueueSession) connection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
       MQQueue queue = (MQQueue) session.createQueue("queue:///DUMMY_Q?targetClient=1");    
       MQQueueSender sender =  (MQQueueSender) session.createSender(queue);
     
     
      String message="<ns1:EmployeeRequest xmlns:ns1=\"http://xmlns.oracle.com/JEJBSample/EmployeeDetailService/EmployeeDetailService\">\n" +
      "<ns1:empNo>987654</ns1:empNo>\n" +
      "</ns1:EmployeeRequest>";
     
       TextMessage textMessage = (TextMessage) session.createTextMessage(message);  
       connection.start();
       sender.send(textMessage);    
     
       sender.close();
       session.close();
       connection.close();
   
      }catch (Exception e) {
          e.printStackTrace();
     
      }
     }
}

Jar Files Required:

com.ibm.mq.jar
com.ibm.mqjms.jar
javax.jms.jar
com.ibm.dhbcore.jar
javax.resource.jar
javax.transaction.jar

Friday, January 10, 2014

Initiating an OSB Service with Email

Initiating an OSB Service with Email

Email transport will help us to send/receive emails in OSB. Some cases we may required to initiate the external service based on the email in the user inbox.


The Proxy service polls the Mail Inbox for the new messages and invokes the Business service whenever there is a new message in the Inbox.The polling interval can be specified in the Proxy Service configuration.Here i will explain about invoking the service with the XML message received from the email body.

Invoking the service with the XML message received from the email body

Create a XSD message structure that will be used by Proxy Service to receive the message

<?xml version="1.0" encoding="UTF-8"?>
<schema attributeFormDefault="unqualified"
elementFormDefault="qualified"
targetNamespace="http://xmlns.oracle.com/JEJBSample/EmployeeDetailService/EmployeeDetailService"
xmlns="http://www.w3.org/2001/XMLSchema">
<element name="EmployeeRequest">
<complexType>
<sequence>
<element name="empNo" type="string"/>
</sequence>
</complexType>
</element>
</schema>

Create a OSB project and create a Business service that needs to be invoked based on the Email content - Here i am invoking a sample BPEL service with the same XSD structure as input.

Create a Service Account with Static username/password of email user.


Tuesday, January 7, 2014

Exposing a OSB Proxy Service as EJB through JEJB transport

Exposing a OSB Proxy Service as EJB through JEJB transport

The JEJB transport lets you pass Plain Old Java Objects (POJOs) through Oracle Service Bus.To a J2EE client, a JEJB proxy service looks like a stateless session bean. A JEJB proxy service, on receiving the method arguments, passes their XML representation in the pipeline $body variable. POJO arguments are represented as the XML fragment. This XML fragment contains the location of the actual POJO stored in the object repository within the pipeline.

For deployment, Oracle Service Bus automatically packages JEJB proxy services as enterprise archives (EARs) and deploys to weblogic server(OSB Server).


JEJB transport uses the Java Interface to expose as EJB.

Here i will explain exposing the proxy service as EJB and invoking the same through java client by passing/receiving  the java objects and invoking the business service by passing/receiving the XML(Java utility methods will be used to convert Java to XML and XML to Java).The BPEL service invoked will receive the empno and and return back the employee details.

Steps to expose the proxy service as EJB

Create a Java interface that will receive/return the Employee object .

package jejbsample;
public interface EmployeeDetails {
 
    Employee getEmployeeDetails(Employee emp);
}

package jejbsample;
import java.io.Serializable;
public class Employee implements Serializable{
    private String empName;
    private String empNo;
    private String empDept;
    private String empLoc;  
    
    public Employee() {
        super();
    }

    public void setEmpName(String empName) {
        this.empName = empName;
    }
    public String getEmpName() {
        return empName;
    }
    public void setEmpNo(String empNo) {
        this.empNo = empNo;
    }
    public String getEmpNo() {
        return empNo;
    }
    public void setEmpDept(String empDept) {
        this.empDept = empDept;
    }
    public String getEmpDept() {
        return empDept;
    }
    public void setEmpLoc(String empLoc) {
        this.empLoc = empLoc;
    }
    public String getEmpLoc() {
        return empLoc;
    }
}

Create a Utility class that will convert the Java to XML and XML to Java.

package javaxmlconverter;
import java.io.InputStream;
import javax.xml.parsers.*;
import jejbsample.Employee;
import org.apache.xmlbeans.*;
import org.w3c.dom.*;

public class JavaXMLConverter {
    public JavaXMLConverter() {
        super();
    }
    public static String getEmpRequestXML(Employee emp) {       
        return emp.getEmpNo();
    }
    public static Employee getEmpResponseJava(XmlObject xml) throws Exception{
            Employee emp = new Employee();        
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            InputStream inputStream = xml.newInputStream();
            DocumentBuilder db = dbf.newDocumentBuilder();
            Document doc = db.parse(inputStream);           
            String empName=null ;
            String empNo=null;
            String empDept=null;
            String empLoc=null;            
            
            NodeList nList = doc.getElementsByTagName("EmployeeResponse");
            for (int temp = 0; temp < nList.getLength(); temp++) {
                Node nNode = nList.item(temp);
                if (nNode.getNodeType() == Node.ELEMENT_NODE) {
                    Element eElement = (Element)nNode;
                     empName =eElement.getElementsByTagName("empName").item(0).getTextContent();
                     empNo =eElement.getElementsByTagName("empNo").item(0).getTextContent();
                     empDept =eElement.getElementsByTagName("empDept").item(0).getTextContent();
                     empLoc =eElement.getElementsByTagName("empLoc").item(0).getTextContent();
                   
                }
            }
        emp.setEmpDept(empDept);
        emp.setEmpName(empName);
        emp.setEmpLoc(empLoc);
        emp.setEmpNo(empNo);
        
        return emp;
        }
    }

Tuesday, December 17, 2013

Custom Message Throttling and Interface Management – Oracle BPEL

Custom Message Throttling and Interface Management – Oracle BPEL

This post explain the details on Custom Message Throttling and Interface Management – Oracle BPEL/Oracle SOA Suite 11g



Custom Message Throttling and Interface Management.pdf

Thursday, December 12, 2013

Approaches to integrate Oracle SOA Suite with SalesForce.com

Approaches to integrate Oracle SOA Suite with SalesForce.com

This post explain the different Approaches to integrate Oracle SOA Suite with SalesForce.com.



Integrate Oracle SOA With SalesForce.pdf

Tuesday, December 10, 2013

Modifying the Request Headers of a OSB Business Service

Modifying the Request Headers of a OSB Business Service

Sometimes we may required to change the request header values eg. Content-Type and Accept etc for OSB Business Service request dynamically, this post will explain the steps to modify the header values for a Business Service request.

Steps to modify the header values for a Business Service request

Login to sbconsole,Create the session and open the message flow of Proxy Service.


Edit the Route to Business Service and Click on add Request Action

Thursday, December 5, 2013

Dynamic endpoint configuration for OSB Business services

Dynamic endpoint configuration for OSB Business services

Sometimes we may required to change the OSB Business service endpoint dynamically.

Steps to change the Business Service endpoints dynamically

The following are the steps to change the Business Service endpoints dynamically.

Login to sbconsole and create the session.

Open the Proxy Service Message Flow.


Click on the RouteTo_BusinessService and click on Edit Route



Wednesday, December 4, 2013

Test the REST services using Chrome

Test the REST services using Chrome

This post will explain you how to test the REST services using chrome.

Steps to test the REST services using Chrome

Install the REST Console Extension to Chrome.


Open REST Console


Here, i am invoking the REST enabled salesforce login service with OAuth.

Provide the Request URI, Content-Type and Language.
Select the Content-Type of Content Headers as application/x-www-form-urlencoded and provide the request payload.We can also add Authorization, Attachment and Headers to the request.

Tuesday, November 26, 2013

Creating JCA Adapters with Abstract WSDL - Oracle OSB

Creating JCA Adapters with Abstract WSDL - Oracle OSB

Oracle OSB provides the option to create JCA adapters to connect to different resources through Proxy Services and Business Services.

The JCA adapter needs to be created through JDevelper, JDeveloper creats a Abstract WSDL and a JCA adapter file.


When creating Busines Service through eclipse, eclipse provides the option to generating the service by right clicking the JCA file.

But through OSB console, we will not be able to generate the Business Service with the Abstract WSDL(WSDL Web Service)  because it will not have any binding or service defined.

If we are adding the binding/service to the abstract wsdl and creating the Business servive the following exception will be thrown


Wednesday, October 30, 2013

Weblogic Managed server status struck in STARTING

Weblogic Managed server status struck in STARTING

We faced the issue while starting the weblogic managed server, the status of the server struck in STARTING.

W could not able to find a valid error messages in the log files

Managed Server Log File:

<30-Oct-2013 11:13:29 o'clock GMT> <Notice> <WebLogicServer> <BEA-000365> <Server state changed to STARTING> 

No logs are getting printed after this.

Node Manager Log File:


<30-Oct-2013 11:09:44> <INFO> <SOACoreDomain> <MS1> <Server failed during startup so will not be restarted>
<30-Oct-2013 11:09:44> <WARNING> <Exception while starting server 'MS1'>
java.io.IOException: Server failed to start up. See server output log for more details.
      at weblogic.nodemanager.server.AbstractServerManager.start(AbstractServerManager.java:200)
      at weblogic.nodemanager.server.ServerManager.start(ServerManager.java:23)
      at weblogic.nodemanager.server.Handler.handleStart(Handler.java:604)
      at weblogic.nodemanager.server.Handler.handleCommand(Handler.java:121)
      at weblogic.nodemanager.server.Handler.run(Handler.java:71)

      at java.lang.Thread.run(Thread.java:662)

The root cause of this issue is somehow the ldap directory of the server got corrupted.

To resolve this issue:

  •  Kill the managed server 
  •  Remove the ldap folder from the following location  <<DOMAIN_HOME>>/servers/<<Managed Server>>, this file will be auto generated while restarting the server.
  • Restart the server

Monday, October 21, 2013

Tracking the messages in Oracle OSB

Tracking the messages in Oracle OSB

This blog will explain how to track the message for a Oracle OSB flow with unique key.

In oracle OSB we can assign a Report key to the proxy service and based on this key the messages can be tracked.

I have developed a proxy service based on business service that invokes a Employee BPEL, this blog will explain how to track the employee messages with employee id.

Steps to enable message tracking in OSB

Open project in OSB console and also create a session

Click on View Message Flow of proxy service

Thursday, October 17, 2013

ORABPEL-05250 Error - JDeveloper Part1

ORABPEL-05250 Error - JDeveloper Part1

I faced a strange ORABPEL-05250 issue while deploying the composite to Oracle SOA Suite Server through JDeveloper.

The composite was successfully build in JDeveloper but during deployment to the server received the following exception.

[03:59:18 PM] Sending internal deployment descriptor
[03:59:18 PM] Sending archive - sca_SFDCOT_Invoker_rev1.0.jar
[03:59:38 PM] Received HTTP response from the server, response code=500
[03:59:38 PM] Error deploying archive sca_SFDCOT_Invoker_rev1.0.jar to partition "CRMASYNC" on server AdminServer [http://localhost:8000] 
[03:59:38 PM] HTTP error code returned [500]
[03:59:38 PM] Error message from server:
There was an error deploying the composite on AdminServer: Error occurred during deployment of component: SFDCOT_Invoker to service engine: implementation.bpel, for composite: SFDCOT_Invoker: ORABPEL-05250

Error deploying BPEL suitcase.
error while attempting to deploy the BPEL component file "/oracle/as01/fmw/config/admin/domains/SOACoreDomain/servers/AdminServer/dc/soa_b3d3a863-3515-4d6d-9b7f-0d0c7d1977a6"; the exception reported is: java.lang.Exception: BPEL 1.1 compilation failed

ORABPEL-05250 exception can occur for number of reasons . After a long struggle( tried removing the partner links one by one) received the actual error

There was an error deploying the composite on AdminServer: Error occurred during deployment of component: SFDCOT_Invoker to service engine: implementation.bpel, for composite: SFDCOT_Invoker: ORABPEL-09705

Could not initialize variable.
An error occurs while initializing BPEL variable inputVariable; the schema processor cannot find the element {http://xmlns.oracle.com/pcbpel/adapter/db/top/SFDCOT_POLLING_V}SfdcotPollingVCollection in the following schemas: oracle.fabric.common.wsdl.SchemaManager@7eb126f4.
The XSD element on which the variable was based was not properly defined in XSD or the WSDL.

Ensure that the element named in the error message is valid in the XSD or the WSDL.

The issue is due to schema name in the wsdl file is wrongly specified(wrong case) even though the schema name was wrongly specified in wsdl the composite was able compile and build successfully in JDeveloper installed in windows but failed while deploying to the server running in UNIX, this is due to case sensitive nature of file names in UNIX OS


After correcting this issue the composite got deployed successfully.

Wednesday, October 16, 2013

The WSDL is not semantically valid: The element or type specified for part'payload' in message cannot be found in any schemas referenced by this wsdl - Oracle OSB

The WSDL is not semantically valid: The element or type specified for part'payload' in message cannot be found in any schemas referenced by this wsdl - Oracle OSB

While creating the WSDL resource in OSB with inline schema refereed to create the message types we may receive the following exception even though the wsdl is valid

An error occurred creating the resource:
The WSDL is not semantically valid: The element or type specified for part'payload' in message '{http://www.tr.com/ns/2013/10/14/SAP/EAI/AAALM/LicenseManagement}PositionEntitlementRequestMessage' cannot be found in any schemas referenced by this wsdl.

WSDL File:


<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions name="SAPOM_PositionEntitlement"
                  targetNamespace="http://www.tr.com/ns/2013/10/14/SAP/EAI/AAALM/LicenseManagement"
                  xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
                  xmlns:client="http://www.tr.com/ns/2013/10/14/SAP/EAI/AAALM/LicenseManagement"
                  xmlns:plnk="http://schemas.xmlsoap.org/ws/2003/05/partner-link/"
                  xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">
 <wsdl:types>
  <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   <xsd:element name="MT_EntitlementStatus" type="client:DT_EntitlementStatus"/>
   <xsd:complexType name="DT_EntitlementStatus">
    <xsd:annotation>
     <xsd:documentation xml:lang="EN">Schema for Entitlement Message</xsd:documentation>
    </xsd:annotation>
    <xsd:sequence>
     <xsd:element name="Record">
      <xsd:complexType>
       <xsd:sequence>
        <xsd:element name="header">
         <xsd:complexType>
          <xsd:sequence>
           <xsd:element name="applicationId" type="xsd:string"/>
           <xsd:element name="transactionId" type="xsd:string"/>
           <xsd:element name="messageId" type="xsd:string"/>
           <xsd:element name="messageHistory" type="xsd:string"/>
           <xsd:element name="tracingId" type="xsd:string"/>
          </xsd:sequence>
         </xsd:complexType>
        </xsd:element>
        
       </xsd:sequence>
      </xsd:complexType>
     </xsd:element>
    </xsd:sequence>
   </xsd:complexType>
  </xsd:schema>
 </wsdl:types>
 <wsdl:message name="PositionEntitlementRequestMessage">
  <wsdl:part name="payload" element="client:MT_EntitlementStatus"/>
 </wsdl:message>
 <wsdl:portType name="PositionEntitlement">
  <wsdl:operation name="process">
   <wsdl:input message="client:PositionEntitlementRequestMessage"/>
  </wsdl:operation>
 </wsdl:portType>

</wsdl:definitions>

The issue is the namespace prefix client is not able to access the element MT_EntitlementStatus.

To resolve this issue add the the targetNamespace attribute in schema definition as shown below

<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions name="SAPOM_PositionEntitlement"
                  targetNamespace="http://www.tr.com/ns/2013/10/14/SAP/EAI/AAALM/LicenseManagement"
                  xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
                  xmlns:client="http://www.tr.com/ns/2013/10/14/SAP/EAI/AAALM/LicenseManagement"
                  xmlns:plnk="http://schemas.xmlsoap.org/ws/2003/05/partner-link/"
                  xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">
 <wsdl:types>
  <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"  targetNamespace="http://www.tr.com/ns/2013/10/14/SAP/EAI/AAALM/LicenseManagement">
   <xsd:element name="MT_EntitlementStatus" type="client:DT_EntitlementStatus"/>

Thursday, September 12, 2013

Common customization file to deploy OSB services to different environments

Common customization file to deploy OSB services to different environments

The customization file can be used to customize the OSB services.
This post will explain how to use the common customization file to customize the OSB services.

Steps to use common customization file to customize the OSB services

1. Create a environment specific property files with the end point details ex Dev_build.properties

# SFDC Details
sfdc.protocol=http
sfdc.host=10.23.23.11

siebel.protocol=http
siebel.host=10.23.23.12


2. Common customization file

To customize the end point details for the business service, we have to change the Service URI and Service URI Table.
we have to tokenize the endpoint details so that the values can be replaced from the environment specific file.

For each new OSB service generate the customization file and copy the required sections(mainly <cus:envValueAssignments> of Service URI and Service URI table <cus:envValueAssignments>) to the common customization file.

<?xml version="1.0" encoding="UTF-8"?>
<cus:Customizations xmlns:cus="http://www.bea.com/wli/config/customizations" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xt="http://www.bea.com/wli/config/xmltypes">
  <cus:customization xsi:type="cus:EnvValueCustomizationType">
    <cus:description/>
    <cus:envValueAssignments>
      <xt:envValueType>Service URI</xt:envValueType>
      <xt:location>0</xt:location>
      <xt:owner>
        <xt:type>BusinessService</xt:type>
        <xt:path>VenusOSB/BusinessServ/BS_ServCloudVenusInbound</xt:path>
      </xt:owner>
      <xt:value xsi:type="xs:string" xmlns:xs="http://www.w3.org/2001/XMLSchema">@sfdc.protocol@://@sfdc.host@/services/service1</xt:value>
    </cus:envValueAssignments>

    <cus:envValueAssignments>
      <xt:envValueType>Service URI Table</xt:envValueType>
      <xt:location xsi:nil="true"/>
      <xt:owner>
        <xt:type>BusinessService</xt:type>
        <xt:path>VenusOSB/BusinessServ/BS_ServCloudVenusInbound</xt:path>
      </xt:owner>
      <xt:value>
        <tableElement xmlns="http://www.bea.com/wli/sb/transports">
          <URI>@sfdc.protocol@://@sfdc.host@/services/service1</URI>
          <weight>1</weight>
        </tableElement>
      </xt:value>
    </cus:envValueAssignments>

    <cus:envValueAssignments>
      <xt:envValueType>Service URI</xt:envValueType>
      <xt:location>0</xt:location>
      <xt:owner>
        <xt:type>BusinessService</xt:type>
        <xt:path>VenusOSB/BusinessServ/BS_RCRMVenusInbound</xt:path>
      </xt:owner>
      <xt:value xsi:type="xs:string" xmlns:xs="http://www.w3.org/2001/XMLSchema">@siebel.protocol@://@siebel.host@/eai_enu/start.swe</xt:value>
    </cus:envValueAssignments>
    <cus:envValueAssignments>
      <xt:envValueType>Service URI Table</xt:envValueType>
      <xt:location xsi:nil="true"/>
      <xt:owner>
        <xt:type>BusinessService</xt:type>
        <xt:path>VenusOSB/BusinessServ/BS_RCRMVenusInbound</xt:path>
      </xt:owner>
      <xt:value>
        <tran:tableElement xmlns:tran="http://www.bea.com/wli/sb/transports">
          <tran:URI>@siebel.protocol@://@siebel.host@/eai_enu/start.swe</tran:URI>
          <tran:weight>1</tran:weight>
        </tran:tableElement>
      </xt:value>
    </cus:envValueAssignments>

  </cus:customization>

Monday, August 19, 2013

Issues while executiing the WLST script to customize the OSB

Issues while executiing the WLST script to customize the OSB

You may be receiving some of the below issues while executing the WLST script to customize the OSB projects.

ImportError: no module named wli: Make sure $OSBHOME/lib/sb-kernel-api.jar is added into the CLASSPATH.

ImportError: no module named customization: Make sure $OSBHOME/modules /com.bea.common.configfwk_1.5.0.0.jar added into the CLASSPATH.

java.lang.RuntimeException: java.lang.RuntimeException: java.lang.ClassNotFoundException: com.bea.wli.sb.management.configuration.DelegatedSessionManagementMBean: Make sure $OSBHOME/lib/sb-kernel-impl.jar added into the CLASSPATH.

 CLASSPATH=$CLASSPATH:$OSBHOME/modules/com.bea.common.configfwk_1.5.0.0.jar:$OSBHOME/lib/sb-kernel-api.jar:$OSBHOME/lib/sb-kernel-impl.jar;export CLASSPATH

Customizing the OSB Service through WLST script

Customizing the OSB Service through WLST script

This post will explain how to Customize the OSB Service through WLST script

The below WLST script will help us to run the OSB customization file.

import sys
from java.io import FileInputStream
from com.bea.wli.config.customization import Customization
from com.bea.wli.sb.management.importexport import ALSBImportOperation
from com.bea.wli.sb.management.configuration import ALSBConfigurationMBean
from com.bea.wli.sb.management.configuration import SessionManagementMBean

def customizeOSBService(customizationFile):
    SessionMBean = None
    try:
        connect('weblogic', 'welcome1', 't3://localhost:8000')
        domainRuntime()
        sessionName = String("Customization"+Long(System.currentTimeMillis()).toString())
        SessionMBean = findService("SessionManagement", "com.bea.wli.sb.management.configuration.SessionManagementMBean")
        SessionMBean.createSession(sessionName)
        OSBConfigurationMBean = findService(String("ALSBConfiguration.").concat(sessionName), "com.bea.wli.sb.management.configuration.ALSBConfigurationMBean")
        print 'Loading customization File', customizationFile
        iStream = FileInputStream(customizationFile)
        customizationList = Customization.fromXML(iStream)       
        OSBConfigurationMBean.customize(customizationList)
        SessionMBean.activateSession(sessionName, "Complete customization using wlst")
        disconnect()

    except:
        print "Unexpected error:", sys.exc_info()[0]
        if SessionMBean != None:
            SessionMBean.discardSession(sessionName)
        raise

def main():
       
        customizeOSBService('D:\Albin\ALSBCustomizationFile.xml')           
        print 'Successfully Completed customization'   
main()

Customization File:

Customization file will help us to modify the environment specific values for a OSB project.
The previous post can be referred for more details on customization file.

Modify the  environment specific values in the customization file.

Running the Script:

Login to the server and copy the wlst script and the Customization file to some location.
Execute the below two commands

CLASSPATH=$CLASSPATH:$OSBHOME/modules/com.bea.common.configfwk_1.5.0.0.jar:$OSBHOME/lib/sb-kernel-api.jar:$OSBHOME/lib/sb-kernel-impl.jar;export CLASSPATH

wlst.sh /home/eaiapp/Albin/OSBCustomization.wlst

Before executing the first command change the com.bea.common.configfwk_1.5.0.0.jar file version according to your environment.

After successful execution verify the service from OSB Console

  DOWNLOAD OSBCustomization.wlst

Saturday, August 17, 2013

OSB Service customization through console

OSB Service customization through console

This post will explain how to perform OSB customization through console


OSB customization will help us to change the environment specific properties for OSB resources.
There are multiple options to customize the OSB resources.

 Find & Replace:

Find And Replace option help us to find and replace the environment specific values. For example replacing the service URI of the service.
Login to OSB console (http ://<< host name>> :<< port>>/sbconsole) and Create the session
Click on System Administration and Find & Replace under Customization


Enter the find value also provide Find in variable type, Located in project if required and click on Find button. This will display the find results in the bottom.

Enter the value to be replaced and click on Replace All.

Monday, August 12, 2013

Removing the default rowselector column from DOJO Enhanced Grid

Removing the default rowselector column from DOJO Enhanced Grid:

Make sure the value for rowSelector is set as 0px or remove rowSelector property from the grid definition.

var grid = new dojox.grid.EnhancedGrid({
        id : gridObjectName,
        structure : layout,
        rowSelector : '0px',
        sortFields: [{attribute: defaultsort, ascending: true}],
        noDataMessage:"<span class=\"dojoxGridNoData\">No Matching Rows Found!!</span>",
        plugins : {
            indirectSelection:selection,
            pagination : {
                pageSizes : [ "25", "50", "100" ],
                description : true,
                sizeSwitch : true,
                pageStepper : true,
                gotoButton : true,
                /* page step to be displayed */
                maxPageStep : 4,
                /* position of the pagination bar */
                position : "bottom"
            }
        }
    }




Programmatically Uncheck/Check DOJO Checkboxs

Programmatically Uncheck/Check DOJO Checkboxs

The below lines of code will help us to check /uncheck set of dojo checkboxes from javascript.

dojo.forEach (dojo.query("input[type=checkbox]"), function(item){
var widget = dijit.getEnclosingWidget(item);
alert(widget)
widget.set('checked', false);
})

We can change the dojo.query parameter accordingly to fetch the checkboxes.

Saturday, August 10, 2013

Testing the Spring Service layer through JUnit

Testing the Spring Service layer through JUnit

Steps to enable Junit test for spring service layer

This post will explains the steps required to test the spring service layer through JUnit without deploying to the server.

Right Click on the service class for which the test class needs to be created and click on New and select JUnit Test Case


Click on Next and provide the Test Class Name and the package to which the test class has to be created.


Click on Next and select the methods for which the test methods needs to be created and click on finish.

Thursday, August 8, 2013

Fetch Type vs Fetch Mode in Hibernate

Fetch Type vs Fetch Mode in Hibernate

Fetch type (lazy/eager) tells when Hibernate fetches the association, whether in advance when it fetches the entity (eager), or whether it waits for the code to ask for the association (lazy).

Fetch mode (select/join) refers to how Hibernate will fetch the association, i.e. does it use an extra SELECT statement, or does it use a join.

Some combinations of these make no sense, e.g. lazy+join. If you use lazy fetching, then SELECT fetch mode is the only one that you can do.If you use eager fetch, then you can choose to use either fetch mode.

Creating Validation TextArea in DOJO

Creating Validation TextArea in DOJO:

Sometimes we may need to do the validation of the data entered in TextArea but unfortunately the default TextArea provided by DOJO will not support the validation .

We can create a custom component extending both dijit.form.ValidationTextBox and dijit.form.SimpleTextarea, this will provide the functionality of both the ValidationTextBox and
SimpleTextarea.

dojo.declare(
            "ValidationTextarea",
            [dijit.form.ValidationTextBox,dijit.form.SimpleTextarea],
            {
                  postCreate: function() {
                    this.inherited(arguments);
                },
                validate: function() {
                    if (arguments.length==0) {
                    return this.validate(false);
                    }
                    return this.inherited(arguments);
                    },           
                onFocus: function() {
                    if (!this.isValid()) {
                        this.displayMessage(this.getErrorMessage());
                    }
                },
               onBlur: function() {
                    this.validate(false);
                }
             }
        );

We have to add the dojo require for ValidationTextarea  -  dojo.provide("ValidationTextarea");

Using the ValidationTextarea in jsp page:

<textarea id="clntlocn" name="clntlocn" data-dojo-type="ValidationTextarea" required="true" missingMessage="Enter the Client Location Name" rows="2" cols="20"" maxLength="50" style="resize:none"></textarea>

Now we can include all the validations applicable for dijit.form.ValidationTextBox to
ValidationTextarea.