Some Eclipse Foundation services are deprecated, or will be soon. Please ensure you've read this important communication.
View | Details | Raw Unified | Return to bug 260459 | Differences between
and this patch

Collapse All | Expand All

(-)META-INF/MANIFEST.MF (-2 / +7 lines)
Lines 49-55 Link Here
49
 org.eclipse.jst.j2ee.project.facet,
49
 org.eclipse.jst.j2ee.project.facet,
50
 org.eclipse.jst.j2ee.refactor,
50
 org.eclipse.jst.j2ee.refactor,
51
 org.eclipse.jst.j2ee.refactor.listeners,
51
 org.eclipse.jst.j2ee.refactor.listeners,
52
 org.eclipse.jst.j2ee.refactor.operations
52
 org.eclipse.jst.j2ee.refactor.operations,
53
 org.eclipse.jst.javaee.ltk.core.change,
54
 org.eclipse.jst.javaee.ltk.core.descriptor,
55
 org.eclipse.jst.javaee.ltk.core.nls,
56
 org.eclipse.jst.javaee.ltk.core.participant
53
Require-Bundle: org.eclipse.emf.edit;bundle-version="[2.2.0,3.0.0)",
57
Require-Bundle: org.eclipse.emf.edit;bundle-version="[2.2.0,3.0.0)",
54
 org.eclipse.jem.workbench;bundle-version="[2.0.0,3.0.0)",
58
 org.eclipse.jem.workbench;bundle-version="[2.0.0,3.0.0)",
55
 org.eclipse.jst.j2ee.core;bundle-version="[1.1.0,1.2.0)",
59
 org.eclipse.jst.j2ee.core;bundle-version="[1.1.0,1.2.0)",
Lines 81-86 Link Here
81
 org.eclipse.wst.common.environment;bundle-version="[1.0.100,1.1.0)",
85
 org.eclipse.wst.common.environment;bundle-version="[1.0.100,1.1.0)",
82
 org.eclipse.core.expressions;bundle-version="[3.4.0,4.0.0)",
86
 org.eclipse.core.expressions;bundle-version="[3.4.0,4.0.0)",
83
 org.eclipse.core.commands;bundle-version="[3.4.0,4.0.0)",
87
 org.eclipse.core.commands;bundle-version="[3.4.0,4.0.0)",
84
 org.eclipse.core.filesystem;bundle-version="[1.2.0,2.0.0)"
88
 org.eclipse.core.filesystem;bundle-version="[1.2.0,2.0.0)",
89
 org.eclipse.ltk.core.refactoring;bundle-version="3.4.1"
85
Eclipse-LazyStart: true
90
Eclipse-LazyStart: true
86
Bundle-RequiredExecutionEnvironment: J2SE-1.5
91
Bundle-RequiredExecutionEnvironment: J2SE-1.5
(-)build.properties (-1 / +2 lines)
Lines 29-35 Link Here
29
           property_files/,\
29
           property_files/,\
30
           refactor/,\
30
           refactor/,\
31
           classpathdep/,\
31
           classpathdep/,\
32
           contenttype/
32
           contenttype/,\
33
           ltkbasedrefactoring/
33
jars.compile.order = .
34
jars.compile.order = .
34
src.includes = rose/,\
35
src.includes = rose/,\
35
               schema/,\
36
               schema/,\
(-)plugin.xml (+10 lines)
Lines 763-766 Link Here
763
	</propertyTester>
763
	</propertyTester>
764
  </extension>
764
  </extension>
765
  
765
  
766
  <extension
767
         point="org.eclipse.ltk.core.refactoring.deleteParticipants">
768
      <deleteParticipant
769
            class="org.eclipse.jst.javaee.ltk.core.participant.JavaEERefactoringParticipant"
770
            id="JavaEERefactoringParticipant"
771
            name="JavaEERefactoringParticipant">
772
         <enablement></enablement>
773
      </deleteParticipant>
774
   </extension>
775
  
766
</plugin>
776
</plugin>
(-)j2eeplugin/org/eclipse/jst/j2ee/internal/plugin/J2EEPlugin.java (-3 / +3 lines)
Lines 518-531 Link Here
518
		final ProjectRefactoringListener listener = new ProjectRefactoringListener();//ProjectDependencyCache.getCache());
518
		final ProjectRefactoringListener listener = new ProjectRefactoringListener();//ProjectDependencyCache.getCache());
519
		// register the project rename/delete refactoring listener
519
		// register the project rename/delete refactoring listener
520
		ResourcesPlugin.getWorkspace().addResourceChangeListener(listener,
520
		ResourcesPlugin.getWorkspace().addResourceChangeListener(listener,
521
				IResourceChangeEvent.POST_CHANGE | IResourceChangeEvent.PRE_DELETE);
521
				IResourceChangeEvent.POST_CHANGE );
522
		
522
		
523
		// register the IElementChangedLister that updates the .component file in 
523
		// register the IElementChangedLister that updates the .component file in 
524
		// response to .classpath changes
524
		// response to .classpath changes
525
		JavaCore.addElementChangedListener(new J2EEElementChangedListener(), ElementChangedEvent.POST_CHANGE);
525
		JavaCore.addElementChangedListener(new J2EEElementChangedListener(), ElementChangedEvent.POST_CHANGE);
526
		
526
		
527
		ResourcesPlugin.getWorkspace().addResourceChangeListener(J2EEComponentClasspathUpdater.getInstance(), IResourceChangeEvent.POST_CHANGE | IResourceChangeEvent.PRE_CLOSE | IResourceChangeEvent.PRE_DELETE);
527
		ResourcesPlugin.getWorkspace().addResourceChangeListener(J2EEComponentClasspathUpdater.getInstance(), IResourceChangeEvent.POST_CHANGE | IResourceChangeEvent.PRE_CLOSE);
528
		ResourcesPlugin.getWorkspace().addResourceChangeListener(J2EEDependencyListener.INSTANCE, IResourceChangeEvent.POST_CHANGE | IResourceChangeEvent.PRE_CLOSE | IResourceChangeEvent.PRE_DELETE);
528
		ResourcesPlugin.getWorkspace().addResourceChangeListener(J2EEDependencyListener.INSTANCE, IResourceChangeEvent.POST_CHANGE | IResourceChangeEvent.PRE_CLOSE);
529
	}
529
	}
530
	
530
	
531
	public void stop(BundleContext context) throws Exception {
531
	public void stop(BundleContext context) throws Exception {
(-)ltkbasedrefactoring/org/eclipse/jst/javaee/ltk/core/change/NonEARModuleReferenceRemoveChange.java (+341 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008, 2009 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
12
package org.eclipse.jst.javaee.ltk.core.change;
13
14
import java.util.ArrayList;
15
import java.util.List;
16
import java.util.Properties;
17
import java.util.concurrent.ExecutionException;
18
19
import org.eclipse.core.resources.IFile;
20
import org.eclipse.core.resources.IProject;
21
import org.eclipse.core.runtime.CoreException;
22
import org.eclipse.core.runtime.IPath;
23
import org.eclipse.core.runtime.IProgressMonitor;
24
import org.eclipse.core.runtime.NullProgressMonitor;
25
import org.eclipse.core.runtime.OperationCanceledException;
26
import org.eclipse.core.runtime.Path;
27
import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
28
import org.eclipse.jst.j2ee.application.internal.operations.UpdateManifestDataModelProperties;
29
import org.eclipse.jst.j2ee.application.internal.operations.UpdateManifestDataModelProvider;
30
import org.eclipse.jst.j2ee.commonarchivecore.internal.helpers.ArchiveManifest;
31
import org.eclipse.jst.j2ee.internal.J2EEConstants;
32
import org.eclipse.jst.j2ee.internal.common.CreationConstants;
33
import org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin;
34
import org.eclipse.jst.j2ee.internal.project.J2EEProjectUtilities;
35
import org.eclipse.jst.j2ee.model.IModelProvider;
36
import org.eclipse.jst.j2ee.model.ModelProviderManager;
37
import org.eclipse.jst.j2ee.project.JavaEEProjectUtilities;
38
import org.eclipse.jst.javaee.ltk.core.nls.RefactoringResourceHandler;
39
import org.eclipse.ltk.core.refactoring.Change;
40
import org.eclipse.ltk.core.refactoring.ChangeDescriptor;
41
import org.eclipse.ltk.core.refactoring.RefactoringStatus;
42
import org.eclipse.osgi.util.NLS;
43
import org.eclipse.wst.common.componentcore.ComponentCore;
44
import org.eclipse.wst.common.componentcore.internal.resources.VirtualComponent;
45
import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
46
import org.eclipse.wst.common.componentcore.resources.IVirtualFile;
47
import org.eclipse.wst.common.componentcore.resources.IVirtualReference;
48
import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
49
import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
50
51
52
public class NonEARModuleReferenceRemoveChange extends Change {
53
54
	
55
	public NonEARModuleReferenceRemoveChange(IProject referencingEARProject, IProject projectToRemove) {
56
		super();
57
		this.referencingModuleProject = referencingEARProject;
58
		this.projectToRemove = projectToRemove;
59
		this.referencingModuleProjectComp = (VirtualComponent)ComponentCore.createComponent(referencingEARProject);
60
		cachedRefs = referencingModuleProjectComp.getReferences();
61
		this.projectToRemoveComp = ComponentCore.createComponent(projectToRemove);
62
	}
63
	
64
	IProject referencingModuleProject = null;
65
	VirtualComponent referencingModuleProjectComp = null;
66
	IProject projectToRemove = null;
67
	IVirtualComponent projectToRemoveComp = null;
68
	IVirtualReference[] cachedRefs = null;
69
	@Override
70
	public Object getModifiedElement() {
71
		return null;
72
	}
73
74
	@Override
75
	public String getName() {
76
		
77
		String name = NLS.bind(
78
				RefactoringResourceHandler.Remove_JavaEE_References,
79
				new Object[] {projectToRemove.getName()});
80
		
81
		name += referencingModuleProject.getName();
82
		return name;
83
		
84
	}
85
86
	@Override
87
	public void initializeValidationData(IProgressMonitor pm) {
88
	
89
	}
90
91
	@Override
92
	public RefactoringStatus isValid(IProgressMonitor pm) throws CoreException,
93
			OperationCanceledException {
94
		return null;
95
	}
96
97
	@Override
98
	public Change perform(IProgressMonitor pm) throws CoreException {
99
		
100
		try {
101
			removeModuleDependency();
102
			if(isEJBClientDeletion()){
103
				updateEJBDDWithEJBClientDeletion();
104
			}
105
		} catch (ExecutionException e) {
106
			J2EEPlugin.logError(e);
107
		}
108
		return null;
109
	}
110
	
111
	public ChangeDescriptor getDescriptor() {
112
		return null;
113
	}
114
	
115
	private boolean isEJBClientDeletion(){
116
		
117
		if(!JavaEEProjectUtilities.isEJBProject(referencingModuleProject))
118
			return false;
119
		Properties props = referencingModuleProjectComp.getMetaProperties();
120
		String clientCompName = props.getProperty(CreationConstants.EJB_CLIENT_NAME);
121
		if(clientCompName == null || clientCompName.isEmpty()){
122
			return false;
123
		}
124
			
125
		 if(clientCompName.equals(projectToRemove.getName())){
126
			 return true;
127
		 }
128
	        return false;
129
	}
130
	
131
	
132
	/*
133
	 * Remove the client JAR entry from the deployment descriptor
134
	 * This method is to be used only to remove EJB Client jar entry from
135
	 * EJB DD
136
	 */
137
	private void updateEJBDDWithEJBClientDeletion() {
138
		IModelProvider ejbModel = ModelProviderManager.getModelProvider(referencingModuleProject);
139
        ejbModel.modify(new Runnable() {
140
            public void run() {
141
                IModelProvider writableEjbModel = ModelProviderManager.getModelProvider(referencingModuleProject);
142
                Object modelObject = writableEjbModel.getModelObject();
143
                
144
                if (modelObject instanceof org.eclipse.jst.javaee.ejb.EJBJar) {
145
                    org.eclipse.jst.javaee.ejb.EJBJar ejbres = (org.eclipse.jst.javaee.ejb.EJBJar) writableEjbModel.getModelObject();
146
                    if (ejbres != null)
147
                    	ejbres.setEjbClientJar(null);
148
                }
149
                else {
150
                    org.eclipse.jst.j2ee.ejb.EJBJar ejbres = (org.eclipse.jst.j2ee.ejb.EJBJar) writableEjbModel.getModelObject();
151
                    ejbres.setEjbClientJar(null);
152
                }
153
            	Properties props = referencingModuleProjectComp.getMetaProperties();
154
            	props.remove(CreationConstants.CLIENT_JAR_URI);
155
            	props.remove(CreationConstants.EJB_CLIENT_NAME);
156
            	referencingModuleProjectComp.clearMetaProperties();
157
            	referencingModuleProjectComp.setMetaProperties(props);
158
         		
159
            }
160
        },null);
161
	}
162
163
	
164
	
165
	protected void removeModuleDependency() throws ExecutionException {
166
		
167
		// create IVirtualComponents for the dependent and the refactored project
168
		final IVirtualComponent dependentComp = referencingModuleProjectComp;
169
		final IVirtualComponent refactoredComp = projectToRemoveComp;
170
		final IProgressMonitor monitor = new NullProgressMonitor();
171
		// Does the dependent project have a .component reference on the refactored project?
172
		final IVirtualReference ref = hadReference();
173
		final boolean webLibDep = hasWebLibDependency(ref);
174
		
175
		// remove the component reference on the deleted project
176
		if (refactoredComp != null) {
177
			removeReferencedComponents(monitor);
178
		}
179
		
180
		// update the manifest
181
			updateManifestDependency(true);
182
	}
183
	
184
	
185
	protected void updateManifestDependency(final boolean remove) throws ExecutionException {
186
		final IVirtualComponent dependentComp = referencingModuleProjectComp;
187
		IProject project= dependentComp.getProject();
188
		if(project.isAccessible()){
189
			final String dependentProjName = referencingModuleProject.getName();
190
			final String refactoredProjName = projectToRemove.getName();
191
			final IVirtualFile vf = dependentComp.getRootFolder().getFile(new Path(J2EEConstants.MANIFEST_URI) );
192
			final IFile manifestmf = vf.getUnderlyingFile();
193
			// adding this check for https://bugs.eclipse.org/bugs/show_bug.cgi?id=170074
194
			// (some adopters have non-jst.ear module projects that are missing manifests)
195
			if (!manifestmf.exists()) {  
196
				return;
197
			}
198
			final IProgressMonitor monitor = new NullProgressMonitor();
199
			final IDataModel updateManifestDataModel = DataModelFactory.createDataModel(new UpdateManifestDataModelProvider());
200
			updateManifestDataModel.setProperty(UpdateManifestDataModelProperties.PROJECT_NAME, dependentProjName);
201
			updateManifestDataModel.setBooleanProperty(UpdateManifestDataModelProperties.MERGE, false);
202
			updateManifestDataModel.setProperty(UpdateManifestDataModelProperties.MANIFEST_FILE, manifestmf);
203
			final ArchiveManifest manifest = J2EEProjectUtilities.readManifest(manifestmf);
204
			String[] cp = manifest.getClassPathTokenized();
205
			List cpList = new ArrayList();
206
			String newCp = refactoredProjName + ".jar";//$NON-NLS-1$
207
			for (int i = 0; i < cp.length; i++) {
208
				if (!cp[i].equals(newCp)) {
209
					cpList.add(cp[i]);
210
				}
211
			}
212
			if (!remove) {
213
				cpList.add(newCp);
214
			}
215
			updateManifestDataModel.setProperty(UpdateManifestDataModelProperties.JAR_LIST, cpList);
216
			try {
217
				updateManifestDataModel.getDefaultOperation().execute(monitor, null );
218
			} catch (org.eclipse.core.commands.ExecutionException e) {
219
				J2EEPlugin.logError(e);
220
			}
221
		}
222
	}
223
	
224
	protected void removeReferencedComponents(IProgressMonitor monitor) {
225
		
226
		if (referencingModuleProjectComp == null || !referencingModuleProjectComp.getProject().isAccessible() || referencingModuleProjectComp.isBinary()) return;
227
		
228
		IVirtualReference [] existingReferencesArray = cachedRefs;
229
		if(existingReferencesArray == null || existingReferencesArray.length == 0){
230
			return;
231
		}
232
		
233
		List existingReferences = new ArrayList();
234
		for(int i=0;i<existingReferencesArray.length; i++){
235
			existingReferences.add(existingReferencesArray[i]);
236
		}
237
		
238
		List targetprojectList = new ArrayList();
239
			if (projectToRemoveComp==null )
240
				return;
241
242
			IVirtualReference ref = findMatchingReference(existingReferences, projectToRemoveComp, null);
243
			//if a ref was found matching the specified deployPath, then remove it
244
			if(ref != null){
245
				removeRefereneceInComponent(referencingModuleProjectComp, ref);
246
				existingReferences.remove(ref);
247
				//after removing the ref, check to see if it was the last ref removed to that component
248
				//and if it was, then also remove the project reference
249
				ref = findMatchingReference(existingReferences, projectToRemoveComp);
250
				if(ref == null){
251
					IProject targetProject = projectToRemoveComp.getProject();
252
					targetprojectList.add(targetProject);
253
				}
254
			}
255
		
256
		
257
		try {
258
			ProjectUtilities.removeReferenceProjects(referencingModuleProjectComp.getProject(),targetprojectList);
259
		} catch (CoreException e) {
260
			J2EEPlugin.logError(e);
261
		}		
262
		
263
	}
264
	
265
	private IVirtualReference findMatchingReference(List existingReferences, IVirtualComponent comp) {
266
		return findMatchingReference(existingReferences, comp, null);
267
	}
268
269
	protected void removeRefereneceInComponent(IVirtualComponent component, IVirtualReference reference) {
270
		((VirtualComponent)component.getComponent()).removeReference(reference);
271
	}
272
	
273
	private IVirtualReference findMatchingReference(List existingReferences, IVirtualComponent comp, IPath path) {
274
		for(int i=0;i<existingReferences.size(); i++){
275
			IVirtualReference ref = (IVirtualReference)existingReferences.get(i);
276
			IVirtualComponent c = ref.getReferencedComponent();
277
			if(c != null && c.getName().equals(comp.getName())){
278
				if(path == null){
279
					return ref;
280
				} else if(path.equals(ref.getRuntimePath())){
281
					return ref;
282
				}
283
			}
284
		}
285
		return null;
286
	}
287
	
288
	
289
	/**
290
	 * Does the dependent project have a .component reference on the refactored project?
291
	 * @return IVirtualReference or null if one didn't exist.
292
	 */
293
	protected IVirtualReference hadReference() {
294
		final IVirtualComponent refactoredComp = projectToRemoveComp;
295
		if (refactoredComp == null) {
296
			return null;
297
		}
298
		final IVirtualReference[] refs = cachedRefs;
299
		IVirtualReference ref = null;
300
		for (int i = 0; i < refs.length; i++) {
301
			if (refs[i].getReferencedComponent().equals(refactoredComp)) {
302
				ref = refs[i];
303
				break;
304
			}
305
		}
306
		return ref;
307
	}
308
	
309
	/**
310
	 * Does the dependent project have a .project reference on the refactored project?
311
	 * (dynamic project refs don't count)
312
	 * @return True if a project reference exists.
313
	 */
314
	protected boolean hadProjectReference() {
315
		try {
316
			final IProject[] refs = referencingModuleProject.getDescription().getReferencedProjects();
317
			final IProject refactoredProject= projectToRemove;
318
			for (int i = 0; i < refs.length; i++) {
319
				if (refs[i].equals(refactoredProject)) {
320
					return true;
321
				}
322
			} 
323
		} catch (CoreException ce) {
324
			J2EEPlugin.logError(ce);
325
		}
326
		return false;
327
	}
328
	
329
	/**
330
	 * Returns true if the dependency was a web library dependency. 
331
	 * @param ref
332
	 * @return
333
	 */
334
	protected static boolean hasWebLibDependency(final IVirtualReference ref) {
335
		if (ref == null) {
336
			return false;
337
		}
338
		return ref.getRuntimePath().equals(new Path("/WEB-INF/lib")); //$NON-NLS-1$
339
	}
340
341
}
(-)ltkbasedrefactoring/org/eclipse/jst/javaee/ltk/core/change/DeleteEJBClientProjectChange.java (+39 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008, 2009 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
12
package org.eclipse.jst.javaee.ltk.core.change;
13
14
import org.eclipse.core.resources.IProject;
15
import org.eclipse.core.runtime.CoreException;
16
import org.eclipse.core.runtime.IPath;
17
import org.eclipse.core.runtime.IProgressMonitor;
18
import org.eclipse.ltk.core.refactoring.Change;
19
import org.eclipse.ltk.core.refactoring.resource.DeleteResourceChange;
20
21
public class DeleteEJBClientProjectChange extends DeleteResourceChange {
22
23
	IProject ejbClientProject = null;
24
	
25
	public DeleteEJBClientProjectChange(IPath resourcePath, boolean forceOutOfSync, boolean forceDelete) {
26
		super(resourcePath, forceOutOfSync, forceDelete);
27
		}
28
	
29
	public DeleteEJBClientProjectChange(IProject clientProj, boolean forceOutOfSync, boolean forceDelete) {
30
		super(clientProj.getFullPath(), forceOutOfSync, forceDelete);
31
		ejbClientProject = clientProj;
32
	}
33
	
34
	public Change perform(IProgressMonitor pm) throws CoreException {
35
		if(!ejbClientProject.isAccessible())
36
			return null;
37
		return super.perform(pm);
38
	}
39
}
(-)ltkbasedrefactoring/org/eclipse/jst/javaee/ltk/core/nls/RefactoringResourceHandler.java (+34 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008, 2009 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
12
package org.eclipse.jst.javaee.ltk.core.nls;
13
14
import org.eclipse.osgi.util.NLS;
15
16
public class RefactoringResourceHandler extends NLS {
17
18
	private static final String BUNDLE_NAME = "refactoring";//$NON-NLS-1$
19
	
20
	public static String Delete_EB_From_DD;
21
	public static String Delete_MDB_From_DD;
22
	public static String Delete_SB_From_DD;
23
	public static String Remove_JavaEE_References;
24
	public static String JavaEE_Refactorings_Participant_title;
25
	
26
	
27
	private RefactoringResourceHandler() {
28
		// Do not instantiate
29
	}
30
	
31
	static {
32
		NLS.initializeMessages(BUNDLE_NAME, RefactoringResourceHandler.class);
33
	}	
34
}
(-)ltkbasedrefactoring/org/eclipse/jst/javaee/ltk/core/descriptor/EARReferenceRemoveDescriptor.java (+37 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008, 2009 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
12
package org.eclipse.jst.javaee.ltk.core.descriptor;
13
14
import org.eclipse.core.runtime.CoreException;
15
import org.eclipse.ltk.core.refactoring.Refactoring;
16
import org.eclipse.ltk.core.refactoring.RefactoringDescriptor;
17
import org.eclipse.ltk.core.refactoring.RefactoringStatus;
18
19
public class EARReferenceRemoveDescriptor extends RefactoringDescriptor {
20
21
	public EARReferenceRemoveDescriptor(){
22
		super (null, null, null, null, -1);
23
	}
24
	protected EARReferenceRemoveDescriptor(String id, String project,
25
			String description, String comment, int flags) {
26
		super(id, project, description, comment, flags);
27
		}
28
29
	@Override
30
	public Refactoring createRefactoring(RefactoringStatus status)
31
			throws CoreException {
32
		return null;
33
	}
34
	
35
	
36
37
}
(-)ltkbasedrefactoring/org/eclipse/jst/javaee/ltk/core/change/EARReferenceRemoveChange.java (+194 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008, 2009 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
12
package org.eclipse.jst.javaee.ltk.core.change;
13
14
import java.util.ArrayList;
15
import java.util.List;
16
17
import org.eclipse.core.resources.IFile;
18
import org.eclipse.core.resources.IProject;
19
import org.eclipse.core.runtime.CoreException;
20
import org.eclipse.core.runtime.IPath;
21
import org.eclipse.core.runtime.IProgressMonitor;
22
import org.eclipse.core.runtime.NullProgressMonitor;
23
import org.eclipse.core.runtime.OperationCanceledException;
24
import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
25
import org.eclipse.jst.j2ee.internal.common.classpath.J2EEComponentClasspathUpdater;
26
import org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin;
27
import org.eclipse.jst.j2ee.model.IEARModelProvider;
28
import org.eclipse.jst.j2ee.model.ModelProviderManager;
29
import org.eclipse.jst.javaee.ltk.core.nls.RefactoringResourceHandler;
30
import org.eclipse.jst.jee.application.ICommonApplication;
31
import org.eclipse.jst.jee.application.ICommonModule;
32
import org.eclipse.ltk.core.refactoring.Change;
33
import org.eclipse.ltk.core.refactoring.ChangeDescriptor;
34
import org.eclipse.ltk.core.refactoring.RefactoringStatus;
35
import org.eclipse.osgi.util.NLS;
36
import org.eclipse.wst.common.componentcore.ComponentCore;
37
import org.eclipse.wst.common.componentcore.internal.resources.VirtualComponent;
38
import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
39
import org.eclipse.wst.common.componentcore.resources.IVirtualFile;
40
import org.eclipse.wst.common.componentcore.resources.IVirtualReference;
41
42
43
public class EARReferenceRemoveChange extends Change {
44
45
	
46
	public EARReferenceRemoveChange(IProject referencingEARProject, IProject projectToRemove) {
47
		super();
48
		this.referencingEARProject = referencingEARProject;
49
		this.projectToRemove = projectToRemove;
50
		this.referencingEARProjectComp = ComponentCore.createComponent(referencingEARProject);
51
		cachedRefs = referencingEARProjectComp.getReferences();
52
		this.projectToRemoveComp = ComponentCore.createComponent(projectToRemove);
53
		earModel = (IEARModelProvider)ModelProviderManager.getModelProvider(referencingEARProject);
54
		moduleURI = earModel.getModuleURI(projectToRemoveComp);
55
	}
56
57
	IProject referencingEARProject = null;
58
	IVirtualComponent referencingEARProjectComp = null;
59
	IProject projectToRemove = null;
60
	IVirtualComponent projectToRemoveComp = null;
61
	IVirtualReference[] cachedRefs = null;
62
	IEARModelProvider earModel = null;
63
	String moduleURI = null;
64
	@Override
65
	public Object getModifiedElement() {
66
		return null;
67
	}
68
69
	@Override
70
	public String getName() {
71
		String name = NLS.bind( RefactoringResourceHandler.Remove_JavaEE_References, 
72
				new Object[] {projectToRemove.getName()});
73
		name += referencingEARProject.getName();
74
		return name;
75
	}
76
77
	@Override
78
	public void initializeValidationData(IProgressMonitor pm) {
79
	}
80
81
	@Override
82
	public RefactoringStatus isValid(IProgressMonitor pm) throws CoreException,
83
			OperationCanceledException {
84
	return null;
85
	}
86
87
	@Override
88
	public Change perform(IProgressMonitor pm) throws CoreException {
89
		updateEARDD();
90
		removeReferencedComponents(pm);
91
		return null;
92
	}
93
	
94
	public ChangeDescriptor getDescriptor() {
95
		return null;
96
	}
97
	
98
	private void updateEARDD() {
99
		if (!referencingEARProject.isAccessible())
100
			return;
101
		J2EEComponentClasspathUpdater.getInstance().queueUpdateEAR(referencingEARProject);
102
		
103
		earModel.modify(new Runnable() {
104
			public void run() {
105
				ICommonApplication application = (ICommonApplication)earModel.getModelObject();
106
				if (application == null)
107
					return;
108
				IVirtualComponent moduleComponent = projectToRemoveComp.getComponent();
109
				if(!moduleComponent.isBinary()){
110
					J2EEComponentClasspathUpdater.getInstance().queueUpdateModule(moduleComponent.getProject());
111
				}
112
			
113
				removeModule(application, moduleURI); 
114
				IVirtualFile vFile = referencingEARProjectComp.getRootFolder().getFile(moduleURI);
115
				IFile iFile = vFile.getUnderlyingFile();
116
				if(iFile.exists()){
117
					try {
118
						iFile.delete(true, new NullProgressMonitor());
119
					} catch (CoreException e) {
120
						J2EEPlugin.logError(e);
121
					}
122
				}
123
			
124
			}
125
		}, null);
126
	}
127
	
128
	protected void removeModule(ICommonApplication application, String moduleURI) {
129
		ICommonModule module = application.getFirstEARModule(moduleURI);
130
		application.getEARModules().remove(module);
131
	}
132
	
133
	protected void removeReferencedComponents(IProgressMonitor monitor) {
134
		
135
		if (referencingEARProjectComp == null || !referencingEARProjectComp.getProject().isAccessible() || referencingEARProjectComp.isBinary()) return;
136
		
137
		IVirtualReference [] existingReferencesArray = cachedRefs;
138
		if(existingReferencesArray == null || existingReferencesArray.length == 0){
139
			return;
140
		}
141
		List existingReferences = new ArrayList();
142
		for(int i=0;i<existingReferencesArray.length; i++){
143
			existingReferences.add(existingReferencesArray[i]);
144
		}
145
		List targetprojectList = new ArrayList();
146
		if (projectToRemoveComp==null )
147
				return;
148
		IVirtualReference ref = findMatchingReference(existingReferences, projectToRemoveComp, null);
149
		//if a ref was found matching the specified deployPath, then remove it
150
		if(ref != null){
151
			removeRefereneceInComponent(referencingEARProjectComp, ref);
152
			existingReferences.remove(ref);
153
			//after removing the ref, check to see if it was the last ref removed to that component
154
			//and if it was, then also remove the project reference
155
			ref = findMatchingReference(existingReferences, projectToRemoveComp);
156
			if(ref == null){
157
				IProject targetProject = projectToRemoveComp.getProject();
158
				targetprojectList.add(targetProject);
159
			}
160
		}
161
		
162
		try {
163
			ProjectUtilities.removeReferenceProjects(referencingEARProjectComp.getProject(),targetprojectList);
164
		} catch (CoreException e) {
165
			J2EEPlugin.logError(e);
166
		}		
167
		
168
	}
169
	
170
	private IVirtualReference findMatchingReference(List existingReferences, IVirtualComponent comp) {
171
		return findMatchingReference(existingReferences, comp, null);
172
	}
173
174
	protected void removeRefereneceInComponent(IVirtualComponent component, IVirtualReference reference) {
175
		((VirtualComponent)component.getComponent()).removeReference(reference);
176
	}
177
	
178
	private IVirtualReference findMatchingReference(List existingReferences, IVirtualComponent comp, IPath path) {
179
		for(int i=0;i<existingReferences.size(); i++){
180
			IVirtualReference ref = (IVirtualReference)existingReferences.get(i);
181
			IVirtualComponent c = ref.getReferencedComponent();
182
			if(c != null && c.getName().equals(comp.getName())){
183
				if(path == null){
184
					return ref;
185
				} else if(path.equals(ref.getRuntimePath())){
186
					return ref;
187
				}
188
			}
189
		}
190
		return null;
191
	}
192
193
194
}
(-)ltkbasedrefactoring/org/eclipse/jst/javaee/ltk/core/participant/JavaEERefactoringParticipant.java (+128 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008, 2009 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
12
package org.eclipse.jst.javaee.ltk.core.participant;
13
14
import java.util.Properties;
15
import java.util.Set;
16
17
import org.eclipse.core.resources.IProject;
18
import org.eclipse.core.runtime.CoreException;
19
import org.eclipse.core.runtime.IProgressMonitor;
20
import org.eclipse.core.runtime.OperationCanceledException;
21
import org.eclipse.jst.j2ee.internal.common.CreationConstants;
22
import org.eclipse.jst.j2ee.project.JavaEEProjectUtilities;
23
import org.eclipse.jst.javaee.ltk.core.change.DeleteEJBClientProjectChange;
24
import org.eclipse.jst.javaee.ltk.core.change.EARReferenceRemoveChange;
25
import org.eclipse.jst.javaee.ltk.core.change.NonEARModuleReferenceRemoveChange;
26
import org.eclipse.jst.javaee.ltk.core.nls.RefactoringResourceHandler;
27
import org.eclipse.ltk.core.refactoring.Change;
28
import org.eclipse.ltk.core.refactoring.CompositeChange;
29
import org.eclipse.ltk.core.refactoring.RefactoringStatus;
30
import org.eclipse.ltk.core.refactoring.participants.CheckConditionsContext;
31
import org.eclipse.ltk.core.refactoring.participants.DeleteParticipant;
32
import org.eclipse.osgi.util.NLS;
33
import org.eclipse.wst.common.componentcore.ComponentCore;
34
import org.eclipse.wst.common.componentcore.internal.builder.IDependencyGraph;
35
import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
36
37
38
public class JavaEERefactoringParticipant extends DeleteParticipant {
39
40
	private IProject projectToDelete = null;
41
	private IProject ejbClientProject = null;
42
	@Override
43
	public RefactoringStatus checkConditions(IProgressMonitor pm,
44
			CheckConditionsContext context) throws OperationCanceledException {
45
		
46
		return new RefactoringStatus();
47
	}
48
49
	@Override
50
	public Change createChange(IProgressMonitor pm) throws CoreException,
51
			OperationCanceledException {
52
53
		CompositeChange result= null;
54
		result = createChangeObjects(result,projectToDelete);
55
		
56
		if(ejbClientProject != null){
57
			
58
			result = createChangeObjects (result, ejbClientProject);
59
			DeleteEJBClientProjectChange dc= new DeleteEJBClientProjectChange(ejbClientProject, true, true);
60
			result.add(dc);
61
		}
62
		
63
		return result;
64
	}
65
	
66
	
67
	private CompositeChange createChangeObjects(CompositeChange compositeChange, IProject projectToBeDeleted){
68
		Set<IProject> referencingComponents = IDependencyGraph.INSTANCE.getReferencingComponents(projectToBeDeleted);
69
		IProject[] dependentProjectList = (IProject[]) referencingComponents.toArray(new IProject[referencingComponents.size()]);
70
	
71
		if (dependentProjectList.length > 0){
72
			if(compositeChange == null){
73
			compositeChange = new CompositeChange(getName());
74
			}
75
			
76
			for (int i = 0; i < dependentProjectList.length; i++){
77
				IProject dependentProject = dependentProjectList[i];
78
				if(JavaEEProjectUtilities.isEARProject(dependentProjectList[i])){
79
					EARReferenceRemoveChange ec = new EARReferenceRemoveChange(dependentProject, projectToBeDeleted);
80
					compositeChange.add(ec);
81
				}else{
82
					NonEARModuleReferenceRemoveChange nc = new NonEARModuleReferenceRemoveChange(dependentProject, projectToBeDeleted);
83
					compositeChange.add(nc);
84
				}
85
			}
86
		}
87
		
88
		return compositeChange;
89
	}
90
	
91
	
92
	private IProject getClientProject(IProject ejbProject) {
93
94
		if( ejbProject.exists() && ejbProject.isAccessible()){
95
			IVirtualComponent comp = ComponentCore.createComponent(ejbProject);;
96
			Properties props = comp.getMetaProperties();
97
			String clientProjName = props.getProperty(CreationConstants.EJB_CLIENT_NAME);
98
			if(clientProjName != null && !clientProjName.equals("")){
99
			IProject clientProj = JavaEEProjectUtilities.getProject(clientProjName);
100
			if(clientProj != null && clientProj.exists())
101
				return clientProj;
102
			}
103
		}
104
		return null;
105
	}
106
107
108
	@Override
109
	public String getName() {
110
		
111
		String name = NLS.bind(
112
				RefactoringResourceHandler.JavaEE_Refactorings_Participant_title,
113
				new Object[] { projectToDelete.getName() });
114
		return name;
115
	}
116
117
	@Override
118
	protected boolean initialize(Object element) {
119
		if(!(element instanceof IProject))
120
			return false;
121
		projectToDelete = (IProject) element;
122
		if(JavaEEProjectUtilities.isEJBProject(projectToDelete)){
123
			ejbClientProject = getClientProject(projectToDelete);
124
		}
125
		return true;
126
	}
127
128
}
(-)property_files/refactoring.properties (+5 lines)
Added Link Here
1
Delete_EB_From_DD=Delete Entity Bean ( {0} ) from DD
2
Delete_MDB_From_DD=Delete Message Driven Bean ( {0} ) from DD
3
Delete_SB_From_DD=Delete Session Bean ( {0} ) from DD
4
Remove_JavaEE_References=Remove Java EE References to {0} in 
5
JavaEE_Refactorings_Participant_title=Java EE Refactorings for {0}

Return to bug 260459