blob: 06529b26512881641dbee9b7402f14bb6da8187c [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.netbeans.modules.web.freeform;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.jar.JarEntry;
import java.util.jar.JarOutputStream;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.netbeans.api.project.FileOwnerQuery;
import org.netbeans.api.project.Project;
import org.netbeans.api.project.ProjectManager;
import org.netbeans.junit.NbTestCase;
import org.netbeans.modules.ant.freeform.FreeformProjectGenerator;
import org.netbeans.modules.ant.freeform.spi.support.Util;
import org.netbeans.modules.project.ant.AntBasedProjectFactorySingleton;
import org.netbeans.modules.web.api.webmodule.WebModule;
import org.netbeans.spi.project.AuxiliaryConfiguration;
import org.netbeans.spi.project.support.ant.AntProjectHelper;
import org.openide.filesystems.FileObject;
import org.openide.filesystems.FileUtil;
import org.openide.modules.ModuleInfo;
import org.openide.util.Lookup;
import org.openide.xml.XMLUtil;
import org.w3c.dom.Element;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
import org.xml.sax.helpers.DefaultHandler;
/**
* Tests for FreeformProjectGenerator.
*
* @author Pavel Buzek
*/
public class WebProjectGeneratorTest extends NbTestCase {
private File lib1;
private File lib2;
private File src;
private File web;
private File doc;
private File buildClasses;
public WebProjectGeneratorTest(String testName) {
super(testName);
}
protected void setUp() throws Exception {
super.setUp();
Lookup.getDefault().lookup(ModuleInfo.class);
clearWorkDir();
}
private AntProjectHelper createEmptyProject(String projectFolder, String projectName) throws Exception {
File base = new File(getWorkDir(), projectFolder);
base.mkdir();
File antScript = new File(base, "build.xml");
antScript.createNewFile();
src = new File(base, "src");
src.mkdir();
web = new File(base, "web");
web.mkdir();
doc = new File(base, "doc");
doc.mkdir();
buildClasses = new File(base, "buildClasses");
buildClasses.mkdir();
File libs = new File(base, "libs");
libs.mkdir();
lib1 = new File(libs, "some.jar");
createRealJarFile(lib1);
lib2 = new File(libs, "some2.jar");
createRealJarFile(lib2);
ArrayList webModules = new ArrayList ();
WebProjectGenerator.WebModule wm = new WebProjectGenerator.WebModule ();
wm.docRoot = web.getAbsolutePath();
wm.contextPath = "/context";
wm.j2eeSpecLevel = WebModule.J2EE_14_LEVEL;
wm.classpath = base.getAbsolutePath() + "/buildClasses:" + lib1.getAbsolutePath();
webModules.add (wm);
AntProjectHelper helper = FreeformProjectGenerator.createProject(base, base, projectName, null);
WebProjectGenerator.putWebModules(helper, Util.getAuxiliaryConfiguration(helper), webModules);
return helper;
}
public void testWebModules () throws Exception {
clearWorkDir();
AntProjectHelper helper = createEmptyProject("proj2", "proj-2");
FileObject base = helper.getProjectDirectory();
Project p = ProjectManager.getDefault().findProject(base);
assertNotNull("Project was not created", p);
assertEquals("Project folder is incorrect", base, p.getProjectDirectory());
WebModule wm = WebModule.getWebModule(FileUtil.toFileObject(web));
assertNotNull("WebModule not found", wm);
assertEquals("correct document base", FileUtil.toFileObject(web), wm.getDocumentBase());
assertEquals("correct j2ee version", WebModule.J2EE_14_LEVEL, wm.getJ2eePlatformVersion());
assertEquals("correct context path", "/context", wm.getContextPath());
WebModule wm2 = WebModule.getWebModule(FileUtil.toFileObject (src));
// assertNotNull("WebModule not found", wm2);
// assertEquals("the same wm for web and src folder", wm, wm2);
}
public void test2WebModules () throws Exception {
clearWorkDir();
AntProjectHelper helper = createEmptyProject("proj6", "proj-6");
FileObject base = helper.getProjectDirectory();
Project p = ProjectManager.getDefault().findProject(base);
assertNotNull("Project was not created", p);
assertEquals("Project folder is incorrect", base, p.getProjectDirectory());
File src2 = FileUtil.toFile (base.createFolder("src2"));
File web2 = FileUtil.toFile (base.createFolder("web2"));
AuxiliaryConfiguration aux = Util.getAuxiliaryConfiguration(helper);
List webModules = WebProjectGenerator.getWebmodules(helper, aux);
WebProjectGenerator.WebModule wm = new WebProjectGenerator.WebModule ();
wm.docRoot = web2.getAbsolutePath();
wm.contextPath = "/context2";
wm.j2eeSpecLevel = WebModule.J2EE_13_LEVEL;
wm.classpath = FileUtil.toFile (base).getAbsolutePath() + "/buildClasses2:" + lib2.getAbsolutePath();
webModules.add (wm);
WebProjectGenerator.putWebModules(helper, aux, webModules);
ProjectManager.getDefault().saveProject(p);
WebModule webModule = WebModule.getWebModule(base.getFileObject("web2"));
assertNotNull("WebModule not found", webModule);
assertEquals("correct document base", base.getFileObject("web2"), webModule.getDocumentBase());
WebModule webModule2 = WebModule.getWebModule(base.getFileObject("src2"));
// assertNotNull("WebModule not found", webModule2);
// assertEquals("correct document base", webModule, webModule2);
}
public void testWebDataUpgrades() throws Exception {
AntProjectHelper helper = createEmptyProject("proj", "proj");
FileObject base = helper.getProjectDirectory();
Project p = ProjectManager.getDefault().findProject(base);
assertNotNull("Project should be created", p);
assertEquals("Project folder should be correct", base, p.getProjectDirectory());
// start with a /1-friendly data set
List<WebProjectGenerator.WebModule> webModules = new ArrayList<WebProjectGenerator.WebModule>();
WebProjectGenerator.WebModule webModule = new WebProjectGenerator.WebModule();
webModule.docRoot = "web";
webModule.webInf = webModule.docRoot + "/WEB-INF";
webModule.j2eeSpecLevel = "1.5";
webModule.contextPath = "mymodule";
webModules.add(webModule);
AuxiliaryConfiguration aux = Util.getAuxiliaryConfiguration(helper);
WebProjectGenerator.putWebModules(helper, aux, webModules);
// check that the correct /1 data was saved
Element el = aux.getConfigurationFragment(WebProjectNature.EL_WEB, WebProjectNature.NS_WEB_1, true);
assertNotNull("Web modules should be saved in /1", el);
List<Element> subElements = XMLUtil.findSubElements(el);
assertEquals(1, subElements.size());
// compare the web module
Element el2 = subElements.get(0);
assertElement(el2, "web-module", null);
assertElementArray(XMLUtil.findSubElements(el2),
new String[] {"doc-root", "context-path", "j2ee-spec-level", "web-inf"},
new String[] {"web", "mymodule", "1.5", "web/WEB-INF"});
// validate against schema:
ProjectManager.getDefault().saveAllProjects();
validate(p);
// now check that setting web-inf to non-default value on that element forces a /2 save.
webModules = new ArrayList<WebProjectGenerator.WebModule>();
webModule = new WebProjectGenerator.WebModule();
webModule.docRoot = "web";
webModule.webInf = "somewhereelse/WEB-INF";
webModule.j2eeSpecLevel = "1.5";
webModule.contextPath = "mymodule";
webModules.add(webModule);
WebProjectGenerator.putWebModules(helper, aux, webModules);
// check that we now have it in /2
el = aux.getConfigurationFragment(WebProjectNature.EL_WEB, WebProjectNature.NS_WEB_1, true);
assertNull("No /1 data should exist.", el);
el = aux.getConfigurationFragment(WebProjectNature.EL_WEB, WebProjectNature.NS_WEB_2, true);
assertNotNull("Should have /2 data.", el);
subElements = XMLUtil.findSubElements(el);
assertEquals(1, subElements.size());
// compare the web module
el2 = subElements.get(0);
assertElement(el2, "web-module", null);
assertElementArray(XMLUtil.findSubElements(el2),
new String[] {"doc-root", "context-path", "j2ee-spec-level", "web-inf"},
new String[] {"web", "mymodule", "1.5", "somewhereelse/WEB-INF"});
// validate against schema:
ProjectManager.getDefault().saveAllProjects();
validate(p);
// now try fresh save of /2-requiring data (using web-inf).
assertTrue("Should removed /2 data", aux.removeConfigurationFragment(WebProjectNature.EL_WEB, WebProjectNature.NS_WEB_2, true));
webModules = new ArrayList<WebProjectGenerator.WebModule>();
webModule = new WebProjectGenerator.WebModule();
webModule.docRoot = "web";
webModule.webInf = "somewhereelse/WEB-INF";
webModule.j2eeSpecLevel = "1.5";
webModule.contextPath = "mymodule";
webModules.add(webModule);
WebProjectGenerator.putWebModules(helper, aux, webModules);
// check that we have it in /2
el = aux.getConfigurationFragment(WebProjectNature.EL_WEB, WebProjectNature.NS_WEB_1, true);
assertNull("No /1 data should exist.", el);
el = aux.getConfigurationFragment(WebProjectNature.EL_WEB, WebProjectNature.NS_WEB_2, true);
assertNotNull("Should have /2 data.", el);
subElements = XMLUtil.findSubElements(el);
assertEquals(1, subElements.size());
// compare the web module
el2 = subElements.get(0);
assertElement(el2, "web-module", null);
assertElementArray(XMLUtil.findSubElements(el2),
new String[] {"doc-root", "context-path", "j2ee-spec-level", "web-inf"},
new String[] {"web", "mymodule", "1.5", "somewhereelse/WEB-INF"});
// validate against schema:
ProjectManager.getDefault().saveAllProjects();
validate(p);
}
//Tests issue: #147128:J2SESources does not register new external roots immediately
public void testProjectFromExtSourcesOwnsTheSources() throws Exception
{
AntProjectHelper helper = createEmptyProject("proj-testFileOwner", "proj-testFileOwner");
File root = FileUtil.toFile(helper.getProjectDirectory());
File srcRoot = new File (root, "src");
File testRoot = new File (root, "test");
final Project expected = FileOwnerQuery.getOwner(helper.getProjectDirectory());
assertNotNull(expected);
assertEquals(expected, FileOwnerQuery.getOwner(srcRoot.toURI()));
assertEquals(expected, FileOwnerQuery.getOwner(testRoot.toURI()));
}
// create real Jar otherwise FileUtil.isArchiveFile returns false for it
public void createRealJarFile(File f) throws Exception {
OutputStream os = new FileOutputStream(f);
try {
JarOutputStream jos = new JarOutputStream(os);
JarEntry entry = new JarEntry("foo.txt");
jos.putNextEntry(entry);
jos.flush();
jos.close();
} finally {
os.close();
}
}
/**
* Asserts that given Element has expected name and its text match expected value.
* @param element element to test
* @param expectedName expected name of element; cannot be null
* @param expectedValue can be null in which case value is not tested
*/
public static void assertElement(Element element, String expectedName, String expectedValue) {
String message = "Element "+element+" does not match [name="+expectedName+",value="+expectedValue+"]"; // NOI18N
assertEquals(message, expectedName, element.getLocalName());
if (expectedValue != null) {
assertEquals(message, expectedValue, XMLUtil.findText(element));
}
}
/**
* See {@link #assertElement(Element, String, String)} for more details. This
* method does exactly the same just on the list of elements and expected names.
*/
public static void assertElementArray(List<Element> elements, String[] expectedNames, String[] expectedValues) {
for (int i=0; i<elements.size(); i++) {
assertElement(elements.get(i), expectedNames[i], expectedValues[i]);
}
}
/**
* Asserts that given Element has expected name and its text match expected value and
* it also has expect attribute with expected value.
* @param element element to test
* @param expectedName expected name of element; cannot be null
* @param expectedValue can be null in which case value is not tested
* @param expectedAttrName expected name of attribute; cannot be null
* @param expectedAttrValue expected value of attribute; cannot be null
*/
public static void assertElement(Element element, String expectedName, String expectedValue, String expectedAttrName, String expectedAttrValue) {
String message = "Element "+element+" does not match [name="+expectedName+",value="+
expectedValue+", attr="+expectedAttrName+", attrvalue="+expectedAttrValue+"]"; // NOI18N
assertEquals(message, expectedName, element.getLocalName());
if (expectedValue != null) {
assertEquals(message, expectedValue, XMLUtil.findText(element));
}
String val = element.getAttribute(expectedAttrName);
assertEquals(expectedAttrValue, val);
}
/**
* See {@link #assertElement(Element, String, String)} for more details. This
* method does exactly the same just on the list of elements and expected names
* and expected attributes.
*/
public static void assertElementArray(List<Element> elements, String[] expectedNames, String[] expectedValues, String[] expectedAttrName, String[] expectedAttrValue) {
assertEquals(expectedNames.length, elements.size());
for (int i=0; i<elements.size(); i++) {
assertElement(elements.get(i), expectedNames[i], expectedValues[i], expectedAttrName[i], expectedAttrValue[i]);
}
}
public static void validate(Project proj) throws Exception {
File projF = FileUtil.toFile(proj.getProjectDirectory());
File xml = new File(new File(projF, "nbproject"), "project.xml");
SAXParserFactory f = SAXParserFactory.newInstance();
f.setNamespaceAware(true);
f.setValidating(true);
SAXParser p = f.newSAXParser();
p.setProperty("http://java.sun.com/xml/jaxp/properties/schemaLanguage",
"http://www.w3.org/2001/XMLSchema");
p.setProperty("http://java.sun.com/xml/jaxp/properties/schemaSource", getSchemas());
try {
p.parse(xml.toURI().toString(), new Handler());
} catch (SAXParseException e) {
assertTrue("Validation of XML document "+xml+" against schema failed. Details: "+
e.getSystemId() + ":" + e.getLineNumber() + ": " + e.getLocalizedMessage(), false);
}
}
private static String[] getSchemas() throws Exception {
return new String[] {
FreeformProjectGenerator.class.getResource("resources/freeform-project-general.xsd").toExternalForm(),
WebProjectGenerator.class.getResource("resources/freeform-project-web.xsd").toExternalForm(),
WebProjectGenerator.class.getResource("resources/freeform-project-web-2.xsd").toExternalForm(),
AntBasedProjectFactorySingleton.class.getResource("project.xsd").toExternalForm(),
};
}
private static final class Handler extends DefaultHandler {
@Override
public void warning(SAXParseException e) throws SAXException {
throw e;
}
@Override
public void error(SAXParseException e) throws SAXException {
throw e;
}
@Override
public void fatalError(SAXParseException e) throws SAXException {
throw e;
}
}
}