Friday, August 10, 2012

Changing the reference endpoint of a Composite through JAVA – Oracle SOA 11g


The blog explain how to use the Java API to change the reference endpoint of a composite.

This update is not a cluster-aware; remember that you must repeat the same process for each managed server of your environment.

UpdateEndPoint .java

import java.util.*;
import javax.management.*;
import javax.management.openmbean.*;
import javax.management.remote.*;
import javax.naming.Context;

public class UpdateEndPoint {

    public static MBeanServerConnection getMbeanServerConnection(String host,int port,String userName,String password) throws Exception {
        String jndiroot = "/jndi/";
        MBeanServerConnection m_connection = null;
        try {
            Hashtable jndiProps = new Hashtable();
            jndiProps.put(Context.SECURITY_PRINCIPAL, userName);
            jndiProps.put(Context.SECURITY_CREDENTIALS, password);
            jndiProps.put(JMXConnectorFactory.PROTOCOL_PROVIDER_PACKAGES,"weblogic.management.remote");

            JMXServiceURL serviceURL =new JMXServiceURL("t3", host, port, jndiroot +"weblogic.management.mbeanservers.runtime");
            JMXConnector m_connector =JMXConnectorFactory.newJMXConnector(serviceURL, jndiProps);
            m_connector.connect();
            m_connection = m_connector.getMBeanServerConnection();

        } catch (Exception e) {
            e.printStackTrace();
        }
        return m_connection;
    }

    private static CompositeDataSupport UpdateEndPointData(CompositeDataSupport cds,String[] keys,String[] newValues) throws Exception {
        Map items =new HashMap(cds.getCompositeType().keySet().size());

        for (String key : cds.getCompositeType().keySet()) {
            boolean matched = false;
            int i = 0;

            for (; i < keys.length; i++) {
                String searchKey = keys[i];

                if (searchKey.equalsIgnoreCase(key)) {
                    items.put(key, newValues[i]);
                    matched = true;
                    break;
                }
            }

                if (!matched) {                   
 
                         items.put(key, cds.get(key));                 
 
                 }
             }

        return new CompositeDataSupport(cds.getCompositeType(), items);
    }

    public static void updateEndPoint(String host, String port,String userName, String password,String compositeName,String revision, String referenceName, String endpoint) {

        String mBeanName =
            "oracle.soa.config:SCAComposite=\""+compositeName+"\""+",revision="+revision+",port=*,label=*,Application=*,name=WSBinding,SCAComposite.SCAReference="+referenceName+",j2eeType=SCAComposite.SCAReference.SCABinding,*";

        MBeanServerConnection mbsc;
        try {
            mbsc =getMbeanServerConnection(host, Integer.parseInt(port), userName, password);
            Set mbeans =mbsc.queryNames(new ObjectName(mBeanName), null);
            ObjectName mbean = (ObjectName)mbeans.iterator().next();
            javax.management.openmbean.CompositeData[] properties =(javax.management.openmbean.CompositeData[])mbsc.getAttribute(mbean, "Properties");
            boolean endpointFound = false;
            for (int i = 0; i < properties.length; i++) {
                CompositeDataSupport cds = (CompositeDataSupport)properties[i];        
 

                if ("endpointURI".equalsIgnoreCase((String)cds.get("name"))) {

                    properties[i] =UpdateEndPointData((CompositeDataSupport)properties[i],new String[] { "value" },new String[] { endpoint });
                    mbsc.setAttribute(mbean,new Attribute("Properties", properties));
                    endpointFound = true;
                    break;
                }
            }

            // Property not found, insert it
            if (!endpointFound) {
                CompositeDataSupport cds =UpdateEndPointData((CompositeDataSupport)properties[0],new String[] { "name", "value" },new String[] { "endpointURI",endpoint });
                CompositeData[] newPropertyArray =AppendEntry(properties, cds);
                mbsc.setAttribute(mbean,new Attribute("Properties", newPropertyArray));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private static CompositeData[] AppendEntry(CompositeData[] properties,CompositeDataSupport endpointProperty) {
        CompositeData[] newArray =new CompositeData[properties.length + 1];
        for (int x = 0; x < properties.length; x++) {
            newArray[x] = properties[x];
        }
        newArray[properties.length] = endpointProperty;
        return newArray;
    }

    public static void main(String[] args) {        //updatePreference(host,post,username,password,compositeName,revision,,referenceParnerlink,enpoint);
  updateEndPoint("localhost", "8000", "weblogic", "password","InvokeServlet", "1.0","InvokeServletService","http://localhost:8080/EmployeeServlet/employeeservlet");
    }
}

Add the weblogic.jar file to the class.
Before executing the program, change the server details, Composite name, revision, reference name and the endpoint location accordingly.

No comments:

Post a Comment