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