summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Ritchie <ritchiem@apache.org>2010-06-22 13:40:52 +0000
committerMartin Ritchie <ritchiem@apache.org>2010-06-22 13:40:52 +0000
commitdd7fe635bfc0a576021cec8f81bacdafeeeb9f58 (patch)
treefc4e6a8546b4444ae6df5e4c691068cc1dd0bba7
parent8c6bdbf58524a38ded50903ffd457a3f1aa59fc1 (diff)
downloadqpid-python-dd7fe635bfc0a576021cec8f81bacdafeeeb9f58.tar.gz
QPID-2555 : Improvements on info plugin, using SOAP
Patch provided by Sorin Suciu git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@956887 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r--qpid/java/broker-plugins/experimental/info/src/main/java/org/apache/qpid/info/AppInfo.java97
-rw-r--r--qpid/java/broker-plugins/experimental/info/src/main/java/org/apache/qpid/info/InfoService.java30
-rw-r--r--qpid/java/broker-plugins/experimental/info/src/main/java/org/apache/qpid/info/InfoServiceImpl.java66
-rw-r--r--qpid/java/broker-plugins/experimental/info/src/main/java/org/apache/qpid/info/SystemInfo.java90
-rw-r--r--qpid/java/broker-plugins/experimental/info/src/main/java/org/apache/qpid/info/util/IniFileReader.java142
-rw-r--r--qpid/java/broker-plugins/experimental/info/src/main/java/org/apache/qpid/info/util/SoapClient.java162
-rw-r--r--qpid/java/broker-plugins/experimental/info/src/test/java/org/apache/qpid/info/test/InfoServiceImplTest.java63
-rw-r--r--qpid/java/broker-plugins/experimental/info/src/test/java/org/apache/qpid/info/test/IniFileReaderTest.java91
-rw-r--r--qpid/java/broker-plugins/experimental/info/src/test/java/org/apache/qpid/info/test/SoapClientTest.java159
-rw-r--r--qpid/java/broker-plugins/experimental/info/src/test/java/org/apache/qpid/info/test/SystemInfoTest.java49
10 files changed, 949 insertions, 0 deletions
diff --git a/qpid/java/broker-plugins/experimental/info/src/main/java/org/apache/qpid/info/AppInfo.java b/qpid/java/broker-plugins/experimental/info/src/main/java/org/apache/qpid/info/AppInfo.java
new file mode 100644
index 0000000000..15d9f6f55f
--- /dev/null
+++ b/qpid/java/broker-plugins/experimental/info/src/main/java/org/apache/qpid/info/AppInfo.java
@@ -0,0 +1,97 @@
+/*
+ *
+ * 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;
+
+import java.util.Arrays;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+import java.util.TreeMap;
+import java.util.Map.Entry;
+
+import org.apache.qpid.common.QpidProperties;
+import org.apache.qpid.server.configuration.ServerConfiguration;
+import org.apache.qpid.server.registry.ApplicationRegistry;
+
+/**
+ * AppInfo class is gathering application specific informations
+ *
+ */
+public class AppInfo
+{
+
+ private static final List<String> appProps = Arrays.asList("QPID_HOME",
+ "QPID_WORK");
+
+ private static Map<String, String> appInfoMap = new TreeMap<String, String>();
+
+ /**
+ * getInfo method retrieves a key-value map for specific application properties
+ * @return Map<String,String>
+ */
+ public static Map<String, String> getInfo()
+ {
+
+ // Gather the selected app 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 (appProps.indexOf(propName) >= 0)
+ {
+ appInfoMap.put(propName, en.getValue().toString());
+ }
+ }
+
+ ServerConfiguration sc;
+ try
+ {
+ sc = ApplicationRegistry.getInstance().getConfiguration();
+ if (null != sc)
+ {
+ appInfoMap.put("jmxport", sc.getJMXManagementPort() + "");
+ appInfoMap.put("port", sc.getPorts().toString());
+ appInfoMap.put("version", QpidProperties.getReleaseVersion());
+ appInfoMap.put("vhosts", "standalone");
+ // brokerInfoMap.put("DefaultVirtualHost",
+ // sc.getDefaultVirtualHost());
+ appInfoMap.put("JMXPrincipalDatabase", sc
+ .getJMXPrincipalDatabase());
+ appInfoMap.put("KeystorePath", sc.getKeystorePath());
+ appInfoMap.put("PluginDirectory", sc.getPluginDirectory());
+ appInfoMap.put("CertType", sc.getCertType());
+ appInfoMap.put("QpidWork", sc.getQpidWork());
+ appInfoMap.put("Bind", sc.getBind());
+ }
+ } catch (Exception e)
+ {
+ //
+ }
+ return appInfoMap;
+
+ }
+
+}
diff --git a/qpid/java/broker-plugins/experimental/info/src/main/java/org/apache/qpid/info/InfoService.java b/qpid/java/broker-plugins/experimental/info/src/main/java/org/apache/qpid/info/InfoService.java
new file mode 100644
index 0000000000..2804dfb1b4
--- /dev/null
+++ b/qpid/java/broker-plugins/experimental/info/src/main/java/org/apache/qpid/info/InfoService.java
@@ -0,0 +1,30 @@
+/*
+ *
+ * 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.
+ *
+ */
+
+ /**
+ * Interface exposing the service methods
+ */
+ package org.apache.qpid.info;
+
+ public interface InfoService
+ {
+ public Info<?> invoke(String action);
+ }
diff --git a/qpid/java/broker-plugins/experimental/info/src/main/java/org/apache/qpid/info/InfoServiceImpl.java b/qpid/java/broker-plugins/experimental/info/src/main/java/org/apache/qpid/info/InfoServiceImpl.java
new file mode 100644
index 0000000000..a2ffaea3bb
--- /dev/null
+++ b/qpid/java/broker-plugins/experimental/info/src/main/java/org/apache/qpid/info/InfoServiceImpl.java
@@ -0,0 +1,66 @@
+/*
+ *
+ * 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.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Map;
+import java.util.SortedMap;
+import java.util.TreeMap;
+
+
+public class InfoServiceImpl implements InfoService
+{
+
+ SortedMap<String, String> infoMap = new TreeMap<String, String>();
+
+ /**
+ * invoke method collects all the informations from System and Application
+ * and encapsulates them in an Info object
+ * @return An instance of an Info object
+ */
+ public Info<? extends Map<String,?>> invoke(String action)
+ {
+ // Record the action (STARTUP/SHUTDOWN)
+ infoMap.put("action",action);
+
+ // Record the current time stamp
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSZ");
+ infoMap.put("time", sdf.format(Calendar.getInstance().getTime()));
+
+ // Add the system specific properties
+ infoMap.putAll(SystemInfo.getInfo());
+
+ // Add the application specific properties
+ infoMap.putAll(AppInfo.getInfo());
+
+ return new Info<SortedMap<String, String>>(infoMap);
+ }
+
+}
diff --git a/qpid/java/broker-plugins/experimental/info/src/main/java/org/apache/qpid/info/SystemInfo.java b/qpid/java/broker-plugins/experimental/info/src/main/java/org/apache/qpid/info/SystemInfo.java
new file mode 100644
index 0000000000..25095b62dc
--- /dev/null
+++ b/qpid/java/broker-plugins/experimental/info/src/main/java/org/apache/qpid/info/SystemInfo.java
@@ -0,0 +1,90 @@
+/*
+ *
+ * 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;
+
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.util.Arrays;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+import java.util.TreeMap;
+import java.util.Map.Entry;
+
+/**
+ * Collector for system specific information
+ */
+public class SystemInfo
+{
+
+ private static Map<String, String> sysInfoMap = new TreeMap<String, String>();
+
+ private static final List<String> sysProps = Arrays.asList(
+ "java.class.path", "java.home", "java.vm.name", "java.vm.vendor",
+ "java.vm.version", "java.class.version", "java.runtime.version",
+ "os.arch", "os.name", "os.version", "sun.arch.data.model",
+ "user.home", "user.dir", "user.name", "user.timezone");
+
+ /**
+ * getInfo collects all the properties specified in sysprops list
+ * @return A Map<String,String>
+ */
+ public static Map<String, String> getInfo()
+ {
+
+ // Get the hostname
+ try
+ {
+ InetAddress addr = InetAddress.getLocalHost();
+ String hostname = addr.getHostName();
+ sysInfoMap.put("hostname", hostname);
+ sysInfoMap.put("ip", addr.getHostAddress());
+ } catch (UnknownHostException e)
+ {
+ //
+ }
+ // Get the runtime info
+ sysInfoMap.put("CPUCores", Runtime.getRuntime().availableProcessors()
+ + "");
+ sysInfoMap.put("Maximum_Memory", Runtime.getRuntime().maxMemory() + "");
+ sysInfoMap.put("Free_Memory", Runtime.getRuntime().freeMemory() + "");
+
+ // Gather the selected 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 (sysProps.indexOf(propName) >= 0)
+ {
+ sysInfoMap.put(propName, en.getValue().toString());
+ }
+ }
+
+ return sysInfoMap;
+
+ }
+
+}
diff --git a/qpid/java/broker-plugins/experimental/info/src/main/java/org/apache/qpid/info/util/IniFileReader.java b/qpid/java/broker-plugins/experimental/info/src/main/java/org/apache/qpid/info/util/IniFileReader.java
new file mode 100644
index 0000000000..f5e8396cbe
--- /dev/null
+++ b/qpid/java/broker-plugins/experimental/info/src/main/java/org/apache/qpid/info/util/IniFileReader.java
@@ -0,0 +1,142 @@
+/*
+ *
+ * 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.util;
+
+import java.util.*;
+import java.io.*;
+
+public class IniFileReader
+{
+ private final Map<String, Properties> sections;
+
+ private final String COMMENT_SEMICOLON = ";";
+
+ private final String COMMENT_HASH = "#";
+
+ enum State
+ {
+ IN_SECTION, OFF_SECTION, GLOBAL
+ }
+
+ /*
+ * IniFileReader constructor
+ */
+ public IniFileReader()
+ {
+ sections = new HashMap<String, Properties>();
+ }
+
+ /**
+ * Cleans up the after comments or the empty spaces/tabs surrounding the given string
+ * @param str The String to be cleaned
+ * @return String Cleanup Version
+ */
+ private String cleanUp(String str)
+ {
+ if (str.contains(COMMENT_SEMICOLON))
+ str = str.substring(0, str.indexOf(COMMENT_SEMICOLON));
+ if (str.contains(COMMENT_HASH))
+ str = str.substring(0, str.indexOf(COMMENT_HASH));
+ return str.trim();
+ }
+
+ /**
+ * Loads and parses the ini file with the full path specified in the argument
+ * @param fileName Full path to the ini file
+ * @throws IllegalArgumentException If the file cannot be processed
+ */
+ public void load(String fileName) throws IllegalArgumentException
+ {
+ if (! new File(fileName).isFile()) throw new IllegalArgumentException("File: "+fileName+ " does not exist or cannot be read.");
+ State state = State.GLOBAL;
+ String line;
+ Properties sectionProps = new Properties();
+ String sectionName = "";
+ try
+ {
+ BufferedReader in = new BufferedReader(new FileReader(fileName));
+ while ((line = in.readLine()) != null)
+ {
+ String str = cleanUp(line);
+
+ // Did we get a section header?
+ if (str.startsWith("[") && str.endsWith("]"))
+ {
+ // We encountered a new section header
+ if (state != State.IN_SECTION)
+ {
+ sections.put(sectionName, sectionProps);
+ sectionProps = new Properties();
+ sectionName = str.replace("[", "").replace("]", "")
+ .trim();
+ state = State.IN_SECTION;
+ }
+ }
+
+ // Any other line tested separately, ignore if out of a section
+ // and add if in section
+ if (str.length() == 0)
+ {
+ // We encountered a commented or an empty line, both cases
+ // mean we are off the section
+ if (state == State.IN_SECTION)
+ {
+ sections.put(sectionName, sectionProps);
+ state = State.OFF_SECTION;
+ }
+ } else
+ {
+ // proper line, add it to the props
+ if (state != State.OFF_SECTION)
+ {
+ if (str.contains("="))
+ {
+ int ix = str.indexOf("=");
+ sectionProps.put(str.substring(0, ix).trim(), str
+ .substring(ix + 1).trim());
+ }
+ }
+ }
+ }
+ in.close();
+ } catch (IOException e)
+ {
+ sections.clear();
+ return;
+ }
+ if (state != State.OFF_SECTION)
+ {
+ sections.put(sectionName, sectionProps);
+ }
+ }
+
+ /**
+ * Getter for the Sections Map
+ * @return Map<String,Properties> The parsed content of the ini file in this structure
+ */
+ public Map<String, Properties> getSections()
+ {
+ return sections;
+ }
+
+
+}
diff --git a/qpid/java/broker-plugins/experimental/info/src/main/java/org/apache/qpid/info/util/SoapClient.java b/qpid/java/broker-plugins/experimental/info/src/main/java/org/apache/qpid/info/util/SoapClient.java
new file mode 100644
index 0000000000..703a710568
--- /dev/null
+++ b/qpid/java/broker-plugins/experimental/info/src/main/java/org/apache/qpid/info/util/SoapClient.java
@@ -0,0 +1,162 @@
+/*
+ *
+ * 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
+ *
+ * An simple SOAP client for qpid info service
+ */
+package org.apache.qpid.info.util;
+
+import java.io.BufferedWriter;
+
+import java.io.OutputStreamWriter;
+
+import java.net.InetAddress;
+
+import java.net.Socket;
+import java.util.HashMap;
+import java.util.Properties;
+
+public class SoapClient
+{
+
+ private final StringBuffer xmlData;
+
+ private final Properties _destprops;
+
+ private final String hostname;
+
+ private final String port;
+
+ private final String urlpath;
+
+ private final String soapenvelope;
+
+ private final String soapaction;
+
+ private final StringBuffer soapMessage = new StringBuffer();
+
+ public SoapClient(HashMap<String, String> map, Properties destprops)
+ {
+ if (null == destprops)
+ {
+ _destprops = new Properties();
+ } else
+ {
+ _destprops = destprops;
+ }
+ hostname = _destprops.getProperty("soap.hostname", "null");
+ port = _destprops.getProperty("soap.port", "null");
+ urlpath = _destprops.getProperty("soap.path", "null");
+ soapenvelope = _destprops.getProperty("soap.envelope", "null");
+ soapaction = _destprops.getProperty("soap.action", "null");
+ xmlData = new StringBuffer(soapenvelope);
+ replaceVariables(map);
+ }
+
+ public StringBuffer getXMLData()
+ {
+ return xmlData;
+ }
+
+ public StringBuffer getSoapMessage()
+ {
+ return soapMessage;
+ }
+
+ public String getSoapEnvelope()
+ {
+ return soapenvelope;
+ }
+
+ public void setXMLData(StringBuilder sb)
+ {
+ xmlData.delete(0, xmlData.length() - 1);
+ xmlData.append(sb);
+ }
+
+ public void replaceVariables(HashMap<String, String> vars)
+ {
+ if (vars == null)
+ return;
+ int ix = 0;
+ for (String var : vars.keySet())
+ {
+ while ((ix = xmlData.indexOf("@" + var.toUpperCase())) >= 0)
+ {
+ xmlData.replace(ix, ix + 1 + var.length(), vars.get(var));
+ }
+ }
+ }
+
+ public void replaceVariables(Properties varProps)
+ {
+ if (varProps == null)
+ return;
+ int ix = 0;
+ for (Object var : varProps.keySet())
+ {
+ while ((ix = xmlData.indexOf("@" + var)) >= 0)
+ {
+ xmlData.replace(ix, ix + 1 + var.toString().length(), varProps
+ .get(var).toString());
+ }
+ }
+ }
+
+ public String sendSOAPMessage()
+ {
+
+ try
+ {
+ InetAddress addr = InetAddress.getByName(hostname);
+ Socket sock = new Socket(addr, Integer.parseInt(port));
+ StringBuffer sb = new StringBuffer();
+ sb.append("POST " + urlpath + " HTTP/1.1\r\n");
+ sb.append("Host: " + hostname + ":" + port + "\r\n");
+ sb.append("Content-Length: " + xmlData.length() + "\r\n");
+ sb.append("Content-Type: text/xml; charset=\"utf-8\"\r\n");
+ sb.append("SOAPAction: \"urn:" + soapaction + "\"\r\n");
+ sb.append("User-Agent: Axis2\r\n");
+ sb.append("\r\n");
+ // Send header
+ BufferedWriter wr = new BufferedWriter(new OutputStreamWriter(sock
+ .getOutputStream(), "UTF-8"));
+ synchronized (soapMessage)
+ {
+ soapMessage.setLength(0);
+ soapMessage.append(sb);
+ soapMessage.append(xmlData);
+ }
+ String msg = soapMessage.toString();
+ // Send data
+ wr.write(msg);
+ wr.flush();
+ wr.close();
+ return msg;
+ } catch (Exception ex)
+ {
+ // Drop any exception
+ return null;
+ }
+ }
+}
diff --git a/qpid/java/broker-plugins/experimental/info/src/test/java/org/apache/qpid/info/test/InfoServiceImplTest.java b/qpid/java/broker-plugins/experimental/info/src/test/java/org/apache/qpid/info/test/InfoServiceImplTest.java
new file mode 100644
index 0000000000..2de3f4841b
--- /dev/null
+++ b/qpid/java/broker-plugins/experimental/info/src/test/java/org/apache/qpid/info/test/InfoServiceImplTest.java
@@ -0,0 +1,63 @@
+/*
+ *
+ * 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.test;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+
+import org.apache.qpid.info.Info;
+import org.apache.qpid.info.InfoServiceImpl;
+
+import junit.framework.TestCase;
+
+/*
+ * This test verifies the invoke() method for the info service making sure that the parameters are returned
+ */
+public class InfoServiceImplTest extends TestCase
+{
+
+ InfoServiceImpl isi = null;
+
+ @SuppressWarnings("unchecked")
+ public void testInvoke()
+ {
+ isi = new InfoServiceImpl();
+ assertNotNull(isi);
+ Info<? extends Map<String, String>> info = (Info<? extends Map<String, String>>) isi
+ .invoke("START");
+ assertNotNull(info);
+ Properties props = info.toProps();
+ assertNotNull(props);
+ List<String> infoProps = Arrays.asList("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");
+ for (String tag : infoProps)
+ {
+ assertNotNull("Info.toProps() does not have the property: " + tag,
+ props.getProperty(tag));
+ }
+ }
+
+}
diff --git a/qpid/java/broker-plugins/experimental/info/src/test/java/org/apache/qpid/info/test/IniFileReaderTest.java b/qpid/java/broker-plugins/experimental/info/src/test/java/org/apache/qpid/info/test/IniFileReaderTest.java
new file mode 100644
index 0000000000..626102c68d
--- /dev/null
+++ b/qpid/java/broker-plugins/experimental/info/src/test/java/org/apache/qpid/info/test/IniFileReaderTest.java
@@ -0,0 +1,91 @@
+/*
+ *
+ * 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.test;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.util.Map;
+import java.util.Properties;
+
+import org.apache.qpid.info.util.IniFileReader;
+
+import junit.framework.TestCase;
+
+public class IniFileReaderTest extends TestCase
+{
+
+ public void testLoad()
+ {
+ IniFileReader ifr = new IniFileReader();
+ File iniFile = null;
+ try
+ {
+ iniFile = File.createTempFile("temp", "ini");
+ iniFile.deleteOnExit();
+ BufferedWriter writer = new BufferedWriter(new FileWriter(iniFile));
+ writer.write("# Global Comment1\n");
+ writer.write("globalprop1=globalval1\n");
+ writer.write("globalprop2=globalval2\n");
+ writer.write("\n");
+ writer.write("[Section1]\n");
+ writer.write("key1=val1\n");
+ writer.write("key2=val2\n");
+ writer.write("\n");
+ writer.write("#Section2 Comment\n");
+ writer.write("[Section2]\n");
+ writer.write("key3=val3\n");
+ writer.write("key4=val4\n");
+ writer.write("key5=val5\n");
+ writer.write("\n");
+ writer.write("[Section3]\n");
+ writer.write("key6=val6\n");
+ writer.write("key7=val7\n");
+ writer.write("\n");
+ writer.close();
+ } catch (IOException e)
+ {
+ e.printStackTrace();
+ fail("Unable to create temporary File");
+ }
+ ifr.load(iniFile.getAbsolutePath());
+ Map<String,Properties> sections = ifr.getSections();
+ assertNotNull("Sections not null",sections);
+ assertEquals("Have 4 sections", sections.keySet().size(), 4);
+ assertTrue("Get globalprop1", sections.get("").getProperty("globalprop1").equals("globalval1"));
+ assertTrue("Get globalprop2", sections.get("").getProperty("globalprop2").equals("globalval2"));
+ assertNotNull("Section1 not null", sections.get("Section1"));
+ assertEquals("Section1 has 2 properties",sections.get("Section1").size(),2);
+ assertTrue("Section1 key1 has val1",sections.get("Section1").getProperty("key1").equals("val1"));
+ assertTrue("Section1 key2 has val2",sections.get("Section1").getProperty("key2").equals("val2"));
+ assertEquals("Section2 has 3 properties",sections.get("Section2").size(),3);
+ assertTrue("Section2 key3 has val3",sections.get("Section2").getProperty("key3").equals("val3"));
+ assertTrue("Section2 key4 has val4",sections.get("Section2").getProperty("key4").equals("val4"));
+ assertTrue("Section2 key5 has val5",sections.get("Section2").getProperty("key5").equals("val5"));
+ assertEquals("Section3 has 2 properties",sections.get("Section3").size(),2);
+ assertTrue("Section3 key6 has val6",sections.get("Section3").getProperty("key6").equals("val6"));
+ assertTrue("Section3 key7 has val7",sections.get("Section3").getProperty("key7").equals("val7"));
+ }
+
+
+}
diff --git a/qpid/java/broker-plugins/experimental/info/src/test/java/org/apache/qpid/info/test/SoapClientTest.java b/qpid/java/broker-plugins/experimental/info/src/test/java/org/apache/qpid/info/test/SoapClientTest.java
new file mode 100644
index 0000000000..5c7276456c
--- /dev/null
+++ b/qpid/java/broker-plugins/experimental/info/src/test/java/org/apache/qpid/info/test/SoapClientTest.java
@@ -0,0 +1,159 @@
+/*
+ *
+ * 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.test;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.net.ServerSocket;
+import java.net.Socket;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Properties;
+
+import junit.framework.TestCase;
+
+import org.apache.qpid.info.util.SoapClient;
+
+public class SoapClientTest extends TestCase
+{
+
+ private final int port = 9000;
+
+ private final String hostName = "localhost";
+
+ private final String urlPath = "/testSoap";
+
+ private ServerSocket server = null;
+
+ Thread socketAcceptor;
+
+ /*
+ * Generate a soap client from a custom URL, hostname, port and soap context
+ * path to be derived
+ */
+ private SoapClient getSoapClient()
+ {
+ Properties destprops = new Properties();
+ destprops.setProperty("soap.hostname", hostName);
+ destprops.setProperty("soap.port", port + "");
+ destprops.setProperty("soap.urlpath", urlPath);
+ destprops.setProperty("soap.envelope", "<ip>@IP</ip>");
+ destprops.setProperty("soap.action", "send");
+ HashMap<String, String> soapmap = new HashMap<String, String>();
+ soapmap.put("IP", "127.0.0.1");
+ return new SoapClient(soapmap, destprops);
+ }
+
+ /*
+ * A connection handler class that verifies the correct message is received
+ *
+ */
+ class ConnectionHandler implements Runnable
+ {
+ private Socket socket;
+
+ public ConnectionHandler(Socket socket)
+ {
+ this.socket = socket;
+ Thread t = new Thread(this);
+ t.start();
+ }
+
+ public void run()
+ {
+ String line;
+ final List<String> response = new ArrayList<String>();
+ try
+ {
+ BufferedReader br = new BufferedReader(new InputStreamReader(
+ socket.getInputStream()));
+ assertNotNull(br);
+ while ((line = br.readLine()) != null)
+ {
+ response.add(line);
+ }
+ br.close();
+ } catch (Exception ex)
+ {
+ ex.printStackTrace();
+ fail("Exception while reading from the socket");
+ }
+ assertTrue(response.contains("<ip>127.0.0.1</ip>"));
+ assertTrue(response.contains("SOAPAction: \"urn:send\""));
+ assertTrue(response
+ .contains("Content-Type: text/xml; charset=\"utf-8\""));
+ assertTrue(response.contains("Host: localhost:9000"));
+ assertTrue(response.contains("User-Agent: Axis2"));
+ }
+
+ }
+
+ /*
+ * Test that the SOAP client sends the expected data to the socket We mock a
+ * simple SOAP envelope: <ip>127.0.0.1</ip>
+ */
+ public void testSoapClient() throws Exception
+ {
+ //
+ try
+ {
+ server = new ServerSocket(port);
+ assertNotNull(server);
+ } catch (Exception ex)
+ {
+ ex.printStackTrace();
+ fail("Unable to start the socket server");
+ }
+
+ socketAcceptor = new Thread()
+ {
+ public void run()
+ {
+ try
+ {
+ Socket socket = server.accept();
+ new ConnectionHandler(socket);
+ } catch (IOException e)
+ {
+ e.printStackTrace();
+ }
+ }
+ };
+ socketAcceptor.start();
+ // Sleep for 1 second to allow the ServerSocket readiness
+ Thread.sleep(1000);
+ SoapClient sc = getSoapClient();
+ assertNotNull(sc);
+ sc.sendSOAPMessage();
+ socketAcceptor.join(2000);
+ }
+
+ public void testSoapClientFailure() throws Exception
+ {
+ SoapClient sc = new SoapClient(null, null);
+ assertNull("No response expected for the failure test", sc
+ .sendSOAPMessage());
+ }
+
+}
diff --git a/qpid/java/broker-plugins/experimental/info/src/test/java/org/apache/qpid/info/test/SystemInfoTest.java b/qpid/java/broker-plugins/experimental/info/src/test/java/org/apache/qpid/info/test/SystemInfoTest.java
new file mode 100644
index 0000000000..092ea630eb
--- /dev/null
+++ b/qpid/java/broker-plugins/experimental/info/src/test/java/org/apache/qpid/info/test/SystemInfoTest.java
@@ -0,0 +1,49 @@
+/*
+ *
+ * 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.test;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+import junit.framework.TestCase;
+
+import org.apache.qpid.info.SystemInfo;
+
+public class SystemInfoTest extends TestCase
+{
+
+ public void testGetInfo()
+ {
+ Map<String, String> sysInfoMap = SystemInfo.getInfo();
+ assertNotNull("SystemInfo.getInfo() returned null", sysInfoMap);
+ List<String> sysInfoProps = Arrays.asList("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");
+ for (String tag : sysInfoProps)
+ {
+ assertNotNull("Map does not contain the tag: "+tag, sysInfoMap.get(tag));
+ }
+ }
+
+}