Project

General

Profile

Download (8.63 KB) Statistics
| Branch: | Tag: | Revision:
1
/*******************************************************************************
2
 * Copyright (c) 2000, 2006 IBM Corporation and others.
3
 * All rights reserved. This program and the accompanying materials
4
 * are made available under the terms of the Eclipse Public License v1.0
5
 * which accompanies this distribution, and is available at
6
 * http://www.eclipse.org/legal/epl-v10.html
7
 *
8
 * Contributors:
9
 *     IBM Corporation - initial API and implementation
10
 *******************************************************************************/
11
package org.eclipse.pde.internal.runtime.registry;
12
import java.util.ArrayList;
13
import java.util.Hashtable;
14

    
15
import org.eclipse.core.runtime.IConfigurationElement;
16
import org.eclipse.core.runtime.Platform;
17
import org.eclipse.jface.viewers.ITreeContentProvider;
18
import org.eclipse.jface.viewers.TreeViewer;
19
import org.eclipse.jface.viewers.Viewer;
20
import org.eclipse.osgi.util.ManifestElement;
21
import org.eclipse.osgi.util.NLS;
22
import org.eclipse.pde.internal.runtime.PDERuntimeMessages;
23
import org.osgi.framework.Bundle;
24
import org.osgi.framework.BundleException;
25
import org.osgi.framework.Constants;
26

    
27
public class RegistryBrowserContentProvider implements ITreeContentProvider {
28
	private Hashtable fPluginMap = new Hashtable();
29
	private boolean fShowRunning;
30
	public boolean isInExtensionSet;
31
	private TreeViewer fViewer;
32
	private int fPluginsTotal;
33
	
34
	class BundleFolder implements IBundleFolder {
35
		private int id;
36
		private Bundle bundle;
37
		public BundleFolder(Bundle pd, int id) {
38
			this.bundle = pd;
39
			this.id = id;
40
		}
41
		public Bundle getBundle() {
42
			return bundle;
43
		}
44
		public Object[] getChildren() {
45
			return getFolderChildren(bundle, id);
46
		}
47
		public int getFolderId() {
48
			return id;
49
		}
50
		public Object getAdapter(Class key) {
51
			return null;
52
		}
53
	}
54
	
55
	class BundlePrerequisite implements IBundlePrerequisite {
56
		private ManifestElement underlyingElement;
57
		public BundlePrerequisite(ManifestElement element) {
58
			underlyingElement = element;
59
		}
60
		public ManifestElement getPrerequisite() {
61
			return underlyingElement;
62
		}
63
		public boolean isExported() {
64
			String visibility = underlyingElement.getDirective(Constants.VISIBILITY_DIRECTIVE);
65
			return Constants.VISIBILITY_REEXPORT.equals(visibility);
66
		}
67
		public String getLabel() {
68
			String version = underlyingElement.getAttribute(Constants.BUNDLE_VERSION_ATTRIBUTE);
69
			String value = underlyingElement.getValue();
70
			if (version == null)
71
				return value;
72
			if (Character.isDigit(version.charAt(0)))
73
				version = '(' + version + ')';
74
			return value + ' ' + version;
75
		}
76
	}
77
	
78
	class BundleLibrary implements IBundleLibrary {
79
		private ManifestElement underlyingElement;
80
		public BundleLibrary(ManifestElement element) {
81
			underlyingElement = element;
82
		}
83
		public String getLibrary() {
84
			return underlyingElement.getValue();
85
		}
86
	}
87
	
88
	public RegistryBrowserContentProvider(TreeViewer viewer, boolean showRunning){
89
		super();
90
		this.fViewer = viewer;
91
		this.fShowRunning = showRunning;
92
		this.fPluginsTotal = 0;
93
	}
94
	
95
	protected PluginObjectAdapter createAdapter(Object object, int id) {
96
		if (id == IBundleFolder.F_EXTENSIONS)
97
			return new ExtensionAdapter(object);
98
		if (id == IBundleFolder.F_EXTENSION_POINTS)
99
			return new ExtensionPointAdapter(object);
100
		return new PluginObjectAdapter(object);
101
	}
102
	protected Object[] createPluginFolders(Bundle bundle) {
103
		Object[] array = new Object[5];
104
		array[0] = new BundleFolder(bundle, IBundleFolder.F_LOCATION);
105
		array[1] = new BundleFolder(bundle, IBundleFolder.F_IMPORTS);
106
		array[2] = new BundleFolder(bundle, IBundleFolder.F_LIBRARIES);
107
		array[3] = new BundleFolder(bundle, IBundleFolder.F_EXTENSION_POINTS);
108
		array[4] = new BundleFolder(bundle, IBundleFolder.F_EXTENSIONS);
109
		return array;
110
	}
111
	
112
	public void dispose() { }
113
	
114
	public Object[] getElements(Object element) {
115
		return getChildren(element);
116
	}
117
	
118
	public Object[] getChildren(Object element) {
119
		if (element == null)
120
			return null;
121
		
122
		if (element instanceof ExtensionAdapter)
123
			return ((ExtensionAdapter) element).getChildren();
124
		
125
		isInExtensionSet = false;
126
		if (element instanceof ExtensionPointAdapter)
127
			return ((ExtensionPointAdapter) element).getChildren();
128
		
129
		if (element instanceof ConfigurationElementAdapter)
130
			return ((ConfigurationElementAdapter) element).getChildren();
131
		
132
		if (element instanceof PluginObjectAdapter)
133
			element = ((PluginObjectAdapter) element).getObject();
134
		
135
		if (element instanceof Bundle) {
136
			Bundle bundle = (Bundle) element;
137
			Object[] folders = (Object[]) fPluginMap.get(bundle.getSymbolicName());
138
			if (folders == null) {
139
				folders = createPluginFolders(bundle);
140
				fPluginMap.put(bundle.getSymbolicName(), folders);
141
			} else {
142
				ArrayList folderList = new ArrayList();
143
				for (int i = 0; i < folders.length; i++) {
144
					if (folders[i] != null
145
							&& ((IBundleFolder)folders[i]).getChildren() != null
146
							|| ((IBundleFolder)folders[i]).getFolderId() == IBundleFolder.F_LOCATION)
147
						folderList.add(folders[i]);
148
				}
149
				folders = folderList.toArray(new Object[folderList.size()]);
150
			}
151
			return folders;
152
		}
153
		if (element instanceof IBundleFolder) {
154
			IBundleFolder folder = (IBundleFolder) element;
155
			isInExtensionSet = folder.getFolderId() == IBundleFolder.F_EXTENSIONS;
156
			return ((IBundleFolder) element).getChildren();
157
		}
158
		if (element instanceof IConfigurationElement) {
159
			return ((IConfigurationElement) element).getChildren();
160
		}
161
		if (element instanceof Bundle[]) {
162
			PluginObjectAdapter[] bundles = getPlugins((Bundle[])element);
163
			fPluginsTotal = bundles.length;
164
			
165
			if (fShowRunning){
166
				ArrayList resultList = new ArrayList();
167
				for (int i = 0; i < bundles.length; i++)
168
					if (bundles[i].getObject() instanceof Bundle &&
169
							((Bundle)bundles[i].getObject()).getState() == Bundle.ACTIVE)
170
						resultList.add(bundles[i]);
171
				return resultList.toArray(new Object[resultList.size()]);
172
			}
173
			return bundles;
174
		}
175
		return null;
176
	}
177

    
178
	public PluginObjectAdapter[] getPlugins(Bundle[] bundles) {
179
		ArrayList list = new ArrayList();
180
		for (int i = 0; i < bundles.length; i++)
181
			if (bundles[i].getHeaders().get(Constants.FRAGMENT_HOST) == null)
182
				list.add(new PluginObjectAdapter(bundles[i]));
183
		return (PluginObjectAdapter[]) list.toArray(new PluginObjectAdapter[list.size()]);
184
	}
185
	private Object[] getFolderChildren(Bundle bundle, int id) {
186
		Object[] array = null;
187
		String bundleId = bundle.getSymbolicName();
188
		switch (id) {
189
			case IBundleFolder.F_EXTENSIONS :
190
				array = Platform.getExtensionRegistry().getExtensions(bundleId);
191
				break;
192
			case IBundleFolder.F_EXTENSION_POINTS :
193
				array = Platform.getExtensionRegistry().getExtensionPoints(bundleId);
194
				break;
195
			case IBundleFolder.F_IMPORTS :
196
				array = getManifestHeaderArray(bundle, Constants.REQUIRE_BUNDLE);
197
				break;
198
			case IBundleFolder.F_LIBRARIES :
199
				array = getManifestHeaderArray(bundle, Constants.BUNDLE_CLASSPATH);
200
				break;
201
		}
202
		Object[] result = null;
203
		if (array != null && array.length > 0) {
204
			result = new Object[array.length];
205
			for (int i = 0; i < array.length; i++) {
206
				result[i] = createAdapter(array[i], id);
207
			}
208
		}
209
		return result;
210
	}
211
	public Object getParent(Object element) {
212
		return null;
213
	}
214
	public boolean hasChildren(Object element) {
215
		Object[] children = getChildren(element);
216
		return children != null && children.length > 0;
217
	}
218
	public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
219
	}
220
	public void setShowRunning(boolean showRunning){
221
		this.fShowRunning = showRunning;
222
	}
223
	public boolean isShowRunning(){
224
		return fShowRunning;
225
	}
226
	
227
	public String getTitleSummary(){
228
		if (fViewer == null || fViewer.getTree() == null)
229
			return NLS.bind(PDERuntimeMessages.get().RegistryView_titleSummary, (new String[] {"0", "0"})); //$NON-NLS-1$ //$NON-NLS-2$
230
		
231
		return NLS.bind(PDERuntimeMessages.get().RegistryView_titleSummary, (new String[] {new Integer(fViewer.getTree().getItemCount()).toString(), new Integer(fPluginsTotal).toString()}));
232
	}
233
	
234
	private Object[] getManifestHeaderArray(Bundle bundle, String headerKey) {
235
		String libraries = (String)bundle.getHeaders().get(headerKey);
236
		try {
237
			ManifestElement[] elements = ManifestElement.parseHeader(headerKey, libraries);
238
			if (elements == null)
239
				return null;
240
			if (headerKey.equals(Constants.BUNDLE_CLASSPATH)) {
241
				IBundleLibrary[] array = new IBundleLibrary[elements.length];
242
				for (int i = 0; i < elements.length; i++) 
243
					array[i] = new BundleLibrary(elements[i]);
244
				return array;
245
			} else if (headerKey.equals(Constants.REQUIRE_BUNDLE)) {
246
				IBundlePrerequisite[] array = new IBundlePrerequisite[elements.length];
247
				for (int i = 0; i < elements.length; i++) 
248
					array[i] = new BundlePrerequisite(elements[i]);
249
				return array;
250
			}
251
		} catch (BundleException e) {
252
		}
253
		return null;
254
	}
255
	
256
}
(12-12/14)