/****************************************************************************** * 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.internal; import java.util.AbstractMap; import java.util.Collections; import java.util.LinkedHashSet; import java.util.Map; import java.util.Set; import org.osgi.framework.ServiceReference; import org.springframework.util.Assert; /** * ServiceReference based map. Offers a dynamic view of a service properties, * which can reflect updates done through the ServiceRegistration. * * @see org.osgi.framework.ServiceRegistration * @see org.osgi.framework.ServiceReference * * @author Costin Leau * */ public class ServiceReferenceBasedMap extends AbstractMap { private ServiceReference reference; private static final String READ_ONLY_MSG = "this is a readonly map"; private static class SimpleEntry implements Map.Entry { Object key; Object value; public SimpleEntry(Object key, Object value) { this.key = key; this.value = value; } public Object getKey() { return key; } public Object getValue() { return value; } public Object setValue(Object value) { Object oldValue = this.value; this.value = value; return oldValue; } public boolean equals(Object o) { if (!(o instanceof Map.Entry)) return false; Map.Entry e = (Map.Entry) o; return eq(key, e.getKey()) && eq(value, e.getValue()); } public int hashCode() { return ((key == null) ? 0 : key.hashCode()) ^ ((value == null) ? 0 : value.hashCode()); } public String toString() { return key + "=" + value; } private boolean eq(Object o1, Object o2) { return (o1 == null ? o2 == null : o1.equals(o2)); } } public ServiceReferenceBasedMap(ServiceReference ref) { Assert.notNull(ref); this.reference = ref; } public void clear() { throw new UnsupportedOperationException(READ_ONLY_MSG); } public boolean containsKey(Object key) { return (get(key) != null); } public boolean containsValue(Object value) { Assert.notNull(value); String[] keys = reference.getPropertyKeys(); for (int i = 0; i < keys.length; i++) { if (value.equals(reference.getProperty(keys[i]))) return true; } return false; } public Set entrySet() { String[] keys = reference.getPropertyKeys(); Set entrySet = new LinkedHashSet(keys.length); for (int i = 0; i < keys.length; i++) { entrySet.add(new SimpleEntry(keys[i], reference.getProperty(keys[i]))); } return Collections.unmodifiableSet(entrySet); } public Object get(Object key) { if (key instanceof String) return reference.getProperty((String) key); else throw new IllegalArgumentException("only String keys are allowed"); } public Object put(Object key, Object value) { throw new UnsupportedOperationException(READ_ONLY_MSG); } public void putAll(Map t) { throw new UnsupportedOperationException(READ_ONLY_MSG); } public Object remove(Object key) { throw new UnsupportedOperationException(READ_ONLY_MSG); } }