Author: nbelaevski
Date: 2009-01-12 12:55:34 -0500 (Mon, 12 Jan 2009)
New Revision: 12231
Added:
trunk/cdk/generator/src/main/java/org/ajax4jsf/builder/generator/ResourceType.java
trunk/cdk/generator/src/main/java/org/ajax4jsf/builder/generator/ResourcesConfigGeneratorBeanEntry.java
trunk/cdk/generator/src/main/java/org/ajax4jsf/builder/generator/ResourcesConfigParser.java
trunk/cdk/generator/src/main/java/org/ajax4jsf/builder/generator/ResourcesDependenciesGenerator.java
trunk/cdk/generator/src/main/resources/META-INF/templates12/resources-dependencies.vm
trunk/cdk/maven-cdk-plugin/src/main/resources/templates12/component-dependencies.vm
Modified:
trunk/cdk/generator/src/main/java/org/ajax4jsf/builder/generator/AbstractClassStubBuilder.java
trunk/cdk/generator/src/main/java/org/ajax4jsf/builder/generator/ResourcesConfigGenerator.java
trunk/cdk/generator/src/main/java/org/ajax4jsf/builder/generator/ResourcesConfigGeneratorBean.java
trunk/cdk/maven-cdk-plugin/
trunk/cdk/maven-cdk-plugin/src/main/java/org/ajax4jsf/builder/mojo/AbstractCDKMojo.java
trunk/cdk/maven-cdk-plugin/src/main/java/org/ajax4jsf/builder/mojo/AssemblyLibraryMojo.java
trunk/cdk/maven-cdk-plugin/src/main/java/org/ajax4jsf/builder/mojo/CompileMojo.java
trunk/cdk/maven-cdk-plugin/src/main/java/org/ajax4jsf/builder/mojo/CreateComponentMojo.java
trunk/cdk/maven-cdk-plugin/src/main/java/org/ajax4jsf/builder/mojo/GenerateMojo.java
trunk/cdk/maven-cdk-plugin/src/main/java/org/ajax4jsf/builder/mojo/GenerateTestMojo.java
trunk/cdk/maven-cdk-plugin/src/main/java/org/ajax4jsf/builder/mojo/Taglib.java
Log:
https://jira.jboss.org/jira/browse/RF-5626
Modified:
trunk/cdk/generator/src/main/java/org/ajax4jsf/builder/generator/AbstractClassStubBuilder.java
===================================================================
---
trunk/cdk/generator/src/main/java/org/ajax4jsf/builder/generator/AbstractClassStubBuilder.java 2009-01-12
17:49:53 UTC (rev 12230)
+++
trunk/cdk/generator/src/main/java/org/ajax4jsf/builder/generator/AbstractClassStubBuilder.java 2009-01-12
17:55:34 UTC (rev 12231)
@@ -33,8 +33,10 @@
import net.sf.cglib.core.MethodInfo;
import net.sf.cglib.core.ReflectUtils;
import net.sf.cglib.core.Signature;
+import net.sf.cglib.proxy.Callback;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
+import net.sf.cglib.proxy.NoOp;
import org.objectweb.asm.ClassVisitor;
import org.objectweb.asm.Constants;
@@ -46,38 +48,96 @@
*
*/
public class AbstractClassStubBuilder {
+
+ public static Object buildInterfaceStub(final Class<?> clazz, ClassLoader
classLoader) throws InstantiationException, IllegalAccessException {
+ Enhancer enhancer = new Enhancer() {
+ public void generateClass(ClassVisitor v) throws Exception {
+ ClassEmitter ce = new ClassEmitter(v);
+ ce.begin_class(Constants.V1_5,
+ Constants.ACC_PUBLIC,
+ getClassName(),
+ null,
+ new Type[]{Type.getType(clazz)},
+ null);
+ EmitUtils.null_constructor(ce);
+ List methods = new ArrayList();
+ getMethods(Object.class, new Class[]{clazz}, methods);
+
+ for (Iterator iterator = methods.iterator(); iterator
+ .hasNext();) {
+ Method method = (Method) iterator.next();
+
+ if (Modifier.isAbstract(method.getModifiers())) {
+ MethodInfo methodInfo = ReflectUtils.getMethodInfo(method);
+ Signature signature = methodInfo.getSignature();
+ Type returnType = signature.getReturnType();
+
+ CodeEmitter e = ce.begin_method(method.getModifiers() & ~Modifier.ABSTRACT,
+ signature, methodInfo.getExceptionTypes(),
+ methodInfo.getAttribute());
+
+ e.zero_or_null(returnType);
+ e.return_value();
+
+ Type[] argumentTypes = methodInfo.getSignature().getArgumentTypes();
+ int size = 0;
+ if (argumentTypes != null) {
+ for (int i = 0; i < argumentTypes.length; i++) {
+ size += argumentTypes[i].getSize();
+ }
+ }
+
+ // 1 is for this
+ e.visitMaxs(returnType.getSize(), size + 1);
+
+ e.end_method();
+ }
+ }
+
+ ce.end_class();
+ }
+ };
+
+ enhancer.setCallbackType(NoOp.class);
+ enhancer.setInterfaces(new Class[]{clazz});
+ enhancer.setClassLoader(classLoader != null ?
+ classLoader : clazz.getClassLoader());
+
+ return enhancer.createClass().newInstance();
+ }
+
public static <T> T buildStub(final Class<T> clazz, MethodInterceptor
interceptor,
ClassLoader classLoader) {
Class<T> instrumentedClass;
-
+
if ((Modifier.ABSTRACT & clazz.getModifiers()) != 0) {
Enhancer enhancer = new Enhancer() {
@Override
public void generateClass(ClassVisitor v) throws Exception {
- ClassEmitter ce = new ClassEmitter(v);
- ce.begin_class(Constants.V1_5,
- Constants.ACC_PUBLIC,
- getClassName(),
- Type.getType(clazz),
- null,
- null);
- EmitUtils.null_constructor(ce);
- List methods = new ArrayList();
- getMethods(clazz, null, methods);
-
- for (Iterator iterator = methods.iterator(); iterator
- .hasNext();) {
+ ClassEmitter ce = new ClassEmitter(v);
+ ce.begin_class(Constants.V1_5,
+ Constants.ACC_PUBLIC,
+ getClassName(),
+ Type.getType(clazz),
+ null,
+ null);
+ EmitUtils.null_constructor(ce);
+ List methods = new ArrayList();
+ getMethods(clazz, null, methods);
+
+ for (Iterator iterator = methods.iterator(); iterator
+ .hasNext();) {
Method method = (Method) iterator.next();
-
+
if (Modifier.isAbstract(method.getModifiers())) {
MethodInfo methodInfo = ReflectUtils.getMethodInfo(method);
Signature signature = methodInfo.getSignature();
Type returnType = signature.getReturnType();
-
+
CodeEmitter e = ce.begin_method(method.getModifiers() & ~Modifier.ABSTRACT,
signature, methodInfo.getExceptionTypes(),
methodInfo.getAttribute());
-
+
e.zero_or_null(returnType);
e.return_value();
@@ -88,15 +148,15 @@
size += argumentTypes[i].getSize();
}
}
-
+
// 1 is for this
e.visitMaxs(returnType.getSize(), size + 1);
-
+
e.end_method();
}
- }
-
- ce.end_class();
+ }
+
+ ce.end_class();
}
};
enhancer.setSuperclass(clazz);
@@ -117,3 +177,4 @@
}
}
+
Added: trunk/cdk/generator/src/main/java/org/ajax4jsf/builder/generator/ResourceType.java
===================================================================
--- trunk/cdk/generator/src/main/java/org/ajax4jsf/builder/generator/ResourceType.java
(rev 0)
+++
trunk/cdk/generator/src/main/java/org/ajax4jsf/builder/generator/ResourceType.java 2009-01-12
17:55:34 UTC (rev 12231)
@@ -0,0 +1,30 @@
+/**
+ * License Agreement.
+ *
+ * Rich Faces - Natural Ajax for Java Server Faces (JSF)
+ *
+ * Copyright (C) 2007 Exadel, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1 as published by the Free Software Foundation.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+package org.ajax4jsf.builder.generator;
+
+/**
+ * @author Nick Belaevski
+ * @since 3.3.0
+ */
+public enum ResourceType {
+ SCRIPT, STYLE
+}
+
Modified:
trunk/cdk/generator/src/main/java/org/ajax4jsf/builder/generator/ResourcesConfigGenerator.java
===================================================================
---
trunk/cdk/generator/src/main/java/org/ajax4jsf/builder/generator/ResourcesConfigGenerator.java 2009-01-12
17:49:53 UTC (rev 12230)
+++
trunk/cdk/generator/src/main/java/org/ajax4jsf/builder/generator/ResourcesConfigGenerator.java 2009-01-12
17:55:34 UTC (rev 12231)
@@ -23,38 +23,22 @@
import java.io.BufferedWriter;
import java.io.File;
-import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.StringReader;
import java.io.Writer;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-import java.util.Arrays;
+import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashSet;
-import java.util.List;
+import java.util.Map;
import java.util.Set;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
-import net.sf.cglib.proxy.MethodInterceptor;
-import net.sf.cglib.proxy.MethodProxy;
-
import org.ajax4jsf.builder.config.BuilderConfig;
-import org.ajax4jsf.builder.config.ComponentBean;
-import org.ajax4jsf.builder.config.RendererBean;
-import org.ajax4jsf.templatecompiler.builder.CompilationContext;
-import org.ajax4jsf.templatecompiler.builder.CompilationException;
-import org.ajax4jsf.templatecompiler.builder.TemplateCompiler;
-import org.ajax4jsf.templatecompiler.elements.RootElement;
-import org.ajax4jsf.templatecompiler.elements.TemplateElement;
-import org.ajax4jsf.templatecompiler.elements.vcp.FResourceTemplateElement;
-import org.ajax4jsf.templatecompiler.elements.vcp.HeaderResourceElement;
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.xml.sax.Attributes;
@@ -63,271 +47,68 @@
import org.xml.sax.helpers.DefaultHandler;
/**
- * @author Nick - mailto:nbelaevski@exadel.com
- * created 17.04.2007
+ * @author Nick - mailto:nbelaevski@exadel.com created 17.04.2007
*
*/
public class ResourcesConfigGenerator extends FacesConfigGenerator {
private File resourcesConfig;
private File templatesDirectory;
-
- private static final SAXParserFactory parserFactory = SAXParserFactory.newInstance();
+ private ResourcesConfigGeneratorBean resourcesConfigGeneratorBean;
+ private static final SAXParserFactory parserFactory = SAXParserFactory
+ .newInstance();
+
public ResourcesConfigGenerator(JSFGeneratorConfiguration task, Logger log) {
super(task, log);
}
- private void addResources(ResourcesConfigGeneratorBean configBean, TemplateElement
templateElement,
- String packageName, RendererBean renderer, BuilderConfig builderConfig) throws
ClassNotFoundException {
- if (templateElement instanceof FResourceTemplateElement) {
- FResourceTemplateElement resourceTemplateElement = (FResourceTemplateElement)
templateElement;
- String name = resourceTemplateElement.getName();
-
- addResource(name, packageName, configBean);
- } else if (templateElement instanceof RootElement) {
- RootElement rootElement = (RootElement) templateElement;
-
- CompilationContext compilationContext = rootElement.getComponentBean();
-
- addResource(configBean, renderer, builderConfig,
- compilationContext);
- } else if (templateElement instanceof HeaderResourceElement) {
- HeaderResourceElement resourceElement = (HeaderResourceElement) templateElement;
- String[] paths = resourceElement.getResourcePaths();
- if (paths != null) {
- for (int i = 0; i < paths.length; i++) {
- String string = paths[i];
-
- addResource(string, packageName, configBean);
- }
- }
- }
-
- ArrayList<TemplateElement> subElements = templateElement.getSubElements();
- for (TemplateElement element : subElements) {
- addResources(configBean, element, packageName, renderer, builderConfig);
- }
- }
+ private void parseXCSSResource(String resourcePath,
+ final ResourcesConfigGeneratorBean bean) throws SAXException,
+ IOException, ParserConfigurationException {
+ InputStream resourceStream = getClassLoader().getResourceAsStream(
+ resourcePath);
+ if (resourceStream != null) {
+ debug("XCSS file exists in classpath");
- private String addResource(ResourcesConfigGeneratorBean configBean,
- RendererBean renderer, BuilderConfig builderConfig,
- CompilationContext compilationContext)
- throws ClassNotFoundException {
- String packageName;
- String classname = renderer.getClassname();
- int idx = classname.lastIndexOf('.');
- if (idx != -1) {
- packageName = classname.substring(0, idx);
- } else {
- packageName = "";
- }
-
- ClassLoader loader = builderConfig.getLoader();
- Class cl = null;
-
- try {
- cl = loader.loadClass(classname);
- } catch (ClassNotFoundException e) {
- String superclass = compilationContext.getBaseclassPackageName() + "." +
compilationContext.getBaseclassName();
- if (superclass != null) {
- cl = loader.loadClass(superclass);
- }
- }
-
- if (cl != null) {
try {
- GetResourceInterceptor interceptor = new GetResourceInterceptor();
+ SAXParser parser = parserFactory.newSAXParser();
+ parser.parse(resourceStream, new DefaultHandler() {
+ @Override
+ public void startElement(String uri, String localName,
+ String name, Attributes attributes)
+ throws SAXException {
- Object instance = AbstractClassStubBuilder.buildStub(cl, interceptor,
- builderConfig.getLoader());
-
- Method method = null;
- Object object = null;
-
- Class<?> cl1 = instance.getClass();
- while (cl1 != null && method == null) {
- try {
- method = cl1.getDeclaredMethod("getStyles", null);
- } catch (NoSuchMethodException e) {
- cl1 = cl1.getSuperclass();
- }
- }
-
- if (method != null) {
- method.setAccessible(true);
- object = method.invoke(instance, null);
- List<String> list = interceptor.getList();
- if (list != null) {
- for (String name : list) {
- addResource(name, packageName, configBean);
- }
- }
- }
-
- interceptor.clearList();
+ super.startElement(uri, localName, name, attributes);
- method = null;
- cl1 = instance.getClass();
- while (cl1 != null && method == null) {
- try {
- method = cl1.getDeclaredMethod("getScripts", null);
- } catch (NoSuchMethodException e) {
- cl1 = cl1.getSuperclass();
- }
- }
-
- if (method != null) {
- method.setAccessible(true);
- object = method.invoke(instance, null);
- List<String> list = interceptor.getList();
- if (list != null) {
- for (String name : list) {
- addResource(name, packageName, configBean);
- }
- }
- }
- } catch (SecurityException e) {
- builderConfig.getLog().error(e.getMessage(), e);
- } catch (IllegalArgumentException e) {
- builderConfig.getLog().error(e.getMessage(), e);
- } catch (IllegalAccessException e) {
- builderConfig.getLog().error(e.getMessage(), e);
- } catch (InvocationTargetException e) {
- builderConfig.getLog().error(e.getMessage(), e);
- }
- }
- return packageName;
- }
+ if ("f:resource".equals(name)) {
+ String value = attributes.getValue("f:key");
- private void addResource(String name, String packageName,
- ResourcesConfigGeneratorBean configBean) {
+ if (value != null) {
+ debug("Adding resource: " + value);
- String resolvedPath = resolveResourcePath(name, packageName);
- // remove leading / from resource name.
- if(name.startsWith("/")){
- name = name.substring(1);
- }
- if (resolvedPath != null) {
- configBean.addPathResource(name, resolvedPath);
- } else {
- //couldn't resolve, treat as class name
- configBean.addClassResource(name, name);
- }
- }
-
- private String resolveResourcePath(String name, String packageName) {
- if (name.contains("/")) {
- String resolvedName;
-
- if (!name.startsWith("/")) {
- //need to resolve
- StringBuffer normalizedName = new StringBuffer();
- normalizedName.append(packageName.replace('.', '/'));
-
- if (!packageName.endsWith("/")) {
- normalizedName.append('/');
- }
-
- normalizedName.append(name);
-
- resolvedName = normalizedName.toString();
- } else {
- if (name.length() > 0) {
- resolvedName = name.substring(1);
- } else {
- resolvedName = null;
- }
- }
-
- return resolvedName;
- }
-
- return null;
- }
-
- private void addResources(ResourcesConfigGeneratorBean configBean, RendererBean
renderer, BuilderConfig builderConfig) throws CompilationException, IOException,
ClassNotFoundException {
- if (null != renderer) {
- CompilationContext compilationContext = new RendererCompilationContext(
- getLog(), getClassLoader(),getConfig());
-
- if (renderer.isGenerate()) {
- String templateString = renderer.getTemplate();
- if (templateString != null) {
- File template;
- if (null != getTemplates()) {
- template = new File(getTemplates(), templateString);
- } else {
- template = new File(templateString);
+ bean.addResource(value, "", null, true);
+ }
+ }
}
+ });
- TemplateCompiler templateCompiler = new TemplateCompiler();
- InputStream templateStream = new FileInputStream(template);
- templateCompiler.processing(templateStream, compilationContext);
-
- TemplateElement root = compilationContext.getTree();
-
- String classname = renderer.getClassname();
- String packageName;
- int idx = classname.lastIndexOf('.');
- if (idx != -1) {
- packageName = classname.substring(0, idx);
- } else {
- packageName = "";
- }
-
- addResources(configBean, root, packageName, renderer, builderConfig);
+ } finally {
+ try {
+ resourceStream.close();
+ } catch (IOException e) {
+ getLog().error(e.getLocalizedMessage(), e);
}
- } else {
- addResource(configBean, renderer, builderConfig, compilationContext);
}
+ } else {
+ getLog().error("Resource " + resourcePath + " hasn't been
found!");
}
}
- private void parseXCSSResource(String resourcePath, final ResourcesConfigGeneratorBean
bean) throws SAXException, IOException, ParserConfigurationException {
- InputStream resourceStream = getClassLoader().getResourceAsStream(resourcePath);
- if (resourceStream != null) {
- debug("XCSS file exists in classpath");
-
- try {
- SAXParser parser = parserFactory.newSAXParser();
- parser.parse(resourceStream, new DefaultHandler() {
- @Override
- public void startElement(String uri,
- String localName, String name,
- Attributes attributes)
- throws SAXException {
-
- super.startElement(uri, localName, name, attributes);
-
- if ("f:resource".equals(name)) {
- String value = attributes.getValue("f:key");
-
- if (value != null) {
- debug("Adding resource: " + value);
-
- addResource(value, "", bean);
- }
- }
- }
- });
-
- } finally {
- try {
- resourceStream.close();
- } catch (IOException e) {
- getLog().error(e.getLocalizedMessage(), e);
- }
- }
- } else {
- getLog().error("Resource " + resourcePath + " hasn't been
found!");
- }
- }
-
private boolean isXCSSPath(String resourcePath) {
- return resourcePath != null && resourcePath.endsWith(".xcss");
+ return resourcePath != null && resourcePath.endsWith(".xcss");
}
-
+
public void createFiles(BuilderConfig config) throws GeneratorException {
VelocityContext context = new VelocityContext();
Template template = getTemplate();
@@ -335,86 +116,107 @@
// Put common properties
final ResourcesConfigGeneratorBean bean = new ResourcesConfigGeneratorBean();
-
- List<ComponentBean> components = config.getComponents();
- for (ComponentBean componentBean : components) {
- RendererBean rendererBean = componentBean.getRenderer();
-
- addResources(bean, rendererBean, config);
+ if (this.resourcesConfigGeneratorBean != null) {
+ bean.merge(resourcesConfigGeneratorBean);
}
-
- List<RendererBean> renderers = config.getRenderers();
- for (RendererBean rendererBean : renderers) {
- addResources(bean, rendererBean, config);
- }
-
+
String includedContent = getIncludeContent();
if (includedContent != null && includedContent.length() != 0) {
- String parseableContent = "<?xml version=\"1.0\"
encoding=\"UTF-8\"?><resource-config>" + includedContent +
- "</resource-config>";
+ String parseableContent = "<?xml version=\"1.0\"
encoding=\"UTF-8\"?><resource-config>"
+ + includedContent + "</resource-config>";
SAXParser parser = parserFactory.newSAXParser();
- parser.parse(new InputSource(new StringReader(parseableContent)), new
DefaultHandler() {
- private StringBuilder path;
-
- @Override
- public void startElement(String uri,
- String localName, String name,
- Attributes attributes)
- throws SAXException {
+ parser.parse(
+ new InputSource(new StringReader(parseableContent)),
+ new DefaultHandler() {
+ private StringBuilder path;
- super.startElement(uri, localName, name, attributes);
-
- if ("path".equals(name)) {
- this.path = new StringBuilder();
- }
- }
-
- public void characters(char[] ch, int start, int length) throws SAXException {
- if (this.path != null) {
- this.path.append(ch, start, length);
- }
- };
-
- @Override
- public void endElement(String uri, String localName, String name) throws
SAXException {
- super.endElement(uri, localName, name);
+ @Override
+ public void startElement(String uri,
+ String localName, String name,
+ Attributes attributes) throws SAXException {
- if ("resource".equals(name)) {
- if (this.path != null && this.path.length() != 0) {
- String resourcePath = this.path.toString().trim();
- if (isXCSSPath(resourcePath)) {
- debug("XCSS file detected: " + resourcePath);
- try {
- parseXCSSResource(resourcePath, bean);
- } catch (IOException e) {
- throw new SAXException(e.getLocalizedMessage(), e);
- } catch (ParserConfigurationException e) {
- throw new SAXException(e.getLocalizedMessage(), e);
+ super.startElement(uri, localName, name,
+ attributes);
+
+ if ("path".equals(name)) {
+ this.path = new StringBuilder();
+ }
}
- }
- }
- this.path = null;
- }
- }
- });
+
+ public void characters(char[] ch, int start,
+ int length) throws SAXException {
+ if (this.path != null) {
+ this.path.append(ch, start, length);
+ }
+ };
+
+ @Override
+ public void endElement(String uri,
+ String localName, String name)
+ throws SAXException {
+ super.endElement(uri, localName, name);
+
+ if ("resource".equals(name)) {
+ if (this.path != null
+ && this.path.length() != 0) {
+ String resourcePath = this.path
+ .toString().trim();
+ if (isXCSSPath(resourcePath)) {
+ debug("XCSS file detected: "
+ + resourcePath);
+ try {
+ parseXCSSResource(resourcePath,
+ bean);
+ } catch (IOException e) {
+ throw new SAXException(e
+ .getLocalizedMessage(),
+ e);
+ } catch (ParserConfigurationException e) {
+ throw new SAXException(e
+ .getLocalizedMessage(),
+ e);
+ }
+ }
+ }
+ this.path = null;
+ }
+ }
+ });
}
+
+ Set<String> pathResourcesSet = new LinkedHashSet<String>();
+ for (ResourcesConfigGeneratorBeanEntry entry : bean.getDependencies()) {
+ if (entry.isPathResource()) {
+ pathResourcesSet.add(entry.getPath());
+ }
+ }
- Set<String> pathResourcesSet = new
LinkedHashSet<String>(bean.getPathResources().values());
for (Iterator<String> iterator = pathResourcesSet.iterator(); iterator
.hasNext();) {
String resourcePath = iterator.next();
-
+
if (isXCSSPath(resourcePath)) {
- debug("XCSS file detected: " + resourcePath);
- parseXCSSResource(resourcePath, bean);
+ debug("XCSS file detected: " + resourcePath);
+ parseXCSSResource(resourcePath, bean);
}
}
+
+ Map<String, String> classResources = new HashMap<String, String>();
+ Map<String, String> pathResources = new HashMap<String, String>();
- context.put("classResources", bean.getClassResources());
- context.put("pathResources", bean.getPathResources());
- context.put("resourcesConfig", this);
+ for (ResourcesConfigGeneratorBeanEntry entry : bean.getDependencies()) {
+ if (entry.isPathResource()) {
+ pathResources.put(entry.getName(), entry.getPath());
+ } else {
+ classResources.put(entry.getName(), entry.getPath());
+ }
+ }
+ context.put("classResources", classResources);
+ context.put("pathResources", pathResources);
+ context.put("resourcesConfig", this);
+
File configFile = getResourcesConfig();
File javaDir = configFile.getParentFile();
if (!javaDir.exists()) {
@@ -428,8 +230,8 @@
out.flush();
out.close();
} catch (Exception e) {
- throw new GeneratorException("Error create new resources-config.xml ",
- e);
+ throw new GeneratorException(
+ "Error create new resources-config.xml ", e);
}
}
@@ -456,36 +258,13 @@
public File getTemplates() {
return this.templatesDirectory;
}
-}
-
-class GetResourceInterceptor implements MethodInterceptor {
-
- private static final Class<?>[] SIGNATURE = new Class<?>[] {
- String.class
- };
- private List<String> list = new ArrayList<String>();
-
- public List<String> getList() {
- return list;
+ public void setResourcesConfigGeneratorBean(
+ ResourcesConfigGeneratorBean resourcesConfigGeneratorBean) {
+ this.resourcesConfigGeneratorBean = resourcesConfigGeneratorBean;
}
- public void clearList() {
- list.clear();
+ public ResourcesConfigGeneratorBean getResourcesConfigGeneratorBean() {
+ return resourcesConfigGeneratorBean;
}
-
- public Object intercept(Object instance, Method method, Object[] args,
- MethodProxy methodProxy) throws Throwable {
-
- if ("getResource".equals(method.getName()) &&
- Arrays.equals(SIGNATURE, method.getParameterTypes())) {
-
- list.add((String) args[0]);
-
- return null;
- } else {
- return methodProxy.invokeSuper(instance, args);
- }
- }
-
}
\ No newline at end of file
Modified:
trunk/cdk/generator/src/main/java/org/ajax4jsf/builder/generator/ResourcesConfigGeneratorBean.java
===================================================================
---
trunk/cdk/generator/src/main/java/org/ajax4jsf/builder/generator/ResourcesConfigGeneratorBean.java 2009-01-12
17:49:53 UTC (rev 12230)
+++
trunk/cdk/generator/src/main/java/org/ajax4jsf/builder/generator/ResourcesConfigGeneratorBean.java 2009-01-12
17:55:34 UTC (rev 12231)
@@ -21,33 +21,73 @@
package org.ajax4jsf.builder.generator;
-import java.util.HashMap;
-import java.util.Map;
+import java.util.ArrayList;
+import java.util.List;
-
-
/**
* @author Nick - mailto:nbelaevski@exadel.com
* created 17.04.2007
*
*/
public class ResourcesConfigGeneratorBean {
- private HashMap<String, String> classResources = new HashMap<String,
String>();
- private HashMap<String, String> pathResources = new HashMap<String,
String>();
- public void addClassResource(String name, String className) {
- classResources.put(name, className);
- }
+ private List<ResourcesConfigGeneratorBeanEntry> dependencies = new
ArrayList<ResourcesConfigGeneratorBeanEntry>();
+
+ private String resolveResourcePath(String name, String packageName) {
+ if (name.contains("/")) {
+ String resolvedName;
- public void addPathResource(String name, String path) {
- pathResources.put(name, path);
+ if (!name.startsWith("/")) {
+ // need to resolve
+ StringBuffer normalizedName = new StringBuffer();
+ normalizedName.append(packageName.replace('.', '/'));
+
+ if (!packageName.endsWith("/")) {
+ normalizedName.append('/');
+ }
+
+ normalizedName.append(name);
+
+ resolvedName = normalizedName.toString();
+ } else {
+ if (name.length() > 0) {
+ resolvedName = name.substring(1);
+ } else {
+ resolvedName = null;
+ }
+ }
+
+ return resolvedName;
+ }
+
+ return null;
}
- public Map<String, String> getClassResources() {
- return classResources;
+ public void addResource(String name, String path, ResourceType type, boolean isDerived)
{
+ boolean isPathResource = true;
+ String resolvedPath = resolveResourcePath(name, path);
+
+ // remove leading / from resource name.
+ if (name.startsWith("/")) {
+ name = name.substring(1);
+ }
+
+ if (resolvedPath == null) {
+ // couldn't resolve, treat as class name
+ resolvedPath = name;
+ isPathResource = false;
+ }
+
+ this.dependencies.add(
+ new ResourcesConfigGeneratorBeanEntry(
+ name, resolvedPath, isPathResource, type, isDerived));
}
- public Map<String, String> getPathResources() {
- return pathResources;
+ public List<ResourcesConfigGeneratorBeanEntry> getDependencies() {
+ return dependencies;
}
+
+ public void merge(ResourcesConfigGeneratorBean bean) {
+ this.dependencies.addAll(bean.dependencies);
+ }
}
\ No newline at end of file
Added:
trunk/cdk/generator/src/main/java/org/ajax4jsf/builder/generator/ResourcesConfigGeneratorBeanEntry.java
===================================================================
---
trunk/cdk/generator/src/main/java/org/ajax4jsf/builder/generator/ResourcesConfigGeneratorBeanEntry.java
(rev 0)
+++
trunk/cdk/generator/src/main/java/org/ajax4jsf/builder/generator/ResourcesConfigGeneratorBeanEntry.java 2009-01-12
17:55:34 UTC (rev 12231)
@@ -0,0 +1,66 @@
+/**
+ * License Agreement.
+ *
+ * Rich Faces - Natural Ajax for Java Server Faces (JSF)
+ *
+ * Copyright (C) 2007 Exadel, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1 as published by the Free Software Foundation.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+
+package org.ajax4jsf.builder.generator;
+
+public final class ResourcesConfigGeneratorBeanEntry {
+
+ public ResourcesConfigGeneratorBeanEntry(String name, String path, boolean
pathResource,
+ ResourceType type, boolean derived) {
+ super();
+ this.name = name;
+ this.path = path;
+ this.pathResource = pathResource;
+ this.type = type;
+ this.derived = derived;
+ }
+
+ private String name;
+
+ private String path;
+
+ private boolean pathResource;
+
+ private ResourceType type;
+
+ private boolean derived;
+
+ public boolean isPathResource() {
+ return pathResource;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public String getPath() {
+ return path;
+ }
+
+ public ResourceType getType() {
+ return type;
+ }
+
+ public boolean isDerived() {
+ return derived;
+ }
+}
\ No newline at end of file
Added:
trunk/cdk/generator/src/main/java/org/ajax4jsf/builder/generator/ResourcesConfigParser.java
===================================================================
---
trunk/cdk/generator/src/main/java/org/ajax4jsf/builder/generator/ResourcesConfigParser.java
(rev 0)
+++
trunk/cdk/generator/src/main/java/org/ajax4jsf/builder/generator/ResourcesConfigParser.java 2009-01-12
17:55:34 UTC (rev 12231)
@@ -0,0 +1,403 @@
+/**
+ * License Agreement.
+ *
+ * Rich Faces - Natural Ajax for Java Server Faces (JSF)
+ *
+ * Copyright (C) 2007 Exadel, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1 as published by the Free Software Foundation.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+package org.ajax4jsf.builder.generator;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.IdentityHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import net.sf.cglib.proxy.MethodInterceptor;
+import net.sf.cglib.proxy.MethodProxy;
+
+import org.ajax4jsf.builder.config.BuilderConfig;
+import org.ajax4jsf.builder.config.ComponentBean;
+import org.ajax4jsf.builder.config.RendererBean;
+import org.ajax4jsf.builder.config.TagBean;
+import org.ajax4jsf.builder.config.TagHandlerBean;
+import org.ajax4jsf.templatecompiler.builder.CompilationContext;
+import org.ajax4jsf.templatecompiler.builder.CompilationException;
+import org.ajax4jsf.templatecompiler.builder.TemplateCompiler;
+import org.ajax4jsf.templatecompiler.elements.RootElement;
+import org.ajax4jsf.templatecompiler.elements.TemplateElement;
+import org.ajax4jsf.templatecompiler.elements.vcp.FResourceTemplateElement;
+import org.ajax4jsf.templatecompiler.elements.vcp.HeaderResourceElement;
+import org.ajax4jsf.templatecompiler.elements.vcp.HeaderScriptsElement;
+import org.ajax4jsf.templatecompiler.elements.vcp.HeaderStylesElement;
+
+/**
+ * @author Nick Belaevski
+ * @since 3.3.0
+ */
+public class ResourcesConfigParser {
+
+ private JSFGeneratorConfiguration config;
+
+ private Logger log;
+
+ private File templates;
+
+ private ResourcesConfigGeneratorBean resourcesConfigGeneratorBean;
+
+ private Map<String, ResourcesConfigGeneratorBean> componentResourcesMap;
+
+ public ResourcesConfigParser(JSFGeneratorConfiguration config, Logger log) {
+ super();
+
+ this.config = config;
+ this.log = log;
+ this.resourcesConfigGeneratorBean = new ResourcesConfigGeneratorBean();
+ this.componentResourcesMap = new HashMap<String,
ResourcesConfigGeneratorBean>();
+ }
+
+ public File getTemplates() {
+ return templates;
+ }
+
+ public void setTemplates(File templates) {
+ this.templates = templates;
+ }
+
+ private void addResources(ResourcesConfigGeneratorBean configBean,
+ TemplateElement templateElement, String packageName,
+ RendererBean renderer, BuilderConfig builderConfig)
+ throws ClassNotFoundException {
+ if (templateElement instanceof FResourceTemplateElement) {
+ FResourceTemplateElement resourceTemplateElement = (FResourceTemplateElement)
templateElement;
+ String name = resourceTemplateElement.getName();
+
+ configBean.addResource(name, packageName, null, true);
+ } else if (templateElement instanceof RootElement) {
+ RootElement rootElement = (RootElement) templateElement;
+
+ CompilationContext compilationContext = rootElement
+ .getComponentBean();
+
+ addResource(configBean, renderer, builderConfig, compilationContext);
+ } else if (templateElement instanceof HeaderResourceElement) {
+ HeaderResourceElement resourceElement = (HeaderResourceElement) templateElement;
+
+ ResourceType type = null;
+ if (templateElement instanceof HeaderScriptsElement) {
+ type = ResourceType.SCRIPT;
+ } else if (templateElement instanceof HeaderStylesElement) {
+ type = ResourceType.STYLE;
+ }
+
+ String[] paths = resourceElement.getResourcePaths();
+ if (paths != null) {
+ for (int i = 0; i < paths.length; i++) {
+ String string = paths[i];
+
+ configBean.addResource(string, packageName, type, false);
+ }
+ }
+ }
+
+ ArrayList<TemplateElement> subElements = templateElement
+ .getSubElements();
+ for (TemplateElement element : subElements) {
+ addResources(configBean, element, packageName, renderer,
+ builderConfig);
+ }
+ }
+
+ private String addResource(ResourcesConfigGeneratorBean configBean,
+ RendererBean renderer, BuilderConfig builderConfig,
+ CompilationContext compilationContext)
+ throws ClassNotFoundException {
+ String packageName;
+ String classname = renderer.getClassname();
+ int idx = classname.lastIndexOf('.');
+ if (idx != -1) {
+ packageName = classname.substring(0, idx);
+ } else {
+ packageName = "";
+ }
+
+ ClassLoader loader = builderConfig.getLoader();
+ Class<?> cl = null;
+
+ try {
+ cl = loader.loadClass(classname);
+ } catch (ClassNotFoundException e) {
+ String superclass = compilationContext.getBaseclassPackageName()
+ + "." + compilationContext.getBaseclassName();
+ if (superclass != null) {
+ cl = loader.loadClass(superclass);
+ }
+ }
+
+ if (cl != null) {
+ try {
+ GetResourceInterceptor interceptor = new
GetResourceInterceptor(builderConfig.getLoader());
+
+ Object instance = AbstractClassStubBuilder.buildStub(cl,
+ interceptor, builderConfig.getLoader());
+
+ //clear list - some resources could be requested during class/instance
initialization
+ Object[] result = null;
+ Method method = null;
+ Set<String> locatedResources = new HashSet<String>();
+
+ Class<?> cl1 = instance.getClass();
+ while (cl1 != null && method == null) {
+ try {
+ method = cl1.getDeclaredMethod("getStyles");
+ } catch (NoSuchMethodException e) {
+ cl1 = cl1.getSuperclass();
+ }
+ }
+
+ if (method != null) {
+ method.setAccessible(true);
+ result = (Object[]) method.invoke(instance);
+ if (result instanceof Object[]) {
+ for (Object object : result) {
+ String resourceName = interceptor.getResourceName(object);
+ if (resourceName != null) {
+ locatedResources.add(resourceName);
+ configBean.addResource(resourceName, packageName, ResourceType.STYLE,
+ false);
+ }
+ }
+ }
+ }
+
+ method = null;
+ cl1 = instance.getClass();
+ while (cl1 != null && method == null) {
+ try {
+ method = cl1.getDeclaredMethod("getScripts");
+ } catch (NoSuchMethodException e) {
+ cl1 = cl1.getSuperclass();
+ }
+ }
+
+ if (method != null) {
+ method.setAccessible(true);
+ result = (Object[]) method.invoke(instance);
+ if (result instanceof Object[]) {
+ for (Object object : result) {
+ String resourceName = interceptor.getResourceName(object);
+ if (resourceName != null) {
+ locatedResources.add(resourceName);
+ configBean.addResource(resourceName, packageName, ResourceType.SCRIPT,
+ false);
+ }
+ }
+ }
+
+ List<String> list = interceptor.getList();
+ if (list != null) {
+ list.removeAll(locatedResources);
+ for (String resourceName : list) {
+ log.warn("Error detecting resource type: " + resourceName);
+ configBean.addResource(resourceName, packageName, null,
+ false);
+ }
+ }
+ }
+ } catch (SecurityException e) {
+ builderConfig.getLog().error(e.getMessage(), e);
+ } catch (IllegalArgumentException e) {
+ builderConfig.getLog().error(e.getMessage(), e);
+ } catch (IllegalAccessException e) {
+ builderConfig.getLog().error(e.getMessage(), e);
+ } catch (InvocationTargetException e) {
+ builderConfig.getLog().error(e.getMessage(), e);
+ }
+ }
+ return packageName;
+ }
+
+ private void addResources(ResourcesConfigGeneratorBean configBean,
+ RendererBean renderer, BuilderConfig builderConfig)
+ throws CompilationException, IOException, ClassNotFoundException {
+ if (null != renderer) {
+ CompilationContext compilationContext = new RendererCompilationContext(
+ log, config.getClassLoader(), config);
+
+ if (renderer.isGenerate()) {
+ String templateString = renderer.getTemplate();
+ if (templateString != null) {
+ File template;
+ if (null != getTemplates()) {
+ template = new File(getTemplates(), templateString);
+ } else {
+ template = new File(templateString);
+ }
+
+ TemplateCompiler templateCompiler = new TemplateCompiler();
+ InputStream templateStream = new FileInputStream(template);
+ templateCompiler.processing(templateStream,
+ compilationContext);
+
+ TemplateElement root = compilationContext.getTree();
+
+ String classname = renderer.getClassname();
+ String packageName;
+ int idx = classname.lastIndexOf('.');
+ if (idx != -1) {
+ packageName = classname.substring(0, idx);
+ } else {
+ packageName = "";
+ }
+
+ addResources(configBean, root, packageName, renderer,
+ builderConfig);
+ }
+ } else {
+ addResource(configBean, renderer, builderConfig,
+ compilationContext);
+ }
+ }
+ }
+
+ public void parse(BuilderConfig config) throws CompilationException, IOException,
ClassNotFoundException {
+ List<ComponentBean> components = config.getComponents();
+ for (ComponentBean componentBean : components) {
+ ResourcesConfigGeneratorBean localBeanInstance = new ResourcesConfigGeneratorBean();
+ RendererBean rendererBean = componentBean.getRenderer();
+
+ addResources(localBeanInstance, rendererBean, config);
+
+ String componentName = null;
+
+ TagBean tag = componentBean.getTag();
+ if (tag != null) {
+ componentName = tag.getName();
+ }
+
+ if (componentName == null) {
+ TagHandlerBean taghandler = componentBean.getTaghandler();
+ if (taghandler != null) {
+ componentName = taghandler.getName();
+ }
+ }
+
+ if (componentName != null) {
+ this.componentResourcesMap.put(componentName, localBeanInstance);
+ }
+
+ this.resourcesConfigGeneratorBean.merge(localBeanInstance);
+ }
+
+ List<RendererBean> renderers = config.getRenderers();
+ for (RendererBean rendererBean : renderers) {
+ addResources(this.resourcesConfigGeneratorBean, rendererBean, config);
+ }
+ }
+
+ public ResourcesConfigGeneratorBean getResourcesConfigGeneratorBean() {
+ return resourcesConfigGeneratorBean;
+ }
+
+ public Map<String, ResourcesConfigGeneratorBean> getComponentResourcesMap() {
+ return componentResourcesMap;
+ }
+}
+
+interface NamedObject {
+ public String getPath();
+}
+
+class NamedObjectImpl implements NamedObject {
+
+ private String path;
+
+ public NamedObjectImpl(String path) {
+ super();
+ this.path = path;
+ }
+
+ public String getPath() {
+ return path;
+ }
+}
+
+class GetResourceInterceptor implements MethodInterceptor {
+
+ private static final Class<?>[] SIGNATURE = new Class<?>[] { String.class
};
+
+ private ClassLoader classLoader;
+
+ private List<String> list = new ArrayList<String>();
+
+ private Map<String, Object> resources = new HashMap<String, Object>();
+
+ private Map<Object, String> resourcesInverse = new IdentityHashMap<Object,
String>();
+
+ public GetResourceInterceptor(ClassLoader loader) {
+ this.classLoader = loader;
+ }
+
+ public List<String> getList() {
+ return list;
+ }
+
+ public String getResourceName(Object resource) {
+ return resourcesInverse.get(resource);
+ }
+
+ public void clearList() {
+ list.clear();
+ }
+
+ public Object intercept(Object instance, Method method, Object[] args,
+ MethodProxy methodProxy) throws Throwable {
+
+ if ("getResource".equals(method.getName())
+ && Arrays.equals(SIGNATURE, method.getParameterTypes())) {
+
+ String resourceName = (String) args[0];
+ list.add(resourceName);
+
+ Object resource = resources.get(resourceName);
+ if (resource == null) {
+ Class<?> returnType = method.getReturnType();
+ if (returnType.isInterface()) {
+ Object interfaceStub = AbstractClassStubBuilder.buildInterfaceStub(returnType,
classLoader);
+ resources.put(resourceName, interfaceStub);
+ resourcesInverse.put(interfaceStub, resourceName);
+
+ return interfaceStub;
+ }
+ }
+
+ return null;
+ } else {
+ return methodProxy.invokeSuper(instance, args);
+ }
+ }
+
+}
\ No newline at end of file
Added:
trunk/cdk/generator/src/main/java/org/ajax4jsf/builder/generator/ResourcesDependenciesGenerator.java
===================================================================
---
trunk/cdk/generator/src/main/java/org/ajax4jsf/builder/generator/ResourcesDependenciesGenerator.java
(rev 0)
+++
trunk/cdk/generator/src/main/java/org/ajax4jsf/builder/generator/ResourcesDependenciesGenerator.java 2009-01-12
17:55:34 UTC (rev 12231)
@@ -0,0 +1,143 @@
+/**
+ * License Agreement.
+ *
+ * Rich Faces - Natural Ajax for Java Server Faces (JSF)
+ *
+ * Copyright (C) 2007 Exadel, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1 as published by the Free Software Foundation.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+
+package org.ajax4jsf.builder.generator;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.Writer;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.ajax4jsf.builder.config.BuilderConfig;
+import org.apache.velocity.Template;
+import org.apache.velocity.VelocityContext;
+
+/**
+ * @author Nick Belaevski
+ * @since 3.3.0
+ */
+public class ResourcesDependenciesGenerator extends InnerGenerator {
+
+ private Map<String, ResourcesConfigGeneratorBean> componentDependencies;
+ private String uri;
+ private File dependencyFile;
+
+ public ResourcesDependenciesGenerator(JSFGeneratorConfiguration config,
+ Logger log) {
+ super(config, log);
+ }
+
+ @Override
+ public void createFiles(BuilderConfig config) throws GeneratorException {
+ try {
+ VelocityContext context = new VelocityContext();
+ Template template = getTemplate();
+
+ Map<String, Map<String, Collection<String>>> componentsMap = new
HashMap<String, Map<String, Collection<String>>>();
+ for (Entry<String, ResourcesConfigGeneratorBean> entry :
componentDependencies.entrySet()) {
+ Map<String, Collection<String>> resourcesMap = new HashMap<String,
Collection<String>>();
+ componentsMap.put(entry.getKey(), resourcesMap);
+
+ Collection<String> scripts = new LinkedHashSet<String>();
+ Collection<String> styles = new LinkedHashSet<String>();
+
+ ResourcesConfigGeneratorBean resourcesConfigBean = entry.getValue();
+ List<ResourcesConfigGeneratorBeanEntry> dependencies =
resourcesConfigBean.getDependencies();
+ for (ResourcesConfigGeneratorBeanEntry beanEntry : dependencies) {
+ if (beanEntry.isDerived()) {
+ continue;
+ }
+
+ ResourceType type = beanEntry.getType();
+ if (type != null) {
+ switch (type) {
+ case SCRIPT:
+ scripts.add(beanEntry.getPath());
+ break;
+
+ case STYLE:
+ styles.add(beanEntry.getPath());
+ break;
+ }
+ }
+ }
+
+ resourcesMap.put("scripts", scripts);
+ resourcesMap.put("styles", styles);
+ }
+
+ context.put("uri", uri);
+ context.put("components", componentsMap);
+
+ File configFile = getDependencyFile();
+ File javaDir = configFile.getParentFile();
+ if (!javaDir.exists()) {
+ javaDir.mkdirs();
+ }
+ if (configFile.exists()) {
+ configFile.delete();
+ }
+ Writer out = new BufferedWriter(new FileWriter(configFile));
+ template.merge(context, out);
+ out.flush();
+ out.close();
+ } catch (Exception e) {
+ throw new GeneratorException(e.getMessage(), e);
+ }
+ }
+
+ @Override
+ protected String getDefaultTemplateName() {
+ return "resources-dependencies.vm";
+ }
+
+ public Map<String, ResourcesConfigGeneratorBean> getComponentDependencies() {
+ return componentDependencies;
+ }
+
+ public void setComponentDependencies(
+ Map<String, ResourcesConfigGeneratorBean> componentDependencies) {
+ this.componentDependencies = componentDependencies;
+ }
+
+ public void setDependencyFile(File dependencyFile) {
+ this.dependencyFile = dependencyFile;
+ }
+
+ public File getDependencyFile() {
+ return dependencyFile;
+ }
+
+ public String getUri() {
+ return uri;
+ }
+
+ public void setUri(String uri) {
+ this.uri = uri;
+ }
+}
Added:
trunk/cdk/generator/src/main/resources/META-INF/templates12/resources-dependencies.vm
===================================================================
--- trunk/cdk/generator/src/main/resources/META-INF/templates12/resources-dependencies.vm
(rev 0)
+++
trunk/cdk/generator/src/main/resources/META-INF/templates12/resources-dependencies.vm 2009-01-12
17:55:34 UTC (rev 12231)
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<components>
+ <namespace>$uri</namespace>
+
+#foreach( $key in ${components.keySet()})
+ <component>
+ <name>$key</name>
+
+ #set($componentEntry = ${components.get($key)})
+ #set($scripts = ${componentEntry.get("scripts")})
+ #set($styles = ${componentEntry.get("styles")})
+
+ #if(!${scripts.isEmpty()})
+ <scripts>
+ #foreach($script in $scripts)
+ <script>$script</script>
+ #end
+ </scripts>
+ #end
+
+ #if(!${styles.isEmpty()})
+ <styles>
+ #foreach($style in $styles)
+ <style>$style</style>
+ #end
+ </styles>
+ #end
+ </component>
+#end
+
+</components>
Property changes on: trunk/cdk/maven-cdk-plugin
___________________________________________________________________
Name: svn:ignore
- .classpath
.project
.settings
target
+ .classpath
.project
.settings
target
bin
Modified:
trunk/cdk/maven-cdk-plugin/src/main/java/org/ajax4jsf/builder/mojo/AbstractCDKMojo.java
===================================================================
---
trunk/cdk/maven-cdk-plugin/src/main/java/org/ajax4jsf/builder/mojo/AbstractCDKMojo.java 2009-01-12
17:49:53 UTC (rev 12230)
+++
trunk/cdk/maven-cdk-plugin/src/main/java/org/ajax4jsf/builder/mojo/AbstractCDKMojo.java 2009-01-12
17:55:34 UTC (rev 12231)
@@ -43,7 +43,6 @@
import org.apache.velocity.exception.MethodInvocationException;
import org.apache.velocity.exception.ParseErrorException;
import org.apache.velocity.exception.ResourceNotFoundException;
-import org.codehaus.plexus.velocity.DefaultVelocityComponent;
import org.codehaus.plexus.velocity.VelocityComponent;
/**
Modified:
trunk/cdk/maven-cdk-plugin/src/main/java/org/ajax4jsf/builder/mojo/AssemblyLibraryMojo.java
===================================================================
---
trunk/cdk/maven-cdk-plugin/src/main/java/org/ajax4jsf/builder/mojo/AssemblyLibraryMojo.java 2009-01-12
17:49:53 UTC (rev 12230)
+++
trunk/cdk/maven-cdk-plugin/src/main/java/org/ajax4jsf/builder/mojo/AssemblyLibraryMojo.java 2009-01-12
17:55:34 UTC (rev 12231)
@@ -72,8 +72,8 @@
* criteria. for accepted modules, unpack it to classes directory, and put
* config files in separate directories. 4. Append unpacked directory to
* resources, included in result jar. 5. Merge all META-INF/faces-config.xml ,
- * *.tld, *.taglib.xml , resources-config.xml into ones. 6. append dependencies
- * of included projects to this.
+ * *.tld, *.taglib.xml, *.component-dependencies.xml , resources-config.xml into ones.
+ * 6. append dependencies of included projects to this.
*
* @author shura
* @goal assembly
@@ -90,6 +90,8 @@
private static final String RESOURCES_CONFIG_TEMPLATE =
"resources-config.vm";
+ private static final String COMPONENT_DEPENDENCIES_TEMPLATE =
"component-dependencies.vm";
+
private static final String XCSS_TEMPLATE = "xcss.vm";
private static final String TLD_TEMPLATE = "tld.vm";
@@ -106,12 +108,19 @@
"library-class", "namespace", "tag",
"function"
};
+ private static final String[] DEPENDENCIES_TAG_NAMES = new String[] {
+ "component"
+ };
+
private static final Comparator<Node> TLD_COMPARATOR = new NamesListComparator(
new XPathComparator("listener-class/text()", "name/text()"),
TLD_TAG_NAMES);
private static final Comparator<Node> FACELET_COMPARATOR = new
NamesListComparator(
new XPathComparator("function-name/text()", "tag-name/text()"),
TAGLIB_TAG_NAMES);
+ private static final Comparator<Node> DEPENDENCIES_COMPARATOR = new
NamesListComparator(
+ new XPathComparator("name/text()"), DEPENDENCIES_TAG_NAMES);
+
/**
* Used to look up Artifacts in the remote repository.
*
@@ -221,6 +230,11 @@
/**
* @parameter
*/
+ private String includeDependencies = "META-INF/*.component-dependencies.xml";
+
+ /**
+ * @parameter
+ */
private String includeXcss = "**/*.xcss";
/**
@@ -264,6 +278,7 @@
mergeXML(models, "META-INF/resources-config.xml", null,
RESOURCES_CONFIG_TEMPLATE, "/resource-config/resource",
"name/text()", new VelocityContext(), resourcesConfig, false, null);
+
if (null != commonStyle) {
File commonXcss = new File(outputDirectory, commonStyle);
mergeXML(models, includeXcss, excludeXcss, XCSS_TEMPLATE,
@@ -301,10 +316,10 @@
}
}
}
- generateTaglib(taglibModels, taglib);
+ generateTaglibAndDependencies(taglibModels, taglib);
}
} else {
- generateTaglib(models, library.getTaglib());
+ generateTaglibAndDependencies(models, library.getTaglib());
}
}
@@ -312,7 +327,7 @@
* @param models
* @throws MojoExecutionException
*/
- private void generateTaglib(List<Model> models, Taglib taglib)
+ private void generateTaglibAndDependencies(List<Model> models, Taglib taglib)
throws MojoExecutionException {
getLog().debug(
"Assembly taglib for uri " + taglib.getUri()
@@ -341,6 +356,14 @@
mergeXML(models, includeTaglib, null, TAGLIB_TEMPLATE, commonXPath,
"tag-name/text() | function-name/text()", new VelocityContext(
taglibContext), faceletsTaglib, false, FACELET_COMPARATOR);
getLog().debug("Write Facelets taglib " + faceletsTaglib.getPath());
+
+ File dependenciesFile = new File(outputDirectory, "META-INF/"
+ + taglib.getTaglib() + ".component-dependencies.xml");
+ commonXPath = "/components/component" + createTagCondition(taglib,
"name");
+
+ mergeXML(models, includeDependencies, null, COMPONENT_DEPENDENCIES_TEMPLATE,
commonXPath, "name/text()", new VelocityContext(
+ taglibContext), dependenciesFile, false, DEPENDENCIES_COMPARATOR);
+ getLog().debug("Write dependencies file " + dependenciesFile.getPath());
}
/**
@@ -715,6 +738,7 @@
resource.addExclude("META-INF/faces-config.xml");
resource.addExclude("META-INF/resources-config.xml");
resource.addExclude("META-INF/*.taglib.xml");
+ resource.addExclude("META-INF/*.component-dependencies.xml");
resource.addExclude("META-INF/*.tld");
project.addResource(resource);
Modified:
trunk/cdk/maven-cdk-plugin/src/main/java/org/ajax4jsf/builder/mojo/CompileMojo.java
===================================================================
---
trunk/cdk/maven-cdk-plugin/src/main/java/org/ajax4jsf/builder/mojo/CompileMojo.java 2009-01-12
17:49:53 UTC (rev 12230)
+++
trunk/cdk/maven-cdk-plugin/src/main/java/org/ajax4jsf/builder/mojo/CompileMojo.java 2009-01-12
17:55:34 UTC (rev 12231)
@@ -26,13 +26,11 @@
import java.lang.reflect.Array;
import java.lang.reflect.InvocationTargetException;
import java.util.Collection;
-import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.apache.commons.beanutils.PropertyUtils;
-import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.model.Parent;
import org.apache.maven.plugin.MojoExecutionException;
Modified:
trunk/cdk/maven-cdk-plugin/src/main/java/org/ajax4jsf/builder/mojo/CreateComponentMojo.java
===================================================================
---
trunk/cdk/maven-cdk-plugin/src/main/java/org/ajax4jsf/builder/mojo/CreateComponentMojo.java 2009-01-12
17:49:53 UTC (rev 12230)
+++
trunk/cdk/maven-cdk-plugin/src/main/java/org/ajax4jsf/builder/mojo/CreateComponentMojo.java 2009-01-12
17:55:34 UTC (rev 12231)
@@ -26,7 +26,6 @@
import java.util.List;
import org.apache.maven.model.Plugin;
-import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.velocity.VelocityContext;
Modified:
trunk/cdk/maven-cdk-plugin/src/main/java/org/ajax4jsf/builder/mojo/GenerateMojo.java
===================================================================
---
trunk/cdk/maven-cdk-plugin/src/main/java/org/ajax4jsf/builder/mojo/GenerateMojo.java 2009-01-12
17:49:53 UTC (rev 12230)
+++
trunk/cdk/maven-cdk-plugin/src/main/java/org/ajax4jsf/builder/mojo/GenerateMojo.java 2009-01-12
17:55:34 UTC (rev 12231)
@@ -26,7 +26,6 @@
import org.ajax4jsf.builder.config.BuilderConfig;
import org.ajax4jsf.builder.config.ParsingException;
-import org.ajax4jsf.builder.generator.ComponentGenerator;
import org.ajax4jsf.builder.generator.ComponentGenerator2;
import org.ajax4jsf.builder.generator.ComponentTagGenerator;
import org.ajax4jsf.builder.generator.ConverterGenerator;
@@ -40,6 +39,8 @@
import org.ajax4jsf.builder.generator.RenderKitBean;
import org.ajax4jsf.builder.generator.RendererGenerator;
import org.ajax4jsf.builder.generator.ResourcesConfigGenerator;
+import org.ajax4jsf.builder.generator.ResourcesConfigParser;
+import org.ajax4jsf.builder.generator.ResourcesDependenciesGenerator;
import org.ajax4jsf.builder.generator.TagHandlerGenerator;
import org.ajax4jsf.builder.generator.TaglibGenerator;
import org.ajax4jsf.builder.generator.ValidatorGenerator;
@@ -211,9 +212,23 @@
faceletsTaglibGenerator.createFiles(config);
}
+ ResourcesConfigParser resourcesConfigParser = new
ResourcesConfigParser(resourcesConfiguration, mavenLogger);
+ resourcesConfigParser.setTemplates(templatesDirectory);
+ resourcesConfigParser.parse(config);
+
+ if (taglib != null) {
+ ResourcesDependenciesGenerator resourcesDependenciesGenerator = new
ResourcesDependenciesGenerator(resourcesConfiguration, mavenLogger);
+ resourcesDependenciesGenerator.setUri(taglib.getUri());
+ resourcesDependenciesGenerator.setDependencyFile(new File(outputResourcesDirectory,
+ "META-INF/" + taglib.getShortName() +
".component-dependencies.xml"));
+ resourcesDependenciesGenerator.setComponentDependencies(resourcesConfigParser.getComponentResourcesMap());
+ resourcesDependenciesGenerator.createFiles(config);
+ }
+
// Generate resources configuration file resources-config.xml
// for all images/scripts/css...
ResourcesConfigGenerator resourcesConfigGenerator = new
ResourcesConfigGenerator(resourcesConfiguration, mavenLogger);
+ resourcesConfigGenerator.setResourcesConfigGeneratorBean(resourcesConfigParser.getResourcesConfigGeneratorBean());
resourcesConfigGenerator.setInclude(resourcesInclude);
resourcesConfigGenerator.setTemplates(templatesDirectory);
resourcesConfigGenerator.setResourcesConfig(new File(
Modified:
trunk/cdk/maven-cdk-plugin/src/main/java/org/ajax4jsf/builder/mojo/GenerateTestMojo.java
===================================================================
---
trunk/cdk/maven-cdk-plugin/src/main/java/org/ajax4jsf/builder/mojo/GenerateTestMojo.java 2009-01-12
17:49:53 UTC (rev 12230)
+++
trunk/cdk/maven-cdk-plugin/src/main/java/org/ajax4jsf/builder/mojo/GenerateTestMojo.java 2009-01-12
17:55:34 UTC (rev 12231)
@@ -27,8 +27,6 @@
import org.ajax4jsf.builder.maven.MavenLogger;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
-import org.apache.maven.project.MavenProject;
-import org.apache.velocity.Template;
/**
*
Modified: trunk/cdk/maven-cdk-plugin/src/main/java/org/ajax4jsf/builder/mojo/Taglib.java
===================================================================
---
trunk/cdk/maven-cdk-plugin/src/main/java/org/ajax4jsf/builder/mojo/Taglib.java 2009-01-12
17:49:53 UTC (rev 12230)
+++
trunk/cdk/maven-cdk-plugin/src/main/java/org/ajax4jsf/builder/mojo/Taglib.java 2009-01-12
17:55:34 UTC (rev 12231)
@@ -21,7 +21,6 @@
package org.ajax4jsf.builder.mojo;
-import java.io.File;
/**
* @author shura
Added:
trunk/cdk/maven-cdk-plugin/src/main/resources/templates12/component-dependencies.vm
===================================================================
--- trunk/cdk/maven-cdk-plugin/src/main/resources/templates12/component-dependencies.vm
(rev 0)
+++
trunk/cdk/maven-cdk-plugin/src/main/resources/templates12/component-dependencies.vm 2009-01-12
17:55:34 UTC (rev 12231)
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<components>
+ <namespace>${taglib.uri}</namespace>
+${content}
+</components>