Skip to main content
summaryrefslogtreecommitdiffstats
blob: d9f700ee4ab82a49012e9f49bc96af7e26bae75e (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
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
/*******************************************************************************
 * Copyright (c) 2000, 2006 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
 *******************************************************************************/
package org.eclipse.core.runtime;

import org.eclipse.core.runtime.CoreException;

/**
 * A configuration element, with its attributes and children, 
 * directly reflects the content and structure of the extension section
 * within the declaring plug-in's manifest (<code>plugin.xml</code>) file.
 * <p>
 * This interface also provides a way to create executable extension
 * objects.
 * </p>
 * <p>
 * These registry objects are intended for relatively short-term use. Clients that 
 * deal with these objects must be aware that they may become invalid if the 
 * declaring plug-in is updated or uninstalled. If this happens, all methods except
 * {@link #isValid()} will throw {@link InvalidRegistryObjectException}.
 * For configuration element objects, the most common case is code in a plug-in dealing
 * with extensions contributed to one of the extension points it declares.
 * Code in a plug-in that has declared that it is not dynamic aware (or not
 * declared anything) can safely ignore this issue, since the registry
 * would not be modified while it is active. However, code in a plug-in that
 * declares that it is dynamic aware must be careful when accessing the extension
 * and configuration element objects because they become invalid if the contributing
 * plug-in is removed. Similarly, tools that analyze or display the extension registry
 * are vulnerable. Client code can pre-test for invalid objects by calling {@link #isValid()},
 * which never throws this exception. However, pre-tests are usually not sufficient
 * because of the possibility of the extension or configuration element object becoming
 * invalid as a result of a concurrent activity. At-risk clients must treat 
 * <code>InvalidRegistryObjectException</code> as if it were a checked exception.
 * Also, such clients should probably register a listener with the extension registry
 * so that they receive notification of any changes to the registry.
 * </p>
 * <p>
 * This interface is not intended to be implemented by clients.
 * </p>
 */
public interface IConfigurationElement {
	/**
	 * Creates and returns a new instance of the executable extension 
	 * identified by the named attribute of this configuration element.
	 * The named attribute value must contain a fully qualified name
	 * of a Java class. The class can either refer to a class implementing 
	 * the executable extension or to a factory capable of returning the 
	 * executable extension.
	 * <p>
	 * The specified class is instantiated using its 0-argument public constructor.
	 * <p>
	 * Then the following checks are done:<br>
	 * If the specified class implements the {@link IExecutableExtension} 
	 * interface, the method {@link IExecutableExtension#setInitializationData(IConfigurationElement, String, Object)} 
	 * is called, passing to the object the configuration information that was used to create it. 
	 * <p>
	 * If the specified class implements {@link IExecutableExtensionFactory} 
	 * interface, the method {@link IExecutableExtensionFactory#create()} 
	 * is invoked.
	 * </p>
	 * <p>
	 * Unlike other methods on this object, invoking this method may activate 
	 * the plug-in.
	 * </p>
	 *
	 * @param propertyName the name of the property
	 * @return the executable instance
	 * @exception CoreException if an instance of the executable extension
	 *   could not be created for any reason
	 * @see IExecutableExtension#setInitializationData(IConfigurationElement, String, Object)
	 * @see IExecutableExtensionFactory
	 * @throws InvalidRegistryObjectException if this configuration element is no longer valid
	 */
	public Object createExecutableExtension(String propertyName) throws CoreException;

	/**
	 * Returns the named attribute of this configuration element, or
	 * <code>null</code> if none. 
	 * <p>
	 * The names of configuration element attributes
	 * are the same as the attribute names of the corresponding XML element.
	 * For example, the configuration markup 
	 * <pre>
	 * &lt;bg pattern="stripes"/&gt;
	 * </pre>
	 * corresponds to a configuration element named <code>"bg"</code>
	 * with an attribute named <code>"pattern"</code>
	 * with attribute value <code>"stripes"</code>.
	 * </p>
	 * <p> Note that any translation specified in the plug-in manifest
	 * file is automatically applied.
	 * </p>
	 *
	 * @param name the name of the attribute
	 * @return attribute value, or <code>null</code> if none
	 * @throws InvalidRegistryObjectException if this configuration element is no longer valid
	 */
	public String getAttribute(String name) throws InvalidRegistryObjectException;

	/**
	 * Returns the named attribute of this configuration element, or
	 * <code>null</code> if none. 
	 * <p>
	 * The names of configuration element attributes
	 * are the same as the attribute names of the corresponding XML element.
	 * For example, the configuration markup 
	 * <pre>
	 * &lt;bg pattern="stripes"/&gt;
	 * </pre>
	 * corresponds to a configuration element named <code>"bg"</code>
	 * with an attribute named <code>"pattern"</code>
	 * with attribute value <code>"stripes"</code>.
	 * </p>
	 * <p>
	 * Note that any translation specified in the plug-in manifest
	 * file for this attribute is <b>not</b> automatically applied.
	 * </p>
	 *
	 * @param name the name of the attribute
	 * @return attribute value, or <code>null</code> if none
	 * @throws InvalidRegistryObjectException if this configuration element is no longer valid
	 * @deprecated The method is equivalent to the {@link #getAttribute(String)}. Contrary to its description,
	 * this method returns a translated value. Use the {@link #getAttribute(String)} method instead.
	 */
	public String getAttributeAsIs(String name) throws InvalidRegistryObjectException;

	/**
	 * Returns the names of the attributes of this configuration element.
	 * Returns an empty array if this configuration element has no attributes.
	 * <p>
	 * The names of configuration element attributes
	 * are the same as the attribute names of the corresponding XML element.
	 * For example, the configuration markup 
	 * <pre>
	 * &lt;bg color="blue" pattern="stripes"/&gt;
	 * </pre>
	 * corresponds to a configuration element named <code>"bg"</code>
	 * with attributes named <code>"color"</code>
	 * and <code>"pattern"</code>.
	 * </p>
	 *
	 * @return the names of the attributes 
	 * @throws InvalidRegistryObjectException if this configuration element is no longer valid
	 */
	public String[] getAttributeNames() throws InvalidRegistryObjectException;

	/**
	 * Returns all configuration elements that are children of this
	 * configuration element. 
	 * Returns an empty array if this configuration element has no children.
	 * <p>
	 * Each child corresponds to a nested
	 * XML element in the configuration markup.
	 * For example, the configuration markup 
	 * <pre>
	 * &lt;view&gt;
	 * &nbsp&nbsp&nbsp&nbsp&lt;verticalHint&gt;top&lt;/verticalHint&gt;
	 * &nbsp&nbsp&nbsp&nbsp&lt;horizontalHint&gt;left&lt;/horizontalHint&gt;
	 * &lt;/view&gt;
	 * </pre>
	 * corresponds to a configuration element, named <code>"view"</code>,
	 * with two children.
	 * </p>
	 *
	 * @return the child configuration elements
	 * @throws InvalidRegistryObjectException if this configuration element is no longer valid
	 * @see #getChildren(String)
	 */
	public IConfigurationElement[] getChildren() throws InvalidRegistryObjectException;

	/**
	 * Returns all child configuration elements with the given name. 
	 * Returns an empty array if this configuration element has no children
	 * with the given name.
	 *
	 * @param name the name of the child configuration element
	 * @return the child configuration elements with that name
	 * @throws InvalidRegistryObjectException if this configuration element is no longer valid
	 * @see #getChildren()
	 */
	public IConfigurationElement[] getChildren(String name) throws InvalidRegistryObjectException;

	/** 
	 * Returns the extension that declares this configuration element.
	 *
	 * @return the extension
	 * @throws InvalidRegistryObjectException if this configuration element is no longer valid
	 */
	public IExtension getDeclaringExtension() throws InvalidRegistryObjectException;

	/**
	 * Returns the name of this configuration element. 
	 * The name of a configuration element is the same as
	 * the XML tag of the corresponding XML element. 
	 * For example, the configuration markup 
	 * <pre>
	 * &lt;wizard name="Create Project"/&gt; 
	 * </pre>
	 * corresponds to a configuration element named <code>"wizard"</code>.
	 *
	 * @return the name of this configuration element
	 * @throws InvalidRegistryObjectException if this configuration element is no longer valid
	 */
	public String getName() throws InvalidRegistryObjectException;

	/**
	 * Returns the element which contains this element.  If this element
	 * is an immediate child of an extension, the
	 * returned value can be downcast to <code>IExtension</code>.
	 * Otherwise the returned value can be downcast to 
	 * <code>IConfigurationElement</code>.
	 *
	 * @return the parent of this configuration element
	 *  or <code>null</code>
	 * @throws InvalidRegistryObjectException if this configuration element is no longer valid
	 * @since 3.0
	 */
	public Object getParent() throws InvalidRegistryObjectException;

	/**
	 * Returns the text value of this configuration element.
	 * For example, the configuration markup 
	 * <pre>
	 * &lt;script lang="javascript"&gt;.\scripts\cp.js&lt;/script&gt;
	 * </pre>
	 * corresponds to a configuration element <code>"script"</code>
	 * with value <code>".\scripts\cp.js"</code>.
	 * <p> Values may span multiple lines (i.e., contain carriage returns
	 * and/or line feeds).
	 * <p> Note that any translation specified in the plug-in manifest
	 * file is automatically applied.
	 * </p>
	 *
	 * @return the text value of this configuration element or <code>null</code>
	 * @throws InvalidRegistryObjectException if this configuration element is no longer valid
	 */
	public String getValue() throws InvalidRegistryObjectException;

	/**
	 * Returns the untranslated text value of this configuration element.
	 * For example, the configuration markup 
	 * <pre>
	 * &lt;script lang="javascript"&gt;.\scripts\cp.js&lt;/script&gt;
	 * </pre>
	 * corresponds to a configuration element <code>"script"</code>
	 * with value <code>".\scripts\cp.js"</code>.
	 * <p> Values may span multiple lines (i.e., contain carriage returns
	 * and/or line feeds).
	 * <p>
	 * Note that translation specified in the plug-in manifest
	 * file is <b>not</b> automatically applied.
	 * For example, the configuration markup 
	 * <pre>
	 * &lt;tooltip&gt;#hattip&lt;/tooltip&gt;
	 * </pre>
	 * corresponds to a configuration element, named <code>"tooltip"</code>,
	 * with value <code>"#hattip"</code>.
	 * </p>
	 *
	 * @return the untranslated text value of this configuration element or <code>null</code>
	 * @throws InvalidRegistryObjectException if this configuration element is no longer valid
	 * @deprecated The method is equivalent to the {@link #getValue()}. Contrary to its description,
	 * this method returns a translated value. Use the {@link #getValue()} method instead.
	 */
	public String getValueAsIs() throws InvalidRegistryObjectException;

	/**
	 * Returns the namespace for this configuration element. This value can be used
	 * in various global facilities to discover this configuration element's contributor.
	 * 
	 * @return the namespace for this configuration element
	 * @throws InvalidRegistryObjectException if this configuration element is no longer valid
	 * @see IExtensionRegistry
	 * @since 3.1
	 * @deprecated As namespace is no longer restricted to the contributor name, 
	 * 	use {@link #getNamespaceIdentifier()} to obtain namespace name or {@link #getContributor()}
	 * 	to get the name of the contributor of this registry element.
	 * <p>
	 * In the past namespace was dictated by the name of the bundle. If bundle <code>org.abc</code> 
	 * contributed registry element with Id of <code>MyId</code>, the namespace of 
	 * the element was always set to <code>org.abc</code>, producing the qualified name of 
	 * <code>org.abc.MyId</code>.
	 * </p><p>
	 * The namespace used to be the same as the bundle name. As a result, the {@link #getNamespace()} 
	 * method was used both to obtain the name of the bundle and to obtain the namespace of a registry 
	 * element.
	 * </p><p>
	 * Since 3.2, the extension registry allows elements to specify qualified name. The extension point 
	 * of the plug-in <code>org.abc</code> could specify <code>org.zzz.MyExtPoint</code> as 
	 * an Id. In this case, namespace name is <code>org.zzz</code>, but the contributor 
	 * name is <code>org.abc</code>.  
	 * </p><p>
	 * (The use of a simple Id is still a preferred way. Whenever possible, specify only the simple 
	 * Id and let runtime take care of the rest.)
	 * </p><p>
	 * If your code used the {@link #getNamespace()} to obtain the name of the contributing bundle, 
	 * use {@link #getContributor()}. The typical usage pattern here is to find a bundle name to obtain 
	 * some information from the corresponding OSGi bundle. For example, deducing the file location 
	 * specified as a relative path to the bundle install location would fall into this group.
	 * </p><p>
	 * If your code used the {@link #getNamespace()} to obtain the namespace of the registry element, 
	 * use {@link #getNamespaceIdentifier()}. Typically, this is the case when code is trying to process 
	 * registry elements belonging to some logical group. For example, processing notifications for all 
	 * elements belonging to the <code>org.abc</code> namespace would fall into this category.
	 * </p>
	 */
	public String getNamespace() throws InvalidRegistryObjectException;

	/**
	 * Returns the namespace name for this configuration element.
	 * 
	 * @return the namespace name for this configuration element
	 * @throws InvalidRegistryObjectException if this configuration element is no longer valid
	 * @since org.eclipse.equinox.registry 3.2	 
	 */
	public String getNamespaceIdentifier() throws InvalidRegistryObjectException;

	/**
	 * Returns the contributor of this configuration element.
	 * 
	 * @return the contributor for this configuration element
	 * @throws InvalidRegistryObjectException if this configuration element is no longer valid
	 * @since org.eclipse.equinox.registry 3.2	 
	 */
	public IContributor getContributor() throws InvalidRegistryObjectException;

	/* (non-javadoc) 
	 * @see Object#equals(java.lang.Object)
	 */
	public boolean equals(Object o);

	/**
	 * Returns whether this configuration element object is valid.
	 * 
	 * @return <code>true</code> if the object is valid, and <code>false</code>
	 * if it is no longer valid
	 * @since 3.1
	 */
	public boolean isValid();
}

Back to the top