/******************************************************************************* * Copyright (c) 2008, 2014 Stuart McCulloch * 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: * Stuart McCulloch - initial API and implementation *******************************************************************************/ package org.eclipse.sisu.peaberry.osgi; import java.util.AbstractMap; import java.util.AbstractSet; import java.util.Iterator; import java.util.Set; import org.eclipse.sisu.peaberry.cache.ImmutableAttribute; import org.osgi.framework.ServiceReference; /** * Service attributes adapter backed by an OSGi {@link ServiceReference}. * * @author mcculls@gmail.com (Stuart McCulloch) */ final class OSGiServiceAttributes extends AbstractMap<String, Object> { final ServiceReference ref; OSGiServiceAttributes(final ServiceReference ref) { this.ref = ref; } @Override public Object get(final Object key) { return ref.getProperty((String) key); } // can safely cache entry set, as it has no state private volatile Set<Entry<String, Object>> entrySet; @Override public Set<Entry<String, Object>> entrySet() { if (null == entrySet) { entrySet = new AbstractSet<Entry<String, Object>>() { @Override public Iterator<Entry<String, Object>> iterator() { // take snapshot of current property names final String[] keys = ref.getPropertyKeys(); return new Iterator<Entry<String, Object>>() { private int i = 0; public boolean hasNext() { return i < keys.length; } public Entry<String, Object> next() { final String k = keys[i++]; // return a snapshot of the current property entry return new ImmutableAttribute(k, ref.getProperty(k)); } public void remove() { throw new UnsupportedOperationException(); } }; } @Override public int size() { return ref.getPropertyKeys().length; } }; } return entrySet; } }