/******************************************************************************* * 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.ui.test.view; import java.io.IOException; import java.io.InputStream; import java.util.Collection; import java.util.Iterator; import junit.framework.TestCase; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IncrementalProjectBuilder; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.Platform; import org.eclipse.jface.action.IContributionItem; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.MenuManager; import org.eclipse.swt.widgets.Tree; import org.eclipse.swt.widgets.TreeItem; import org.eclipse.ui.IActionBars; import org.eclipse.ui.IViewPart; import org.eclipse.ui.IViewSite; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.WorkbenchException; import org.eclipse.ui.navigator.CommonNavigator; import org.jboss.tools.common.util.FileUtil; import org.jboss.tools.seam.core.ISeamComponent; import org.jboss.tools.seam.core.ISeamPackage; import org.jboss.tools.seam.core.ISeamProject; import org.jboss.tools.seam.core.SeamCorePlugin; import org.jboss.tools.seam.ui.ISeamUiConstants; import org.jboss.tools.seam.ui.SeamPerspectiveFactory; import org.jboss.tools.seam.ui.views.actions.SeamViewLayoutActionGroup.SeamContributionItem; import org.jboss.tools.test.util.JUnitUtils; import org.jboss.tools.test.util.JobUtils; import org.jboss.tools.test.util.ResourcesUtils; import org.jboss.tools.test.util.WorkbenchUtils; /** * * @author eskimo * */ public class SeamComponentsViewTest extends TestCase { IProject project; IFile componentsFile; IFile classFile; @Override protected void setUp() throws Exception { super.setUp(); IWorkbench workbench = PlatformUI.getWorkbench(); try { workbench.showPerspective(SeamPerspectiveFactory.PERSPECTIVE_ID,workbench.getActiveWorkbenchWindow()); } catch (WorkbenchException e) { fail("Cannot load perspective '" + SeamPerspectiveFactory.PERSPECTIVE_ID + "'"); } project = (IProject)ResourcesPlugin.getWorkspace().getRoot().findMember("TestComponentView"); if(project==null) { project = ResourcesUtils.createEclipseProject(Platform.getBundle("org.jboss.tools.seam.ui.test"), "/projects/TestComponentView"); } assertNotNull("",project); this.project.refreshLocal(IResource.DEPTH_INFINITE, null); componentsFile = project.getFile(new Path("WebContent/WEB-INF/components.xml")); assertTrue("Cannot find components.xml in test project", componentsFile != null && componentsFile.exists()); this.project.build(IncrementalProjectBuilder.FULL_BUILD, null); JobUtils.waitForIdle(); } public void testViewInNewWindow() throws CoreException{ int itemCount = 0; SeamCorePlugin.getSeamProject(project, true); IWorkbench workbench = PlatformUI.getWorkbench(); IWorkbenchPage page = workbench.getActiveWorkbenchWindow().openPage(SeamPerspectiveFactory.PERSPECTIVE_ID, project); try { CommonNavigator navigator = getSeamComponentsView(); navigator.getCommonViewer().expandAll(); Tree tree = navigator.getCommonViewer().getTree(); itemCount = tree.getItemCount(); } finally { page.getWorkbenchWindow().close(); } assertEquals(1, itemCount); } public void testAddRenameDeleteComponentInXmlFile() throws CoreException{ // public void testAddComponentInXmlFile() throws CoreException{ CommonNavigator navigator = getSeamComponentsView(); navigator.getCommonViewer().expandAll(); Tree tree = navigator.getCommonViewer().getTree(); ISeamPackage seamPackage = findSeamPackage(tree, "myPackage"); assertTrue("Error in initial loading components from components.xml. " + "Unexpected package 'myPackage' was found",seamPackage==null); IFile file1 = project.getFile("WebContent/WEB-INF/components.1"); if(file1 == null || !file1.exists()) { fail("Cannot find test data file 'WebContent/WEB-INF/components.1'"); } InputStream is = null; try { is = file1.getContents(); componentsFile.setContents(is, true, false, new NullProgressMonitor()); } catch (CoreException e) { JUnitUtils.fail("Error in changing 'components.xml' content to " + "'WebContent/WEB-INF/components.1'", e); } finally { if(is!=null) { try { is.close(); } catch (IOException e) { e.printStackTrace(); } } } refreshProject(project); navigator.getCommonViewer().refresh(true); navigator.getCommonViewer().expandAll(); seamPackage = findSeamPackage(tree, "myPackage"); assertTrue("Seam model is not updated, expected package 'myPackage'" + " is not found in tree",seamPackage!=null); ISeamComponent component = findSeamComponent(seamPackage, "myPackage.myStringComponent"); assertTrue("Expected component 'myPackage.myStringComponent' was not" + " found",component!=null); // } // // public void testRenameComponentInXmlFile() throws CoreException{ // CommonNavigator navigator = getSeamComponentsView(); navigator.getCommonViewer().expandAll(); // Tree tree = navigator.getCommonViewer().getTree(); // ISeamPackage seamPackage = findSeamPackage(tree, "myPackage"); assertTrue("Expected package 'myPackage' was not found it tree", seamPackage!=null); // ISeamComponent component = findSeamComponent(seamPackage, "myPackage.myStringComponent"); assertTrue("Expected component 'myPackage.myStringComponent' was not" + " found",component!=null); // IFile file1 = project.getFile("WebContent/WEB-INF/components.2"); if(file1 == null || !file1.exists()) { fail("Cannot find test data file 'WebContent/WEB-INF/components.2'"); } try{ FileUtil.copyContent(file1, componentsFile, true, false, new NullProgressMonitor()); }catch(Exception ex){ JUnitUtils.fail("Error in changing 'components.xml' content to " + "'WebContent/WEB-INF/components.2'", ex); } refreshProject(project); navigator.getCommonViewer().refresh(true); navigator.getCommonViewer().expandAll(); seamPackage = findSeamPackage(tree, "myPackage"); assertTrue("Expected package 'myPackage' was not found it tree", seamPackage!=null); JobUtils.delay(1000); component = findSeamComponent(seamPackage, "myPackage.myTextComponent"); assertTrue("Expected component 'myPackage.myTextComponent' not found " + "after renaming",component!=null); file1 = project.getFile("WebContent/WEB-INF/components.3"); if(file1 == null || !file1.exists()) { fail("Cannot find test data file 'WebContent/WEB-INF/components.3'"); } try{ FileUtil.copyContent(file1, componentsFile, true, false, new NullProgressMonitor()); }catch(Exception ex){ JUnitUtils.fail("Error in changing 'components.xml' content to " + "'WebContent/WEB-INF/components.3'", ex); } refreshProject(project); navigator.getCommonViewer().refresh(true); navigator.getCommonViewer().expandAll(); JobUtils.waitForIdle(); seamPackage = findSeamPackage(tree, "myNewPackage"); assertTrue("Expected package 'myNewPackage' was not found it tree after " + "renaming", seamPackage!=null); component = findSeamComponent(seamPackage, "myNewPackage.myTextComponent"); assertTrue("Expected component 'myNewPackage.myTextComponent' not found " + "after renaming",component!=null); // } // // public void testDeleteComponentInXmlFile() throws CoreException{ // CommonNavigator navigator = getSeamComponentsView(); navigator.getCommonViewer().expandAll(); JobUtils.waitForIdle(); // Tree tree = navigator.getCommonViewer().getTree(); // ISeamPackage seamPackage = findSeamPackage(tree, "myNewPackage"); assertTrue("Package \"myNewPackage\" not found!",seamPackage!=null); // ISeamComponent component = findSeamComponent(seamPackage, "myNewPackage.myTextComponent"); assertTrue("Component \"myNewPackage.myTextComponent\" not found!",component!=null); // IFile file1 = project.getFile("WebContent/WEB-INF/components.4"); assertTrue("Cannot find components.2 in test project", file1 != null && file1.exists()); // InputStream is = null; try { is = file1.getContents(); componentsFile.setContents(is, true, false, new NullProgressMonitor()); } catch (CoreException e) { JUnitUtils.fail("Cannot read file WebContent/WEB-INF/components.4", e); } finally { if(is!=null) { try { is.close(); } catch (IOException e) { e.printStackTrace(); } } } refreshProject(project); navigator.getCommonViewer().refresh(true); navigator.getCommonViewer().expandAll(); seamPackage = findSeamPackage(tree, "myNewPackage"); assertTrue("Package \"myNewPackage\" found!",seamPackage==null); } public void testAddComponentInClass(){ classFile = project.getFile("JavaSource/demo/Person.java"); assertTrue("Cannot find Person.java in test project", componentsFile != null); CommonNavigator navigator = getSeamComponentsView(); navigator.getCommonViewer().expandAll(); Tree tree = navigator.getCommonViewer().getTree(); ISeamPackage seamPackage = findSeamPackage(tree, "demo"); assertTrue("Package \"demo\" found!",seamPackage==null); IFile file1 = project.getFile("JavaSource/demo/Person.1"); assertTrue("Cannot find Person.1 in test project", file1 != null && file1.exists()); InputStream is = null; try{ is = file1.getContents(); classFile.create(is, false, new NullProgressMonitor()); }catch(Exception ex){ JUnitUtils.fail("Cannot read file JavaSource/demo/Person.1", ex); } finally { if(is!=null) { try { is.close(); } catch (IOException e) { // ignore } } } refreshProject(project); navigator.getCommonViewer().refresh(true); navigator.getCommonViewer().expandAll(); seamPackage = findSeamPackage(tree, "demo"); assertTrue("Package \"demo\" not found!",seamPackage!=null); ISeamComponent component = findSeamComponent(seamPackage, "demo.John"); assertTrue("Component \"demo.John\" not found!",component!=null); } public void testRenameComponentInClass(){ classFile = project.getFile("JavaSource/demo/Person.java"); CommonNavigator navigator = getSeamComponentsView(); navigator.getCommonViewer().expandAll(); Tree tree = navigator.getCommonViewer().getTree(); ISeamPackage seamPackage = findSeamPackage(tree, "demo"); assertTrue("Package \"demo\" not found!",seamPackage!=null); ISeamComponent component = findSeamComponent(seamPackage, "demo.John"); assertTrue("Component \"demo.John\" not found!",component!=null); IFile file1 = project.getFile("JavaSource/demo/Person.2"); assertTrue("Cannot find Person.2 in test project", file1 != null && file1.exists()); try{ FileUtil.copyContent(file1, classFile, true, false, new NullProgressMonitor()); }catch(Exception ex){ JUnitUtils.fail("Cannot read file JavaSource/demo/Person.2", ex); } refreshProject(project); navigator.getCommonViewer().refresh(true); navigator.getCommonViewer().expandAll(); seamPackage = findSeamPackage(tree, "demo"); assertTrue("Package \"demo\" not found!",seamPackage!=null); component = findSeamComponent(seamPackage, "demo.John"); assertTrue("Component \"demo.John\" found!",component==null); component = findSeamComponent(seamPackage, "demo.Pall"); assertTrue("Component \"demo.Pall\" not found!",component!=null); IFile file2 = project.getFile("JavaSource/demo/Person.3"); assertTrue("Cannot find Person.3 in test project", file2 != null && file2.exists()); try{ FileUtil.copyContent(file2, classFile, true, false, new NullProgressMonitor()); }catch(Exception ex){ JUnitUtils.fail("Cannot read file JavaSource/demo/Person.3", ex); } refreshProject(project); navigator.getCommonViewer().refresh(true); navigator.getCommonViewer().expandAll(); seamPackage = findSeamPackage(tree, "demo"); assertTrue("Package \"demo\" found!",seamPackage==null); seamPackage = findSeamPackage(tree, "beatles"); assertTrue("Package \"beatles\" not found!",seamPackage!=null); component = findSeamComponent(seamPackage, "beatles.Pall"); assertTrue("Component \"beatles.Pall\" not found!",component!=null); } public void testDeleteComponentInClass(){ classFile = project.getFile("JavaSource/demo/Person.java"); ISeamProject sp = SeamCorePlugin.getSeamProject(project, true); ISeamComponent component = sp.getComponent("beatles.Pall"); assertNotNull(component); CommonNavigator navigator = getSeamComponentsView(); navigator.getCommonViewer().expandAll(); Tree tree = navigator.getCommonViewer().getTree(); ISeamPackage seamPackage = findSeamPackage(tree, "beatles"); assertTrue("Package \"beatles\" not found!",seamPackage!=null); if(seamPackage != null){ component = findSeamComponent(seamPackage, "beatles.Pall"); assertTrue("Component \"beatles.Pall\" not found!",component!=null); } try{ classFile.delete(true, new NullProgressMonitor()); JobUtils.waitForIdle(); }catch(Exception ex){ JUnitUtils.fail("Cannot delete file JavaSource/demo/Person.java", ex); } refreshProject(project); component = sp.getComponent("beatles.Pall"); assertNull(component); Collection<ISeamPackage> ps = sp.getPackages(); if(ps != null) for (ISeamPackage p: ps) { System.out.println(p.getName()); assertFalse("beatles".equals(p.getName())); } navigator.getCommonViewer().refresh(true); navigator.getCommonViewer().expandAll(); seamPackage = findSeamPackage(tree, "beatles"); assertTrue("Package \"beatles\" found!",seamPackage==null); } /** * */ public void testSeamComponentsViewIsShowedOnPerspective() { IWorkbenchPage page = WorkbenchUtils.getWorkbenchActivePage(); IViewPart part = page.findView(ISeamUiConstants.SEAM_COMPONENTS_VIEW_ID); assertNotNull("Cannot show the Seam Components View", part); } public void testFlatSeamPackages(){ SeamCorePlugin.getSeamProject(project, true); refreshProject(project); CommonNavigator navigator = getSeamComponentsView(); IActionBars bars = ((IViewSite)navigator.getSite()).getActionBars(); IMenuManager mm = bars.getMenuManager(); IContributionItem item = ((MenuManager)mm).find("Seam Packages"); SeamContributionItem item2 = (SeamContributionItem)((MenuManager)item).find("package.flat"); item2.getAction().run(); refreshProject(project); navigator.getCommonViewer().refresh(); navigator.getCommonViewer().expandAll(); Object[] expanded = navigator.getCommonViewer().getExpandedElements(); for (Object object : expanded) { System.out.println(object.getClass().getName()); System.out.println(object); } Tree tree = navigator.getCommonViewer().getTree(); navigator.getCommonViewer().refresh(true); navigator.getCommonViewer().expandAll(); ISeamPackage seamPackage = findSeamPackage(tree, "package1"); assertTrue("Unexpected package 'package1' was" + " found",seamPackage==null); seamPackage = findSeamPackage(tree, "package1.package2.package3.package4"); assertTrue("Expected package 'package1.package2.package3.package4' was not" + " found",seamPackage!=null); } public void testHierarchicalSeamPackages(){ SeamCorePlugin.getSeamProject(project, true); refreshProject(project); CommonNavigator navigator = getSeamComponentsView(); IActionBars bars = ((IViewSite)navigator.getSite()).getActionBars(); IMenuManager mm = bars.getMenuManager(); IContributionItem item = ((MenuManager)mm).find("Seam Packages"); SeamContributionItem item2 = (SeamContributionItem)((MenuManager)item).find("package.hierarchical"); item2.getAction().run(); refreshProject(project); navigator.getCommonViewer().refresh(); navigator.getCommonViewer().expandAll(); Object[] expanded = navigator.getCommonViewer().getExpandedElements(); Tree tree = navigator.getCommonViewer().getTree(); navigator.getCommonViewer().refresh(true); navigator.getCommonViewer().expandAll(); ISeamPackage seamPackage = findSeamPackage(tree, "package1"); assertTrue("Expected package 'package1' was not" + " found",seamPackage!=null); seamPackage = findSeamPackage(tree, "package1.package2"); assertTrue("Expected package 'package1.package2' was not" + " found",seamPackage!=null); seamPackage = findSeamPackage(tree, "package1.package2.package3"); assertTrue("Expected package 'package1.package2.package3' was not" + " found",seamPackage!=null); seamPackage = findSeamPackage(tree, "package1.package2.package3.package4"); assertTrue("Expected package 'package1.package2.package3.package4' was not" + " found",seamPackage!=null); } private CommonNavigator getSeamComponentsView() { IWorkbenchPage page = WorkbenchUtils.getWorkbenchActivePage(); CommonNavigator part = (CommonNavigator)page.findView(ISeamUiConstants.SEAM_COMPONENTS_VIEW_ID); return part; } private void showTreeItem(TreeItem item, int level){ for(int i=0;i<level;i++) System.out.print("-"); System.out.print("Item "+item.getText()); System.out.println(" Data "+item.getData()); if(item.getData() instanceof ISeamPackage) showSeamPackage((ISeamPackage)item.getData(),1); else if(item.getData() instanceof ISeamComponent) showSeamComponent((ISeamComponent)item.getData(),1); for(int i=0;i<item.getItemCount();i++){ showTreeItem(item.getItem(i),level+1); } } private void showSeamPackage(ISeamPackage seamPackage, int level){ // for(int i=0;i<level;i++) // System.out.print("-"); System.out.println("Package - "+seamPackage.getName()+" "+seamPackage.getQualifiedName()); Iterator<ISeamComponent> iter = seamPackage.getComponents().iterator(); while(iter.hasNext()) showSeamComponent(iter.next(), level+1); } private void showSeamComponent(ISeamComponent component, int level){ // for(int i=0;i<level;i++) // System.out.print("-"); System.out.println("Component - "+component.getName()+" "+component.getClassName()); } private ISeamComponent findSeamComponent(ISeamPackage seamPackage, String name){ ISeamComponent component=null; Iterator<ISeamComponent> iter = seamPackage.getComponents().iterator(); while(iter.hasNext()){ component = iter.next(); if(component.getName().equals(name)) return component; } return null; } // private ISeamPackage findSeamPackage(ISeamScope seamScope, String name){ // ISeamPackage seamPackage=null; // // Iterator<ISeamPackage> iter = seamScope.getAllPackages().iterator(); // while(iter.hasNext()){ // seamPackage = iter.next(); // if(seamPackage.getName().equals(name)) return seamPackage; // } // // return null; // } private ISeamPackage findSeamPackage(TreeItem item, String name){ ISeamPackage seamPackage=null; for(int i=0;i<item.getItemCount();i++){ TreeItem cur = item.getItem(i); if(cur.getData() instanceof ISeamPackage) { ISeamPackage pkg =(ISeamPackage)cur.getData(); //System.out.println("Searching: "+name+" found: "+pkg.getQualifiedName()); if(name.equals(pkg.getQualifiedName())) { //System.out.println("Found!"); return pkg; } } seamPackage = findSeamPackage(cur, name); if(seamPackage != null) return seamPackage; } return seamPackage; } private ISeamPackage findSeamPackage(Tree tree, String name){ ISeamPackage seamPackage=null; TreeItem item; for(int i=0;i<tree.getItemCount();i++){ item = tree.getItem(i); seamPackage = findSeamPackage(item, name); if(seamPackage != null) return seamPackage; } return null; } private static final int NUMBER_OF_REFRESHES = 1; private void refreshProject(IProject project){ long timestamp = project.getModificationStamp(); int count = 1; while(true){ System.out.println("Refresh project "+count); try { project.refreshLocal(IResource.DEPTH_INFINITE, new NullProgressMonitor()); JobUtils.waitForIdle(); } catch (CoreException e) { JUnitUtils.fail("Cannot build test Project", e); break; } if(project.getModificationStamp() != timestamp) break; count++; if(count > NUMBER_OF_REFRESHES) break; } JobUtils.delay(1000); } }