[richfaces-svn-commits] JBoss Rich Faces SVN: r12231 - in trunk/cdk: generator/src/main/resources/META-INF/templates12 and 3 other directories.

richfaces-svn-commits at lists.jboss.org richfaces-svn-commits at lists.jboss.org
Mon Jan 12 12:55:34 EST 2009


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 at exadel.com
- * created 17.04.2007
+ * @author Nick - mailto:nbelaevski at 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 at 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>




More information about the richfaces-svn-commits mailing list