Package com.sun.messaging.ums.provider.openmq

Source Code of com.sun.messaging.ums.provider.openmq.ProviderBrokerInfoService

/*
* 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.provider.openmq;

import com.sun.messaging.ums.common.Constants;
import java.util.Properties;
import javax.jms.JMSException;

import javax.management.*;
import javax.management.remote.*;
import com.sun.messaging.AdminConnectionFactory;
import com.sun.messaging.AdminConnectionConfiguration;
import com.sun.messaging.jms.management.server.*;
import com.sun.messaging.ums.resources.UMSResources;
import com.sun.messaging.ums.service.SecuredSid;
import com.sun.messaging.ums.service.UMSServiceException;
import com.sun.messaging.ums.service.UMSServiceImpl;
import com.sun.messaging.ums.readonly.ReadOnlyRequestMessage;
import com.sun.messaging.ums.dom.util.XMLDataBuilder;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import java.io.IOException;
import java.io.StringWriter;
import java.util.logging.Logger;
import java.util.ArrayList;
import java.util.Date;
import java.util.Map;
import java.util.Iterator;
import java.util.StringTokenizer;
import java.text.DateFormat;


/**
*
* @author isa
*/
public class ProviderBrokerInfoService {
   
    //private com.sun.messaging.ConnectionFactory factory = null;
   
    private Logger logger = UMSServiceImpl.logger;
   
    private String brokerAddress = null;
   
    //private String user = null;
   
    //private String password = null;
   
    private AdminConnectionFactory acf;
   
    private boolean shouldAuthenticate = true;
   
    private boolean base64encoding = false;
   
    /**
     * Called by UMS immediately after constructed.
     *
     * @param props properties used by the connection factory.
     * @throws javax.jms.JMSException
     */
   
    public void init (Properties props) throws JMSException {
       
        // get connection factory
        acf = new AdminConnectionFactory();

        brokerAddress = props.getProperty(Constants.IMQ_BROKER_ADDRESS);

        if (brokerAddress != null) {
            acf.setProperty(AdminConnectionConfiguration.imqAddress, brokerAddress);
        }
           
        String tmp = props.getProperty(Constants.JMS_AUTHENTICATE, Constants.JMS_AUTHENTICATE_DEFAULT_VALUE);
       
        this.shouldAuthenticate = Boolean.parseBoolean(tmp);
       
        tmp = props.getProperty(Constants.BASIC_AUTH_TYPE, Constants.BASIC_AUTH_TYPE_DEFAULT_VALUE);
       
        this.base64encoding = Boolean.parseBoolean(tmp);
       
        String msg = UMSResources.getResources().getKString(UMSResources.UMS_DEST_SERVICE_INIT, brokerAddress, String.valueOf(shouldAuthenticate));
      
        logger.info(msg);
      
        msg = UMSResources.getResources().getKString(UMSResources.UMS_AUTH_BASE64_ENCODE, base64encoding);
        logger.info(msg);
       
        //logger.info ("broker addr=" + brokerAddress + ", shouldAuth=" + this.shouldAuthenticate + ", base64encode=" + this.base64encoding);
    }
   
    /**
     * Same as JMS ConnectionFactory.createConnection();
     *
     * @return
     * @throws javax.jms.JMSException
     */
    private JMXConnector createConnection() throws JMException {
        return acf.createConnection();
    }
   
    /**
     * Same as JMS ConnectionFactory.createConnection(String user, String password);
     *
     * @param user
     * @param password
     * @return
     * @throws javax.jms.JMSException
     */
    private JMXConnector createConnection(String user, String password) throws JMException, JMSException {
       
        JMXConnector jmxc = null;
       
        if (this.shouldAuthenticate == false) {
            jmxc = acf.createConnection();
        } else {
           
            if (this.base64encoding) {
               
                if (password == null) {
                    throw new UMSServiceException ("Password is required for user=" + user);
                }
               
                password = SecuredSid.decode(password);
            }
           
            jmxc =acf.createConnection(user, password);
        }
       
        return jmxc;
    }
   
    public String getBrokerInfo(ReadOnlyRequestMessage request, String user, String password) {
  String reqURL = request.getMessageProperty ("requestURL");
  String ret = "hello";
  JMXConnector jmxc = null;


  try  {
            if (user == null) {
                jmxc = createConnection();
            } else {
                jmxc = createConnection(user, password);
            }

      /*
       * Get MBeanServer interface.
       */
      MBeanServerConnection mbsc = jmxc.getMBeanServerConnection();

      // Build XML
      Document doc = XMLDataBuilder.newUMSDocument();
      Element root = XMLDataBuilder.getRootElement(doc);

      Element brokerInfoElement = XMLDataBuilder.createUMSElement(doc, "BrokerInfo");
      XMLDataBuilder.addChildElement(root, brokerInfoElement);

            generateHeaderElement(request, mbsc, doc, brokerInfoElement);
            generateBodyElement(request, mbsc, doc, brokerInfoElement);

      //transform xml document to a string
      ret = XMLDataBuilder.domToString(doc);
  } catch(Exception e)  {
      throw new UMSServiceException (e);
  } finally  {
            try {
                if (jmxc != null) {
                    jmxc.close();
                }
            } catch (Exception e) {
            }
  }

  return ret;
    }

    public void generateHeaderElement(ReadOnlyRequestMessage request,
        MBeanServerConnection mbsc,
        Document doc,
        Element parentXMLElement) {
  String reqURL = request.getMessageProperty ("requestURL");

  try  {
      Element headerElement = XMLDataBuilder.createUMSElement(doc, "Header");
      XMLDataBuilder.addChildElement(parentXMLElement, headerElement);

      Element genDateElement = XMLDataBuilder.createUMSElement(doc, "GeneratedDate");
      XMLDataBuilder.addChildElement(headerElement, genDateElement);

      long curTime = System.currentTimeMillis();

      Element msElement = XMLDataBuilder.createUMSElement(doc, "Milliseconds");
      XMLDataBuilder.setElementValue(doc, msElement, String.valueOf(curTime));
      XMLDataBuilder.addChildElement(genDateElement, msElement);

      Element dateStringElement = XMLDataBuilder.createUMSElement(doc, "DateString");
      Date        d = new Date(curTime);
      DateFormat df = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.MEDIUM);
      String ds = df.format(d);
      XMLDataBuilder.setElementValue(doc, dateStringElement, ds);
      XMLDataBuilder.addChildElement(genDateElement, dateStringElement);


      /*
      Element queryStringElement = XMLDataBuilder.createUMSElement(doc, "QueryString");
      XMLDataBuilder.addChildElement(headerElement, queryStringElement);
      XMLDataBuilder.setElementValue(doc, queryStringElement, reqURL);
      */

      Element reqPropElement = XMLDataBuilder.createUMSElement(doc, "RequestProperties");
      XMLDataBuilder.addChildElement(headerElement, reqPropElement);

      /*
      Map msgProps = request.getMessageProperties();
      Iterator keyI = msgProps.keySet().iterator();
      while (keyI.hasNext()) {
    String oneKey =  (String)keyI.next();

    if (oneKey.equals("cmd"))  {
    }

    String vals[] = (String[])msgProps.get(oneKey);

    if (vals != null)  {

              XMLDataBuilder.setElementAttribute(reqPropElement,
        oneKey.toString(), vals[0]);
    }
      }
      */



      String propName, val;

      propName = "cmd";
      val = request.getMessageProperty (propName);
      if ((val != null) && (val.length() > 0))  {
          XMLDataBuilder.setElementAttribute(reqPropElement, propName, val);
      }

      propName = "dest-elements";
      val = request.getMessageProperty (propName);
      if ((val != null) && (val.length() > 0))  {
          XMLDataBuilder.setElementAttribute(reqPropElement, propName, val);
      }

            addBrokerToXML(mbsc, doc, headerElement);

  } catch(Exception e)  {
      throw new UMSServiceException (e);
  }
    }

    public void generateBodyElement(ReadOnlyRequestMessage request,
        MBeanServerConnection mbsc,
        Document doc,
        Element parentXMLElement) {
  String reqURL = request.getMessageProperty ("requestURL");
  String cmds = request.getMessageProperty ("cmd");

  try  {
      Element bodyElement = XMLDataBuilder.createUMSElement(doc, "Body");
      XMLDataBuilder.addChildElement(parentXMLElement, bodyElement);

      if ((cmds != null) && (cmds.length() > 0))  {
          StringTokenizer st = new StringTokenizer(cmds, ",");
    while (st.hasMoreTokens()) {
        String oneCmd = st.nextToken();

        if (oneCmd.equals("getDestinations"))  {
                        addDestinationsToXML(request, mbsc, doc, bodyElement);
        }
    }
      }
  } catch(Exception e)  {
      throw new UMSServiceException (e);
  }
    }

    public void addBrokerToXML(MBeanServerConnection mbsc,
        Document doc,
        Element parentXMLElement) {
  try  {
      Element bkrElement = XMLDataBuilder.createUMSElement(doc, "Broker");
      XMLDataBuilder.addChildElement(parentXMLElement, bkrElement);

      /*
       * Create object name of broker monitor MBean.
       */
      ObjectName objName
    = new ObjectName(MQObjectName.BROKER_MONITOR_MBEAN_NAME);

            addMBeanAttrsToXML(mbsc, objName, null, doc, bkrElement);

      /*
       * Create object name of broker config MBean to get value of imq.varhome
       * TBD: Add VarHome attribute to both Broker Config/Monitor MBeans ??
       */
      objName = new ObjectName(MQObjectName.BROKER_CONFIG_MBEAN_NAME);

      Element varHomeElement = XMLDataBuilder.createUMSElement(doc, "VarHome");
      XMLDataBuilder.addChildElement(bkrElement, varHomeElement);
      Object params[] = { "imq.varhome" };
      String signature[] = { String.class.getName() };
      String varHome = (String)mbsc.invoke(objName, BrokerOperations.GET_PROPERTY,
      params, signature);
      XMLDataBuilder.setElementValue(doc, varHomeElement,
      (varHome == null) ? "" : varHome);
  } catch(Exception e)  {
      throw new UMSServiceException (e);
  }
    }

    public void addDestinationsToXML(ReadOnlyRequestMessage request,
        MBeanServerConnection mbsc, Document doc,
        Element parentXMLElement) {
  try  {

      Element destsElement = XMLDataBuilder.createUMSElement(doc, "Destinations");
      XMLDataBuilder.addChildElement(parentXMLElement, destsElement);


      /*
       * Create object name of destination monitor mgr MBean.
       */
      ObjectName objName
    = new ObjectName(MQObjectName.DESTINATION_MANAGER_MONITOR_MBEAN_NAME);

      ObjectName destinationObjNames[] =
                (ObjectName[])mbsc.invoke(objName, DestinationOperations.GET_DESTINATIONS, null, null);
      MBeanInfo mbInfo = null;
      String attrsToGet[] = null;
      String opsToGet[] = null;

      String propName = "dest-elements";
      String tmpVal = request.getMessageProperty (propName);
      ArrayList<String> destElements = null;

      if ((tmpVal != null) && (tmpVal.length() > 0))  {
    destElements = new ArrayList<String>();

          StringTokenizer st = new StringTokenizer(tmpVal, ",");
    while (st.hasMoreTokens()) {
        String oneElement = st.nextToken();
        destElements.add(oneElement);
    }
      }

            for (int i = 0; i < destinationObjNames.length; ++i)  {
                ObjectName oneDestObjName = destinationObjNames[i];

    if (attrsToGet == null)  {
        if (mbInfo == null)  {
            mbInfo = mbsc.getMBeanInfo(oneDestObjName);
        }
        MBeanAttributeInfo mbAttrInfo[] = mbInfo.getAttributes();

        ArrayList<String> tmpArray = new ArrayList<String>();

        for (int j = 0; j < mbAttrInfo.length; ++j)  {
      String oneAttrName = mbAttrInfo[j].getName();

      if ((destElements == null) || (destElements.size() == 0))  {
          tmpArray.add(oneAttrName);
      } else  {
          if (destElements.contains(oneAttrName))  {
              tmpArray.add(oneAttrName);
          }
      }
        }

        attrsToGet = new String [ tmpArray.size() ];
        tmpArray.toArray(attrsToGet);
    }

    if (opsToGet == null)  {
        if (mbInfo == null)  {
            mbInfo = mbsc.getMBeanInfo(oneDestObjName);
        }
        MBeanOperationInfo mbOpInfo[] = mbInfo.getOperations();

        ArrayList<String> tmpArray = new ArrayList<String>();

        for (int j = 0; j < mbOpInfo.length; ++j)  {
      MBeanOperationInfo oneOpInfo = mbOpInfo[j];
      if (oneOpInfo.getImpact() != MBeanOperationInfo.INFO)  {
          continue;
      }

      if ((oneOpInfo.getSignature() != null) && (oneOpInfo.getSignature().length > 0))  {
          continue;
      }

      String oneOpName = oneOpInfo.getName();

      if ((destElements == null) || (destElements.size() == 0))  {
          tmpArray.add(oneOpName);
      } else  {
          if (destElements.contains(opNameToElementName(oneOpName)))  {
              tmpArray.add(oneOpName);
          }
      }
        }

        if (tmpArray.size() > 0)  {
            opsToGet = new String [ tmpArray.size() ];
      tmpArray.toArray(opsToGet);
        }
    }

          Element destElement = XMLDataBuilder.createUMSElement(doc, "Destination");
          XMLDataBuilder.addChildElement(destsElement, destElement);

    addDestNameTypeToDestElement(mbsc, oneDestObjName, destElement);

    if (attrsToGet != null)  {
                    addMBeanAttrsToXML(mbsc, oneDestObjName,
        attrsToGet, doc, destElement);
    }

    if (opsToGet != null)  {
                    addMBeanOpsToXML(mbsc, oneDestObjName,
        opsToGet, doc, destElement);
    }
      }
  } catch(Exception e)  {
      throw new UMSServiceException (e);
  }
    }

    public void addDestNameTypeToDestElement(MBeanServerConnection mbsc,
        ObjectName objName,
        Element targetElement) {
  try  {
            if (mbsc == null) {
    return;
            }

      String attrsToGet[] = {
      DestinationAttributes.NAME,
      DestinationAttributes.TYPE
        };

      AttributeList attrList = mbsc.getAttributes(objName, attrsToGet);

      for (int j = 0; j < attrList.size(); ++j)  {
          Attribute oneAttr = (Attribute)attrList.get(j);
          String val = "";
          Object valObj = oneAttr.getValue();

          if (valObj != null)  {
              val = oneAttr.getValue().toString();
    }

          XMLDataBuilder.setElementAttribute(targetElement, oneAttr.getName(), val);
      }

  } catch(Exception e)  {
      throw new UMSServiceException (e);
  }
    }
   
    public void addMBeanAttrsToXML(MBeanServerConnection mbsc,
        ObjectName objName,
        String attrsToGet[],
        Document doc,
        Element targetElement) {
  try  {
            if (mbsc == null) {
    return;
            }

      if (attrsToGet == null)  {
          MBeanInfo mbInfo = mbsc.getMBeanInfo(objName);
          MBeanAttributeInfo mbAttrInfo[] = mbInfo.getAttributes();

          attrsToGet = new String [ mbAttrInfo.length ];

          for (int j = 0; j < mbAttrInfo.length; ++j)  {
        attrsToGet[j] = mbAttrInfo[j].getName();
          }
      }


      AttributeList attrList = mbsc.getAttributes(objName, attrsToGet);

      for (int j = 0; j < attrList.size(); ++j)  {
          Attribute oneAttr = (Attribute)attrList.get(j);
          Element oneAttrElement = XMLDataBuilder.createUMSElement(doc,
            oneAttr.getName());
          String val = "";
          Object valObj = oneAttr.getValue();

          if (valObj != null)  {
              val = oneAttr.getValue().toString();
    }
          XMLDataBuilder.setElementValue(doc, oneAttrElement, val);
          XMLDataBuilder.addChildElement(targetElement, oneAttrElement);
      }

  } catch(Exception e)  {
      throw new UMSServiceException (e);
  }
    }
   
    public void addMBeanOpsToXML(MBeanServerConnection mbsc,
        ObjectName objName,
        String opsToGet[],
        Document doc,
        Element targetElement) {
  try  {
            if (mbsc == null) {
    return;
            }

      if (opsToGet == null)  {
    MBeanInfo mbInfo = mbsc.getMBeanInfo(objName);

          MBeanOperationInfo mbOpInfo[] = mbInfo.getOperations();

          ArrayList<String> tmpArray = new ArrayList<String>();

          for (int j = 0; j < mbOpInfo.length; ++j)  {
        MBeanOperationInfo oneOpInfo = mbOpInfo[j];
        int impact = oneOpInfo.getImpact();
        MBeanParameterInfo sig[] = oneOpInfo.getSignature();

        if (impact != MBeanOperationInfo.INFO)  {
      continue;
        }

        if ((sig != null) && (sig.length > 0))  {
      continue;
        }

        tmpArray.add(oneOpInfo.getName());
          }

          if (tmpArray.size() > 0)  {
              opsToGet = new String [ tmpArray.size() ];
        tmpArray.toArray(opsToGet);
          }
      }

      for (int i = 0; i < opsToGet.length; ++i)  {
    String opName = opsToGet[i];
    String groupElementName, memberElementName;
          Object opReturn =
                    mbsc.invoke(objName, opName, null, null);
   
    if (opName.startsWith("get"))  {
        groupElementName = opName.substring("get".length());
    } else  {
        groupElementName = opName;
    }

    if (groupElementName.endsWith("s"))  {
        memberElementName = groupElementName.substring(0,
        groupElementName.length()-1);
    } else  {
        memberElementName = groupElementName;
    }

    Element groupElement = XMLDataBuilder.createUMSElement(doc, groupElementName);
          XMLDataBuilder.addChildElement(targetElement, groupElement);

    if (opReturn != null)  {
        if (opReturn.getClass().isArray())  {
      Object array[] = (Object[])opReturn;

      for (int j = 0; j < array.length; ++j)  {
          Object val = array[j];
                Element memberElement = XMLDataBuilder.createUMSElement(doc,
              memberElementName);
                      XMLDataBuilder.setElementValue(doc, memberElement, val.toString());
                      XMLDataBuilder.addChildElement(groupElement, memberElement);
      }
        }
    }
      }
  } catch(Exception e)  {
      throw new UMSServiceException (e);
  }
    }

    public String opNameToElementName(String opName)  {
  if (opName == null)  {
      return ("");
  }

        if (opName.startsWith("get"))  {
            return(opName.substring("get".length()));
        } else  {
            return(opName);
        }
    }
   
   
    /**
     * XXX: review
     * @param user
     * @param pass
     * @throws javax.jms.JMSException
     * @throws javax.management.JMException
     * @throws java.io.IOException
     */
    public void authenticate (String user, String pass) throws IOException {
       
        JMXConnector jmxc = null;
       
        try {
       
        if (user == null) {
            this.createConnection();
        } else {
            this.createConnection(user, pass);
        }
       
        } catch (Exception e) {
           
            throw new RuntimeException (e.getMessage());
       
        } finally {
           
            if (jmxc != null) {
                jmxc.close();
            }
        }
    }
   
    /*
    public static void main(String[] args) throws Exception {
        Properties props = new Properties();
       
        props.setProperty(Constants.IMQ_BROKER_ADDRESS, "niagra2:7676");
       
        ProviderDestinationService ds = new ProviderDestinationService();
        ds.init(props);
       
        //ds.listDestinations(null, null);
       
       ds.queryDestination("simpleQ", "queue", null, null);
    }
    */
   
   
}
TOP

Related Classes of com.sun.messaging.ums.provider.openmq.ProviderBrokerInfoService

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.