/*******************************************************************************
* Copyright (c) 2011 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.jsf.test;
import java.util.List;
import java.util.Set;
import junit.framework.TestCase;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
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.jboss.tools.common.el.core.model.ELInvocationExpression;
import org.jboss.tools.common.el.core.parser.ELParser;
import org.jboss.tools.common.el.core.parser.ELParserUtil;
import org.jboss.tools.common.el.core.resolver.ELContext;
import org.jboss.tools.common.model.XModelObject;
import org.jboss.tools.common.model.XModelObjectConstants;
import org.jboss.tools.common.model.project.IModelNature;
import org.jboss.tools.common.model.util.EclipseResourceUtil;
import org.jboss.tools.common.validation.ValidatorManager;
import org.jboss.tools.jsf.jsf2.bean.el.JSF2ElResolver;
import org.jboss.tools.jsf.jsf2.bean.model.IJSF2ManagedBean;
import org.jboss.tools.jsf.jsf2.bean.model.IJSF2Project;
import org.jboss.tools.jsf.jsf2.bean.model.JSF2ProjectFactory;
import org.jboss.tools.jsf.model.pv.JSFProjectBeans;
import org.jboss.tools.jsf.model.pv.JSFProjectsRoot;
import org.jboss.tools.jsf.model.pv.JSFProjectsTree;
import org.jboss.tools.jst.web.kb.PageContextFactory;
import org.jboss.tools.test.util.JobUtils;
import org.jboss.tools.test.util.ResourcesUtils;
public class JSF2ModelTest extends TestCase {
IProject project = null;
IProject webproject = null;
IProject kick = null;
public JSF2ModelTest() {
project = ResourcesPlugin.getWorkspace().getRoot().getProject("JSF2Beans");
webproject = ResourcesPlugin.getWorkspace().getRoot().getProject("JSF2Web");
kick = ResourcesPlugin.getWorkspace().getRoot().getProject("JSF2KickStartWithoutLibs");
}
public void testModel() {
IJSF2Project jsf2 = JSF2ProjectFactory.getJSF2Project(project, true);
assertNotNull(jsf2);
Set<IJSF2ManagedBean> beans = jsf2.getManagedBeans("mybean1");
//Test two beans with the same name
assertEquals(1, beans.size());
beans = jsf2.getManagedBeans("mybean2");
assertEquals(2, beans.size());
//Test bean annotated @ManagedBean(name="")
beans = jsf2.getManagedBeans("bean4");
assertEquals(1, beans.size());
//Test bean annotated @ManagedBean
beans = jsf2.getManagedBeans("bean5");
assertEquals(1, beans.size());
}
public void testConstantBeanName() {
IJSF2Project jsf2 = JSF2ProjectFactory.getJSF2Project(project, true);
assertNotNull(jsf2);
Set<IJSF2ManagedBean> beans = jsf2.getManagedBeans("bean6");
assertEquals(1, beans.size());
}
public void testWebProjectTree() {
IModelNature n = EclipseResourceUtil.getModelNature(kick);
assertNotNull(n);
JSFProjectsRoot root = JSFProjectsTree.getProjectsRoot(n.getModel());
JSFProjectBeans beans = (JSFProjectBeans)root.getChildByPath("Beans");
XModelObject[] cs = beans.getTreeChildren();
boolean userFound = false;
for (XModelObject c: cs) {
if("user".equals(c.getAttributeValue(XModelObjectConstants.ATTR_NAME))) userFound = true;
}
assertTrue(userFound);
IJSF2Project jsf2 = JSF2ProjectFactory.getJSF2Project(kick, true);
Set<IJSF2ManagedBean> bs = jsf2.getManagedBeans("user");
assertFalse(bs.isEmpty());
}
/**
* Modifies metadata-complete flag in /WEB-INF/faces-config.xml.
* Checks that the flag is loaded correctly into model.
* Checks that JSF2ElResolver takes into account that flag.
*
* @throws CoreException
*/
public void testMetadataCompleteAndElResolver() throws CoreException {
IJSF2Project jsf2 = JSF2ProjectFactory.getJSF2Project(webproject, true);
assertNotNull(jsf2);
Set<IJSF2ManagedBean> beans = jsf2.getManagedBeans("mybean1");
assertEquals(1, beans.size());
IFile f = webproject.getFile("src/test/beans/inputname.xhtml");
assertTrue(f.exists());
JSF2ElResolver resolver = new JSF2ElResolver();
ELParser p = ELParserUtil.getJbossFactory().createParser();
ELInvocationExpression exp = (ELInvocationExpression)p.parse("#{myb}").getInstances().get(0).getExpression();
assertFalse(jsf2.isMetadataComplete());
ELContext context = PageContextFactory.getInstance().createPageContext(f);
List<IJSF2ManagedBean> bs = resolver.resolveVariables(f, context, exp, true, false, 5);
assertFalse(bs.isEmpty());
replaceFile(webproject, "WebContent/WEB-INF/faces-config.complete", "WebContent/WEB-INF/faces-config.xml");
assertTrue(jsf2.isMetadataComplete());
bs = resolver.resolveVariables(f, context, exp, true, false, 5);
assertTrue(bs.isEmpty());
beans = jsf2.getManagedBeans("mybean1");
assertTrue(beans.isEmpty());
replaceFile(webproject, "WebContent/WEB-INF/faces-config.original", "WebContent/WEB-INF/faces-config.xml");
assertFalse(jsf2.isMetadataComplete());
bs = resolver.resolveVariables(f, context, exp, true, false, 5);
assertFalse(bs.isEmpty());
beans = jsf2.getManagedBeans("mybean1");
assertEquals(1, beans.size());
}
public static void replaceFile(IProject project, String sourcePath, String targetPath) throws CoreException {
boolean saveAutoBuild = ResourcesUtils.setBuildAutomatically(false);
try {
IFile target = project.getFile(new Path(targetPath));
IFile source = project.getFile(new Path(sourcePath));
assertTrue(source.exists());
ValidatorManager.setStatus(ValidatorManager.RUNNING);
if(!target.exists()) {
target.create(source.getContents(), true, new NullProgressMonitor());
} else {
target.setContents(source.getContents(), true, false, new NullProgressMonitor());
}
project.build(IncrementalProjectBuilder.INCREMENTAL_BUILD, new NullProgressMonitor());
} finally {
ResourcesUtils.setBuildAutomatically(saveAutoBuild);
JobUtils.waitForIdle();
}
}
}