KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > eclipse > jdt > internal > corext > refactoring > RefactoringElementFilterDescriptor


1 /*******************************************************************************
2  * Copyright (c) 2005, 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.jdt.internal.corext.refactoring;
12
13 import java.util.ArrayList JavaDoc;
14 import java.util.HashSet JavaDoc;
15 import java.util.List JavaDoc;
16 import java.util.Set JavaDoc;
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 /**
36  * Represents a filter which is provided by the
37  * "org.eclipse.jdt.ui.internal_refactoringElementFilter" extension point.
38  *
39  * @since 3.2
40  */

41 public class RefactoringElementFilterDescriptor implements IPluginContribution {
42
43     private static final String JavaDoc EXTENSION_POINT_NAME= "internal_refactoringElementFilter"; //$NON-NLS-1$
44

45     private static final String JavaDoc FILTER_TAG= "filter"; //$NON-NLS-1$
46

47     private static final String JavaDoc ID_ATTRIBUTE= "id"; //$NON-NLS-1$
48
private static final String JavaDoc CLASS_ATTRIBUTE= "class"; //$NON-NLS-1$
49

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 JavaDoc {
69                     filtered[0]= filter.filter(cu);
70                 }
71             });
72             // TODO: disable filter if it throws an exception?
73

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 JavaDoc result= new ArrayList JavaDoc(5);
91         Set JavaDoc descIds= new HashSet JavaDoc(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 JavaDoc {
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"); //$NON-NLS-1$
115
Assert.isNotNull(getId(), "An extension for extension-point org.eclipse.jdt.ui.internal_refactoringElementFilter does not provide a valid ID"); //$NON-NLS-1$
116
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 JavaDoc message= Messages.format(RefactoringCoreMessages.RefactoringElementFilterDescriptor_filterCreationError_message, getId());
127         ISafeRunnable code= new SafeRunnable(message) {
128             public void run() throws Exception JavaDoc {
129                 fRefactoringElementFilter= (RefactoringElementFilter)fElement.createExecutableExtension(CLASS_ATTRIBUTE);
130             }
131             public void handleException(Throwable JavaDoc e) {
132                 fFilterOKToUse= false;
133                 super.handleException(e);
134             }
135         };
136         SafeRunner.run(code);
137         return fRefactoringElementFilter;
138     }
139     
140     /**
141      * @return the filter's id
142      */

143     public String JavaDoc getId() {
144         return fElement.getAttribute(ID_ATTRIBUTE);
145     }
146     
147     /**
148      * @return the filter class
149      */

150     public String JavaDoc getFilterClass() {
151         return fElement.getAttribute(CLASS_ATTRIBUTE);
152     }
153     
154     /*
155      * @see org.eclipse.ui.IPluginContribution#getLocalId()
156      */

157     public String JavaDoc getLocalId() {
158         return fElement.getAttribute(ID_ATTRIBUTE);
159     }
160
161     /*
162      * @see org.eclipse.ui.IPluginContribution#getPluginId()
163      */

164     public String JavaDoc getPluginId() {
165         return fElement.getContributor().getName();
166     }
167 }
168
Popular Tags