Package org.apache.tools.ant.taskdefs.optional.ide

Source Code of org.apache.tools.ant.taskdefs.optional.ide.VAJLocalUtil

/*
* The Apache Software License, Version 1.1
*
* Copyright (c) 2001-2002 The Apache Software Foundation.  All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
*    notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
*    notice, this list of conditions and the following disclaimer in
*    the documentation and/or other materials provided with the
*    distribution.
*
* 3. The end-user documentation included with the redistribution, if
*    any, must include the following acknowlegement:
*       "This product includes software developed by the
*        Apache Software Foundation (http://www.apache.org/)."
*    Alternately, this acknowlegement may appear in the software itself,
*    if and wherever such third-party acknowlegements normally appear.
*
* 4. The names "The Jakarta Project", "Ant", and "Apache Software
*    Foundation" must not be used to endorse or promote products derived
*    from this software without prior written permission. For written
*    permission, please contact apache@apache.org.
*
* 5. Products derived from this software may not be called "Apache"
*    nor may "Apache" appear in their names without prior written
*    permission of the Apache Group.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation.  For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/

package org.apache.tools.ant.taskdefs.optional.ide;

import java.util.Vector;
import java.util.Enumeration;
import java.io.File;

import com.ibm.ivj.util.base.Package;
import com.ibm.ivj.util.base.IvjException;
import com.ibm.ivj.util.base.Workspace;
import com.ibm.ivj.util.base.ToolEnv;
import com.ibm.ivj.util.base.ExportCodeSpec;
import com.ibm.ivj.util.base.ProjectEdition;
import com.ibm.ivj.util.base.ImportCodeSpec;
import com.ibm.ivj.util.base.Type;
import com.ibm.ivj.util.base.Project;

import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.DirectoryScanner;


/**
* Helper class for VAJ tasks. Holds Workspace singleton and
* wraps IvjExceptions into BuildExceptions
*
* @author Wolf Siberski, TUI Infotec GmbH
*/
abstract class VAJLocalUtil implements VAJUtil{
    // singleton containing the VAJ workspace
    private static Workspace workspace;

    /**
     * Wraps IvjException into a BuildException
     *
     * @return org.apache.tools.ant.BuildException
     * @param errMsg Additional error message
     * @param e IvjException which is wrapped
     */
    static BuildException createBuildException(
                                               String errMsg, IvjException e) {
        errMsg = errMsg + "\n" + e.getMessage();
        String[] errors = e.getErrors();
        if (errors != null) {
            for (int i = 0; i < errors.length; i++) {
                errMsg = errMsg + "\n" + errors[i];
            }
        }
        return new BuildException(errMsg, e);
    }

    /**
     * returns the current VAJ workspace.
     * @return com.ibm.ivj.util.base.Workspace
     */
    static Workspace getWorkspace() {
        if (workspace == null) {
            workspace = ToolEnv.connectToWorkspace();
            if (workspace == null) {
                throw new BuildException(
                                         "Unable to connect to Workspace! "
                                         + "Make sure you are running in VisualAge for Java.");
            }
        }

        return workspace;
    }


    //-----------------------------------------------------------
    // export
    //-----------------------------------------------------------

    /**
     * export packages
     */
    public void exportPackages(
                               File dest,
                               String[] includePatterns, String[] excludePatterns,
                               boolean exportClasses, boolean exportDebugInfo,
                               boolean exportResources, boolean exportSources,
                               boolean useDefaultExcludes,    boolean overwrite) {
        if (includePatterns == null || includePatterns.length == 0) {
            log("You must specify at least one include attribute. "
                + "Not exporting", MSG_ERR);
        } else {
            try {
                VAJWorkspaceScanner scanner = new VAJWorkspaceScanner();
                scanner.setIncludes(includePatterns);
                scanner.setExcludes(excludePatterns);
                if (useDefaultExcludes) {
                    scanner.addDefaultExcludes();
                }
                scanner.scan();

                Package[] packages = scanner.getIncludedPackages();

                log("Exporting " + packages.length + " package(s) to "
                    + dest, MSG_INFO);
                for (int i = 0; i < packages.length; i++) {
                    log("    " + packages[i].getName(), MSG_VERBOSE);
                }

                ExportCodeSpec exportSpec = new ExportCodeSpec();
                exportSpec.setPackages(packages);
                exportSpec.includeJava(exportSources);
                exportSpec.includeClass(exportClasses);
                exportSpec.includeResources(exportResources);
                exportSpec.includeClassDebugInfo(exportDebugInfo);
                exportSpec.useSubdirectories(true);
                exportSpec.overwriteFiles(overwrite);
                exportSpec.setExportDirectory(dest.getAbsolutePath());

                getWorkspace().exportData(exportSpec);
            } catch (IvjException ex) {
                throw createBuildException("Exporting failed!", ex);
            }
        }
    }


    //-----------------------------------------------------------
    // load
    //-----------------------------------------------------------

    /**
     * Load specified projects.
     */
    public void loadProjects(Vector projectDescriptions) {
        Vector expandedDescs = getExpandedDescriptions(projectDescriptions);

        // output warnings for projects not found
        for (Enumeration e = projectDescriptions.elements(); e.hasMoreElements();) {
            VAJProjectDescription d = (VAJProjectDescription) e.nextElement();
            if (!d.projectFound()) {
                log("No Projects match the name " + d.getName(), MSG_WARN);
            }
        }

        log("Loading " + expandedDescs.size()
            + " project(s) into workspace", MSG_INFO);

        for (Enumeration e = expandedDescs.elements();
             e.hasMoreElements();) {
            VAJProjectDescription d = (VAJProjectDescription) e.nextElement();

            ProjectEdition pe = findProjectEdition(d.getName(), d.getVersion());
            try {
                log("Loading '" + d.getName() + "', Version '" + d.getVersion()
                    + "', into Workspace", MSG_VERBOSE);
                pe.loadIntoWorkspace();
            } catch (IvjException ex) {
                throw createBuildException("Project '" + d.getName()
                                            + "' could not be loaded.", ex);
            }
        }
    }

    /**
     * returns a list of project names matching the given pattern
     */
    private Vector findMatchingProjects(String pattern) {
        String[] projectNames;
        try {
            projectNames = getWorkspace().getRepository().getProjectNames();
        } catch (IvjException e) {
            throw createBuildException("VA Exception occured: ", e);
        }

        Vector matchingProjects = new Vector();
        for (int i = 0; i < projectNames.length; i++) {
            if (VAJWorkspaceScanner.match(pattern, projectNames[i])) {
                matchingProjects.addElement(projectNames[i]);
            }
        }

        return matchingProjects;
    }


    /**
     * return project descriptions containing full project names instead
     * of patterns with wildcards.
     */
    private Vector getExpandedDescriptions(Vector projectDescs) {
        Vector expandedDescs = new Vector(projectDescs.size());
        try {
            String[] projectNames =
                getWorkspace().getRepository().getProjectNames();
            for (int i = 0; i < projectNames.length; i++) {
                for (Enumeration e = projectDescs.elements();
                     e.hasMoreElements();) {
                    VAJProjectDescription d = (VAJProjectDescription) e.nextElement();
                    String pattern = d.getName();
                    if (VAJWorkspaceScanner.match(pattern, projectNames[i])) {
                        d.setProjectFound();
                        expandedDescs.addElement(new VAJProjectDescription(
                                                                           projectNames[i], d.getVersion()));
                        break;
                    }
                }
            }
        } catch (IvjException e) {
            throw createBuildException("VA Exception occured: ", e);
        }

        return expandedDescs;
    }

    /**
     * Finds a specific project edition in the repository.
     *
     * @param name project name
     * @param versionName project version name
     * @return com.ibm.ivj.util.base.ProjectEdition the specified edition
     */
    private ProjectEdition findProjectEdition(
                                              String name, String versionName) {
        try {
            ProjectEdition[] editions = null;
            editions = getWorkspace().getRepository().getProjectEditions(name);

            if (editions == null) {
                throw new BuildException("Project " + name + " doesn't exist");
            }

            ProjectEdition pe = null;
            for (int i = 0; i < editions.length && pe == null; i++) {
                if (versionName.equals(editions[i].getVersionName())) {
                    pe = editions[i];
                }
            }
            if (pe == null) {
                throw new BuildException("Version " + versionName
                    + " of Project " + name + " doesn't exist");
            }
            return pe;

        } catch (IvjException e) {
            throw createBuildException("VA Exception occured: ", e);
        }

    }



    //-----------------------------------------------------------
    // import
    //-----------------------------------------------------------


    /**
     * Do the import.
     */
    public void importFiles(
                            String importProject, File srcDir,
                            String[] includePatterns, String[] excludePatterns,
                            boolean importClasses, boolean importResources,
                            boolean importSources, boolean useDefaultExcludes)
        throws BuildException {

        if (importProject == null || "".equals(importProject)) {
            throw new BuildException("The VisualAge for Java project "
                                     + "name is required!");
        }

        ImportCodeSpec importSpec = new ImportCodeSpec();
        importSpec.setDefaultProject(getVAJProject(importProject));

        DirectoryScanner ds = new DirectoryScanner();
        ds.setBasedir(srcDir);
        ds.setIncludes(includePatterns);
        ds.setExcludes(excludePatterns);
        if (useDefaultExcludes) {
            ds.addDefaultExcludes();
        }
        ds.scan();

        Vector classes = new Vector();
        Vector sources = new Vector();
        Vector resources = new Vector();

        scanForImport(srcDir, ds.getIncludedFiles(), classes, sources, resources);

        StringBuffer summaryLog = new StringBuffer("Importing ");
        addFilesToImport(importSpec, importClasses, classes, "Class", summaryLog);
        addFilesToImport(importSpec, importSources, sources, "Java", summaryLog);
        addFilesToImport(importSpec, importResources, resources, "Resource", summaryLog);
        importSpec.setResourcePath(srcDir.getAbsolutePath());

        summaryLog.append(" into the project '");
        summaryLog.append(importProject);
        summaryLog.append("'.");

        log(summaryLog.toString(), MSG_INFO);

        try {
            Type[] importedTypes = getWorkspace().importData(importSpec);
            if (importedTypes == null) {
                throw new BuildException("Unable to import into Workspace!");
            } else {
                log(importedTypes.length + " types imported", MSG_DEBUG);
                for (int i = 0; i < importedTypes.length; i++) {
                    log(importedTypes[i].getPackage().getName()
                        + "." + importedTypes[i].getName()
                        + " into " + importedTypes[i].getProject().getName(),
                        MSG_DEBUG);
                }
            }
        } catch (IvjException ivje) {
            throw createBuildException("Error while importing into workspace: ",
                                       ivje);
        }
    }

    /**
     * get a project from the Workspace.
     */
    static Project getVAJProject(String importProject) {
        Project found = null;
        Project[] currentProjects = getWorkspace().getProjects();

        for (int i = 0; i < currentProjects.length; i++) {
            Project p = currentProjects[i];
            if (p.getName().equals(importProject)) {
                found = p;
                break;
            }
        }


        if (found == null) {
            try {
                found = getWorkspace().createProject(importProject, true);
            } catch (IvjException e) {
                throw createBuildException("Error while creating Project "
                                           + importProject + ": ", e);
            }
        }

        return found;
    }


    /**
     * Sort the files into classes, sources, and resources.
     */
    private void scanForImport(
                               File dir,
                               String[] files,
                               Vector classes,
                               Vector sources,
                               Vector resources) {
        for (int i = 0; i < files.length; i++) {
            String file = (new File(dir, files[i])).getAbsolutePath();
            if (file.endsWith(".java") || file.endsWith(".JAVA")) {
                sources.addElement(file);
            } else
                if (file.endsWith(".class") || file.endsWith(".CLASS")) {
                    classes.addElement(file);
                } else {
                    // for resources VA expects the path relative to the resource path
                    resources.addElement(files[i]);
                }
        }
    }

    /**
     * Adds files to an import specification. Helper method
     * for importFiles()
     *
     * @param spec       import specification
     * @param doImport   only add files if doImport is true
     * @param files      the files to add
     * @param fileType   type of files (Source/Class/Resource)
     * @param summaryLog buffer for logging
     */
    private void addFilesToImport(ImportCodeSpec spec, boolean doImport,
                                  Vector files, String fileType,
                                  StringBuffer summaryLog) {

        if (doImport) {
            String[] fileArr = new String[files.size()];
            files.copyInto(fileArr);
            try {
                // here it is assumed that fileType is one of the
                // following strings: // "Java", "Class", "Resource"
                String methodName = "set" + fileType + "Files";
                Class[] methodParams = new Class[]{fileArr.getClass()};
                java.lang.reflect.Method method =
                    spec.getClass().getDeclaredMethod(methodName, methodParams);
                method.invoke(spec, new Object[]{fileArr});
            } catch (Exception e) {
                throw new BuildException(e);
            }
            if (files.size() > 0) {
                logFiles(files, fileType);
                summaryLog.append(files.size());
                summaryLog.append(" " + fileType.toLowerCase() + " file");
                summaryLog.append(files.size() > 1 ? "s, " : ", ");
            }
        }
    }

    /**
     * Logs a list of file names to the message log
     * @param fileNames java.util.Vector file names to be logged
     * @param type java.lang.String file type
     */
    private void logFiles(Vector fileNames, String fileType) {
        log(fileType + " files found for import:", MSG_VERBOSE);
        for (Enumeration e = fileNames.elements(); e.hasMoreElements();) {
            log("    " + e.nextElement(), MSG_VERBOSE);
        }
    }
}
TOP

Related Classes of org.apache.tools.ant.taskdefs.optional.ide.VAJLocalUtil

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.