Skip to main content
summaryrefslogtreecommitdiffstats
blob: 37e7c6c58adfe2a3dcf2c41c0b1a31d1d83009b4 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
/*******************************************************************************
 * 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.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;

import org.eclipse.core.runtime.IAdaptable;

/**
 * An abstract implementation of the IDelegatingFactory interface
 * 
 * Clients may extend this class.
 * 
 * @author cbateman
 *
 */
public abstract class AbstractDelegatingFactory implements IDelegatingFactory {

	/* instance attributes */
	
	/**
	 * the list of registered factory delegates
	 */
	protected 	final List<IAdaptable>  _delegates;
	
	private 	final List<Class>		_supportedDelegates;

	/**
	 * @param supportedDelegateTypes -- populates the list of classes used
	 * by the isValidDelegate contract
	 */
	protected AbstractDelegatingFactory(Class[]  supportedDelegateTypes)
	{
		_delegates = new ArrayList<IAdaptable>();
		
		final List<Class> supportedTypes = new ArrayList<Class>();
		supportedTypes.addAll(Arrays.asList(supportedDelegateTypes));
		_supportedDelegates = Collections.unmodifiableList(supportedTypes);
	}

	/**
	 * @see org.eclipse.jst.jsf.context.IDelegatingFactory#addFactoryDelegate(org.eclipse.core.runtime.IAdaptable)
	 */
	public final void addFactoryDelegate(IAdaptable delegate) 
	{
		synchronized(_delegates)
		{
			
			if (!_delegates.contains(delegate)
					&& isValidDelegate(delegate))
			{
				_delegates.add(delegate);
			}
		}
	}

	/**
	 * @see org.eclipse.jst.jsf.context.IDelegatingFactory#removeFactoryDelegate(org.eclipse.core.runtime.IAdaptable)
	 */
	public final boolean removeFactoryDelegate(IAdaptable delegate) 
	{
		synchronized(_delegates)
		{
			return _delegates.remove(delegate);
		}	
	}

	/**
	 * @see org.eclipse.jst.jsf.context.IDelegatingFactory#getValidDelegateTypes()
	 */
	public final List<Class> getValidDelegateTypes() 
	{
		return _supportedDelegates;
	}

	/**
	 * @see org.eclipse.jst.jsf.context.IDelegatingFactory#isValidDelegate(org.eclipse.core.runtime.IAdaptable)
	 */
	public final boolean isValidDelegate(IAdaptable delegate) 
	{
		for (final Iterator<Class> it = _supportedDelegates.iterator(); it.hasNext();)
		{
			final Class clazz = it.next();
			
			// if the delegate supports one of the valid delegate classes
			// via adaptation, then it is a valid delegate
			if (delegate.getAdapter(clazz) != null)
			{
				return true;
			}
		}
		
		// if no found, delegate is not supported
		return false;
	}
}

Back to the top