Package com.sun.messaging.ums.common

Source Code of com.sun.messaging.ums.common.MessageUtil

/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright (c) 2000-2010 Oracle and/or its affiliates. All rights reserved.
*
* The contents of this file are subject to the terms of either the GNU
* General Public License Version 2 only ("GPL") or the Common Development
* and Distribution License("CDDL") (collectively, the "License").  You
* may not use this file except in compliance with the License.  You can
* obtain a copy of the License at
* https://glassfish.dev.java.net/public/CDDL+GPL_1_1.html
* or packager/legal/LICENSE.txt.  See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each
* file and include the License file at packager/legal/LICENSE.txt.
*
* GPL Classpath Exception:
* Oracle designates this particular file as subject to the "Classpath"
* exception as provided by Oracle in the GPL Version 2 section of the License
* file that accompanied this code.
*
* Modifications:
* If applicable, add the following below the License Header, with the fields
* enclosed by brackets [] replaced by your own identifying information:
* "Portions Copyright [year] [name of copyright owner]"
*
* Contributor(s):
* If you wish your version of this file to be governed by only the CDDL or
* only the GPL Version 2, indicate your decision by adding "[Contributor]
* elects to include this software in this distribution under the [CDDL or GPL
* Version 2] license."  If you don't indicate a single choice of license, a
* recipient has the option to distribute your version of this file under
* either the CDDL, the GPL Version 2 or to extend the choice of license to
* its licensees as provided above.  However, if you add GPL Version 2 code
* and therefore, elected the GPL Version 2 license, then the option applies
* only if the new code is made subject to such option by the copyright
* holder.
*/

package com.sun.messaging.ums.common;

import java.net.InetAddress;
import java.util.Iterator;

import java.util.Random;
import javax.xml.soap.Name;
import javax.xml.soap.SOAPBodyElement;
import javax.xml.soap.SOAPElement;
import javax.xml.soap.SOAPException;
import javax.xml.soap.SOAPFactory;
import javax.xml.soap.SOAPHeader;
import javax.xml.soap.SOAPHeaderElement;
import javax.xml.soap.SOAPMessage;
import javax.xml.soap.MessageFactory;
import javax.xml.soap.SOAPConstants;

public class MessageUtil {

    private static MessageFactory messageFactory = null;
    private static SOAPFactory soapFactory = null;
    private static String HOST_ADDRESS = null;
    private static Object syncObj = new Object();
   
    private static long sequence = 0;
   
    private static long MSG_RANDOM = 0;
   
    private static String MSG_ID_PREFIX = null;

    static {

        try {
            soapFactory = SOAPFactory.newInstance();

            //messageFactory = MessageFactory.newInstance();
            //messageFactory = MessageFactory.newInstance(SOAPConstants.DEFAULT_SOAP_PROTOCOL);
            messageFactory = MessageFactory.newInstance(SOAPConstants.DEFAULT_SOAP_PROTOCOL);
            HOST_ADDRESS = InetAddress.getLocalHost().toString();
           
            sequence = 0;
           
            Random random = new Random();
            random.setSeed(System.currentTimeMillis());
            MSG_RANDOM = random.nextLong();
           
            MSG_ID_PREFIX = HOST_ADDRESS + "-" + MSG_RANDOM + "-";
           
        } catch (Exception se) {
            se.printStackTrace();
        }
    }

    public static SOAPHeaderElement getMessageHeaderElement(SOAPMessage message) throws SOAPException {

        SOAPHeader soapHeader = message.getSOAPHeader();

        SOAPHeaderElement she = (SOAPHeaderElement) getJMSChildElement(soapHeader, Constants.MESSAGE_HEADER);

        return she;
    }
   
    public static SOAPHeaderElement removeMessageHeaderElement(SOAPMessage message) throws SOAPException {

        SOAPHeader soapHeader = message.getSOAPHeader();

        SOAPHeaderElement she = (SOAPHeaderElement) getJMSChildElement (soapHeader, Constants.MESSAGE_HEADER);

        she.detachNode();
       
        message.saveChanges();
       
        return she;
    }

    public static Iterator getJMSProperties(SOAPMessage m) throws SOAPException {

        SOAPHeader sheader = m.getSOAPHeader();

        Name propEleName = createJMSName(InternalConstants.JMS_PROPERTY);

        Iterator it = sheader.getChildElements(propEleName);

        if (it.hasNext()) {
            SOAPHeaderElement she = (SOAPHeaderElement) it.next();
            return she.getChildElements();
        }

        //iterator with no elements.
        return it;

    }

    public static boolean isStringProperty(SOAPElement se) throws SOAPException {

        if (se.getLocalName().equals(InternalConstants.STRING_PROPERTY)) {
            return true;
        }

        return false;
    }

    public static boolean isBooleanProperty(SOAPElement se) throws SOAPException {

        if (se.getLocalName().equals(InternalConstants.BOOLEAN_PROPERTY)) {
            return true;
        }

        return false;
    }

    public static boolean isLongProperty(SOAPElement se) throws SOAPException {

        if (se.getLocalName().equals(InternalConstants.LONG_PROPERTY)) {
            return true;
        }

        return false;
    }

    public static boolean isShortProperty(SOAPElement se) throws SOAPException {

        if (se.getLocalName().equals(InternalConstants.SHORT_PROPERTY)) {
            return true;
        }

        return false;
    }

    public static boolean isByteProperty(SOAPElement se) throws SOAPException {

        if (se.getLocalName().equals(InternalConstants.BYTE_PROPERTY)) {
            return true;
        }

        return false;
    }

    public static boolean isIntProperty(SOAPElement se) throws SOAPException {

        if (se.getLocalName().equals(InternalConstants.INT_PROPERTY)) {
            return true;
        }

        return false;
    }

    public static String getPropertyName(SOAPElement se) throws SOAPException {

        Name attrName = createJMSName(InternalConstants.PNAME);
        String propName = se.getAttributeValue(attrName);

        return propName;
    }

    public static Object getPropertyValue(SOAPElement se) throws SOAPException {

        Name pvalueAttrName = createJMSName(InternalConstants.PVALUE);
        String pValue = se.getAttributeValue(pvalueAttrName);

        Object pvObj = null;

        if (isStringProperty(se)) {
            pvObj = pValue;
        } else if (isLongProperty(se)) {
            pvObj = new Long(pValue);
        } else if (isIntProperty(se)) {
            pvObj = new Integer(pValue);
        } else if (isShortProperty(se)) {
            pvObj = new Short(pValue);
        } else if (isBooleanProperty(se)) {
            pvObj = new Boolean(pValue);
        } else if (isByteProperty(se)) {
            pvObj = new Byte(pValue);
        }

        return pvObj;

    }

    public static SOAPHeaderElement getSOAPHeaderElement(SOAPMessage message, String headerName,
            String nameSpace) throws SOAPException {

        Iterator it = message.getSOAPHeader().examineAllHeaderElements();

        while (it.hasNext()) {

            SOAPHeaderElement she = (SOAPHeaderElement) it.next();
            String uri = she.getNamespaceURI();
            String localName = she.getLocalName();

            if (headerName.equals(localName) && nameSpace.equals(uri)) {
                //found message header.
                return she;
            }

        }

        return null;
    }

    public static SOAPBodyElement getJMSBodyElement(SOAPMessage message, String localName) throws SOAPException {

        Name name = createJMSName(localName);
        Iterator it = message.getSOAPBody().getChildElements(name);

        if (it.hasNext()) {
            return (SOAPBodyElement) it.next();
        }

        return null;
    }

    public static String getJMSChildElementValue(SOAPElement soapElement, String localName) throws SOAPException {

        String value = null;

        SOAPElement se = getJMSChildElement(soapElement, localName);

        if (se != null) {
            value = se.getValue();
        }

        return value;
    }

    public static SOAPElement getJMSChildElement(SOAPElement soapElement, String localName) throws SOAPException {

        SOAPElement se = null;

        Name name = createJMSName(localName);

        Iterator it = soapElement.getChildElements(name);
        if (it.hasNext()) {
            se = (SOAPElement) it.next();
        }

        return se;
    }

    public static boolean isJMSPropertyExists(SOAPHeader sheader) throws SOAPException {

        Name pname = createJMSName(InternalConstants.JMS_PROPERTY);

        Iterator it = sheader.getChildElements(pname);

        if (it.hasNext()) {
            return true;
        }

        return false;
    }

    public static SOAPHeaderElement getJMSPropertyElement(SOAPHeader sheader) throws SOAPException {

        SOAPHeaderElement she = (SOAPHeaderElement) getJMSChildElement(sheader, InternalConstants.JMS_PROPERTY);

        return she;

    }

    public static SOAPHeaderElement addJMSPropertyElement(SOAPHeader sheader) throws SOAPException {

        SOAPHeaderElement she = null;

        //Name pname = createJMSName (Constants.JMS_PROPERTY);

        //System.out.println("*** JMS property exists: " + pname.getQualifiedName());
        she = getJMSPropertyElement(sheader);

        if (she == null) {
            she = addJMSNsSOAPHeaderElement(sheader, InternalConstants.JMS_PROPERTY);
        }

        return she;
    }

    public static SOAPElement setObjectProperty(SOAPMessage soapm, String pname, Object pvalue)
            throws SOAPException {

        SOAPHeader sheader = soapm.getSOAPHeader();

        SOAPHeaderElement jmsPropertyRoot =
                getJMSPropertyElement(sheader);

        if (jmsPropertyRoot == null) {
            jmsPropertyRoot = addJMSPropertyElement(sheader);
        }

        SOAPElement propEle = setJMSProperty(jmsPropertyRoot, pname, pvalue);

        return propEle;
    }

    public static SOAPElement setJMSProperty(SOAPHeaderElement jmsPropertyRoot, String pname, Object pvalue)
            throws SOAPException {

        //prop element to be added to JMSProperty element
        String eleName = null;

        if (pvalue instanceof String) {
            eleName = InternalConstants.STRING_PROPERTY;
        // System.out.println ("Message util setting String prop ... " +
        // pvalue );
        } else if (pvalue instanceof Integer) {
            eleName = InternalConstants.INT_PROPERTY;
        // System.out.println ("Message util setting Int prop ... " + pvalue
        // );
        } else if (pvalue instanceof Long) {
            eleName = InternalConstants.LONG_PROPERTY;
        // System.out.println ("Message util setting Long prop ... " +
        // pvalue );
        } else if (pvalue instanceof Boolean) {
            eleName = InternalConstants.BOOLEAN_PROPERTY;
        // System.out.println ("Message util setting Boolean prop... " +
        // pvalue );
        } else if (pvalue instanceof Short) {
            eleName = InternalConstants.SHORT_PROPERTY;
        // System.out.println ("Message util setting SHORT prop... " +
        // pvalue );
        } else if (pvalue instanceof Byte) {
            eleName = InternalConstants.BYTE_PROPERTY;
        // System.out.println ("Message util setting Byte prop ... " +
        // pvalue );
        } else {
            throw new SOAPException("Invalid property value." + pvalue);
        }

        // SOAPElement propEle = jmsPropertyRoot.addChildElement(eleName);
        SOAPElement propEle =
                MessageUtil.addJMSChildElement(jmsPropertyRoot, eleName);

        // pname attr
        Name propNameAttr = createJMSName(InternalConstants.PNAME);

        // pvalue attr
        Name propValueAttr = createJMSName(InternalConstants.PVALUE);

        // add pname attr
        propEle.addAttribute(propNameAttr, pname);
        // add pvalue attr.
        propEle.addAttribute(propValueAttr, pvalue.toString());

        // System.out.println ("Message util setting prop attributes for "
        // + eleName + ", " + pname + "=" +pvalue);

        return propEle;
    }

    public static Name createJMSName(String localName) throws SOAPException {

        Name name =
                soapFactory.createName(localName,
                Constants.JMS_NS_PREFIX, Constants.JMS_NS_URI);

        return name;
    }

    public static SOAPHeaderElement addMessageHeader(SOAPMessage soapm) throws SOAPException {

        SOAPHeaderElement she = getMessageHeaderElement(soapm);

        if (she == null) {
            SOAPHeader sh = soapm.getSOAPHeader();
            she = addJMSNsSOAPHeaderElement(sh, Constants.MESSAGE_HEADER);
            addMessageHeaderChildElements(she);
            soapm.saveChanges();
        }

        return she;
    }

    public static SOAPMessage newMessageInstance() throws SOAPException {

        SOAPMessage soapm = null;

        /**
         * sync create new instance to make sure to work in ALL SAAJ impl.
         */
        synchronized (syncObj) {
            soapm = messageFactory.createMessage();
        }

        SOAPHeader sh = soapm.getSOAPHeader();

        SOAPHeaderElement she =
                addJMSNsSOAPHeaderElement(sh, Constants.MESSAGE_HEADER);

        addMessageHeaderChildElements(she);

        soapm.saveChanges();

        return soapm;
    }

    public static SOAPHeaderElement addJMSNsSOAPHeaderElement(SOAPHeader soapHeader, String localName)
            throws SOAPException {

        SOAPHeaderElement headerElement = null;

        Name mh = createJMSName(localName);

        headerElement = soapHeader.addHeaderElement(mh);

        addHeaderAttributes(headerElement);

        return headerElement;
    }

    public static void addHeaderAttributes(SOAPHeaderElement she)
            throws SOAPException {

        Name id = createJMSName(Constants.ID);
        she.addAttribute(id, "1.0");

        Name version = createJMSName(Constants.VERSION);
        she.addAttribute(version, "1.1");

    //she.setMustUnderstand(true);
    }

    public static void addMessageHeaderChildElements(SOAPHeaderElement messageHeader)
            throws SOAPException {
       
        SOAPElement se = null;
       
        //se = addJMSChildElement(messageHeader, Constants.FROM);
        //se.setValue(Constants.FROM_DEFAULT_VALUE);

        //se = addJMSChildElement(messageHeader, Constants.TO);
        //se.setValue(Constants.TO_DEAFULT_VALUE);
       
        //se = addJMSChildElement(messageHeader, Constants.MESSAGE_ID);
        //String mid = getNewMessageID();
        //se.setValue(mid);

        //se = addJMSChildElement(messageHeader, Constants.TIMESTAMP);
        //String ts = getTimestamp(mid);
        //se.setValue(ts);

        //addJMSChildElement(messageHeader, Constants.REF_TO_MESSAGE_ID);

        addJMSChildElement(messageHeader, Constants.SERVICE);
    }

    public static SOAPElement addJMSChildElement(SOAPElement element, String localName) throws SOAPException {
        Name name = createJMSName(localName);
        SOAPElement se = element.addChildElement(name);
        return se;
    }

    /**
     * Create ack message from the specified soap message.
     * @param soapm the message to be acknowledged.
     * @return the created acknowledge message.
     * @throws SOAPException
     */
    public static SOAPMessage createAcknowledgeMessage(SOAPMessage soapm) throws SOAPException {

        //create message
        SOAPMessage ackm = newMessageInstance();

        //add acknowledge element
        SOAPHeaderElement ackele =
                addJMSNsSOAPHeaderElement(ackm.getSOAPHeader(), InternalConstants.ACKNOWLEDGMENT);

        //message to be acked
        SOAPHeaderElement messageHeader = getMessageHeaderElement(soapm);
        String mid = getJMSChildElementValue(messageHeader, Constants.MESSAGE_ID);

        SOAPHeaderElement ackMsgHdr = getMessageHeaderElement(ackm);
        SOAPElement se = getJMSChildElement(ackMsgHdr, Constants.REF_TO_MESSAGE_ID);
        se.setValue(mid);

        //add RefToMessageID element
        SOAPElement refEle = addJMSChildElement(ackele, Constants.REF_TO_MESSAGE_ID);
        refEle.setValue(mid);


        ackm.saveChanges();

        return ackm;
    }
   
    /**
     * Create ack message from the specified soap message.
     * @param soapm the message to be acknowledged.
     * @return the created acknowledge message.
     * @throws SOAPException
     */
    public static SOAPMessage createResponseMessage (SOAPMessage soapm) throws SOAPException {

        //create message
        SOAPMessage ackm = newMessageInstance();

       ackm = createResponseMessage2 (soapm, ackm);

        return ackm;
    }
   
   
    /**
     * Create ack message from the specified soap message.
     * @param soapm the message to be acknowledged.
     * @return the created acknowledge message.
     * @throws SOAPException
     */
    public static SOAPMessage createResponseMessage2 (SOAPMessage req, SOAPMessage resp) throws SOAPException {

        //create message
        //SOAPMessage ackm = newMessageInstance();
       
        checkJMSMessageHeader (resp);
       
        resp.saveChanges();

        return resp;
    }

    public static SOAPMessage createResponseMessage2_save (SOAPMessage req, SOAPMessage resp) throws SOAPException {

        //create message
        //SOAPMessage ackm = newMessageInstance();
       
        checkJMSMessageHeader (resp);
       
        //set ref to mid
        SOAPHeaderElement messageHeader = getMessageHeaderElement(req);
        String mid = getJMSChildElementValue(messageHeader, Constants.MESSAGE_ID);

        SOAPHeaderElement ackMsgHdr = getMessageHeaderElement(resp);
        SOAPElement se = getJMSChildElement(ackMsgHdr, Constants.REF_TO_MESSAGE_ID);
        se.setValue(mid);
       
        //get <from> value from req msg
        String from = getJMSChildElementValue(messageHeader, Constants.FROM);
       
        //get <to> element from resp msg
        SOAPElement toEle = getJMSChildElement (ackMsgHdr, Constants.TO);
        toEle.setValue(from);
       
        resp.saveChanges();

        return resp;
    }
   
    public static void checkJMSMessageHeader (SOAPMessage sm) throws SOAPException {
        SOAPHeaderElement msgHeader = getMessageHeaderElement (sm);
       
        if (msgHeader != null) {
            msgHeader.detachNode();
        }
       
        addMessageHeader(sm);
       
    }

   
    /**
     * XXX chiaming 06/19/2008- OLD -- to be removed
     * @param soapm
     * @param value
     * @throws javax.xml.soap.SOAPException
     */
    public static void setService(SOAPMessage soapm, String value) throws SOAPException {

        SOAPHeaderElement mh = MessageUtil.getMessageHeaderElement(soapm);

        SOAPElement service = MessageUtil.addJMSChildElement(mh, Constants.SERVICE);

        service.setValue(value);

        soapm.saveChanges();
    }

    public static void setServiceAttribute(SOAPMessage soapm, String localName, String value) throws SOAPException {

        SOAPHeaderElement mh = getMessageHeaderElement(soapm);

        SOAPElement serviceElement = getJMSChildElement(mh, Constants.SERVICE);

        Name n = createJMSName(localName);

        serviceElement.addAttribute(n, value);

        soapm.saveChanges();
    }

    public static String getServiceAttribute(SOAPMessage soapm, String localName) throws SOAPException {

        SOAPHeaderElement mh = getMessageHeaderElement(soapm);

        SOAPElement serviceElement = getJMSChildElement(mh, Constants.SERVICE);

        if (serviceElement == null) {
            throw new SOAPException("Message does not contain a Service SOAP Header Element.");
        }

        Name n = createJMSName(localName);

        String value = serviceElement.getAttributeValue(n);

        return value;
    }

    public static String getServiceDestinationName(SOAPMessage soapm) throws SOAPException {

        String destName = getServiceAttribute(soapm, Constants.DESTINATION_NAME);

        return destName;
    }
   
    public static long getServiceReceiveTimeout (SOAPMessage soapm) throws SOAPException {
       
        //in milli secconds
        long timeout = 30000;
       
        String str = getServiceAttribute(soapm, Constants.RECEIVE_TIMEOUT);
       
        if (str != null) {
           
            try {
                timeout = Integer.parseInt(str);
            } catch (Exception e) {
                throw new SOAPException (e);
            }
        }
       
        return timeout;
    }

    public static boolean isServiceTopicDomain(SOAPMessage soapm) throws SOAPException {

        boolean isTopic = false;

        String domain = getServiceAttribute(soapm, Constants.DOMAIN);

        if (Constants.TOPIC_DOMAIN.equals(domain)) {
            isTopic = true;
        } else if (Constants.QUEUE_DOMAIN.equals(domain)) {
            isTopic = false;
        } else {
            throw new SOAPException("SOAP message does not contain domain attribute.");
        }

        return isTopic;

    }

    public static String getServiceName(SOAPMessage soapm) throws SOAPException {
        int stype = -1;

        String sname = getServiceAttribute(soapm, Constants.SERVICE_NAME);

        return sname;
    }

    public static String getServiceClientId(SOAPMessage soapm) throws SOAPException {

        String clientId = getServiceAttribute(soapm, Constants.CLIENT_ID);

        return clientId;
    }

    public static String getNewMessageID() {
      
        return MSG_ID_PREFIX + System.currentTimeMillis() + getNextSequence();
       
    }
   
    public static long getNextSequence() {
       
        synchronized (syncObj) {
           
            if (sequence == Long.MAX_VALUE) {
                sequence = 0;
            }
           
            sequence ++;
        }
       
        return sequence;
       
    }

    private static String getTimestamp(String mid) {
        int index = mid.lastIndexOf('-') + 1;

        String ts = mid.substring(index);

        return ts;
    }
}
TOP

Related Classes of com.sun.messaging.ums.common.MessageUtil

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.