1 11 package org.eclipse.jdt.internal.corext.refactoring; 12 13 import java.util.ArrayList ; 14 import java.util.HashSet ; 15 import java.util.List ; 16 import java.util.Set ; 17 18 import org.eclipse.core.runtime.IConfigurationElement; 19 import org.eclipse.core.runtime.IExtensionRegistry; 20 import org.eclipse.core.runtime.ISafeRunnable; 21 import org.eclipse.core.runtime.Platform; 22 import org.eclipse.core.runtime.SafeRunner; 23 24 import org.eclipse.jface.util.Assert; 25 import org.eclipse.jface.util.SafeRunnable; 26 27 import org.eclipse.ui.IPluginContribution; 28 29 import org.eclipse.jdt.core.ICompilationUnit; 30 31 import org.eclipse.jdt.internal.corext.util.Messages; 32 33 import org.eclipse.jdt.ui.JavaUI; 34 35 41 public class RefactoringElementFilterDescriptor implements IPluginContribution { 42 43 private static final String EXTENSION_POINT_NAME= "internal_refactoringElementFilter"; 45 private static final String FILTER_TAG= "filter"; 47 private static final String ID_ATTRIBUTE= "id"; private static final String CLASS_ATTRIBUTE= "class"; 50 private static RefactoringElementFilterDescriptor[] fgFilterDescriptors; 51 52 private IConfigurationElement fElement; 53 private RefactoringElementFilter fRefactoringElementFilter; 54 private boolean fFilterOKToUse; 55 56 public static boolean isFiltered(final ICompilationUnit cu) { 57 if (cu == null) 58 return false; 59 60 RefactoringElementFilterDescriptor[] filterDescriptors= getFilterDescriptors(); 61 for (int i= 0; i < filterDescriptors.length; i++) { 62 final RefactoringElementFilter filter= filterDescriptors[i].getRefactoringElementFilter(); 63 if (filter == null) 64 continue; 65 66 final boolean[] filtered= new boolean[1]; 67 SafeRunner.run(new SafeRunnable() { 68 public void run() throws Exception { 69 filtered[0]= filter.filter(cu); 70 } 71 }); 72 74 if (filtered[0]) 75 return true; 76 } 77 return false; 78 } 79 80 private static RefactoringElementFilterDescriptor[] getFilterDescriptors() { 81 if (fgFilterDescriptors == null) { 82 IExtensionRegistry registry= Platform.getExtensionRegistry(); 83 IConfigurationElement[] elements= registry.getConfigurationElementsFor(JavaUI.ID_PLUGIN, EXTENSION_POINT_NAME); 84 fgFilterDescriptors= createFilterDescriptors(elements); 85 } 86 return fgFilterDescriptors; 87 } 88 89 private static RefactoringElementFilterDescriptor[] createFilterDescriptors(IConfigurationElement[] elements) { 90 List result= new ArrayList (5); 91 Set descIds= new HashSet (5); 92 for (int i= 0; i < elements.length; i++) { 93 final IConfigurationElement element= elements[i]; 94 if (FILTER_TAG.equals(element.getName())) { 95 96 final RefactoringElementFilterDescriptor[] desc= new RefactoringElementFilterDescriptor[1]; 97 SafeRunner.run(new SafeRunnable(RefactoringCoreMessages.RefactoringElementFilterDescriptor_filterDescriptionCreationError_message) { 98 public void run() throws Exception { 99 desc[0]= new RefactoringElementFilterDescriptor(element); 100 } 101 }); 102 103 if (desc[0] != null && !descIds.contains(desc[0].getId())) { 104 result.add(desc[0]); 105 descIds.add(desc[0].getId()); 106 } 107 } 108 } 109 return (RefactoringElementFilterDescriptor[])result.toArray(new RefactoringElementFilterDescriptor[result.size()]); 110 } 111 112 private RefactoringElementFilterDescriptor(IConfigurationElement element) { 113 fElement= element; 114 Assert.isNotNull(getFilterClass(), "An extension for extension-point org.eclipse.jdt.ui.internal_refactoringElementFilter does not specify a valid class"); Assert.isNotNull(getId(), "An extension for extension-point org.eclipse.jdt.ui.internal_refactoringElementFilter does not provide a valid ID"); fFilterOKToUse= true; 117 } 118 119 private RefactoringElementFilter getRefactoringElementFilter() { 120 if (! fFilterOKToUse) 121 return null; 122 123 if (fRefactoringElementFilter != null) 124 return fRefactoringElementFilter; 125 126 String message= Messages.format(RefactoringCoreMessages.RefactoringElementFilterDescriptor_filterCreationError_message, getId()); 127 ISafeRunnable code= new SafeRunnable(message) { 128 public void run() throws Exception { 129 fRefactoringElementFilter= (RefactoringElementFilter)fElement.createExecutableExtension(CLASS_ATTRIBUTE); 130 } 131 public void handleException(Throwable e) { 132 fFilterOKToUse= false; 133 super.handleException(e); 134 } 135 }; 136 SafeRunner.run(code); 137 return fRefactoringElementFilter; 138 } 139 140 143 public String getId() { 144 return fElement.getAttribute(ID_ATTRIBUTE); 145 } 146 147 150 public String getFilterClass() { 151 return fElement.getAttribute(CLASS_ATTRIBUTE); 152 } 153 154 157 public String getLocalId() { 158 return fElement.getAttribute(ID_ATTRIBUTE); 159 } 160 161 164 public String getPluginId() { 165 return fElement.getContributor().getName(); 166 } 167 } 168 | Popular Tags |