Skip to main content
aboutsummaryrefslogtreecommitdiffstats
blob: 795c9b5648737b0b810ae4510267c3053294dcdc (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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
/*******************************************************************************
 * Copyright (c) 2011, 2012 Wind River Systems, Inc. and others. 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:
 * Wind River Systems - initial API and implementation
 *******************************************************************************/
package org.eclipse.tcf.te.runtime.persistence;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import org.eclipse.core.runtime.Assert;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Status;
import org.eclipse.tcf.te.runtime.extensions.AbstractExtensionPointManager;
import org.eclipse.tcf.te.runtime.extensions.ExecutableExtensionProxy;
import org.eclipse.tcf.te.runtime.persistence.activator.CoreBundleActivator;
import org.eclipse.tcf.te.runtime.persistence.interfaces.IPersistenceDelegate;
import org.eclipse.tcf.te.runtime.persistence.interfaces.IVariableDelegate;
import org.eclipse.tcf.te.runtime.persistence.internal.PersistenceDelegateBinding;
import org.eclipse.tcf.te.runtime.persistence.internal.PersistenceDelegateBindingExtensionPointManager;
import org.eclipse.tcf.te.runtime.persistence.internal.VariableDelegateExtensionPointManager;

/**
 * Persistence delegate manager implementation.
 */
public class PersistenceManager extends AbstractExtensionPointManager<IPersistenceDelegate> {

	/*
	 * Thread save singleton instance creation.
	 */
	private static class LazyInstance {
		public static PersistenceManager instance = new PersistenceManager();
	}

	/**
	 * Constructor.
	 */
	PersistenceManager() {
		super();
	}

	/**
	 * Returns the singleton instance of the extension point manager.
	 */
	public static PersistenceManager getInstance() {
		return LazyInstance.instance;
	}

	/* (non-Javadoc)
	 * @see org.eclipse.tcf.te.runtime.extensions.AbstractExtensionPointManager#getExtensionPointId()
	 */
	@Override
	protected String getExtensionPointId() {
		return "org.eclipse.tcf.te.runtime.persistence.delegates"; //$NON-NLS-1$
	}

	/* (non-Javadoc)
	 * @see org.eclipse.tcf.te.runtime.extensions.AbstractExtensionPointManager#getConfigurationElementName()
	 */
	@Override
	protected String getConfigurationElementName() {
		return "delegate"; //$NON-NLS-1$
	}

	/**
	 * Returns the list of all contributed persistence delegates.
	 *
	 * @param unique If <code>true</code>, the method returns new instances for each
	 *               contributed persistence delegate.
	 *
	 * @return The list of contributed persistence delegates, or an empty array.
	 */
	protected IPersistenceDelegate[] getDelegates(boolean unique) {
		List<IPersistenceDelegate> contributions = new ArrayList<IPersistenceDelegate>();
		Collection<ExecutableExtensionProxy<IPersistenceDelegate>> delegates = getExtensions().values();
		for (ExecutableExtensionProxy<IPersistenceDelegate> delegate : delegates) {
			IPersistenceDelegate instance = unique ? delegate.newInstance() : delegate.getInstance();
			if (instance != null && !contributions.contains(instance)) {
				contributions.add(instance);
			}
		}

		return contributions.toArray(new IPersistenceDelegate[contributions.size()]);
	}

	/**
	 * Returns the persistence delegate identified by its unique id. If no persistence
	 * delegate with the specified id is registered, <code>null</code> is returned.
	 *
	 * @param id The unique id of the persistence delegate or <code>null</code>
	 * @param unique If <code>true</code>, the method returns new instances of the persistence delegate contribution.
	 *
	 * @return The persistence delegate instance or <code>null</code>.
	 */
	protected IPersistenceDelegate getDelegate(String id, boolean unique) {
		IPersistenceDelegate contribution = null;
		if (getExtensions().containsKey(id)) {
			ExecutableExtensionProxy<IPersistenceDelegate> proxy = getExtensions().get(id);
			// Get the extension instance
			contribution = unique ? proxy.newInstance() : proxy.getInstance();
		}

		return contribution;
	}

	/**
	 * Returns the persistence delegate which is enabled for the given
	 * context and persistence container.
	 *
	 * @param context The persistence delegate context. Must not be <code>null</code>.
	 * @param container The persistence container or <code>null</code>.
	 * @return The persistence delegate which is enabled or <code>null</code>.
	 */
	public IPersistenceDelegate getDelegate(Object context, Object container, boolean unique) {
		Assert.isNotNull(context);

		List<IPersistenceDelegate> delegates = new ArrayList<IPersistenceDelegate>();

		// Get the list of applicable bindings
		PersistenceDelegateBinding[] bindings = PersistenceDelegateBindingExtensionPointManager.getInstance().getApplicableBindings(context, container);
		for (PersistenceDelegateBinding binding : bindings) {
			IPersistenceDelegate delegate = getDelegate(binding.getDelegateId(), unique);
			if (delegate != null && !delegates.contains(delegate)) {
				delegates.add(delegate);
			}
		}

		// If no applicable persistence delegate is found, always return null
		if (delegates.isEmpty() || delegates.isEmpty()) {
			return null;
		}

		// Write an information if we are in debug mode and we have more than one persistence delegate.
		if (Platform.inDebugMode() && delegates.size() > 1) {
			IStatus status = new Status(IStatus.INFO, CoreBundleActivator.getUniqueIdentifier(), "Found multiple persistence delegates for " + context.getClass().getName() + //$NON-NLS-1$
							" (" + context + ")" + (container != null ? " to store in " + container : "")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
			Platform.getLog(CoreBundleActivator.getContext().getBundle()).log(status);
		}

		return delegates.get(0);
	}

	/**
	 * Returns the bound variable delegates for the given persistence delegate.
	 *
	 * @param persistenceDelegate The persistence delegate.
	 * @return The list of bound variable delegates or an empty array.
	 */
	public IVariableDelegate[] getVariableDelegates(IPersistenceDelegate persistenceDelegate) {
		return VariableDelegateExtensionPointManager.getInstance().getDelegates(persistenceDelegate);
	}
}

Back to the top