alvinalexander.com | career | drupal | java | mac | mysql | perl | scala | uml | unix  

What this is

This file is included in the DevDaily.com "Java Source Code Warehouse" project. The intent of this project is to help you "Learn Java by Example" TM.

Other links

The source code

/*
 *                 Sun Public License Notice
 *
 * The contents of this file are subject to the Sun Public License
 * Version 1.0 (the "License"). You may not use this file except in
 * compliance with the License. A copy of the License is available at
 * http://www.sun.com/
 *
 * The Original Code is NetBeans. The Initial Developer of the Original
 * Code is Sun Microsystems, Inc. Portions Copyright 1997-2004 Sun
 * Microsystems, Inc. All Rights Reserved.
 */

package org.netbeans.modules.ant.freeform;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URL;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.jar.JarEntry;
import java.util.jar.JarOutputStream;
import java.util.zip.ZipEntry;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import junit.framework.*;
import org.netbeans.api.java.classpath.ClassPath;
import org.netbeans.api.project.Project;
import org.netbeans.api.project.ProjectInformation;
import org.netbeans.api.project.ProjectManager;
import org.netbeans.api.project.ProjectUtils;
import org.netbeans.api.project.Sources;
import org.netbeans.junit.NbTestCase;
import org.netbeans.modules.web.api.webmodule.WebModule;
import org.netbeans.modules.web.spi.webmodule.WebModuleProvider;
import org.netbeans.spi.java.classpath.ClassPathProvider;
import org.netbeans.spi.project.ActionProvider;
import org.netbeans.spi.project.AuxiliaryConfiguration;
import org.netbeans.spi.project.support.ant.AntProjectHelper;
import org.netbeans.spi.project.support.ant.ProjectGenerator;
import org.netbeans.spi.project.support.ant.PropertyUtils;
import org.netbeans.spi.project.ui.LogicalViewProvider;
import org.openide.ErrorManager;
import org.openide.filesystems.FileObject;
import org.openide.filesystems.FileUtil;
import org.openide.nodes.Node;
import org.openide.util.Lookup;
import org.w3c.dom.Document;
import org.w3c.dom.Element;

// XXX: part of the testSourceFoldersAndSourceViews test is commented out
// becasue implementation of Source interface does not refresh automatically.

/**
 * Tests for FreeformProjectGenerator.
 *
 * @author Pavel Buzek
 */
public class FreeformProjectGeneratorWebTest extends NbTestCase {

    private File lib1;
    private File lib2;
    private File src;
    private File web;
    private File doc;
    private File buildClasses;
    
    public FreeformProjectGeneratorWebTest(java.lang.String testName) {
        super(testName);
    }
    
    protected void setUp() throws Exception {
    }
    
    protected void tearDown() throws Exception {
    }
    
    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);
        
// XXX: might need to call refresh here??
//        FileObject fo = FileUtil.toFileObject(getWorkDir());
//        fo.refresh();
        ArrayList sources = new ArrayList();
        FreeformProjectGenerator.SourceFolder sf = new FreeformProjectGenerator.SourceFolder();
        sf.label = "src";
        sf.type = "java";
        sf.location = src.getAbsolutePath();
        sf.style = "packages";
        sources.add(sf);
        
        FreeformProjectGenerator.SourceFolder sf2 = new FreeformProjectGenerator.SourceFolder();
        sf2.label = "web";
        sf2.type = "doc_root";
        sf2.location = web.getAbsolutePath();
        sf2.style = "tree";
        sources.add(sf2);
        
        ArrayList compUnits = new ArrayList();
        FreeformProjectGenerator.JavaCompilationUnit cu = new FreeformProjectGenerator.JavaCompilationUnit();
        FreeformProjectGenerator.JavaCompilationUnit.CP cp = new FreeformProjectGenerator.JavaCompilationUnit.CP();
        cp.classpath = lib1.getAbsolutePath();
        cp.mode = "compile";
        cu.classpath = Collections.singletonList(cp);
        cu.sourceLevel = "1.4";
        ArrayList outputs = new ArrayList ();
        outputs.add ("buildClasses"); 
        cu.output = outputs;
        cu.packageRoots = Collections.singletonList(src.getAbsolutePath());
        compUnits.add(cu);
        
        ArrayList webModules = new ArrayList ();
        FreeformProjectGenerator.WebModule wm = new FreeformProjectGenerator.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.createWebProject(base, base, projectName, null, new ArrayList(), sources, compUnits, 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 testSourceFoldersAndSourceViews() throws Exception {
        clearWorkDir();
        AntProjectHelper helper = createEmptyProject("proj3", "proj-3");
        FileObject base = helper.getProjectDirectory();
        Project p = ProjectManager.getDefault().findProject(base);
        assertNotNull("Project was not created", p);
        assertEquals("Project folder is incorrect", base, p.getProjectDirectory());
        
        Sources ss = ProjectUtils.getSources(p);
        assertEquals("Project must have one java source group", 1, ss.getSourceGroups("java").length);
        assertEquals("Project must have one doc_root source group", 1, ss.getSourceGroups("doc_root").length);
        assertEquals("Project cannot have csharp source group", 0, ss.getSourceGroups("csharp").length);

        LogicalViewProvider lvp = (LogicalViewProvider)p.getLookup().lookup(LogicalViewProvider.class);
        assertNotNull("Project does not have LogicalViewProvider", lvp);
        Node n = lvp.createLogicalView();
        // expected subnodes: #1) src folder, #2 web folder and #3) build.xml
        assertEquals("There must be three subnodes in logical view", 3, n.getChildren().getNodesCount());
        
        
        n = lvp.createLogicalView();
        // expected subnodes: #1) src folder and #2) build.xml and #3) tests
//        assertEquals("There must be three subnodes in logical view", 3, n.getChildren().getNodesCount());

        List sfs = new ArrayList();
        FreeformProjectGenerator.SourceFolder sf = new FreeformProjectGenerator.SourceFolder();
        sf.label = "xdoc";
        sf.type = "x-doc";
        // just some path
        sf.location = doc.getAbsolutePath();
        sf.style = "tree";
        sfs.add(sf);
        FreeformProjectGenerator.putSourceFolders(helper, sfs, "x-doc");
        assertEquals("Project must have two java source group", 1, ss.getSourceGroups("java").length);
        assertEquals("Project must have one doc_root source group", 1, ss.getSourceGroups("doc_root").length);
        assertEquals("Project cannot have csharp source group", 1, FreeformProjectGenerator.getSourceFolders(helper, "java").size());
        assertEquals("Project cannot have csharp source group", 0, ss.getSourceGroups("csharp").length);
        assertEquals("Project cannot have csharp source group", 1, ss.getSourceGroups("x-doc").length);
        assertEquals("Project cannot have csharp source group", 1, FreeformProjectGenerator.getSourceFolders(helper, "x-doc").size());
        sf = new FreeformProjectGenerator.SourceFolder();
        sf.label = "xdoc2";
        sf.type = "x-doc";
        // just some path
        sf.location = src.getAbsolutePath();
        sf.style = "packages";
        sfs.add(sf);
        FreeformProjectGenerator.putSourceFolders(helper, sfs, "x-doc");
        assertEquals("Project must have two java source group", 1, ss.getSourceGroups("java").length);
        assertEquals("Project must have one doc_root source group", 1, ss.getSourceGroups("doc_root").length);
        assertEquals("Project cannot have csharp source group", 1, FreeformProjectGenerator.getSourceFolders(helper, "java").size());
        assertEquals("Project cannot have csharp source group", 0, ss.getSourceGroups("csharp").length);
        assertEquals("Project cannot have csharp source group", 2, ss.getSourceGroups("x-doc").length);
        assertEquals("Project cannot have csharp source group", 2, FreeformProjectGenerator.getSourceFolders(helper, "x-doc").size());
        assertEquals("Project cannot have csharp source group", 4, FreeformProjectGenerator.getSourceFolders(helper, null).size());

        sfs = FreeformProjectGenerator.getSourceFolders(helper, null);
        FreeformProjectGenerator.putSourceFolders(helper, sfs, null);
        Iterator it = sfs.iterator();
        while (it.hasNext()) {
            ((FreeformProjectGenerator.SourceFolder) it.next()).style = "tree"; // for example
        }
        FreeformProjectGenerator.putSourceViews(helper, sfs, null);
        assertEquals("Project must have two java source group", 1, ss.getSourceGroups("java").length);
        assertEquals("Project must have one doc_root source group", 1, ss.getSourceGroups("doc_root").length);
        assertEquals("Project cannot have csharp source group", 1, FreeformProjectGenerator.getSourceFolders(helper, "java").size());
        assertEquals("Project cannot have csharp source group", 0, ss.getSourceGroups("csharp").length);
        assertEquals("Project cannot have csharp source group", 2, ss.getSourceGroups("x-doc").length);
        assertEquals("Project cannot have csharp source group", 2, FreeformProjectGenerator.getSourceFolders(helper, "x-doc").size());
        assertEquals("Project cannot have csharp source group", 4, FreeformProjectGenerator.getSourceFolders(helper, null).size());
        
        ProjectManager.getDefault().saveAllProjects();
    }
    
    public void testAuxiliaryConfiguration() throws Exception {
        clearWorkDir();
        AntProjectHelper helper = createEmptyProject("proj4", "proj-4");
        FileObject base = helper.getProjectDirectory();
        Project p = ProjectManager.getDefault().findProject(base);
        assertNotNull("Project was not created", p);
        assertEquals("Project folder is incorrect", base, p.getProjectDirectory());
        
        AuxiliaryConfiguration au = FreeformProjectGenerator.getAuxiliaryConfiguration(helper);
        assertNotNull("Project does not have AuxiliaryConfiguration", au);
        Element el = au.getConfigurationFragment("java-data", FreeformProjectType.NS_JAVA, true);
        assertNotNull("Project does not have correct aux data", el);
        Element wel = au.getConfigurationFragment("web-data", FreeformProjectType.NS_WEB, true);
        assertNotNull("Project does not have correct aux data", wel);
    }

    public void testJavaCompilationUnits() throws Exception {
        clearWorkDir();
        AntProjectHelper helper = createEmptyProject("proj5", "proj-5");
        FileObject base = helper.getProjectDirectory();
        Project p = ProjectManager.getDefault().findProject(base);
        assertNotNull("Project was not created", p);
        assertEquals("Project folder is incorrect", base, p.getProjectDirectory());
        
        ClassPathProvider cpp = (ClassPathProvider)p.getLookup().lookup(ClassPathProvider.class);
        assertNotNull("Project does not have ClassPathProvider", cpp);
        ClassPath cp = cpp.findClassPath(FileUtil.toFileObject(src), ClassPath.COMPILE);
        assertEquals("Project must have one classpath root", 1, cp.getRoots().length);
        assertEquals("Classpath root does not match", "jar:"+lib1.toURI().toURL()+"!/", (cp.getRoots()[0]).getURL().toExternalForm());
        cp = cpp.findClassPath(FileUtil.toFileObject(src).getParent(), ClassPath.COMPILE);
        assertEquals("There is no classpath for this file", null, cp);
        
        cp = cpp.findClassPath(FileUtil.toFileObject(web), ClassPath.COMPILE);
        assertNotNull("No classpath for doc root", cp);
        List roots = Arrays.asList(cp.getRoots());
        assertTrue("Classpath does not contain web module classes", roots.contains(base.getFileObject("buildClasses")));
        assertTrue("Classpath does not contain lib1.jar", roots.contains(FileUtil.getArchiveRoot(FileUtil.toFileObject(lib1))));
    }
    
    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"));

        List sources = FreeformProjectGenerator.getSourceFolders(helper, null);
        FreeformProjectGenerator.SourceFolder sf = new FreeformProjectGenerator.SourceFolder();
        sf.label = "src2";
        sf.type = "java";
        sf.location = src2.getAbsolutePath();
        sources.add(sf);
        
        FreeformProjectGenerator.SourceFolder sf2 = new FreeformProjectGenerator.SourceFolder();
        sf2.label = "web2";
        sf2.type = "doc_root";
        sf2.location = web2.getAbsolutePath();
        sources.add(sf2);
        FreeformProjectGenerator.putSourceFolders(helper, sources, null);
        
        AuxiliaryConfiguration aux = FreeformProjectGenerator.getAuxiliaryConfiguration(helper);
        List compUnits = FreeformProjectGenerator.getJavaCompilationUnits(helper, aux);
        FreeformProjectGenerator.JavaCompilationUnit cu = new FreeformProjectGenerator.JavaCompilationUnit();
        FreeformProjectGenerator.JavaCompilationUnit.CP cucp = new FreeformProjectGenerator.JavaCompilationUnit.CP();
        cucp.classpath = lib2.getAbsolutePath();
        cucp.mode = "execute";
        cu.classpath = Collections.singletonList(cucp);
        cu.sourceLevel = "1.4";
        ArrayList outputs = new ArrayList ();
        outputs.add (FileUtil.toFile (base).getAbsolutePath() + "/buildClasses2"); 
        cu.output = outputs;
        cu.packageRoots = Collections.singletonList(src2.getAbsolutePath());
        compUnits.add(cu);
        FreeformProjectGenerator.putJavaCompilationUnits(helper, aux, compUnits);
        
        List webModules = FreeformProjectGenerator.getWebmodules(helper, aux);
        FreeformProjectGenerator.WebModule wm = new FreeformProjectGenerator.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);
        FreeformProjectGenerator.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);
    }
    
    // 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);
//            jos.setMethod(ZipEntry.STORED);
            JarEntry entry = new JarEntry("foo.txt");
//            entry.setSize(0L);
//            entry.setTime(System.currentTimeMillis());
//            entry.setCrc(new CRC32().getValue());
            jos.putNextEntry(entry);
            jos.flush();
            jos.close();
        } finally {
            os.close();
        }
    }
    
}
... this post is sponsored by my books ...

#1 New Release!

FP Best Seller

 

new blog posts

 

Copyright 1998-2021 Alvin Alexander, alvinalexander.com
All Rights Reserved.

A percentage of advertising revenue from
pages under the /java/jwarehouse URI on this website is
paid back to open source projects.