1 /*******************************************************************************
2  * Copyright (c) 2000, 2017 IBM Corporation and others.
3  *
4  * This program and the accompanying materials
5  * are made available under the terms of the Eclipse Public License 2.0
6  * which accompanies this distribution, and is available at
7  * https://www.eclipse.org/legal/epl-2.0/
8  *
9  * SPDX-License-Identifier: EPL-2.0
10  *
11  * Contributors:
12  *     IBM Corporation - initial API and implementation
13  *     Wolfgang Schell <ws@jetztgrad.net> - bug 259348
14  *******************************************************************************/
15 package org.eclipse.pde.internal.runtime.registry;
16 
17 import java.util.ArrayList;
18 import java.util.List;
19 import org.eclipse.jface.viewers.ILabelProvider;
20 import org.eclipse.jface.viewers.ITreeContentProvider;
21 import org.eclipse.pde.internal.runtime.registry.model.*;
22 
23 public class RegistryBrowserContentProvider implements ITreeContentProvider {
24 
25 	public boolean isInExtensionSet;
26 
27 	private RegistryBrowser fRegistryBrowser;
28 
RegistryBrowserContentProvider(RegistryBrowser registryBrowser)29 	public RegistryBrowserContentProvider(RegistryBrowser registryBrowser) {
30 		fRegistryBrowser = registryBrowser;
31 	}
32 
33 	@Override
dispose()34 	public void dispose() { // nothing to dispose
35 	}
36 
37 	@Override
getElements(Object element)38 	public Object[] getElements(Object element) {
39 		return getChildren(element);
40 	}
41 
42 	@Override
getChildren(Object element)43 	public Object[] getChildren(Object element) {
44 		if (element instanceof RegistryModel) {
45 			RegistryModel model = (RegistryModel) element;
46 
47 			switch (fRegistryBrowser.getGroupBy()) {
48 				case (RegistryBrowser.BUNDLES) :
49 					return model.getBundles();
50 				case (RegistryBrowser.EXTENSION_REGISTRY) :
51 					return model.getExtensionPoints();
52 				case (RegistryBrowser.SERVICES) :
53 					return model.getServiceNames();
54 			}
55 
56 			return null;
57 		}
58 
59 		if (element instanceof Extension)
60 			return ((Extension) element).getConfigurationElements();
61 
62 		isInExtensionSet = false;
63 		if (element instanceof ExtensionPoint)
64 			return ((ExtensionPoint) element).getExtensions().toArray();
65 
66 		if (element instanceof ConfigurationElement)
67 			return ((ConfigurationElement) element).getElements();
68 
69 		if (element instanceof Bundle) {
70 			if (fRegistryBrowser.getGroupBy() != RegistryBrowser.BUNDLES) // expands only in Bundles mode
71 				return null;
72 
73 			Bundle bundle = (Bundle) element;
74 
75 			List<Object> folders = new ArrayList<>(9);
76 
77 			folders.add(new Attribute(Attribute.F_LOCATION, bundle.getLocation()));
78 			if (bundle.getImports().length > 0)
79 				folders.add(new Folder(Folder.F_IMPORTS, bundle));
80 			if (bundle.getImportedPackages().length > 0)
81 				folders.add(new Folder(Folder.F_IMPORTED_PACKAGES, bundle));
82 			if (bundle.getExportedPackages().length > 0)
83 				folders.add(new Folder(Folder.F_EXPORTED_PACKAGES, bundle));
84 			if (bundle.getLibraries().length > 0)
85 				folders.add(new Folder(Folder.F_LIBRARIES, bundle));
86 			if (bundle.getExtensionPoints().length > 0)
87 				folders.add(new Folder(Folder.F_EXTENSION_POINTS, bundle));
88 			if (bundle.getExtensions().length > 0)
89 				folders.add(new Folder(Folder.F_EXTENSIONS, bundle));
90 			if (bundle.getRegisteredServices().length > 0)
91 				folders.add(new Folder(Folder.F_REGISTERED_SERVICES, bundle));
92 			if (bundle.getServicesInUse().length > 0)
93 				folders.add(new Folder(Folder.F_SERVICES_IN_USE, bundle));
94 			if (bundle.getFragments().length > 0)
95 				folders.add(new Folder(Folder.F_FRAGMENTS, bundle));
96 
97 			return folders.toArray();
98 		}
99 
100 		isInExtensionSet = false;
101 
102 		if (element instanceof Folder) {
103 			Folder folder = (Folder) element;
104 			isInExtensionSet = folder.getId() == Folder.F_EXTENSIONS;
105 			ModelObject[] objs = folder.getChildren();
106 			if (folder.getId() == Folder.F_USING_BUNDLES) {
107 				ModelObject[] result = new ModelObject[objs.length];
108 				ILabelProvider labelProvider = fRegistryBrowser.getAdapter(ILabelProvider.class);
109 
110 				for (int i = 0; i < objs.length; i++) {
111 					result[i] = new Attribute(Attribute.F_BUNDLE, labelProvider.getText(objs[i]));
112 				}
113 
114 				objs = result;
115 			}
116 			return objs;
117 		}
118 		if (element instanceof ConfigurationElement) {
119 			return ((ConfigurationElement) element).getElements();
120 		}
121 
122 		if (element instanceof ExtensionPoint) {
123 			ExtensionPoint extensionPoint = (ExtensionPoint) element;
124 			Object[] objs = extensionPoint.getExtensions().toArray();
125 			return objs;
126 		}
127 
128 		if (element instanceof ServiceName) {
129 			return ((ServiceName) element).getChildren();
130 		}
131 
132 		if (element instanceof ServiceRegistration) {
133 			ServiceRegistration service = (ServiceRegistration) element;
134 
135 			List<Folder> folders = new ArrayList<>();
136 
137 			if (service.getProperties().length > 0)
138 				folders.add(new Folder(Folder.F_PROPERTIES, service));
139 			if (service.getUsingBundleIds().length > 0)
140 				folders.add(new Folder(Folder.F_USING_BUNDLES, service));
141 
142 			return folders.toArray();
143 		}
144 
145 		if (element instanceof Object[]) {
146 			return (Object[]) element;
147 		}
148 
149 		return null;
150 	}
151 
152 	@Override
getParent(Object element)153 	public Object getParent(Object element) {
154 		if (!(element instanceof ModelObject)) {
155 			return null;
156 		}
157 
158 		if (element instanceof Folder) {
159 			return ((Folder) element).getParent();
160 		}
161 
162 		return null;
163 	}
164 
165 	@Override
hasChildren(Object element)166 	public boolean hasChildren(Object element) {
167 		// Bundle and ServiceRegistration always have children
168 		if (element instanceof Bundle)
169 			return true;
170 		if (element instanceof ServiceRegistration)
171 			return true;
172 
173 		Object[] children = getChildren(element);
174 		return children != null && children.length > 0;
175 	}
176 
177 }
178