/* * 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(); } }