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
|
/*******************************************************************************
* Copyright (c) 2015 IBM Corporation 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:
* IBM Corporation - initial API and implementation
* Lars Vogel <Lars.Vogel@vogella.com> - Bug 478685, 478864
*******************************************************************************/
package org.eclipse.core.runtime;
import org.eclipse.core.internal.runtime.AdapterManager;
/**
* Provides a standard way to request adapters from adaptable objects
*
* @see IAdaptable
* @see IAdapterManager
* @since 3.8
*/
public class Adapters {
/**
* If it is possible to adapt the given object to the given type, this
* returns the adapter. Performs the following checks:
*
* <ol>
* <li>Returns <code>sourceObject</code> if it is an instance of the
* adapter type.</li>
* <li>If sourceObject implements IAdaptable, it is queried for adapters.</li>
* <li>Finally, the adapter manager is consulted for adapters</li>
* </ol>
*
* Otherwise returns null.
*
* @param sourceObject
* object to adapt
* @param adapter
* type to adapt to
* @param allowActivation
* if true, plugins may be activated if necessary to provide the requested adapter.
* if false, the method will return null if they cannot be provided from activated plugins.
* @return a representation of sourceObject that is assignable to the
* adapter type, or null if no such representation exists
*/
@SuppressWarnings("unchecked")
public static <T> T adapt(Object sourceObject, Class<T> adapter, boolean allowActivation) {
if (sourceObject == null) {
return null;
}
if (adapter.isInstance(sourceObject)) {
return (T) sourceObject;
}
if (sourceObject instanceof IAdaptable) {
IAdaptable adaptable = (IAdaptable) sourceObject;
Object result = adaptable.getAdapter(adapter);
if (result != null) {
// Sanity-check
Assert.isTrue(adapter.isInstance(result));
return (T) result;
}
}
// If the source object is a platform object then it's already tried calling AdapterManager.getAdapter,
// so there's no need to try it again.
if ((sourceObject instanceof PlatformObject) && !allowActivation) {
return null;
}
String adapterId = adapter.getName();
Object result = queryAdapterManager(sourceObject, adapterId, allowActivation);
if (result != null) {
// Sanity-check
Assert.isTrue(adapter.isInstance(result));
return (T) result;
}
return null;
}
/**
* Temporary method for the transition during the I-builds
*
* Planned to be deleted after the transition
*
* @noreference
*/
public static <T> T getAdapter(Object sourceObject, Class<T> adapter, boolean allowActivation) {
return adapt(sourceObject, adapter, allowActivation);
}
/**
* If it is possible to adapt the given object to the given type, this
* returns the adapter.
* <p>
* Convenient method for calling <code>adapt(Object, Class, true)</code>.
* <p>
* See {@link #adapt(Object, Class, boolean)}.
*
*/
public static <T> T adapt(Object sourceObject, Class<T> adapter) {
return adapt(sourceObject, adapter, true);
}
private static Object queryAdapterManager(Object sourceObject, String adapterId, boolean allowActivation) {
Object result;
if (allowActivation) {
result = AdapterManager.getDefault().loadAdapter(sourceObject, adapterId);
} else {
result = AdapterManager.getDefault().getAdapter(sourceObject, adapterId);
}
return result;
}
}
|