blob: 883ee514ac253393131dbedb4590696ba2ea6565 [file] [log] [blame]
/*******************************************************************************
* 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();
}
}