/* * Copyright 2000-2013 Enonic AS * http://www.enonic.com/license */ package com.enonic.cms.core.plugin.manager; import java.util.ArrayList; import java.util.List; import java.util.Map; import org.osgi.framework.Bundle; import org.osgi.framework.ServiceReference; import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.enonic.cms.api.plugin.ext.Extension; import com.enonic.cms.core.plugin.ext.ExtensionListener; final class ExtensionHolder { private final Map<ServiceReference, Extension> map; private final List<ExtensionListener> listeners; public ExtensionHolder() { this.map = Maps.newHashMap(); this.listeners = Lists.newArrayList(); } public void setListeners(final List<ExtensionListener> list) { this.listeners.clear(); this.listeners.addAll(list); } public List<Extension> getAll() { return ImmutableList.copyOf(this.map.values()); } public List<Extension> getAllForBundle( final Bundle bundle ) { final Map<ServiceReference, Extension> cloned = Maps.newHashMap( this.map ); final ArrayList<Extension> list = Lists.newArrayList(); for ( final Map.Entry<ServiceReference, Extension> entry : cloned.entrySet() ) { if ( entry.getKey().getBundle().getBundleId() == bundle.getBundleId() ) { list.add( entry.getValue() ); } } return list; } public void add(final ServiceReference ref, final Extension ext) { this.map.put(ref, ext); for (final ExtensionListener listener : this.listeners) { listener.extensionAdded(ext); } } public void remove(final ServiceReference ref) { final Extension ext = this.map.remove(ref); if (ext == null) { return; } for (final ExtensionListener listener : this.listeners) { listener.extensionRemoved(ext); } } }