1 11 12 package org.eclipse.ui; 13 14 import java.util.ArrayList ; 15 import java.util.List ; 16 import java.util.StringTokenizer ; 17 18 import org.eclipse.core.runtime.IAdaptable; 19 import org.eclipse.core.runtime.IAdapterManager; 20 import org.eclipse.core.runtime.IConfigurationElement; 21 import org.eclipse.core.runtime.IExecutableExtension; 22 import org.eclipse.core.runtime.Platform; 23 import org.eclipse.ui.internal.WorkbenchPlugin; 24 import org.osgi.framework.Bundle; 25 import org.osgi.service.packageadmin.ExportedPackage; 26 import org.osgi.service.packageadmin.PackageAdmin; 27 import org.osgi.util.tracker.ServiceTracker; 28 29 53 public final class BasicWorkingSetElementAdapter implements 54 IWorkingSetElementAdapter, IExecutableExtension { 55 56 private class Type { 57 private static final int NONE = 0; 58 private static final int ADAPT = 1; 59 String className; 60 int flags; 61 } 62 63 private Type[] preferredTypes = new Type[0]; 64 65 private ServiceTracker packageTracker; 66 67 89 public IAdaptable[] adaptElements(IWorkingSet ws, IAdaptable[] elements) { 90 List adaptedElements = new ArrayList (); 91 for (int i = 0; i < elements.length; i++) { 92 IAdaptable adaptable = adapt(elements[i]); 93 if (adaptable != null) 94 adaptedElements.add(adaptable); 95 } 96 97 return (IAdaptable[]) adaptedElements 98 .toArray(new IAdaptable[adaptedElements.size()]); 99 } 100 101 110 private IAdaptable adapt(IAdaptable adaptable) { 111 for (int i = 0; i < preferredTypes.length; i++) { 112 IAdaptable adaptedAdaptable = adapt(preferredTypes[i], adaptable); 113 if (adaptedAdaptable != null) 114 return adaptedAdaptable; 115 } 116 return null; 117 } 118 119 129 private IAdaptable adapt(Type type, IAdaptable adaptable) { 130 IAdapterManager adapterManager = Platform.getAdapterManager(); 131 Class [] directClasses = adapterManager.computeClassOrder(adaptable 132 .getClass()); 133 for (int i = 0; i < directClasses.length; i++) { 134 Class clazz = directClasses[i]; 135 if (clazz.getName().equals(type.className)) 136 return adaptable; 137 } 138 139 if ((type.flags & Type.ADAPT) != 0) { 140 Object adapted = adapterManager.getAdapter(adaptable, 141 type.className); 142 if (adapted instanceof IAdaptable) 143 return (IAdaptable) adapted; 144 145 PackageAdmin admin = getPackageAdmin(); 146 if (admin != null) { 147 int lastDot = type.className.lastIndexOf('.'); 148 if (lastDot > 0) { String packageName = type.className.substring(0, lastDot); 150 ExportedPackage[] packages = admin 151 .getExportedPackages(packageName); 152 if (packages != null && packages.length == 1) { 153 if (packages[0].getExportingBundle().getState() == Bundle.ACTIVE) { 157 try { 158 adapted = adaptable.getAdapter(packages[0] 162 .getExportingBundle().loadClass( 163 type.className)); 164 if (adapted instanceof IAdaptable) 165 return (IAdaptable) adapted; 166 167 } catch (ClassNotFoundException e) { 168 WorkbenchPlugin.log(e); 169 } 170 } 171 } 172 } 173 } 174 } 175 return null; 176 } 177 178 183 public void dispose() { 184 if (packageTracker != null) 185 packageTracker.close(); 186 } 187 188 194 public void setInitializationData(IConfigurationElement config, 195 String propertyName, Object data) { 196 197 if (data instanceof String ) { 198 List preferredTypes = new ArrayList (0); 199 for (StringTokenizer toker = new StringTokenizer ((String ) data, ","); toker.hasMoreTokens();) { String classNameAndOptions = toker.nextToken(); 201 Type record = new Type(); 202 parseOptions(classNameAndOptions, record); 203 preferredTypes.add(record); 204 } 205 this.preferredTypes = (Type[]) preferredTypes 206 .toArray(new Type[preferredTypes.size()]); 207 } 208 } 209 210 217 private void parseOptions(String classNameAndOptions, Type record) { 218 for (StringTokenizer toker = new StringTokenizer (classNameAndOptions, 219 ";"); toker.hasMoreTokens();) { String token = toker.nextToken(); 221 if (record.className == null) 222 record.className = token; 223 else { 224 for (StringTokenizer pair = new StringTokenizer (token, "="); pair.hasMoreTokens();) { if (pair.countTokens() == 2) { 226 String param = pair.nextToken(); 227 String value = pair.nextToken(); 228 if ("adapt".equals(param)) { record.flags ^= "true".equals(value) ? Type.ADAPT : Type.NONE; } 231 } 232 } 233 } 234 } 235 } 236 237 243 private PackageAdmin getPackageAdmin() { 244 if (packageTracker == null) { 245 packageTracker = new ServiceTracker(WorkbenchPlugin.getDefault() 246 .getBundleContext(), PackageAdmin.class.getName(), null); 247 packageTracker.open(); 248 } 249 250 return (PackageAdmin) packageTracker.getService(); 251 } 252 } 253 | Popular Tags |