blob: 21e7be26c1db630361f8a328b05ed47e22c2b9f6 [file] [log] [blame]
/*
*
* 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 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;
import java.io.File;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Properties;
/** 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;
/**
* Start bundle method
*
* @param ctx the bundle context
*/
public void start(BundleContext ctx) throws Exception
{
if (null != ctx)
{
_ctx = ctx;
_service = new InfoServiceImpl();
ctx.registerService(InfoService.class.getName(), _service, null);
new Thread(new Runnable()
{
public void run()
{
sendInfo("STARTUP");
}
}).start();
}
}
/**
* Stop the bundle method
*
* @param ctx the bundle context
*/
public void stop(BundleContext ctx) throws Exception
{
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.ini";
ifr.load(cfgFilePath);
}
catch (Throwable ex)
{
// drop everything to be silent
return;
}
// Only send Messages if we have some sections.
if (ifr.getSections().size() != 0)
{
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();
}
}
}
}
}
/**
* 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
* @return boolean
*/
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