/******************************************************************************* * Copyright (c) 2004, 2005 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are 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: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.jst.jsp.ui.tests.contentassist; import java.io.File; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import junit.framework.TestCase; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.Platform; import org.eclipse.jdt.core.IJavaElement; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.IOpenable; import org.eclipse.jdt.core.IPackageFragment; import org.eclipse.jdt.core.IPackageFragmentRoot; import org.eclipse.jdt.core.IParent; import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jst.jsp.ui.internal.contentassist.BeanInfoProvider; import org.eclipse.jst.jsp.ui.internal.contentassist.IJavaPropertyDescriptor; import org.eclipse.jst.jsp.ui.tests.util.FileUtil; import org.eclipse.jst.jsp.ui.tests.util.ProjectUnzipUtility; import org.eclipse.osgi.service.datalocation.Location; import org.eclipse.ui.dialogs.IOverwriteQuery; /** * This class tests the BeanInfoProvider. Currently test workspace MUST point * to the specific one for this test. * * @author pavery */ public class BeanInfoProviderTest extends TestCase { class OverwriteNone implements IOverwriteQuery { public String queryOverwrite(String pathString) { return IOverwriteQuery.ALL; } } private IResource fResource; private BeanInfoProvider fProvider; private HashSet fAlreadyOpen = new HashSet(); private ProjectUnzipUtility fProjUtil = null; private boolean fIsSetup = false; public BeanInfoProviderTest(String name) { super(name); } protected void setUp() throws Exception { super.setUp(); if (!this.fIsSetup) { initializeResource(); this.fIsSetup = true; } } private void initializeResource() throws Exception { fProjUtil = new ProjectUnzipUtility(); // root of workspace directory Location platformLocation = Platform.getInstanceLocation(); // platform location may be null -- depends on "mode" of platform if (platformLocation != null) { File zipFile = FileUtil.makeFileFor(ProjectUnzipUtility.PROJECT_ZIPS_FOLDER, "beaninfo_tests.zip", ProjectUnzipUtility.PROJECT_ZIPS_FOLDER); fProjUtil.unzipAndImport(zipFile, platformLocation.getURL().getPath()); fProjUtil.initJavaProject("BEANINFO"); IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot(); String workspaceRelativeLocation = "/BEANINFO/BEAN_TESTS/beanInfo_test.jsp"; fResource = root.getFile(new Path(workspaceRelativeLocation)); IJavaProject javaProj = JavaCore.create(fResource.getProject()); openPath(javaProj); } } protected File getSourceDirectory(String absoluteSourceDirectoryPath) { File sourceDirectory = new File(absoluteSourceDirectoryPath); if (!sourceDirectory.exists() || !sourceDirectory.isDirectory()) { return null; } return sourceDirectory; } private void openPath(IJavaProject javaProj) { try { if (javaProj.exists() && !javaProj.isOpen()) { javaProj.open(null); } IPackageFragmentRoot root = javaProj.getPackageFragmentRoot(fResource.getProject()); if (!root.isOpen()) root.open(null); IPackageFragment frag = getPackageFragment(root, "BEAN_TESTS"); openAll(frag); frag = getPackageFragment(root, "org"); if (frag != null && !frag.isOpen()) openAll(frag); frag = getPackageFragment(root, "org.eclipse"); if (frag != null && !frag.isOpen()) openAll(frag); frag = getPackageFragment(root, "org.eclipse.jst"); if (frag != null && !frag.isOpen()) openAll(frag); frag = getPackageFragment(root, "org.eclipse.jst.jsp"); if (frag != null && !frag.isOpen()) openAll(frag); frag = getPackageFragment(root, "org.eclipse.jst.jsp.ui"); if (frag != null && !frag.isOpen()) openAll(frag); frag = getPackageFragment(root, "org.eclipse.jst.jsp.ui.tests"); if (frag != null && !frag.isOpen()) openAll(frag); } catch (JavaModelException e) { e.printStackTrace(); } } private IPackageFragment getPackageFragment(IPackageFragmentRoot root, String fragmentName) throws JavaModelException { IPackageFragment frag = null; IJavaElement[] children = root.getChildren(); for (int i = 0; i < children.length; i++) { if (children[i].getElementName().equals(fragmentName)) { frag = (IPackageFragment) children[i]; break; } } return frag; } private void openAll(IJavaElement javaElem) throws JavaModelException { if (javaElem instanceof IOpenable) { if (!((IOpenable) javaElem).isOpen()) ((IOpenable) javaElem).open(null); } if (javaElem instanceof IParent && ((IParent) javaElem).hasChildren()) { IJavaElement[] children = ((IParent) javaElem).getChildren(); for (int i = 0; i < children.length; i++) { if (!fAlreadyOpen.contains(children[i].getElementName())) { fAlreadyOpen.add(children[i].getElementName()); openAll(children[i]); } } } } public void testAll() { beanOnClasspath(); beanInProject(); } private void beanOnClasspath() { // pa_TODO don't use JButton, properties change // use something more static IJavaPropertyDescriptor[] descriptors = getProvider().getRuntimeProperties(fResource, "javax.swing.JButton"); // assertEquals("Number of properties for JButton:", 122, descriptors.length); assertNotNull("descriptors shouldn't be null", descriptors); // List getOnly = new ArrayList(); // List setOnly = new ArrayList(); // List both = new ArrayList(); // IJavaPropertyDescriptor jpd = null; // for (int i = 0; i < descriptors.length; i++) { // jpd = descriptors[i]; // if (jpd.getReadable() && jpd.getWriteable()) // both.add(jpd); // else if (jpd.getReadable() && !jpd.getWriteable()) // getOnly.add(jpd); // else // setOnly.add(jpd); // } // assertEquals("Number of getOnly properties:", 62, getOnly.size()); //assertEquals("Number of setOnly properties:", 0, setOnly.size()); //assertEquals("Number of get & set properties that:", 59, // both.size()); } private void beanInProject() { IJavaPropertyDescriptor[] descriptors = getProvider().getRuntimeProperties(fResource, "org.eclipse.jst.jsp.ui.tests.BaseAlbumCollectionBean"); assertEquals("Number of properties for BaseAlbumCollectionBean:", 4, descriptors.length); List getOnly = new ArrayList(); List setOnly = new ArrayList(); List both = new ArrayList(); IJavaPropertyDescriptor jpd = null; for (int i = 0; i < descriptors.length; i++) { jpd = descriptors[i]; if (jpd.getReadable() && jpd.getWriteable()) both.add(jpd); else if (jpd.getReadable() && !jpd.getWriteable()) getOnly.add(jpd); else setOnly.add(jpd); } assertEquals("Number of getOnly properties:", 1, getOnly.size()); assertEquals("Number of setOnly properties:", 1, setOnly.size()); assertEquals("Number of get & set properties that:", 2, both.size()); // get only jpd = (IJavaPropertyDescriptor) getOnly.get(0); assertEquals("get readable for get only property: ", true, jpd.getReadable()); assertEquals("get writable for get only property:", false, jpd.getWriteable()); assertEquals("name for get only property", "numCds", jpd.getDisplayName()); assertEquals("type for get only property", "int", jpd.getDeclaredType()); // set only jpd = (IJavaPropertyDescriptor) setOnly.get(0); assertEquals("get readable for set only property: ", false, jpd.getReadable()); assertEquals("get writable for set only property:", true, jpd.getWriteable()); assertEquals("name for set only property", "cds", jpd.getDisplayName()); assertEquals("type for set only property", "String[]", jpd.getDeclaredType()); // both jpd = (IJavaPropertyDescriptor) both.get(0); assertEquals("get readable for both property: ", true, jpd.getReadable()); assertEquals("get writable for both property:", true, jpd.getWriteable()); } private BeanInfoProvider getProvider() { if (fProvider == null) fProvider = new BeanInfoProvider(); return fProvider; } }