/******************************************************************************
* Copyright (c) 2006, 2010 VMware Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* and Apache License v2.0 which accompanies this distribution.
* The Eclipse Public License is available at
* http://www.eclipse.org/legal/epl-v10.html and the Apache License v2.0
* is available at http://www.opensource.org/licenses/apache2.0.php.
* You may elect to redistribute this code under either of these licenses.
*
* Contributors:
* VMware Inc.
*****************************************************************************/
package org.eclipse.gemini.blueprint.util;
import java.util.Dictionary;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleEvent;
import org.osgi.framework.FrameworkEvent;
import org.osgi.framework.ServiceEvent;
import org.osgi.framework.ServiceReference;
import org.springframework.core.ConstantException;
import org.springframework.core.Constants;
import org.springframework.util.Assert;
import org.springframework.util.ObjectUtils;
/**
* Utility class for creating nice string representations of various OSGi classes.
*
* @author Costin Leau
*
*/
@SuppressWarnings("unchecked")
public abstract class OsgiStringUtils {
/** Constant over the Bundle events */
public static final Constants BUNDLE_EVENTS = new Constants(BundleEvent.class);
/** Constant over the Framework events */
public static final Constants FRAMEWORK_EVENTS = new Constants(FrameworkEvent.class);
/** Constant over the Service events */
public static final Constants SERVICE_EVENTS = new Constants(ServiceEvent.class);
/** Constant over the Bundle states */
public static final Constants BUNDLE_STATES = new Constants(Bundle.class);
private static final String UNKNOWN_EVENT_TYPE = "UNKNOWN EVENT TYPE";
private static final String NULL_STRING = "null";
private static final String EMPTY_STRING = "";
/**
* Returns a String representation for the given bundle event.
*
* @param eventType OSGi <code>BundleEvent</code> given as an int
* @return String representation for the bundle event
*/
public static String nullSafeBundleEventToString(int eventType) {
try {
return BUNDLE_EVENTS.toCode(Integer.valueOf(eventType), "");
} catch (ConstantException cex) {
return UNKNOWN_EVENT_TYPE;
}
}
/**
* Returns a String representation for the given bundle event.
*
* @param event OSGi <code>BundleEvent</code> (can be <code>null</code>)
* @return String representation for the given bundle event
*/
public static String nullSafeToString(BundleEvent event) {
if (event == null)
return NULL_STRING;
try {
return BUNDLE_EVENTS.toCode(Integer.valueOf(event.getType()), EMPTY_STRING);
} catch (ConstantException cex) {
return UNKNOWN_EVENT_TYPE;
}
}
/**
* Returns a String representation for the given <code>ServiceEvent</code>.
*
* @param event OSGi <code>ServiceEvent</code> (can be <code>null</code>)
* @return String representation for the given event
*/
public static String nullSafeToString(ServiceEvent event) {
if (event == null)
return NULL_STRING;
try {
return SERVICE_EVENTS.toCode(Integer.valueOf(event.getType()), EMPTY_STRING);
} catch (ConstantException cex) {
return UNKNOWN_EVENT_TYPE;
}
}
/**
* Returns a String representation for the given <code>FrameworkEvent</code> .
*
* @param event OSGi <code>FrameworkEvent</code> (can be <code>null</code>)
* @return String representation of the given event
*/
public static String nullSafeToString(FrameworkEvent event) {
if (event == null)
return NULL_STRING;
try {
return FRAMEWORK_EVENTS.toCode(Integer.valueOf(event.getType()), EMPTY_STRING);
} catch (ConstantException cex) {
return UNKNOWN_EVENT_TYPE;
}
}
/**
* Returns a String representation of the given <code>ServiceReference</code>.
*
* @param reference OSGi service reference (can be <code>null</code>)
* @return String representation of the given service reference
*/
public static String nullSafeToString(ServiceReference reference) {
if (reference == null)
return NULL_STRING;
StringBuilder buf = new StringBuilder();
Bundle owningBundle = reference.getBundle();
buf.append("ServiceReference [").append(OsgiStringUtils.nullSafeSymbolicName(owningBundle)).append("] ");
String clazzes[] = (String[]) reference.getProperty(org.osgi.framework.Constants.OBJECTCLASS);
buf.append(ObjectUtils.nullSafeToString(clazzes));
buf.append("={");
String[] keys = reference.getPropertyKeys();
for (int i = 0; i < keys.length; i++) {
if (!org.osgi.framework.Constants.OBJECTCLASS.equals(keys[i])) {
buf.append(keys[i]).append('=').append(reference.getProperty(keys[i]));
if (i < keys.length - 1) {
buf.append(',');
}
}
}
buf.append('}');
return buf.toString();
}
/**
* Returns a String representation of the <code>Bundle</code> state.
*
* @param bundle OSGi bundle (can be <code>null</code>)
* @return bundle state as a string
*/
public static String bundleStateAsString(Bundle bundle) {
Assert.notNull(bundle, "bundle is required");
int state = bundle.getState();
try {
return BUNDLE_STATES.toCode(Integer.valueOf(state), "");
} catch (ConstantException cex) {
return "UNKNOWN STATE";
}
}
/**
* Returns the given <code>Bundle</code> symbolic name.
*
* @param bundle OSGi bundle (can be <code>null</code>)
* @return the bundle, symbolic name
*/
public static String nullSafeSymbolicName(Bundle bundle) {
if (bundle == null)
return NULL_STRING;
Dictionary headers = bundle.getHeaders();
if (headers == null)
return NULL_STRING;
return (String) (bundle.getSymbolicName() == null ? NULL_STRING : bundle.getSymbolicName());
}
/**
* Returns the name of the given <code>Bundle</code> in a null-safe manner.
*
* @param bundle OSGi bundle (can be <code>null</code>)
* @return bundle name
*/
public static String nullSafeName(Bundle bundle) {
if (bundle == null)
return NULL_STRING;
Dictionary headers = bundle.getHeaders();
if (headers == null)
return NULL_STRING;
String name = (String) headers.get(org.osgi.framework.Constants.BUNDLE_NAME);
return (name == null ? NULL_STRING : name);
}
/**
* Returns the bundle name and symbolic name - useful when logging bundle info.
*
* @param bundle OSGi bundle (can be null)
* @return the bundle name and symbolic name
*/
public static String nullSafeNameAndSymName(Bundle bundle) {
if (bundle == null)
return NULL_STRING;
Dictionary dict = bundle.getHeaders();
if (dict == null)
return NULL_STRING;
StringBuilder buf = new StringBuilder();
String name = (String) dict.get(org.osgi.framework.Constants.BUNDLE_NAME);
if (name == null)
buf.append(NULL_STRING);
else
buf.append(name);
buf.append(" (");
String sname = (String) dict.get(org.osgi.framework.Constants.BUNDLE_SYMBOLICNAME);
if (sname == null)
buf.append(NULL_STRING);
else
buf.append(sname);
buf.append(")");
return buf.toString();
}
}