| /******************************************************************************* |
| * Copyright (c) 2005 Oracle Corporation. |
| * 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: |
| * Ian Trimble - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.jst.jsf.core.jsfappconfig; |
| |
| import java.util.Collections; |
| import java.util.Iterator; |
| import java.util.LinkedHashSet; |
| import java.util.Set; |
| |
| import org.eclipse.jst.jsf.core.jsfappconfig.internal.IJSFAppConfigManager; |
| |
| /** |
| * Abstract implementation of {@link IJSFAppConfigLocater} that provides common |
| * locater functionality. {@link IJSFAppConfigLocater} implementations MUST |
| * extend this class or provide similar functionality. |
| * |
| * <p><b>Provisional API - subject to change</b></p> |
| * |
| * @author Ian Trimble - Oracle |
| */ |
| public abstract class AbstractJSFAppConfigLocater implements IJSFAppConfigLocater { |
| |
| /** |
| * {@link JSFAppConfigManager} instance to which this locater belongs. |
| * @deprecated - DO NOT USE |
| */ |
| protected JSFAppConfigManager manager = null; |
| |
| /** |
| * {@link IJSFAppConfigManager} instance to which this locater belongs. |
| */ |
| private IJSFAppConfigManager _manager; |
| |
| /** |
| * Set of known {@link IJSFAppConfigProvider} instances. |
| */ |
| protected Set configProviders = new LinkedHashSet(); |
| |
| public void setJSFAppConfigManager(final IJSFAppConfigManager manager) { |
| this._manager = manager; |
| } |
| |
| public IJSFAppConfigManager getJSFAppConfigManager() { |
| return _manager; |
| } |
| |
| public abstract void startLocating(); |
| |
| public abstract void stopLocating(); |
| |
| public Set<IJSFAppConfigProvider> getJSFAppConfigProviders() { |
| return configProviders; |
| } |
| |
| /** |
| * Adds an {@link IJSFAppConfigProvider} instance to the set of known |
| * instances and notifies {@link JSFAppConfigManager} instance of the |
| * addition if successful. |
| * |
| * @param configProvider {@link IJSFAppConfigProvider} instance to be |
| * added. |
| * @return true if instance was added, else false. |
| */ |
| protected boolean addConfigProvider(final IJSFAppConfigProvider configProvider) { |
| final boolean added = configProviders.add(configProvider); |
| if (added && getJSFAppConfigManager() != null) { |
| configProvider.setJSFAppConfigLocater(this); |
| getJSFAppConfigManager().notifyJSFAppConfigProvidersChangeListeners( |
| configProvider, |
| JSFAppConfigProvidersChangeEvent.ADDED); |
| } |
| return added; |
| } |
| |
| /** |
| * Removes an {@link IJSFAppConfigProvider} instance from the set of known |
| * instances and notifies {@link JSFAppConfigManager} instance of the |
| * removal if successful. |
| * |
| * @param configProvider {@link IJSFAppConfigProvider} instance to be |
| * removed. |
| * @return true if instance was removed, else false. |
| */ |
| protected boolean removeConfigProvider(final IJSFAppConfigProvider configProvider) { |
| if (configProvider != null) { |
| configProvider.releaseFacesConfigModel(); |
| } |
| final boolean removed = configProviders.remove(configProvider); |
| if (removed && getJSFAppConfigManager() != null) { |
| getJSFAppConfigManager().notifyJSFAppConfigProvidersChangeListeners( |
| configProvider, |
| JSFAppConfigProvidersChangeEvent.REMOVED); |
| } |
| return removed; |
| } |
| |
| /** |
| * Updates known set of {@link IJSFAppConfigProvider} instances by removing |
| * instances that are in the existing set but not in the passed set and |
| * adding instances that are in the passed set but not in the existing set. |
| * Instances that are in both the existing set and the passed set are left |
| * unchanged. The {@link JSFAppConfigManager} is notified of removals and |
| * additions, and no notification is sent for instances that are left |
| * unchanged. |
| * |
| * @param newConfigProviders New set of {@link IJSFAppConfigProvider} |
| * instances. |
| */ |
| protected void updateConfigProviders(final Set newConfigProviders) { |
| if (newConfigProviders != null) { |
| final LinkedHashSet oldConfigProviders = new LinkedHashSet(); |
| //iterate over existing set |
| final Iterator itConfigProviders = configProviders.iterator(); |
| while (itConfigProviders.hasNext()) { |
| final IJSFAppConfigProvider configProvider = (IJSFAppConfigProvider)itConfigProviders.next(); |
| //remove provider from new set if it is already in existing set |
| if (!newConfigProviders.remove(configProvider)) { |
| //stage removal of existing provider that is not in new set |
| oldConfigProviders.add(configProvider); |
| } |
| } |
| //remove providers that are not in new set from existing set |
| final Iterator itOldConfigProviders = oldConfigProviders.iterator(); |
| while (itOldConfigProviders.hasNext()) { |
| final IJSFAppConfigProvider configProvider = (IJSFAppConfigProvider)itOldConfigProviders.next(); |
| //call removeConfigProvider(...) method so manager's listeners are notified |
| removeConfigProvider(configProvider); |
| } |
| //add providers that are still in new set to existing set |
| final Iterator itNewConfigProviders = newConfigProviders.iterator(); |
| while (itNewConfigProviders.hasNext()) { |
| final IJSFAppConfigProvider configProvider = (IJSFAppConfigProvider)itNewConfigProviders.next(); |
| //call addConfigProvider(...) method so manager's listeners are notified |
| addConfigProvider(configProvider); |
| } |
| } |
| } |
| |
| /** |
| * Removes all {@link IJSFAppConfigProvider} instances from the known set, |
| * sending notification of all removals to the {@link JSFAppConfigManager} |
| * instance. |
| */ |
| protected void removeAllConfigProviders() { |
| updateConfigProviders(Collections.EMPTY_SET); |
| } |
| |
| /* |
| * (non-Javadoc) |
| * @see org.eclipse.jst.jsf.core.jsfappconfig.IJSFAppConfigLocater#dispose() |
| */ |
| public void dispose() { |
| removeAllConfigProviders(); |
| } |
| } |