blob: fbb4a4aaa80ba4c4c0bcfd33d82b29ee4af6b336 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010-2011 Composent, Inc. and others. All rights reserved. This
* program and the accompanying materials are made available under the terms of
* the Eclipse Public License v1.0 which accompanies this distribution, and is
* available at http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Composent, Inc. - initial API and implementation
******************************************************************************/
package org.eclipse.ecf.internal.osgi.services.remoteserviceadmin;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Dictionary;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import org.eclipse.ecf.osgi.services.remoteserviceadmin.RemoteConstants;
import org.eclipse.ecf.remoteservice.IRemoteServiceReference;
import org.eclipse.ecf.remoteservice.IRemoteServiceRegistration;
import org.osgi.framework.ServiceReference;
public class PropertiesUtil {
protected static final List osgiProperties = Arrays
.asList(new String[] {
// OSGi properties
org.osgi.framework.Constants.OBJECTCLASS,
org.osgi.framework.Constants.SERVICE_ID,
org.osgi.service.remoteserviceadmin.RemoteConstants.ENDPOINT_FRAMEWORK_UUID,
org.osgi.service.remoteserviceadmin.RemoteConstants.ENDPOINT_ID,
org.osgi.service.remoteserviceadmin.RemoteConstants.ENDPOINT_SERVICE_ID,
org.osgi.service.remoteserviceadmin.RemoteConstants.REMOTE_CONFIGS_SUPPORTED,
org.osgi.service.remoteserviceadmin.RemoteConstants.REMOTE_INTENTS_SUPPORTED,
org.osgi.service.remoteserviceadmin.RemoteConstants.SERVICE_EXPORTED_CONFIGS,
org.osgi.service.remoteserviceadmin.RemoteConstants.SERVICE_EXPORTED_INTENTS,
org.osgi.service.remoteserviceadmin.RemoteConstants.SERVICE_EXPORTED_INTENTS_EXTRA,
org.osgi.service.remoteserviceadmin.RemoteConstants.SERVICE_EXPORTED_INTERFACES,
org.osgi.service.remoteserviceadmin.RemoteConstants.SERVICE_IMPORTED,
org.osgi.service.remoteserviceadmin.RemoteConstants.SERVICE_IMPORTED_CONFIGS,
org.osgi.service.remoteserviceadmin.RemoteConstants.SERVICE_INTENTS });
protected static final List ecfProperties = Arrays.asList(new String[] {
// ECF properties
org.eclipse.ecf.remoteservice.Constants.OBJECTCLASS,
org.eclipse.ecf.remoteservice.Constants.SERVICE_ID,
RemoteConstants.DISCOVERY_DEFAULT_SERVICE_NAME_PREFIX,
RemoteConstants.DISCOVERY_NAMING_AUTHORITY,
RemoteConstants.DISCOVERY_PROTOCOLS,
RemoteConstants.DISCOVERY_SCOPE,
RemoteConstants.DISCOVERY_SERVICE_NAME,
RemoteConstants.ENDPOINT_CONNECTTARGET_ID,
RemoteConstants.ENDPOINT_CONTAINER_ID_NAMESPACE,
RemoteConstants.ENDPOINT_IDFILTER_IDS,
RemoteConstants.ENDPOINT_REMOTESERVICE_FILTER,
RemoteConstants.ENDPOINT_SERVICE_IMPORTED_CONFIGS_VALUE,
RemoteConstants.SERVICE_EXPORTED_CONTAINER_CONNECT_CONTEXT,
RemoteConstants.SERVICE_EXPORTED_CONTAINER_FACTORY_ARGS,
RemoteConstants.SERVICE_EXPORTED_CONTAINER_ID,
RemoteConstants.SERVICE_IMPORTED_VALUETYPE,
RemoteConstants.DISCOVERY_SERVICE_TYPE });
public static String verifyStringProperty(Map properties, String propName) {
Object r = properties.get(propName);
try {
return (String) r;
} catch (ClassCastException e) {
IllegalArgumentException iae = new IllegalArgumentException(
"property value is not a String: " + propName); //$NON-NLS-1$
iae.initCause(e);
throw iae;
}
}
public static Object convertToStringPlusValue(List<String> values) {
if (values == null)
return null;
int valuesSize = values.size();
switch (valuesSize) {
case 0:
return null;
case 1:
return values.get(0);
default:
return values.toArray(new String[valuesSize]);
}
}
public static String[] getStringArrayFromPropertyValue(Object value) {
if (value == null)
return null;
else if (value instanceof String)
return new String[] { (String) value };
else if (value instanceof String[])
return (String[]) value;
else if (value instanceof Collection)
return (String[]) ((Collection) value).toArray(new String[] {});
else
return null;
}
public static String[] getExportedInterfaces(
ServiceReference serviceReference) {
// Get the OSGi 4.2 specified required service property value
Object propValue = serviceReference
.getProperty(org.osgi.service.remoteserviceadmin.RemoteConstants.SERVICE_EXPORTED_INTERFACES);
// If the required property is not set then it's not being registered
// as a remote service so we return null
if (propValue == null)
return null;
boolean wildcard = propValue.equals("*"); //$NON-NLS-1$
if (wildcard)
return (String[]) serviceReference
.getProperty(org.osgi.framework.Constants.OBJECTCLASS);
else {
final String[] stringValue = getStringArrayFromPropertyValue(propValue);
if (stringValue != null && stringValue.length == 1
&& stringValue[0].equals("*")) { //$NON-NLS-1$
LogUtility
.logWarning(
"getExportedInterfaces", //$NON-NLS-1$
DebugOptions.TOPOLOGY_MANAGER,
PropertiesUtil.class,
"Service Exported Interfaces Wildcard does not accept String[\"*\"]"); //$NON-NLS-1$
}
return stringValue;
}
}
public static String[] getServiceIntents(ServiceReference serviceReference,
Map overridingProperties) {
List results = new ArrayList();
String[] intents = getStringArrayFromPropertyValue(overridingProperties
.get(org.osgi.service.remoteserviceadmin.RemoteConstants.SERVICE_INTENTS));
if (intents == null) {
intents = getStringArrayFromPropertyValue(serviceReference
.getProperty(org.osgi.service.remoteserviceadmin.RemoteConstants.SERVICE_INTENTS));
}
if (intents != null)
results.addAll(Arrays.asList(intents));
String[] exportedIntents = getStringArrayFromPropertyValue(overridingProperties
.get(org.osgi.service.remoteserviceadmin.RemoteConstants.SERVICE_EXPORTED_INTENTS));
if (exportedIntents == null) {
exportedIntents = getStringArrayFromPropertyValue(serviceReference
.getProperty(org.osgi.service.remoteserviceadmin.RemoteConstants.SERVICE_EXPORTED_INTENTS));
}
if (exportedIntents != null)
results.addAll(Arrays.asList(exportedIntents));
String[] extraIntents = getStringArrayFromPropertyValue(overridingProperties
.get(org.osgi.service.remoteserviceadmin.RemoteConstants.SERVICE_EXPORTED_INTENTS_EXTRA));
if (extraIntents == null) {
extraIntents = getStringArrayFromPropertyValue(serviceReference
.getProperty(org.osgi.service.remoteserviceadmin.RemoteConstants.SERVICE_EXPORTED_INTENTS_EXTRA));
}
if (extraIntents != null)
results.addAll(Arrays.asList(extraIntents));
if (results.size() == 0)
return null;
return (String[]) results.toArray(new String[results.size()]);
}
public static List getStringPlusProperty(Map properties, String key) {
Object value = properties.get(key);
if (value == null) {
return Collections.EMPTY_LIST;
}
if (value instanceof String) {
return Collections.singletonList((String) value);
}
if (value instanceof String[]) {
String[] values = (String[]) value;
List result = new ArrayList(values.length);
for (int i = 0; i < values.length; i++) {
if (values[i] != null) {
result.add(values[i]);
}
}
return Collections.unmodifiableList(result);
}
if (value instanceof Collection) {
Collection values = (Collection) value;
List result = new ArrayList(values.size());
for (Iterator iter = values.iterator(); iter.hasNext();) {
Object v = iter.next();
if (v instanceof String) {
result.add((String) v);
}
}
return Collections.unmodifiableList(result);
}
return Collections.EMPTY_LIST;
}
public static Object getPropertyValue(ServiceReference serviceReference,
String key) {
return (serviceReference == null) ? null : serviceReference
.getProperty(key);
}
public static Object getPropertyValue(ServiceReference serviceReference,
Map<String, Object> overridingProperties, String key) {
Object result = null;
if (overridingProperties != null)
result = overridingProperties.get(key);
return (result != null) ? result : getPropertyValue(serviceReference,
key);
}
public static boolean isOSGiProperty(String key) {
return osgiProperties.contains(key)
|| key.startsWith(org.osgi.service.remoteserviceadmin.RemoteConstants.ENDPOINT_PACKAGE_VERSION_);
}
public static boolean isECFProperty(String key) {
return ecfProperties.contains(key);
}
public static boolean isReservedProperty(String key) {
return isOSGiProperty(key) || isECFProperty(key);
}
public static Map createMapFromDictionary(Dictionary input) {
if (input == null)
return null;
Map result = new HashMap();
for (Enumeration e = input.keys(); e.hasMoreElements();) {
Object key = e.nextElement();
Object val = input.get(key);
result.put(key, val);
}
return result;
}
public static Dictionary createDictionaryFromMap(Map propMap) {
if (propMap == null)
return null;
Dictionary result = new Properties();
for (Iterator i = propMap.keySet().iterator(); i.hasNext();) {
Object key = i.next();
Object val = propMap.get(key);
result.put(key, val);
}
return result;
}
public static Long getLongWithDefault(Map props, String key, Long def) {
Object o = props.get(key);
if (o instanceof Long)
return (Long) o;
if (o instanceof String)
return Long.valueOf((String) o);
return def;
}
public static String[] getStringArrayWithDefault(
Map<String, Object> properties, String key, String[] def) {
Object o = properties.get(key);
if (o instanceof String) {
return new String[] { (String) o };
} else if (o instanceof String[]) {
return (String[]) o;
} else if (o instanceof List) {
List l = (List) o;
return (String[]) l.toArray(new String[l.size()]);
}
return def;
}
public static String getStringWithDefault(Map props, String key, String def) {
Object o = props.get(key);
if (o == null || (!(o instanceof String)))
return def;
return (String) o;
}
public static Map<String, Object> copyProperties(
IRemoteServiceRegistration rsRegistration,
Map<String, Object> target) {
String[] keys = rsRegistration.getPropertyKeys();
for (int i = 0; i < keys.length; i++)
target.put(keys[i], rsRegistration.getProperty(keys[i]));
return target;
}
public static Map<String, Object> copyProperties(
Map<String, Object> source, Map<String, Object> target) {
for (String key : source.keySet())
target.put(key, source.get(key));
return target;
}
public static Map<String, Object> copyNonECFProperties(
Map<String, Object> source, Map<String, Object> target) {
for (String key : source.keySet())
if (!isECFProperty(key))
target.put(key, source.get(key));
return target;
}
public static Map<String, Object> copyNonReservedProperties(
Map<String, Object> source, Map<String, Object> target) {
for (String key : source.keySet())
if (!isReservedProperty(key))
target.put(key, source.get(key));
return target;
}
public static Map<String, Object> copyNonECFProperties(
ServiceReference serviceReference, Map<String, Object> target) {
String[] keys = serviceReference.getPropertyKeys();
for (int i = 0; i < keys.length; i++)
if (!isECFProperty(keys[i]))
target.put(keys[i], serviceReference.getProperty(keys[i]));
return target;
}
public static Map<String, Object> copyNonReservedProperties(
ServiceReference serviceReference, Map<String, Object> target) {
String[] keys = serviceReference.getPropertyKeys();
for (int i = 0; i < keys.length; i++)
if (!isReservedProperty(keys[i]))
target.put(keys[i], serviceReference.getProperty(keys[i]));
return target;
}
public static Map<String, Object> copyNonReservedProperties(
IRemoteServiceReference rsReference, Map<String, Object> target) {
String[] keys = rsReference.getPropertyKeys();
for (int i = 0; i < keys.length; i++)
if (!isReservedProperty(keys[i]))
target.put(keys[i], rsReference.getProperty(keys[i]));
return target;
}
}