org.springframework.metadata.commons.CommonsAttributeCompilerUtils.java Source code

Java tutorial

Introduction

Here is the source code for org.springframework.metadata.commons.CommonsAttributeCompilerUtils.java

Source

/*
 * Copyright 2002-2005 the original author or authors.
 * 
 * Licensed 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.springframework.metadata.commons;

import java.io.File;

import org.apache.commons.attributes.compiler.AttributeCompiler;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.taskdefs.Javac;
import org.apache.tools.ant.types.FileSet;
import org.apache.tools.ant.types.Path;

import org.springframework.core.ControlFlowFactory;

/**
 * <p>Programmatic support classes for compiling with Commons Attributes
 * so that tests can run within Eclipse.</p>
 * 
 * <p>tools.jar needs to be on the Eclipse classpath (just add it explicitly when setting up
 * the JDK. This class also has a dependency on the target test tree beeing '/target/test-classes'</p>
 * 
 * @author Rod Johnson
 */
public class CommonsAttributeCompilerUtils {

    public static final String MARKER_FILE = "/org/springframework/beans/BeanFactory.class";

    public static void compileAttributesIfNecessary(String testWildcards) {
        if (inIde()) {
            ideAttributeCompile(testWildcards);
        }
    }

    public static boolean inIde() {
        return inEclipse() || inIdea();
    }

    private static boolean inIdea() {
        return ControlFlowFactory.createControlFlow().underToken("com.intellij");
    }

    public static boolean inEclipse() {
        // Use our AOP control flow functionality
        return ControlFlowFactory.createControlFlow().underToken("eclipse.jdt");
    }

    public static void ideAttributeCompile(String testWildcards) {
        System.out.println("Compiling attributes under IDE");
        Project project = new Project();

        //URL markerUrl = CommonsAttributeCompilerUtils.class.getResource(MARKER_FILE);
        //File markerFile = new File(markerUrl.getFile());
        // we know marker is in /target/test-classes
        File root = new File("./");

        project.setBaseDir(root);
        project.init();

        AttributeCompiler commonsAttributesCompiler = new AttributeCompiler();
        commonsAttributesCompiler.setProject(project);

        //commonsAttributesCompiler.setSourcepathref("test");
        String tempPath = "target/generated-commons-attributes-src";
        commonsAttributesCompiler.setDestdir(new File(tempPath));
        FileSet fileset = new FileSet();
        fileset.setDir(new File(root.getPath() + File.separator + "test"));
        String attributeClasses = testWildcards;
        fileset.setIncludes(attributeClasses);
        commonsAttributesCompiler.addFileset(fileset);

        commonsAttributesCompiler.execute();

        System.out.println(
                "Compiling Java sources generated by Commons Attributes using Javac: requires tools.jar on Eclipse project classpath");
        // We now have the generated Java source: compile it.
        // This requires Javac on the source path
        Javac javac = new Javac();
        javac.setProject(project);
        //project.setCoreLoader(Thread.currentThread().getContextClassLoader());
        Path path = new Path(project, tempPath);
        javac.setSrcdir(path);

        // Couldn't get this to work: trying to use Eclipse
        //javac.setCompiler("org.eclipse.jdt.core.JDTCompilerAdapter");
        File destDir = new File(root.getPath() + File.separator + "target/test-classes");
        if (!destDir.exists()) {
            destDir.mkdir();
        }

        javac.setDestdir(destDir);
        javac.setIncludes(attributeClasses);
        javac.execute();
    }

}