diff options
| author | Martin Ritchie <ritchiem@apache.org> | 2010-06-22 13:41:24 +0000 |
|---|---|---|
| committer | Martin Ritchie <ritchiem@apache.org> | 2010-06-22 13:41:24 +0000 |
| commit | 5951dfafe74a4115ef22dbb5d5d9b8c455bde0f5 (patch) | |
| tree | 41f103484174afd124be65a0355626ebb65074f6 /java/broker-plugins/experimental/info/src/main | |
| parent | 571c08285a95a1fb810309f19ceca2107054f12d (diff) | |
| download | qpid-python-5951dfafe74a4115ef22dbb5d5d9b8c455bde0f5.tar.gz | |
QPID-2555 : Modified the MANIFEST to include org.apache.qpid.common and org.apache.qpid.server.registry
Patch provided by Sorin Suciu
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk/qpid@956888 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'java/broker-plugins/experimental/info/src/main')
5 files changed, 294 insertions, 237 deletions
diff --git a/java/broker-plugins/experimental/info/src/main/java/org/apache/qpid/info/Activator.java b/java/broker-plugins/experimental/info/src/main/java/org/apache/qpid/info/Activator.java index 167a53fdc5..a442cf1f28 100644 --- a/java/broker-plugins/experimental/info/src/main/java/org/apache/qpid/info/Activator.java +++ b/java/broker-plugins/experimental/info/src/main/java/org/apache/qpid/info/Activator.java @@ -19,60 +19,204 @@ * */ -/** - * - * @author sorin - * - * Activator class for the tracking services - */ - package org.apache.qpid.info; import java.io.File; -import java.io.FileInputStream; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import java.util.Properties; import org.apache.qpid.info.util.HttpPoster; +import org.apache.qpid.info.util.IniFileReader; +import org.apache.qpid.info.util.SoapClient; import org.osgi.framework.BundleActivator; import org.osgi.framework.BundleContext; +/** + * The Activator class for the OSGI info service + * + */ public class Activator implements BundleActivator { + private final List<String> soapPropList = Arrays.asList("soap.hostname", + "soap.port", "soap.path", "soap.action", "soap.envelope"); + + private final List<String> httpPropList = Arrays.asList("http.url", + "http.envelope"); + + InfoServiceImpl service = null; + BundleContext _ctx = null; + Map<String, Properties> infoprops = new HashMap<String, Properties>(); + + /** + * Start bundle method + * + * @param ctx + * the bundle context + */ public void start(BundleContext ctx) throws Exception { if (null != ctx) { - BrokerInfoServiceImpl service = new BrokerInfoServiceImpl(ctx); - ctx.registerService(BrokerInfoService.class.getName(), service, - null); _ctx = ctx; - HttpPoster hp; - try - { - Properties props = new Properties(); - String QPID_WORK = System.getenv("QPID_WORK"); - props.load(new FileInputStream(QPID_WORK + File.separator - + "etc" + File.separator + "qpidinfo.properties")); - hp = new HttpPoster(props, service.invoke().toXML()); - hp.run(); - } catch (Exception ex) - { - // Silently drop any exception - } + service = new InfoServiceImpl(); + ctx.registerService(InfoService.class.getName(), service, null); + sendInfo("STARTUP"); } } + /** + * Getter for the bundle context + * + * @return BundleContext the bundle context + */ public BundleContext getBundleContext() { return _ctx; } + /** + * Stop the bundle method + * + * @param ctx + * the bundle context + */ public void stop(BundleContext ctx) throws Exception { - // no need to do anything here, osgi will unregister the service for us + sendInfo("SHUTDOWN"); + } + + /** + * Sends the information message + * + * @param action + * label that identifies if we are starting up or shutting down + */ + private void sendInfo(String action) + { + if ((null == _ctx) && (null == service)) + { + // invalid state + return; + } + + IniFileReader ifr = new IniFileReader(); + try + { + String QPID_HOME = System.getProperty("QPID_HOME"); + String cfgFilePath = QPID_HOME + File.separator + "etc" + + File.separator + "qpidinfo.properties"; + ifr.load(cfgFilePath); + } catch (Exception ex) + { + // drop the exception + return; + } + + // If we have no sections, something has gone really wrong, abort + if (ifr.getSections().size() == 0) + return; + + Info<? extends Map<String, ?>> info = service.invoke(action); + String protocol = ifr.getSections().get("").getProperty("protocol"); + sendMessages(protocol, ifr, info); + } + + /** + * Sends all the messages configured in the properties file + * + * @param protocol + * indicates what protocol to be used: http and soap implemented + * for now + * @param ifr + * an instance of IniFileReader class + * @param info + * an instance of an Info object, encapsulating the information + * we want to send + */ + private void sendMessages(String protocol, IniFileReader ifr, + Info<? extends Map<String, ?>> info) + { + if (null != protocol) + { + // Set the global properties first (as they are the defaults) + Properties defaultProps = ifr.getSections().get(""); + if (protocol.toLowerCase().startsWith("http")) + { + for (String section : ifr.getSections().keySet()) + { + // Skip the defaults + if (section.equals("")) + continue; + Properties props = new Properties(); + props.putAll(defaultProps); + props.putAll(ifr.getSections().get(section)); + if (isValid(protocol, props)) + { + new HttpPoster(props, info.toXML()).run(); + } + } + + } else if (protocol.toLowerCase().startsWith("soap")) + { + for (String section : ifr.getSections().keySet()) + { + Properties props = new Properties(); + props.putAll(defaultProps); + props.putAll(ifr.getSections().get(section)); + if (isValid(protocol, props)) + { + new SoapClient(info.toMap(), props).sendSOAPMessage(); + } + } + } + } else + { + return; + } + } + + /** + * Checks if the properties for a specified protocol are valid + * + * @param protocol + * String representing the protocol + * @param props + * The properties associate with the specified protocol + */ + private boolean isValid(String protocol, Properties props) + { + if (null == protocol) + return false; + String value = ""; + if (protocol.toLowerCase().startsWith("http")) + { + for (String prop : httpPropList) + { + if (null == props.get(prop)) + return false; + } + return true; + } + + if (protocol.toLowerCase().startsWith("soap")) + { + for (String prop : soapPropList) + { + value = props.getProperty(prop); + if (null == value) + { + return false; + } + } + return true; + } + return false; } +} // end class -} diff --git a/java/broker-plugins/experimental/info/src/main/java/org/apache/qpid/info/BrokerInfoService.java b/java/broker-plugins/experimental/info/src/main/java/org/apache/qpid/info/BrokerInfoService.java deleted file mode 100644 index 4c3c95d385..0000000000 --- a/java/broker-plugins/experimental/info/src/main/java/org/apache/qpid/info/BrokerInfoService.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * - */ - -package org.apache.qpid.info; - -public interface BrokerInfoService -{ - public Info<?> invoke(); -} diff --git a/java/broker-plugins/experimental/info/src/main/java/org/apache/qpid/info/BrokerInfoServiceImpl.java b/java/broker-plugins/experimental/info/src/main/java/org/apache/qpid/info/BrokerInfoServiceImpl.java deleted file mode 100644 index fe10d55dea..0000000000 --- a/java/broker-plugins/experimental/info/src/main/java/org/apache/qpid/info/BrokerInfoServiceImpl.java +++ /dev/null @@ -1,120 +0,0 @@ -/* - * - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * - */ - -/** - * - * @author sorin - * - * Implementation for Info service - */ - -package org.apache.qpid.info; - -import java.net.InetAddress; -import java.net.UnknownHostException; -import java.text.SimpleDateFormat; -import java.util.Arrays; -import java.util.Calendar; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Properties; -import java.util.SortedMap; -import java.util.TreeMap; -import java.util.Map.Entry; - -import org.apache.qpid.server.configuration.ServerConfiguration; -import org.osgi.framework.BundleContext; -import org.osgi.framework.ServiceReference; - -public class BrokerInfoServiceImpl implements BrokerInfoService -{ - - SortedMap<String, String> brokerInfoMap = new TreeMap<String, String>(); - - private final List<String> qpidProps = Arrays.asList("QPID_HOME", - "QPID_WORK", "java.class.path", "java.vm.name", - "java.class.version", "os.arch", "os.name", "os.version", - "sun.arch.data.model", "user.dir", "user.name", "user.timezone"); - - private final BundleContext _ctx; - - public BrokerInfoServiceImpl(BundleContext ctx) - { - _ctx = ctx; - } - - public Info<? extends Map<String, ?>> invoke() - { - // Get current time - SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSZ"); - brokerInfoMap.put("time", sdf.format(Calendar.getInstance().getTime())); - // Get the hostname - try - { - InetAddress addr = InetAddress.getLocalHost(); - String hostname = addr.getHostName(); - brokerInfoMap.put("hostname", hostname); - brokerInfoMap.put("ip", addr.getHostAddress()); - } catch (UnknownHostException e) - { - // - } - // Dump system props - Properties sysprops = System.getProperties(); - String propName; - for (Iterator<Entry<Object, Object>> it = sysprops.entrySet() - .iterator(); it.hasNext();) - { - Entry<Object, Object> en = it.next(); - propName = en.getKey().toString(); - if (qpidProps.indexOf(propName) >= 0) - { - brokerInfoMap.put(propName, en.getValue().toString()); - } - } - - if (null == _ctx) - { - return new Info<SortedMap<String, String>>(brokerInfoMap); - } - - ServiceReference sref; - ServerConfiguration sc; - try - { - sref = _ctx - .getServiceReference(ServerConfiguration.class.getName()); - sc = (ServerConfiguration) _ctx.getService(sref); - if (null != sc) - { - brokerInfoMap.put("port", sc.getPorts().toString()); - } - } - catch (Exception e) - { - return new Info<SortedMap<String, String>>(brokerInfoMap); - } - - return new Info<SortedMap<String, String>>(brokerInfoMap); - } - -} diff --git a/java/broker-plugins/experimental/info/src/main/java/org/apache/qpid/info/Info.java b/java/broker-plugins/experimental/info/src/main/java/org/apache/qpid/info/Info.java index e4d33817a1..2c6db8df12 100644 --- a/java/broker-plugins/experimental/info/src/main/java/org/apache/qpid/info/Info.java +++ b/java/broker-plugins/experimental/info/src/main/java/org/apache/qpid/info/Info.java @@ -35,15 +35,24 @@ import java.util.Properties; import org.apache.qpid.info.util.XMLWriter; +/** + * The Info class encapsulates all the informations we are collecting + * and it is able to render it in different data representations + */ public class Info<T extends Map<String, ?>> { private T _info; + /** + * Constructor. + * @param info instantiates the object with a Map<String,?> + */ public Info(T info) { _info = info; } + @Override public String toString() { String result = ""; @@ -55,21 +64,25 @@ public class Info<T extends Map<String, ?>> return result; } - public Properties toProps() - { + /** + * Renders Info map to a property object + * @return A Properties object representing the Info map + */ + public Properties toProps() { Properties props = new Properties(); - if (null == _info) - return null; - for (Iterator<String> it = _info.keySet().iterator(); it.hasNext();) - { - String key = it.next(); - props.put(key, _info.get(key)); + if (null==_info) return null; + for (Iterator<String> it = _info.keySet().iterator(); it.hasNext();) { + String key = it.next(); + props.put(key, _info.get(key)); } return props; } - - public StringBuffer toStringBuffer() - { + + /** + * Renders Info map to a StringBuffer + * @return A StringBuffer object representing the Info map + */ + public StringBuffer toStringBuffer() { StringBuffer sb = new StringBuffer(); for (Iterator<String> it = _info.keySet().iterator(); it.hasNext();) { @@ -78,22 +91,39 @@ public class Info<T extends Map<String, ?>> } return sb; } - - public StringBuffer toXML() + + /** + * Renders Info map to a StringBuffer containing an XML string + * @return A StringBuffer object containing an XML representation of the Info map + */ + public StringBuffer toXML() { XMLWriter xw = new XMLWriter(new StringBuffer()); xw.writeXMLHeader(); Map<String, String> attr = new HashMap<String, String>(); xw.writeOpenTag("qpidinfo", attr); String key; - for (Iterator<String> it = _info.keySet().iterator(); it.hasNext();) - { + for (Iterator<String> it = _info.keySet().iterator(); it.hasNext();) { attr.clear(); key = it.next(); - xw.writeTag(key, attr, _info.get(key).toString()); - } + xw.writeTag(key, attr, _info.get(key).toString()); + } xw.writeCloseTag("qpidinfo"); return xw.getXML(); } + + /** + * Renders Info map to a HashMap + * @return A HashMap object representing the Info map + */ + public HashMap<String,String> toMap() { + String key; + HashMap<String,String> infoMap = new HashMap<String,String>(); + for (Iterator<String> it = _info.keySet().iterator(); it.hasNext();) { + key = it.next(); + infoMap.put(key, _info.get(key).toString()); + } + return infoMap; + } } diff --git a/java/broker-plugins/experimental/info/src/main/java/org/apache/qpid/info/util/HttpPoster.java b/java/broker-plugins/experimental/info/src/main/java/org/apache/qpid/info/util/HttpPoster.java index c67a7682f3..d07f34dec0 100644 --- a/java/broker-plugins/experimental/info/src/main/java/org/apache/qpid/info/util/HttpPoster.java +++ b/java/broker-plugins/experimental/info/src/main/java/org/apache/qpid/info/util/HttpPoster.java @@ -36,62 +36,92 @@ import java.util.Properties; import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
+import java.net.InetAddress;
import java.net.URL;
import java.net.URLConnection;
+import java.net.UnknownHostException;
+
+public class HttpPoster implements Runnable
+{
+ private final String url;
+
+ private final Hashtable<String, String> header;
-public class HttpPoster implements Runnable {
- private final String url;
- private final Hashtable<String,String> header;
private final List<String> response = new ArrayList<String>();
- private final StringBuffer _buf;
- //
- public HttpPoster(Properties props, StringBuffer buf)
+
+ private final StringBuffer _buf;
+
+ /**
+ * Constructor
+ * @param props Properties containing the URL
+ * @param buf Buffer containing the message to be posted
+ */
+ public HttpPoster(Properties props, StringBuffer buf)
+ {
+ _buf = buf;
+ if (null != props)
+ {
+ url = props.getProperty("http.url");
+ header = new Hashtable<String, String>();
+ try
+ {
+ String hostname = InetAddress.getLocalHost().getHostName();
+ header.put("hostname", hostname);
+ } catch (UnknownHostException e)
+ {
+ // Silently ignoring the error ;)
+ }
+ } else
+ {
+ url = null;
+ header = null;
+ }
+ }
+ /**
+ * Posts the message from the _buf StringBuffer to the http server
+ */
+ public void run()
{
- _buf = buf;
- if (null!= props) {
- url = props.getProperty("URL");
- header = new Hashtable<String, String>();
- String hostname = props.getProperty("hostname");
- if (null!= hostname) header.put("hostname", hostname);
- } else {
- url = null;
- header = null;
- }
- }
- //
- @Override
- public void run()
+ if (null == url)
+ return;
+ String line;
+ URL urlDest;
+ URLConnection urlConn;
+ try
{
- if (null==url) return;
- String line;
- URL urlDest;
- URLConnection urlConn;
- try {
- urlDest = new URL(url);
- urlConn = urlDest.openConnection();
- urlConn.setDoOutput(true);
- urlConn.setUseCaches(false);
- for (Iterator<String> it=header.keySet().iterator(); it.hasNext();) {
- String prop = (String)it.next();
- urlConn.setRequestProperty(prop, header.get(prop));
- }
- OutputStreamWriter wr = new OutputStreamWriter(urlConn.getOutputStream());
+ urlDest = new URL(url);
+ urlConn = urlDest.openConnection();
+ urlConn.setDoOutput(true);
+ urlConn.setUseCaches(false);
+ for (Iterator<String> it = header.keySet().iterator(); it.hasNext();)
+ {
+ String prop = (String) it.next();
+ urlConn.setRequestProperty(prop, header.get(prop));
+ }
+ OutputStreamWriter wr = new OutputStreamWriter(urlConn
+ .getOutputStream());
wr.write(_buf.toString());
wr.flush();
// Get the response
- BufferedReader rd = new BufferedReader(new InputStreamReader(urlConn.getInputStream()));
- while ((line = rd.readLine()) != null) {
+ BufferedReader rd = new BufferedReader(new InputStreamReader(
+ urlConn.getInputStream()));
+ while ((line = rd.readLine()) != null)
+ {
response.add(line);
- }
- } catch (Exception ex) {
- return;
- }
- }
-
- public List<String> getResponse()
+ }
+ } catch (Exception ex)
{
- return response;
- }
-
-}
+ return;
+ }
+ }
+
+ /**
+ * Retrieves the response from the http server
+ * @return List<String> response received from the http server
+ */
+ public List<String> getResponse()
+ {
+ return response;
+ }
+}
|
