/******************************************************************************* * Copyright (c) 2007 Red Hat, Inc. * Distributed under license by Red Hat, Inc. All rights reserved. * This program is made available under the terms of the * Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Red Hat, Inc. - initial API and implementation ******************************************************************************/ package org.jboss.tools.seam.core.test.refactoring; import java.lang.reflect.InvocationTargetException; import java.util.HashMap; import junit.framework.TestCase; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.jdt.core.IJavaElement; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.IPackageFragment; import org.eclipse.jdt.core.IPackageFragmentRoot; import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jdt.internal.corext.refactoring.rename.JavaRenameProcessor; import org.eclipse.jdt.internal.corext.refactoring.rename.RenameJavaProjectProcessor; import org.eclipse.jdt.internal.corext.refactoring.rename.RenamePackageProcessor; import org.eclipse.jdt.internal.corext.refactoring.rename.RenameSourceFolderProcessor; import org.eclipse.jdt.internal.corext.refactoring.reorg.IConfirmQuery; import org.eclipse.jdt.internal.corext.refactoring.reorg.ICreateTargetQueries; import org.eclipse.jdt.internal.corext.refactoring.reorg.ICreateTargetQuery; import org.eclipse.jdt.internal.corext.refactoring.reorg.IReorgQueries; import org.eclipse.jdt.internal.corext.refactoring.reorg.JavaMoveProcessor; import org.eclipse.jdt.internal.corext.refactoring.reorg.ReorgDestinationFactory; import org.eclipse.jdt.internal.corext.refactoring.reorg.ReorgPolicyFactory; import org.eclipse.jdt.internal.corext.refactoring.reorg.IReorgPolicy.IMovePolicy; import org.eclipse.jdt.internal.corext.refactoring.tagging.ITextUpdating; import org.eclipse.jdt.ui.refactoring.RenameSupport; import org.eclipse.ltk.core.refactoring.Change; import org.eclipse.ltk.core.refactoring.CompositeChange; import org.eclipse.ltk.core.refactoring.participants.MoveArguments; import org.eclipse.ltk.core.refactoring.participants.MoveParticipant; import org.eclipse.ltk.core.refactoring.participants.MoveRefactoring; import org.eclipse.ltk.core.refactoring.participants.RefactoringProcessor; import org.eclipse.ltk.core.refactoring.participants.RenameArguments; import org.eclipse.ltk.core.refactoring.participants.RenameParticipant; import org.eclipse.ltk.core.refactoring.participants.RenameRefactoring; import org.eclipse.ltk.internal.core.refactoring.resource.RenameResourceProcessor; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.IWorkbenchWindow; import org.jboss.tools.common.model.util.EclipseResourceUtil; import org.jboss.tools.seam.core.ISeamProject; import org.jboss.tools.seam.core.SeamCorePlugin; import org.jboss.tools.seam.internal.core.project.facet.ISeamFacetDataModelProperties; import org.jboss.tools.seam.internal.core.refactoring.SeamFolderMoveParticipant; import org.jboss.tools.seam.internal.core.refactoring.SeamFolderRenameParticipant; import org.jboss.tools.seam.internal.core.refactoring.SeamProjectChange; import org.jboss.tools.seam.internal.core.refactoring.SeamProjectRenameParticipant; import org.jboss.tools.test.util.JUnitUtils; import org.jboss.tools.test.util.JobUtils; import org.jboss.tools.test.util.ProjectImportTestSetup; import org.jboss.tools.test.util.WorkbenchUtils; /** * @author Alexey Kazakov */ public class SeamPropertyRefactoringTest extends TestCase { static String warProjectName = "RefactoringTestProject-war"; static String ejbProjectName = "RefactoringTestProject-ejb"; static String testProjectName = "RefactoringTestProject-test"; static String actionSourceFolderName = "src"; static String modelSourceFolderName = "src"; static String testSourceFolderName = "src"; static String actionSourceFolderPath = "/" + ejbProjectName + "/" + actionSourceFolderName; static String modelSourceFolderPath = "/" + warProjectName + "/" + modelSourceFolderName; static String testSourceFolderPath = "/" + testProjectName + "/" + testSourceFolderName; static String viewFolderParentName = "webroot"; static String viewFolderName = "WebContent"; static String viewFolderPath = "/" + warProjectName + "/" + viewFolderParentName + "/" + viewFolderName; static String actionPackageName = "ejbdemo"; static String modelPackageName = "wardemo"; static String testPackageName = "testdemo"; static IProject warProject; static IProject ejbProject; static IProject testProject; static ISeamProject seamWarProject; static ISeamProject seamEjbProject; static ISeamProject seamTestProject; public SeamPropertyRefactoringTest() { super("Seam Property Refactoring Tests"); } protected void setUp() throws Exception { if(warProject==null) { warProject = ProjectImportTestSetup.loadProject(warProjectName); } if(ejbProject==null) { ejbProject = ProjectImportTestSetup.loadProject(ejbProjectName);; } if(testProject==null) { testProject = ProjectImportTestSetup.loadProject(testProjectName); } if(seamWarProject==null) { seamWarProject = loadSeamProject(warProject); } if(seamEjbProject==null) { seamEjbProject = loadSeamProject(ejbProject); } if(seamTestProject==null) { seamTestProject = loadSeamProject(testProject); } } private ISeamProject loadSeamProject(IProject project) throws CoreException { ISeamProject seamProject = SeamCorePlugin.getSeamProject(project, true); assertNotNull("Seam project for " + project.getName() + " is null", seamProject); JobUtils.waitForIdle(); return seamProject; } public void testWarProjectRename() throws CoreException { warProjectName = "NewWarProjectName"; HashMap<String, String> preferences = new HashMap<String, String>(); preferences.put(ISeamFacetDataModelProperties.SEAM_PARENT_PROJECT, warProjectName); preferences.put(ISeamFacetDataModelProperties.ENTITY_BEAN_SOURCE_FOLDER, "/"+warProjectName+"/src"); preferences.put(ISeamFacetDataModelProperties.WEB_CONTENTS_FOLDER, "/"+warProjectName+"/webroot/WebContent"); try{ renameProject(warProject, warProjectName, preferences); }finally{ warProjectName = "RefactoringTestProject-war"; updateFields(); } } public void testEjbProjectRename() throws CoreException { ejbProjectName = "NewEjbProjectName"; HashMap<String, String> preferences = new HashMap<String, String>(); preferences.put(ISeamFacetDataModelProperties.SEAM_EJB_PROJECT, ejbProjectName); preferences.put(ISeamFacetDataModelProperties.SESSION_BEAN_SOURCE_FOLDER, "/"+ejbProjectName+"/src"); try{ renameProject(ejbProject, ejbProjectName, preferences); }finally{ ejbProjectName = "RefactoringTestProject-ejb"; updateFields(); } } public void testTestProjectRename() throws CoreException { testProjectName = "NewTestProjectName"; HashMap<String, String> preferences = new HashMap<String, String>(); preferences.put(ISeamFacetDataModelProperties.SEAM_TEST_PROJECT, testProjectName); preferences.put(ISeamFacetDataModelProperties.TEST_SOURCE_FOLDER, "/"+testProjectName+"/src"); try{ renameProject(testProject, testProjectName, preferences); }finally{ testProjectName = "RefactoringTestProject-test"; updateFields(); } } public void testActionSourceFolderRename() throws CoreException { actionSourceFolderName = "newActionSrc"; HashMap<String, String> preferences = new HashMap<String, String>(); preferences.put(ISeamFacetDataModelProperties.SESSION_BEAN_SOURCE_FOLDER, "/RefactoringTestProject-ejb/RefactoringTestProject-ejb/"+actionSourceFolderName); try{ renameSourceFolder(actionSourceFolderPath, actionSourceFolderName, preferences); }finally{ actionSourceFolderName = "src"; updateFields(); } } public void testModelSourceFolderRename() throws CoreException { modelSourceFolderName = "newModelSrc"; HashMap<String, String> preferences = new HashMap<String, String>(); preferences.put(ISeamFacetDataModelProperties.SESSION_BEAN_SOURCE_FOLDER, "/RefactoringTestProject-ejb/RefactoringTestProject-war/"+modelSourceFolderName); try{ renameSourceFolder(modelSourceFolderPath, modelSourceFolderName, preferences); }finally{ modelSourceFolderName = "src"; updateFields(); } } public void testTestSourceFolderRename() throws CoreException { testSourceFolderName = "newTestSrc"; HashMap<String, String> preferences = new HashMap<String, String>(); preferences.put(ISeamFacetDataModelProperties.SESSION_BEAN_SOURCE_FOLDER, "/RefactoringTestProject-ejb/RefactoringTestProject-test/"+testSourceFolderName); try{ renameSourceFolder(testSourceFolderPath, testSourceFolderName, preferences); }finally{ testSourceFolderName = "src"; updateFields(); } } public void testViewFolderRename() throws CoreException { viewFolderName = "newViewFolder"; HashMap<String, String> preferences = new HashMap<String, String>(); preferences.put(ISeamFacetDataModelProperties.WEB_CONTENTS_FOLDER, "/RefactoringTestProject-war/webroot/"+viewFolderName); try{ renameFolder(viewFolderPath, viewFolderName, preferences); }finally{ viewFolderName = "WebContent"; updateFields(); } } public void testActionPackageRename() throws CoreException { String oldName = actionPackageName; actionPackageName = "newejbdemo"; HashMap<String, String> preferences = new HashMap<String, String>(); preferences.put(ISeamFacetDataModelProperties.SESSION_BEAN_SOURCE_FOLDER, "/RefactoringTestProject-ejb/"+actionPackageName); try{ renamePackage(actionSourceFolderPath, oldName, actionPackageName, preferences); }finally{ actionPackageName = "ejbdemo"; updateFields(); } } public void testModelPackageRename() throws CoreException { String oldName = modelPackageName; modelPackageName = "newwardemo"; HashMap<String, String> preferences = new HashMap<String, String>(); preferences.put(ISeamFacetDataModelProperties.ENTITY_BEAN_SOURCE_FOLDER, "/RefactoringTestProject-war/"+modelPackageName); try{ renamePackage(modelSourceFolderPath, oldName, modelPackageName, preferences); }finally{ modelPackageName = "wardemo"; updateFields(); } } public void testTestPackageRename() throws CoreException { String oldName = testPackageName; testPackageName = "newtestdemo"; HashMap<String, String> preferences = new HashMap<String, String>(); preferences.put(ISeamFacetDataModelProperties.TEST_SOURCE_FOLDER, "/RefactoringTestProject-test/"+testPackageName); try{ renamePackage(testSourceFolderPath, oldName, testPackageName, preferences); }finally{ testPackageName = "testdemo"; updateFields(); } } public void testViewFolderMove() throws CoreException { viewFolderParentName = "testwebroot"; HashMap<String, String> preferences = new HashMap<String, String>(); preferences.put(ISeamFacetDataModelProperties.WEB_CONTENTS_FOLDER, "/RefactoringTestProject-war/"+viewFolderParentName+"/WebContent"); try{ moveFolder(viewFolderPath, "/" + warProjectName + "/" + viewFolderParentName, preferences); }finally{ viewFolderParentName = "webroot"; updateFields(); } } private void updateFields() { actionSourceFolderPath = "/" + ejbProjectName + "/" + actionSourceFolderName; modelSourceFolderPath = "/" + warProjectName + "/" + modelSourceFolderName; testSourceFolderPath = "/" + testProjectName + "/" + testSourceFolderName; viewFolderPath = "/" + warProjectName + "/" + viewFolderParentName + "/" + viewFolderName; } private void renameSourceFolder(String folderPath, String newFolderName, HashMap<String, String> preferences) throws CoreException { IPackageFragmentRoot packageFragmentRoot = getSourceFolder(folderPath); IProject project = packageFragmentRoot.getResource().getProject(); String newPath = project.getFullPath().toString() + "/" + newFolderName; JavaRenameProcessor processor= new RenameSourceFolderProcessor(packageFragmentRoot); SeamFolderRenameParticipant participant = new SeamFolderRenameParticipant(); IResource folder = ResourcesPlugin.getWorkspace().getRoot().findMember(actionSourceFolderPath); checkRename(processor, folder, newPath, participant, preferences); } private IPackageFragmentRoot getSourceFolder(String folderPath) { IResource initSourceFolder = ResourcesPlugin.getWorkspace().getRoot().findMember(folderPath); assertNotNull("Can't find source folder: " + folderPath, initSourceFolder); IProject project = initSourceFolder.getProject(); IJavaProject javaProject = EclipseResourceUtil.getJavaProject(project); IPackageFragmentRoot packageFragmentRoot = null; try { IPackageFragmentRoot[] roots = javaProject.getPackageFragmentRoots(); for (int i = 0; i < roots.length; i++) { if (roots[i].getKind() == IPackageFragmentRoot.K_SOURCE && roots[i].getResource().equals(initSourceFolder)) { packageFragmentRoot = roots[i]; break; } } } catch (JavaModelException e) { JUnitUtils.fail("Exception during searching source folder: " + folderPath, e); } assertNotNull("Can't find source folder: " + folderPath, packageFragmentRoot); return packageFragmentRoot; } private void renameFolder(String folderPath, String newFolderName, HashMap<String, String> preferences) throws CoreException { IResource resource = ResourcesPlugin.getWorkspace().getRoot().findMember(folderPath); assertNotNull("Can't find folder: " + folderPath, resource); // init refactoring RenameResourceProcessor processor = new RenameResourceProcessor(resource); RenameRefactoring refactoring = new RenameRefactoring(processor); processor.setNewResourceName(newFolderName); processor.setUpdateReferences(true); ITextUpdating text = (ITextUpdating)refactoring.getAdapter(ITextUpdating.class); if(text != null) { text.setUpdateTextualMatches(true); } SeamFolderRenameParticipant participant = new SeamFolderRenameParticipant(); checkRename(processor, resource, newFolderName, participant, preferences); } private void renamePackage(String sourceFolderPath, String oldPackageName, String newPackageName, HashMap<String, String> preferences) throws CoreException { IResource resource = ResourcesPlugin.getWorkspace().getRoot().findMember(sourceFolderPath); assertNotNull("Can't find source folder: " + sourceFolderPath, resource); IProject project = resource.getProject(); IJavaProject javaProject = EclipseResourceUtil.getJavaProject(project); assertNotNull("Can't find java project: " + project.getName(), javaProject); IPackageFragmentRoot root = null; try { IPackageFragmentRoot[] roots = javaProject.getPackageFragmentRoots(); for (int i = 0; i < roots.length; i++) { if (roots[i].getKind() == IPackageFragmentRoot.K_SOURCE && roots[i].getResource().getFullPath().toString().equals(sourceFolderPath)) { root = roots[i]; break; } } } catch (JavaModelException e) { JUnitUtils.fail("Can't find source folder: " + sourceFolderPath, e); } assertNotNull("Can't find source folder: " + sourceFolderPath, root); IPackageFragment oldPackage = findPackage(root, oldPackageName); assertNotNull("Can't find package \"" + oldPackageName + "\". So it's impossible to rename it.", oldPackage); JavaRenameProcessor processor= new RenamePackageProcessor(oldPackage); SeamFolderRenameParticipant participant = new SeamFolderRenameParticipant(); checkRename(processor, resource, newPackageName, participant, preferences); } private IPackageFragment findPackage(IPackageFragmentRoot root, String packageName) { IJavaElement[] packages = null; try { packages = root.getChildren(); } catch (JavaModelException e) { JUnitUtils.fail("Can't find package: " + packageName, e); } for (IJavaElement javaElement : packages) { if(javaElement instanceof IPackageFragment && javaElement.getElementName().equals(packageName)) { return (IPackageFragment)javaElement; } } return null; } private void renameProject(IProject project, String newProjectName, HashMap<String, String> preferences) throws CoreException { JavaRenameProcessor processor= new RenameJavaProjectProcessor(JavaCore.create(project)); SeamProjectRenameParticipant participant = new SeamProjectRenameParticipant(); checkRename(processor, project, newProjectName, participant, preferences); } // private void performRename(RenameSupport support) throws CoreException { // Shell parent = WorkbenchUtils.getActiveShell(); // IWorkbenchWindow context = WorkbenchUtils.getWorkbench().getActiveWorkbenchWindow(); // try { // support.perform(parent, context); // } catch (InterruptedException e) { // JUnitUtils.fail("Rename failed", e); // } catch (InvocationTargetException e) { // JUnitUtils.fail("Rename failed", e); // } // JobUtils.waitForIdle(); // } private void moveFolder(String folderPath, String destinationFolderPath, HashMap<String, String> preferences) throws CoreException { IResource resource = ResourcesPlugin.getWorkspace().getRoot().findMember(folderPath); assertNotNull("Can't find folder: " + folderPath, resource); IResource destination = ResourcesPlugin.getWorkspace().getRoot().findMember(destinationFolderPath); assertNotNull("Can't find destination folder: " + destinationFolderPath, destination); IMovePolicy policy = null; JavaMoveProcessor processor = null; try { policy = ReorgPolicyFactory.createMovePolicy(new IResource[]{resource}, new IJavaElement[0]); processor = new JavaMoveProcessor(policy); processor.setDestination(ReorgDestinationFactory.createDestination(destination)); } catch (JavaModelException e) { JUnitUtils.fail("Exception during perform folder moving: " + folderPath, e); } MoveRefactoring refactoring = new MoveRefactoring(processor); processor.setCreateTargetQueries(new ICreateTargetQueries(){ public ICreateTargetQuery createNewPackageQuery() { return null; } }); processor.setReorgQueries(new IReorgQueries(){ public IConfirmQuery createSkipQuery(String queryTitle, int queryID) { return null; } public IConfirmQuery createYesNoQuery(String queryTitle, boolean allowCancel, int queryID) { return null; } public IConfirmQuery createYesYesToAllNoNoToAllQuery(String queryTitle, boolean allowCancel, int queryID) { return null; } }); SeamFolderMoveParticipant participant = new SeamFolderMoveParticipant(); checkMove(processor, resource, destination, participant, preferences); } private void checkMove(RefactoringProcessor processor, Object oldObject, Object destinationObject, MoveParticipant participant, HashMap<String, String> preferences) throws CoreException { // Move MoveArguments arguments = new MoveArguments(destinationObject, true); participant.initialize(processor, oldObject, arguments); participant.checkConditions(new NullProgressMonitor(), null); CompositeChange rootChange = (CompositeChange)participant.createChange(new NullProgressMonitor()); for(Change change : rootChange.getChildren()){ if(change instanceof SeamProjectChange){ SeamProjectChange seamChange = (SeamProjectChange)change; HashMap<String, String> preferencesToCheck = seamChange.getPreferencesForTest(); checkChanges(preferencesToCheck, preferences); } } } private void checkRename(RefactoringProcessor processor, Object oldObject, String newName, RenameParticipant participant, HashMap<String, String> preferences) throws CoreException { // Rename RenameArguments arguments = new RenameArguments(newName, true); participant.initialize(processor, oldObject, arguments); participant.checkConditions(new NullProgressMonitor(), null); CompositeChange rootChange = (CompositeChange)participant.createChange(new NullProgressMonitor()); for(Change change : rootChange.getChildren()){ if(change instanceof SeamProjectChange){ SeamProjectChange seamChange = (SeamProjectChange)change; HashMap<String, String> preferencesToCheck = seamChange.getPreferencesForTest(); checkChanges(preferencesToCheck, preferences); } } } private void checkChanges(HashMap<String, String> preferencesToCheck, HashMap<String, String> preferences){ for(String key : preferencesToCheck.keySet()){ String value = preferences.get(key); assertNotNull("Unexpected preference "+key+" not found", value); String valueToCheck = preferencesToCheck.get(key); assertEquals("Wrong preference value", value, valueToCheck); } } }