Author: alexsmirnov
Date: 2009-09-15 21:42:34 -0400 (Tue, 15 Sep 2009)
New Revision: 15590
Modified:
root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/CdkWriter.java
root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/DummyBuilder.java
root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/DummyGenerator.java
root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/LibraryBuilder.java
root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/StandardOutputFolders.java
root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/StandardSources.java
root/cdk/trunk/plugins/generator/src/main/resources/META-INF/templates/component.ftl
root/cdk/trunk/plugins/maven-cdk-plugin/src/main/java/org/richfaces/builder/mojo/GenerateMojo.java
Log:
start working on
https://jira.jboss.org/jira/browse/RF-7791
Modified: root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/CdkWriter.java
===================================================================
---
root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/CdkWriter.java 2009-09-15
22:50:30 UTC (rev 15589)
+++
root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/CdkWriter.java 2009-09-16
01:42:34 UTC (rev 15590)
@@ -30,14 +30,13 @@
* @author asmirnov(a)exadel.com
*
*/
-public interface CdkWriter {
+public interface CdkWriter extends CdkWorker {
interface OutputType {
String getName();
OutputType getFolderType();
}
- public void init(CdkContext context) throws CdkException;
public void render(ComponentLibrary library) throws CdkException;
Modified:
root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/DummyBuilder.java
===================================================================
---
root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/DummyBuilder.java 2009-09-15
22:50:30 UTC (rev 15589)
+++
root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/DummyBuilder.java 2009-09-16
01:42:34 UTC (rev 15590)
@@ -26,7 +26,7 @@
import org.richfaces.cdk.model.ComponentLibrary;
/**
- * <p class="changed_added_4_0"></p>
+ * <p class="changed_added_4_0">This is dummy model builder class for not
yet implemented source types</p>
* @author asmirnov(a)exadel.com
*
*/
Modified:
root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/DummyGenerator.java
===================================================================
---
root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/DummyGenerator.java 2009-09-15
22:50:30 UTC (rev 15589)
+++
root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/DummyGenerator.java 2009-09-16
01:42:34 UTC (rev 15590)
@@ -26,7 +26,7 @@
import org.richfaces.cdk.model.ComponentLibrary;
/**
- * <p class="changed_added_4_0"></p>
+ * <p class="changed_added_4_0">This is dummy generator for not yet
implemented output types</p>
* @author asmirnov(a)exadel.com
*
*/
Modified:
root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/LibraryBuilder.java
===================================================================
---
root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/LibraryBuilder.java 2009-09-15
22:50:30 UTC (rev 15589)
+++
root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/LibraryBuilder.java 2009-09-16
01:42:34 UTC (rev 15590)
@@ -37,6 +37,8 @@
import org.richfaces.cdk.xmlconfig.FacesConfigGenerator;
import org.richfaces.cdk.xmlconfig.FacesConfigParser;
+import com.google.common.collect.ImmutableMap;
+
/**
* <p class="changed_added_4_0">
* That class builds JSF library model from different sources. It acts as
@@ -68,6 +70,7 @@
@Override
public void init(CdkContext context) throws CdkException {
this.context = context;
+ // default workers.
}
/**
@@ -102,7 +105,7 @@
/**
* <p class="changed_added_4_0">
- * Compile and store in the model Renderer templates.
+ * Build library model from all available sources.
* </p>
*
* @param templates
@@ -124,6 +127,11 @@
return library;
}
+ /**
+ * Generate all types of files from library model.
+ * @param library
+ * @throws CdkException
+ */
public void generate(ComponentLibrary library) throws CdkException {
for (OutputType type : StandardOutputs.values()) {
generate(library, type);
@@ -132,11 +140,11 @@
/**
* <p class="changed_added_4_0">
- * Cenerate files from library model.
+ * Cenerate files from library model for given type ( eg. component classes,
faces-config ).
* </p>
*
- * @param library
- * @param type
+ * @param library model
+ * @param type of generated files.
* @throws CdkException
*/
public void generate(ComponentLibrary library, OutputType type)
@@ -144,22 +152,37 @@
CdkWriter generator = getGeneratorFor(type);
generator.render(library);
}
+
+ /**
+ * Map contains writer classes for standard outputs.
+ */
+ private static final ImmutableMap<OutputType, Class<? extends CdkWriter>>
writers = ImmutableMap
+ .<OutputType, Class<? extends CdkWriter>> builder().put(
+ StandardOutputs.COMPONENT_CLASSES,
+ ComponentClassGenerator.class).put(
+ StandardOutputs.RENDERER_CLASSES,
+ RendererClassGenerator.class).put(
+ StandardOutputs.FACES_CONFIG, FacesConfigGenerator.class)
+ .build();
+ /**
+ * This method returns instance of {@link CdkWriter} for given output type.
+ * @param type
+ * @return
+ * @throws CdkException
+ */
protected CdkWriter getGeneratorFor(OutputType type) throws CdkException {
CdkWriter generator = null;
- if (StandardOutputs.COMPONENT_CLASSES.equals(type)) {
- generator = new ComponentClassGenerator();
- } else if (StandardOutputs.RENDERER_CLASSES.equals(type)) {
- generator = new RendererClassGenerator();
- } else if (StandardOutputs.FACES_CONFIG.equals(type)) {
- generator = new FacesConfigGenerator();
+ Class<? extends CdkWriter> writerClass = writers.get(type);
+ if (null != writerClass) {
+ generator = context.getWorkerInstance(writerClass);
} else {
generator = new DummyGenerator();
+ generator.init(getContext());
// TODO - make service method for new source types.
// throw new CdkException("No generator for type " +
// type.getName());
}
- generator.init(getContext());
return generator;
}
@@ -185,21 +208,37 @@
return context;
}
+
+ /**
+ * map contain library model builder classes for each source type.
+ */
+ private static final ImmutableMap<SourceType, Class<? extends ModelBuilder>>
builders = ImmutableMap
+ .<SourceType, Class<? extends ModelBuilder>> builder().put(
+ StandardSources.FACES_CONFIGS,
+ FacesConfigParser.class).put(
+ StandardSources.JAVA_SOURCES,
+ AptBuilder.class).put(
+ StandardSources.RENDERER_TEMPLATES, RendererTemplateParser.class)
+ .build();
+
+ /**
+ * This method returns initialized instance of the {@link ModelBuilder} for given source
type.
+ * @param type
+ * @return
+ * @throws CdkException
+ */
protected ModelBuilder getBuilderFor(SourceType type) throws CdkException {
ModelBuilder builder;
- if (StandardSources.JAVA_SOURCES.equals(type)) {
- builder = new AptBuilder();
- } else if (StandardSources.FACES_CONFIGS.equals(type)) {
- builder = new FacesConfigParser();
- } else if (StandardSources.RENDERER_TEMPLATES.equals(type)) {
- builder = new RendererTemplateParser();
+ Class<? extends ModelBuilder> builderClass = builders.get(type);
+ if (null != builderClass) {
+ builder = context.getWorkerInstance(builderClass);
} else {
builder = new DummyBuilder();
+ builder.init(getContext());
// TODO - make service method for new source types.
// throw new CdkException("No model builder for source type " +
// type.getName());
}
- builder.init(getContext());
return builder;
}
Modified:
root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/StandardOutputFolders.java
===================================================================
---
root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/StandardOutputFolders.java 2009-09-15
22:50:30 UTC (rev 15589)
+++
root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/StandardOutputFolders.java 2009-09-16
01:42:34 UTC (rev 15590)
@@ -26,7 +26,7 @@
import org.richfaces.cdk.CdkWriter.OutputType;
/**
- * <p class="changed_added_4_0"></p>
+ * <p class="changed_added_4_0">This enumeration defines standard types
of output folders.</p>
* @author asmirnov(a)exadel.com
*
*/
Modified:
root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/StandardSources.java
===================================================================
---
root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/StandardSources.java 2009-09-15
22:50:30 UTC (rev 15589)
+++
root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/StandardSources.java 2009-09-16
01:42:34 UTC (rev 15590)
@@ -26,7 +26,7 @@
import org.richfaces.cdk.CdkContext.SourceType;
/**
- * <p class="changed_added_4_0"></p>
+ * <p class="changed_added_4_0">This enumeration defines standard types
for project sources.</p>
* @author asmirnov(a)exadel.com
*
*/
Modified:
root/cdk/trunk/plugins/generator/src/main/resources/META-INF/templates/component.ftl
===================================================================
---
root/cdk/trunk/plugins/generator/src/main/resources/META-INF/templates/component.ftl 2009-09-15
22:50:30 UTC (rev 15589)
+++
root/cdk/trunk/plugins/generator/src/main/resources/META-INF/templates/component.ftl 2009-09-16
01:42:34 UTC (rev 15590)
@@ -42,7 +42,7 @@
import javax.el.ValueExpression;
/**
- * ${description!}
+ * ${description?if_exists}
**/
@Generated({"RicFaces CDK","4.0.0-SNAPSHOT"})
public class ${componentClass.simpleName} extends ${baseClass} <#if (eventNames?size
> 0)>implements ClientBehaviorHolder</#if> {
@@ -78,7 +78,7 @@
<#list generatedAttributes as attribute>
/**
- * ${attribute.description!}
+ * ${attribute.description?if_exists}
**/
public ${attribute.type} ${attribute.getterName}(){
return (${attribute.type})getStateHelper().eval(Properties.${attribute.name});
Modified:
root/cdk/trunk/plugins/maven-cdk-plugin/src/main/java/org/richfaces/builder/mojo/GenerateMojo.java
===================================================================
---
root/cdk/trunk/plugins/maven-cdk-plugin/src/main/java/org/richfaces/builder/mojo/GenerateMojo.java 2009-09-15
22:50:30 UTC (rev 15589)
+++
root/cdk/trunk/plugins/maven-cdk-plugin/src/main/java/org/richfaces/builder/mojo/GenerateMojo.java 2009-09-16
01:42:34 UTC (rev 15590)
@@ -24,19 +24,29 @@
package org.richfaces.builder.mojo;
import java.io.File;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
import java.util.Set;
+import org.apache.maven.artifact.DependencyResolutionRequiredException;
import org.apache.maven.model.Resource;
+import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
+import org.apache.maven.project.MavenProject;
+import org.codehaus.plexus.util.DirectoryScanner;
import org.richfaces.cdk.CdkContextBase;
import org.richfaces.cdk.CdkException;
import org.richfaces.cdk.LibraryBuilder;
import org.richfaces.cdk.ModelValidator;
import org.richfaces.cdk.NamingConventions;
import org.richfaces.cdk.RichFacesConventions;
+import org.richfaces.cdk.StandardOutputFolders;
import org.richfaces.cdk.StandardOutputs;
import org.richfaces.cdk.StandardSources;
import org.richfaces.cdk.ValidatorImpl;
@@ -50,8 +60,69 @@
*
* @goal generate
*/
-public class GenerateMojo extends CompileTemplatesMojo {
+public class GenerateMojo extends AbstractMojo {
+
+ /**
+ * Top maven project.
+ *
+ * @parameter expression="${project}"
+ * @readonly
+ */
+ protected MavenProject project;
+ /**
+ * @parameter
+ */
+ protected Resource[] facesConfigs;
+
+ /**
+ * @parameter
+ */
+ protected Resource[] templates;
+
+ /**
+ * Directory where the output Java Files will be located.
+ *
+ * @parameter
expression="${project.build.directory}/generated-component/java"
+ */
+ protected File outputJavaDirectory;
+
+ /**
+ * @parameter
expression="${project.build.directory}/generated-component/test"
+ */
+ protected File outputTestsDirectory;
+
+ /**
+ * Directory where the output Java Files will be located.
+ *
+ * @parameter
expression="${project.build.directory}/generated-component/resources"
+ */
+ protected File outputResourcesDirectory;
+ /**
+ * The source directories containing the sources to be compiled.
+ *
+ * @parameter expression="${project.compileSourceRoots}"
+ * @required
+ * @readonly
+ */
+ protected List<String> compileSourceRoots;
+ /**
+ * Project classpath.
+ *
+ * @parameter expression="${project.compileClasspathElements}"
+ * @required
+ * @readonly
+ */
+ protected List classpathElements;
+ /**
+ * The directory for compiled classes.
+ *
+ * @parameter expression="${project.build.outputDirectory}"
+ * @required
+ * @readonly
+ */
+ protected File outputDirectory;
+
/*
* (non-Javadoc)
*
@@ -74,22 +145,17 @@
if(!outputJavaDirectory.exists()){
outputJavaDirectory.mkdirs();
}
- context.setOutputFolder(StandardOutputs.COMPONENT_CLASSES, outputJavaDirectory);
- context.setOutputFolder(StandardOutputs.EVENT_LISTENER_CLASSES, outputJavaDirectory);
- context.setOutputFolder(StandardOutputs.EVENT_SOURCE_CLASSES, outputJavaDirectory);
+ context.setOutputFolder(StandardOutputFolders.JAVA_CLASSES, outputJavaDirectory);
if(!outputResourcesDirectory.exists()){
outputResourcesDirectory.mkdirs();
}
- context.setOutputFolder(StandardOutputs.FACES_CONFIG, outputResourcesDirectory);
- context.setOutputFolder(StandardOutputs.TAG_LIBRARY, outputResourcesDirectory);
- context.setOutputFolder(StandardOutputs.XML_SCHEMA, outputResourcesDirectory);
+ context.setOutputFolder(StandardOutputFolders.RESOURCES, outputResourcesDirectory);
if(!outputTestsDirectory.exists()){
outputTestsDirectory.mkdirs();
}
- context.setOutputFolder(StandardOutputs.COMPONENT_TEST, outputTestsDirectory);
+ context.setOutputFolder(StandardOutputFolders.TEST_JAVA_CLASSES,
outputTestsDirectory);
// TODO - configure.
- context.addWorker(NamingConventions.class, new RichFacesConventions(library
- .getPrefix()));
+ context.addWorker(NamingConventions.class, new RichFacesConventions(null));
context.addWorker(ModelValidator.class, new ValidatorImpl());
context.addSources(StandardSources.JAVA_SOURCES, findJavaFiles());
context.addSources(StandardSources.RENDERER_TEMPLATES,
@@ -111,6 +177,16 @@
}
}
+ protected void checkLibraryConfig() {
+ // TODO Auto-generated method stub
+
+ }
+
+ private Iterable<File> findTemplateFiles() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
private Set<File> findJavaFiles() throws MojoExecutionException {
Set<File> javaSources = new HashSet<File>();
for (String compileRoot : compileSourceRoots) {
@@ -126,14 +202,58 @@
private Set<File> findFacesConfigFiles() throws MojoExecutionException {
Set<File> javaSources = new HashSet<File>();
- if (facesConfigInclude.exists() && facesConfigInclude.isDirectory()) {
- String[] sources = doScan(new String[] { "**/*.xml" }, null,
- facesConfigInclude);
- for (String src : sources) {
- javaSources.add(new File(facesConfigInclude, src));
+// if (facesConfigInclude.exists() && facesConfigInclude.isDirectory()) {
+// String[] sources = doScan(new String[] { "**/*.xml" }, null,
+// facesConfigInclude);
+// for (String src : sources) {
+// javaSources.add(new File(facesConfigInclude, src));
+// }
+//
+// }
+ return javaSources;
+ }
+
+ protected ClassLoader createProjectClassLoader(MavenProject project) {
+ ClassLoader classLoader = null;
+ try {
+ List<?> compileClasspathElements = project
+ .getCompileClasspathElements();
+ String outputDirectory = project.getBuild().getOutputDirectory();
+ URL[] urls = new URL[compileClasspathElements.size() + 1];
+ int i = 0;
+ urls[i++] = new File(outputDirectory).toURI().toURL();
+ for (Iterator<?> iter = compileClasspathElements.iterator(); iter
+ .hasNext();) {
+ String element = (String) iter.next();
+ urls[i++] = new File(element).toURI().toURL();
}
+ classLoader = new URLClassLoader(urls);
+ } catch (MalformedURLException e) {
+ getLog().error("Bad URL in classpath", e);
+ } catch (DependencyResolutionRequiredException e) {
+ getLog().error("Dependencies not resolved ", e);
+ }
+ return classLoader;
+ }
+
+ protected String[] doScan(String[] includes, String[] excludes, File rootFolder)
+ throws MojoExecutionException {
+ try {
+ DirectoryScanner directoryScanner = new DirectoryScanner();
+ directoryScanner.setFollowSymlinks(true);
+ directoryScanner.setBasedir(rootFolder);
+ directoryScanner.setExcludes(excludes);
+ directoryScanner.setIncludes(includes);
+ directoryScanner.addDefaultExcludes();
+
+ directoryScanner.scan();
+
+ return directoryScanner.getIncludedFiles();
+ } catch (IllegalStateException e) {
+ throw new MojoExecutionException(
+ "Error scanning source root: \'" + rootFolder + "\'", e
);
}
- return javaSources;
}
+
}