blob: 6e91576ef4969784f7305d60e4ffd88a65465847 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006 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:
* Cameron Bateman/Oracle - initial API and implementation
*
********************************************************************************/
package org.eclipse.jst.jsf.context;
import java.util.List;
import org.eclipse.core.runtime.IAdaptable;
/**
* Defines a type of factory that can have delegate factories to help it
* create an appropriate instance type. The general contract for implementors
* is:
*
* 1) You must follow the isValidDelegate contract.
* 2) You should try to create an instance yourself and only delegate
* if cannot do it yourself. Deviations from this rule must be
* clearly documented to ensure clients understand how the factory works.
*
* Clients may NOT implement this interface.
* Extend AbstractDelegatingFactory instead.
*
* @author cbateman
*
*/
public interface IDelegatingFactory
{
/** -- Delegates */
/** If this factory is asked to construct but does not know how to,
* it will ask each of its registered delegates to do so in the order
* they were added.
*/
/**
* Adds delgate to the end of the list of factory delegates if the list
* does not already contain it.
*
* @param delegate
* @throws ClassCastException if delegate does not implement an expected
* interface. Each implementor can define what delegates are valid
* based on the isValidDelegate() and getValidDelegates contracts
*/
void addFactoryDelegate(IAdaptable delegate);
/**
* @param delegate
* @return true if delegate was removed, false if delegate wasn't in
* the list of delegates
*/
boolean removeFactoryDelegate(IAdaptable delegate);
/**
* @return a list of Class objects that represent the interfaces
* that may be passed to addFactoryDelegate. Implementor should
* return at least one supported class.
*/
List<Class> getValidDelegateTypes();
/**
* The return value of this method should conform to the following contract:
*
* Let v = getValidDelegates. Then isValidDelegate should return true
* only if the set of v contains a Class for which delegate.getAdapter(Class)
* returns a non-null value.
*
* @param delegate
* @return true if delegate is supported, false otherwise.
*/
boolean isValidDelegate(IAdaptable delegate);
}