[richfaces-svn-commits] JBoss Rich Faces SVN: r15903 - in root/cdk/trunk/plugins/generator/src: main/java/org/richfaces/builder/model and 11 other directories.

richfaces-svn-commits at lists.jboss.org richfaces-svn-commits at lists.jboss.org
Tue Nov 17 13:22:37 EST 2009


Author: nbelaevski
Date: 2009-11-17 13:22:36 -0500 (Tue, 17 Nov 2009)
New Revision: 15903

Added:
   root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/builder/model/MethodBodyStatementImpl.java
   root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/AbstractTemplateMethodBodyStatement.java
   root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/AbstractTemplateMethodBodyStatementsContainer.java
   root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/EncodeMethodPrefaceStatement.java
   root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/EndElementStatement.java
   root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/ForEachStatement.java
   root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/IfElseStatement.java
   root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/IfStatement.java
   root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/RenderingContext.java
   root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/StartElementStatement.java
   root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/WriteAttributeStatement.java
   root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/WriteTextStatement.java
   root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/model/CdkForEachElement.java
   root/cdk/trunk/plugins/generator/src/main/resources/META-INF/templates/java/
   root/cdk/trunk/plugins/generator/src/main/resources/META-INF/templates/java/class.ftl
   root/cdk/trunk/plugins/generator/src/main/resources/META-INF/templates/java/encode-method-preface.ftl
   root/cdk/trunk/plugins/generator/src/main/resources/META-INF/templates/java/end-element.ftl
   root/cdk/trunk/plugins/generator/src/main/resources/META-INF/templates/java/for-each.ftl
   root/cdk/trunk/plugins/generator/src/main/resources/META-INF/templates/java/if-else.ftl
   root/cdk/trunk/plugins/generator/src/main/resources/META-INF/templates/java/start-element.ftl
   root/cdk/trunk/plugins/generator/src/main/resources/META-INF/templates/java/write-attribute.ftl
   root/cdk/trunk/plugins/generator/src/main/resources/META-INF/templates/java/write-text.ftl
   root/cdk/trunk/plugins/generator/src/main/resources/META-INF/templates/method.ftl
   root/cdk/trunk/plugins/generator/src/main/resources/META-INF/templates/object.ftl
Removed:
   root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/builder/templates/
   root/cdk/trunk/plugins/generator/src/test/java/org/richfaces/builder/render/
   root/cdk/trunk/plugins/generator/src/test/java/org/richfaces/cdk/TemplateReaderTest.java
   root/cdk/trunk/plugins/generator/src/test/resources/org/richfaces/cdk/template-simple.xml
   root/cdk/trunk/plugins/generator/src/test/resources/org/richfaces/cdk/template.xml
Modified:
   root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/builder/model/JavaLanguageElement.java
   root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/builder/model/JavaMethod.java
   root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/builder/model/MethodBody.java
   root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/builder/model/MethodBodyStatement.java
   root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/builder/model/MethodBodyStatementsContainer.java
   root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/builder/render/JavaLanguageElementRenderer.java
   root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/builder/render/JavaMethodRenderer.java
   root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/model/ComponentLibrary.java
   root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/RendererClassGenerator.java
   root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/RendererClassVisitor.java
   root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/model/CdkBodyElement.java
   root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/model/CdkChooseElement.java
   root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/model/CompositeImplementation.java
   root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/model/ElementsHandler.java
   root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/model/ModelFragment.java
   root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/model/TemplateVisitor.java
   root/cdk/trunk/plugins/generator/src/main/resources/META-INF/schema/cdk-composite.xsd
   root/cdk/trunk/plugins/generator/src/main/resources/META-INF/schema/cdk-jstl-core.xsd
   root/cdk/trunk/plugins/generator/src/main/resources/META-INF/schema/cdk-template.xsd
   root/cdk/trunk/plugins/generator/src/main/resources/META-INF/schema/xhtml-el.xsd
   root/cdk/trunk/plugins/generator/src/main/resources/META-INF/templates/component.ftl
   root/cdk/trunk/plugins/generator/src/test/java/org/richfaces/cdk/templatecompiler/model/TemplateTest.java
Log:
https://jira.jboss.org/jira/browse/RF-7732

Modified: root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/builder/model/JavaLanguageElement.java
===================================================================
--- root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/builder/model/JavaLanguageElement.java	2009-11-17 18:10:31 UTC (rev 15902)
+++ root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/builder/model/JavaLanguageElement.java	2009-11-17 18:22:36 UTC (rev 15903)
@@ -27,6 +27,7 @@
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
+import java.util.TreeSet;
 
 /**
  *
@@ -34,7 +35,7 @@
  *
  */
 public class JavaLanguageElement {
-    private Set<JavaModifier> modifiers = new HashSet<JavaModifier>();
+    private Set<JavaModifier> modifiers = new TreeSet<JavaModifier>();
     private List<JavaComment> comments = new ArrayList<JavaComment>();
     private List<JavaAnnotation> annotations = new ArrayList<JavaAnnotation>();
     private String name;
@@ -83,4 +84,8 @@
     public void addAnnotation(Class<?> annotation) {
         annotations.add(new JavaAnnotation(annotation));
     }
+    
+	public void addComment(JavaComment comment) {
+		comments.add(comment);
+	}
 }

Modified: root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/builder/model/JavaMethod.java
===================================================================
--- root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/builder/model/JavaMethod.java	2009-11-17 18:10:31 UTC (rev 15902)
+++ root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/builder/model/JavaMethod.java	2009-11-17 18:22:36 UTC (rev 15903)
@@ -39,6 +39,7 @@
 
     public JavaMethod(String name) {
         super(name);
+        
         this.returnType = Void.TYPE;
     }
 

Modified: root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/builder/model/MethodBody.java
===================================================================
--- root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/builder/model/MethodBody.java	2009-11-17 18:10:31 UTC (rev 15902)
+++ root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/builder/model/MethodBody.java	2009-11-17 18:22:36 UTC (rev 15903)
@@ -23,18 +23,15 @@
 
 package org.richfaces.builder.model;
 
-import java.util.ArrayList;
 import java.util.HashSet;
-import java.util.List;
 import java.util.Set;
 
 /**
  * @author Maksim Kaszynski
- *
+ * @author Nick Belaevski
  */
-public class MethodBody implements MethodBodyStatementsContainer {
+public class MethodBody extends MethodBodyStatementsContainer {
     private Set<Class<?>> usedClasses = new HashSet<Class<?>>();
-    private List<MethodBodyStatement> body = new ArrayList<MethodBodyStatement>();
     private JavaMethod method;
 
     public MethodBody() {}
@@ -52,22 +49,6 @@
         this.method = method;
     }
 
-    public String toCode() {
-        StringBuilder builder = new StringBuilder();
-
-        for (MethodBodyStatement statement : body) {
-            statement.appendTo(builder);
-        }
-
-        return builder.toString();
-    }
-
-    public void addToBody(MethodBodyStatement... argStatements) {
-        for (MethodBodyStatement methodBodyStatement : argStatements) {
-            body.add(methodBodyStatement);
-        }
-    }
-
     public void addType(Class<?> clazz) {
         usedClasses.add(clazz);
     }
@@ -75,4 +56,5 @@
     public Set<Class<?>> getUsedClasses() {
         return usedClasses;
     }
+
 }

Modified: root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/builder/model/MethodBodyStatement.java
===================================================================
--- root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/builder/model/MethodBodyStatement.java	2009-11-17 18:10:31 UTC (rev 15902)
+++ root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/builder/model/MethodBodyStatement.java	2009-11-17 18:22:36 UTC (rev 15903)
@@ -1,77 +1,32 @@
-/**
- * License Agreement.
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2009, Red Hat, Inc. and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
  *
- * Rich Faces - Natural Ajax for Java Server Faces (JSF)
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
  *
- * 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,
+ * This software 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
+ * 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
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
  */
-
-
-
 package org.richfaces.builder.model;
 
-import java.util.ArrayList;
-import java.util.List;
-
 /**
  * @author Nick Belaevski
- *
+ * 
  */
-public class MethodBodyStatement implements MethodBodyStatementsContainer {
-    private String end = null;
-    private String start = null;
-    private List<MethodBodyStatement> statements = new ArrayList<MethodBodyStatement>();
+public interface MethodBodyStatement {
 
-    public MethodBodyStatement() {
-        this(null);
-    }
-
-    public MethodBodyStatement(String expression) {
-        this(expression, null);
-    }
-
-    public MethodBodyStatement(String start, String end) {
-        super();
-        this.start = start;
-        this.end = end;
-    }
-
-    /**
-     * @param builder
-     */
-    public void appendTo(StringBuilder builder) {
-        if (start != null) {
-            builder.append(start);
-            builder.append('\n');
-        }
-
-        for (MethodBodyStatement statement : statements) {
-            statement.appendTo(builder);
-            builder.append('\n');
-        }
-
-        if (end != null) {
-            builder.append(end);
-            builder.append('\n');
-        }
-    }
-
-    public void addToBody(MethodBodyStatement... argStatements) {
-        for (MethodBodyStatement methodBodyStatement : argStatements) {
-            statements.add(methodBodyStatement);
-        }
-    }
+	public String getCode();
+	
 }

Added: root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/builder/model/MethodBodyStatementImpl.java
===================================================================
--- root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/builder/model/MethodBodyStatementImpl.java	                        (rev 0)
+++ root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/builder/model/MethodBodyStatementImpl.java	2009-11-17 18:22:36 UTC (rev 15903)
@@ -0,0 +1,42 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2009, Red Hat, Inc. and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software 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 software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.richfaces.builder.model;
+
+/**
+ * @author Nick Belaevski
+ * 
+ */
+public class MethodBodyStatementImpl implements MethodBodyStatement {
+
+	private String code;
+	
+	public MethodBodyStatementImpl(String code) {
+		super();
+		this.code = code;
+	}
+
+	@Override
+	public String getCode() {
+		return code;
+	}
+
+}

Modified: root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/builder/model/MethodBodyStatementsContainer.java
===================================================================
--- root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/builder/model/MethodBodyStatementsContainer.java	2009-11-17 18:10:31 UTC (rev 15902)
+++ root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/builder/model/MethodBodyStatementsContainer.java	2009-11-17 18:22:36 UTC (rev 15903)
@@ -23,10 +23,53 @@
 
 package org.richfaces.builder.model;
 
+import java.util.ArrayList;
+import java.util.List;
+
+
 /**
  * @author Nick Belaevski
- *
+ * @since 4.0
  */
-public interface MethodBodyStatementsContainer {
-    public void addToBody(MethodBodyStatement... s);
+public class MethodBodyStatementsContainer implements MethodBodyStatement {
+
+    private List<MethodBodyStatement> statements = new ArrayList<MethodBodyStatement>();
+
+	public List<MethodBodyStatement> getStatements() {
+		return statements;
+	}
+    
+	public void addStatement(MethodBodyStatement statement) {
+    	statements.add(statement);
+	}
+
+	public void addStatement(int index, MethodBodyStatement statement) {
+    	statements.add(index, statement);
+	}
+
+	public void addStatement(String statementCode) {
+    	addStatement(new MethodBodyStatementImpl(statementCode));
+	}
+
+	public void addStatement(int index, String statementCode) {
+    	addStatement(index, new MethodBodyStatementImpl(statementCode));
+	}
+	
+	public boolean isEmpty() {
+		return statements.isEmpty();
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.richfaces.builder.model.MethodBodyStatement#getCode()
+	 */
+	@Override
+	public String getCode() {
+		StringBuilder sb = new StringBuilder();
+		for (MethodBodyStatement statement: statements) {
+			sb.append(statement.getCode());
+			sb.append('\n');
+		}
+		
+		return sb.toString();
+	}
 }

Modified: root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/builder/render/JavaLanguageElementRenderer.java
===================================================================
--- root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/builder/render/JavaLanguageElementRenderer.java	2009-11-17 18:10:31 UTC (rev 15902)
+++ root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/builder/render/JavaLanguageElementRenderer.java	2009-11-17 18:22:36 UTC (rev 15903)
@@ -25,6 +25,7 @@
 
 import java.io.PrintWriter;
 
+import java.util.Collection;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Set;
@@ -46,7 +47,7 @@
     }
 
     public void renderModifiers(T element, PrintWriter out) {
-        Set<JavaModifier> modifiers = element.getModifiers();
+        Collection<JavaModifier> modifiers = element.getModifiers();
 
         for (JavaModifier javaModifier : modifiers) {
             out.print(javaModifier);

Modified: root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/builder/render/JavaMethodRenderer.java
===================================================================
--- root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/builder/render/JavaMethodRenderer.java	2009-11-17 18:10:31 UTC (rev 15902)
+++ root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/builder/render/JavaMethodRenderer.java	2009-11-17 18:22:36 UTC (rev 15903)
@@ -24,13 +24,13 @@
 package org.richfaces.builder.render;
 
 import java.io.PrintWriter;
-
 import java.util.Iterator;
 import java.util.List;
 
 import org.richfaces.builder.model.Argument;
 import org.richfaces.builder.model.JavaMethod;
 import org.richfaces.builder.model.MethodBody;
+import org.richfaces.builder.model.MethodBodyStatement;
 
 /**
  * @author Maksim Kaszynski
@@ -91,7 +91,10 @@
         MethodBody methodBody = javaMethod.getMethodBody();
 
         if (methodBody != null) {
-            out.println(methodBody.toCode());
+        	List<MethodBodyStatement> statements = methodBody.getStatements();
+        	for (MethodBodyStatement methodBodyStatement : statements) {
+				out.println(methodBodyStatement.toString());
+			}
         }
 
         out.println("}");

Modified: root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/model/ComponentLibrary.java
===================================================================
--- root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/model/ComponentLibrary.java	2009-11-17 18:10:31 UTC (rev 15902)
+++ root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/model/ComponentLibrary.java	2009-11-17 18:22:36 UTC (rev 15903)
@@ -327,7 +327,13 @@
 
     static <K extends Key, T extends ModelElement<T, K>> void merge(Collection<T> target, Collection<T> source) {
         for (T element : source) {
-            T targetElement = find(target, element.getKey());
+            T targetElement = null;
+            
+            try {
+                find(target, element.getKey());
+            } catch (NoSuchElementException e) {
+				// TODO: handle exception
+			}
 
             if (null == targetElement) {
                 target.add(element);

Added: root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/AbstractTemplateMethodBodyStatement.java
===================================================================
--- root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/AbstractTemplateMethodBodyStatement.java	                        (rev 0)
+++ root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/AbstractTemplateMethodBodyStatement.java	2009-11-17 18:22:36 UTC (rev 15903)
@@ -0,0 +1,44 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2009, Red Hat, Inc. and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software 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 software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.richfaces.cdk.templatecompiler;
+
+import org.richfaces.builder.model.MethodBodyStatement;
+
+/**
+ * @author Nick Belaevski
+ * 
+ */
+public class AbstractTemplateMethodBodyStatement implements MethodBodyStatement {
+
+	private String templateName;
+	
+	protected AbstractTemplateMethodBodyStatement(String templateName) {
+		super();
+		this.templateName = templateName;
+	}
+
+	@Override
+	public String getCode() {
+		return RenderingContext.renderSnippet(templateName, this);
+	}
+
+}

Added: root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/AbstractTemplateMethodBodyStatementsContainer.java
===================================================================
--- root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/AbstractTemplateMethodBodyStatementsContainer.java	                        (rev 0)
+++ root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/AbstractTemplateMethodBodyStatementsContainer.java	2009-11-17 18:22:36 UTC (rev 15903)
@@ -0,0 +1,44 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2009, Red Hat, Inc. and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software 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 software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.richfaces.cdk.templatecompiler;
+
+import org.richfaces.builder.model.MethodBodyStatementsContainer;
+
+/**
+ * @author Nick Belaevski
+ * 
+ */
+public class AbstractTemplateMethodBodyStatementsContainer extends MethodBodyStatementsContainer {
+
+	private String templateName;
+	
+	protected AbstractTemplateMethodBodyStatementsContainer(String templateName) {
+		super();
+		this.templateName = templateName;
+	}
+
+	@Override
+	public String getCode() {
+		return RenderingContext.renderSnippet(templateName, this);
+	}
+
+}

Added: root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/EncodeMethodPrefaceStatement.java
===================================================================
--- root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/EncodeMethodPrefaceStatement.java	                        (rev 0)
+++ root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/EncodeMethodPrefaceStatement.java	2009-11-17 18:22:36 UTC (rev 15903)
@@ -0,0 +1,38 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2009, Red Hat, Inc. and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software 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 software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.richfaces.cdk.templatecompiler;
+
+
+/**
+ * @author Nick Belaevski
+ * 
+ */
+public class EncodeMethodPrefaceStatement extends AbstractTemplateMethodBodyStatement {
+
+	/**
+	 * @param templateName
+	 */
+	public EncodeMethodPrefaceStatement() {
+		super("encode-method-preface");
+	}
+
+}

Added: root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/EndElementStatement.java
===================================================================
--- root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/EndElementStatement.java	                        (rev 0)
+++ root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/EndElementStatement.java	2009-11-17 18:22:36 UTC (rev 15903)
@@ -0,0 +1,34 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2009, Red Hat, Inc. and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software 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 software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.richfaces.cdk.templatecompiler;
+
+/**
+ * @author Nick Belaevski
+ * @since 4.0
+ */
+public class EndElementStatement extends StartElementStatement {
+
+	public EndElementStatement(String elementName) {
+		super("end-element", elementName);
+	}
+
+}

Added: root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/ForEachStatement.java
===================================================================
--- root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/ForEachStatement.java	                        (rev 0)
+++ root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/ForEachStatement.java	2009-11-17 18:22:36 UTC (rev 15903)
@@ -0,0 +1,65 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2009, Red Hat, Inc. and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software 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 software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.richfaces.cdk.templatecompiler;
+
+/**
+ * @author Nick Belaevski
+ * 
+ */
+public class ForEachStatement extends AbstractTemplateMethodBodyStatementsContainer {
+
+	private String itemsExpression;
+	
+	private String var;
+	
+	private String varType;
+	
+	public ForEachStatement(String itemsExpression,
+			String var, String varType) {
+		super("for-each");
+		this.itemsExpression = itemsExpression;
+		this.var = var;
+		this.varType = varType;
+	}
+
+	/**
+	 * @return the itemsExpression
+	 */
+	public String getItemsExpression() {
+		return itemsExpression;
+	}
+	
+	/**
+	 * @return the var
+	 */
+	public String getVar() {
+		return var;
+	}
+	
+	/**
+	 * @return the varType
+	 */
+	public String getVarType() {
+		return varType;
+	}
+
+}

Added: root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/IfElseStatement.java
===================================================================
--- root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/IfElseStatement.java	                        (rev 0)
+++ root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/IfElseStatement.java	2009-11-17 18:22:36 UTC (rev 15903)
@@ -0,0 +1,35 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2009, Red Hat, Inc. and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software 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 software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.richfaces.cdk.templatecompiler;
+
+
+/**
+ * @author Nick Belaevski
+ * @since 4.0
+ */
+public class IfElseStatement extends AbstractTemplateMethodBodyStatementsContainer {
+
+	public IfElseStatement() {
+		super("if-else");
+	}
+
+}

Added: root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/IfStatement.java
===================================================================
--- root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/IfStatement.java	                        (rev 0)
+++ root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/IfStatement.java	2009-11-17 18:22:36 UTC (rev 15903)
@@ -0,0 +1,38 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2009, Red Hat, Inc. and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software 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 software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.richfaces.cdk.templatecompiler;
+
+import org.richfaces.builder.model.MethodBodyStatementsContainer;
+
+public final class IfStatement extends MethodBodyStatementsContainer {
+	
+	private String test;
+
+	public IfStatement(String test) {
+		super();
+		this.test = test;
+	}
+
+	public String getTest() {
+		return test;
+	}
+}
\ No newline at end of file

Modified: root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/RendererClassGenerator.java
===================================================================
--- root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/RendererClassGenerator.java	2009-11-17 18:10:31 UTC (rev 15902)
+++ root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/RendererClassGenerator.java	2009-11-17 18:22:36 UTC (rev 15903)
@@ -24,20 +24,22 @@
 package org.richfaces.cdk.templatecompiler;
 
 import java.io.File;
-import java.io.FileNotFoundException;
+import java.io.IOException;
 import java.io.PrintWriter;
 
 import org.richfaces.builder.model.JavaClass;
-import org.richfaces.builder.render.JavaClassRenderer;
 import org.richfaces.cdk.CdkContext;
 import org.richfaces.cdk.CdkException;
 import org.richfaces.cdk.CdkWriter;
 import org.richfaces.cdk.StandardOutputs;
+import org.richfaces.cdk.freemarker.CdkConfiguration;
 import org.richfaces.cdk.model.ComponentLibrary;
+import org.richfaces.cdk.model.RenderKit;
 import org.richfaces.cdk.model.Renderer;
-import org.richfaces.cdk.model.RenderKit;
 import org.richfaces.cdk.templatecompiler.model.Template;
 
+import freemarker.template.TemplateException;
+
 /**
  * <p class="changed_added_4_0">
  * </p>
@@ -74,7 +76,9 @@
                     // TODO - put real parameters.
                     RendererClassVisitor visitor = new RendererClassVisitor(
                             template.getInterface());
+                    visitor.preProcess();
                     template.getImplementation().visit(visitor);
+                    visitor.postProcess();
                     JavaClass javaClass = visitor.getRendererClass();
                     String fullName = javaClass.getFullName();
                     File outFile = context.createOutputFile(
@@ -83,11 +87,22 @@
                                     + ".java", library.lastModified());
 
                     if (null != outFile) {
+                        PrintWriter outputWriter = null;;
                         try {
-                            new JavaClassRenderer().render(javaClass,
-                                    new PrintWriter(outFile));
-                        } catch (FileNotFoundException e) {
+                        	outputWriter = new PrintWriter(outFile);
+                        	
+                        	CdkConfiguration cdkConfiguration = new CdkConfiguration(context);
+                        	RenderingContext.setCdkConfiguration(cdkConfiguration);
+                        	RenderingContext.writeSnippet("class", javaClass, outputWriter);
+                        } catch (IOException e) {
                             throw new CdkException(e);
+                        } catch (TemplateException e) {
+                            throw new CdkException(e);
+						} finally {
+                        	RenderingContext.setCdkConfiguration(null);
+                        	if (outputWriter != null) {
+                            	outputWriter.close();
+                        	}
                         }
                     }
 

Modified: root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/RendererClassVisitor.java
===================================================================
--- root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/RendererClassVisitor.java	2009-11-17 18:10:31 UTC (rev 15902)
+++ root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/RendererClassVisitor.java	2009-11-17 18:22:36 UTC (rev 15903)
@@ -26,18 +26,32 @@
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.ObjectInputStream;
+import java.util.HashSet;
 import java.util.LinkedList;
+import java.util.Locale;
 import java.util.Map;
 import java.util.Set;
 import java.util.regex.Pattern;
 
+import javax.faces.component.UIComponent;
+import javax.faces.context.FacesContext;
+import javax.faces.context.ResponseWriter;
+import javax.faces.render.Renderer;
+import javax.xml.namespace.QName;
+
+import org.richfaces.builder.model.Argument;
 import org.richfaces.builder.model.JavaClass;
-import org.richfaces.builder.model.MethodBodyStatement;
+import org.richfaces.builder.model.JavaMethod;
+import org.richfaces.builder.model.JavaModifier;
+import org.richfaces.builder.model.JavaPackage;
+import org.richfaces.builder.model.MethodBody;
+import org.richfaces.builder.model.MethodBodyStatementsContainer;
 import org.richfaces.cdk.CdkException;
 import org.richfaces.cdk.templatecompiler.model.AnyElement;
 import org.richfaces.cdk.templatecompiler.model.CdkBodyElement;
 import org.richfaces.cdk.templatecompiler.model.CdkCallElement;
 import org.richfaces.cdk.templatecompiler.model.CdkChooseElement;
+import org.richfaces.cdk.templatecompiler.model.CdkForEachElement;
 import org.richfaces.cdk.templatecompiler.model.CdkIfElement;
 import org.richfaces.cdk.templatecompiler.model.CdkObjectElement;
 import org.richfaces.cdk.templatecompiler.model.CdkOtherwiseElement;
@@ -54,15 +68,34 @@
  */
 public class RendererClassVisitor implements TemplateVisitor {
 
+	/**
+	 * 
+	 */
+	static final String RESPONSE_WRITER_VARIABLE = "responseWriter";
+	/**
+	 * 
+	 */
+	static final String COMPONENT_VARIABLE = "cc";
+	/**
+	 * 
+	 */
+	static final String FACES_CONTEXT_VARIABLE = "facesContext";
+	private static final Set<String> DEFAULT_NAMESPACES = new HashSet<String>();
+	
+	static {
+		DEFAULT_NAMESPACES.add("http://richfaces.org/xhtml-el");
+		DEFAULT_NAMESPACES.add("http://www.w3.org/1999/xhtml");
+	}
+	
     private static final Pattern EL_EXPRESSION = Pattern.compile("#\\{([^\\}]+)\\}");
     private static final Pattern COMPONENT_ATTRIBUTES_EXPRESSION =
         Pattern.compile("^component\\.attributes\\[(?:'|\")?([^'\"]+)(?:'|\")?\\]$");
     private static final Map<String, Set<String>> ELEMENTS_ATTRIBUTES;
-    private final LinkedList<MethodBodyStatement> statements = Lists.newLinkedList();
-    private final JavaClass rendererClass;
-    private final CompositeInterface compositeInterface;
+    private JavaClass rendererClass;
+    private CompositeInterface compositeInterface;
 
-    protected MethodBodyStatement currentStatement;
+    protected MethodBodyStatementsContainer currentStatement;
+    private final LinkedList<MethodBodyStatementsContainer> statements = Lists.newLinkedList();
 
     static {
         InputStream serializedAttributesStream = RendererClassVisitor.class.getResourceAsStream("/META-INF/schema/attributes.ser");
@@ -73,7 +106,9 @@
             // TODO detect URI attributes
             ObjectInputStream ois = new ObjectInputStream(serializedAttributesStream);
 
-            ELEMENTS_ATTRIBUTES = (Map<String, Set<String>>) ois.readObject();
+            @SuppressWarnings("unchecked")
+            Map<String, Set<String>> attributes = (Map<String, Set<String>>) ois.readObject();
+            ELEMENTS_ATTRIBUTES = attributes;
         } catch (Exception e) {
             throw new IllegalStateException(e.getMessage(), e);
         } finally {
@@ -84,11 +119,148 @@
             }
         }
     }
+   
+    private String compileEl(String expression, Class<?> type) {
+    	if (Boolean.class.isAssignableFrom(type)) {
+    		//TODO just a stub!
+			return "false /* " + expression.trim() + " */";
+    	}
+    	
+    	return quote(expression) + " /* " + expression.trim() + " */";
+    }
     
+	private String getElExpressionContainerType(String value) {
+		// TODO Auto-generated method stub
+		return Object.class.getName();
+	}
+
+	private String getElExpressionType(String value) {
+		// TODO Auto-generated method stub
+		return String.class.getName();
+	}
+    
+	private String toCharExpression(char c) {
+		String prependingZeroesString;
+		String hexString = Integer.toHexString(c);
+		
+		switch (hexString.length()) {
+		case 1:
+			prependingZeroesString = "000";
+			break;
+		case 2:
+			prependingZeroesString = "00";
+			break;
+		case 3:
+			prependingZeroesString = "0";
+			break;
+		case 4: 
+			prependingZeroesString = "";
+			break;
+		default:
+			throw new IllegalArgumentException();
+		}
+		
+		return "\\u" + prependingZeroesString + hexString.toUpperCase(Locale.US);
+	}
+	
+    private String quote(String s) {
+        StringBuilder result = new StringBuilder();
+
+        result.append('\"');
+
+        char[] chars = s.toCharArray();
+
+        for (char c : chars) {
+        	if (c == '\n') {
+                result.append("\\n");
+        	} else if (c == '\r') {
+                result.append("\\r");
+        	} else if (c == '\t') {
+                result.append("\\t");
+        	} else if (c == '\f') {
+                   result.append("\\f");
+        	} else if (c == '\b') {
+                    result.append("\\b");
+        	} else if (c == '\\') {
+                    result.append("\\\\");
+        	} else if (c == '"') {
+                    result.append("\\\"");
+        	} else {
+                if (c < 0x20 || c > 0x7F) {
+                    result.append(toCharExpression(c));
+                } else {
+                	result.append(c);
+                }
+        	}
+        }
+
+        result.append('\"');
+
+        return result.toString();
+    }
+    
+    private boolean isDefaultNamespace(String namespaceURI) {
+    	//TODO - another namespaces
+    	if (namespaceURI == null || namespaceURI.length() == 0) {
+    		return true;
+    	}
+    	
+    	if (DEFAULT_NAMESPACES.contains(namespaceURI)) {
+    		return true;
+    	}
+    	
+    	return false;
+    }
+    
+    private void flushToEncodeMethod(String encodeMethodName) {
+    	if (!this.currentStatement.isEmpty()) {
+        	Argument facesContextArgument = new Argument(FACES_CONTEXT_VARIABLE, FacesContext.class);
+        	Argument componentArgument = new Argument(COMPONENT_VARIABLE, UIComponent.class);
+        	
+        	JavaMethod javaMethod = new JavaMethod(encodeMethodName, facesContextArgument, componentArgument);
+        	javaMethod.addModifier(JavaModifier.PUBLIC);
+        	javaMethod.addAnnotation(Override.class);
+        	javaMethod.getExceptions().add(IOException.class);
+        	
+        	MethodBody methodBody = (MethodBody) currentStatement;
+        	javaMethod.setMethodBody(methodBody);
+        	
+        	methodBody.addStatement(0, new EncodeMethodPrefaceStatement());
+        	rendererClass.addMethod(javaMethod);
+    	}
+    	
+    	this.currentStatement = new MethodBody();
+    }
+    
+    private JavaClass createJavaClassByName(String fullName) {
+        String simpleName = null;
+        String packageName = "";
+        int lastDotIdx = fullName.lastIndexOf('.');
+
+        if (lastDotIdx != -1) {
+            simpleName = fullName.substring(lastDotIdx + 1);
+            packageName = fullName.substring(0, lastDotIdx);
+        } else {
+            simpleName = fullName;
+        }
+
+        return new JavaClass(simpleName, new JavaPackage(packageName));
+    }
+    
+    private void pushStatement(MethodBodyStatementsContainer container) {
+    	currentStatement.addStatement(container);
+    	statements.push(currentStatement);
+    	currentStatement = container;
+    }
+    
+    private void popStatement() {
+    	currentStatement = statements.pop();
+    }
+
     public RendererClassVisitor(CompositeInterface compositeInterface) {
         this.compositeInterface = compositeInterface;
-        rendererClass = new JavaClass();
-        }
+    }
+    
     /**
      * <p class="changed_added_4_0"></p>
      * @return the rendererClass
@@ -96,13 +268,13 @@
     public JavaClass getRendererClass() {
         return this.rendererClass;
     }
+    
     /* (non-Javadoc)
-     * @see org.richfaces.cdk.templatecompiler.model.TemplateVisitor#endElement(org.richfaces.cdk.templatecompiler.model.AnyElement)
+     * @see org.richfaces.cdk.templatecompiler.model.TemplateVisitor#startElement(org.richfaces.cdk.templatecompiler.model.CdkBodyElement)
      */
     @Override
-    public void endElement(AnyElement anyElement) throws CdkException {
-        // TODO Auto-generated method stub
-
+    public void startElement(CdkBodyElement cdkBodyElement) throws CdkException {
+    	flushToEncodeMethod("encodeBegin");
     }
 
     /* (non-Javadoc)
@@ -110,8 +282,7 @@
      */
     @Override
     public void endElement(CdkBodyElement cdkBodyElement) throws CdkException {
-        // TODO Auto-generated method stub
-
+    	flushToEncodeMethod("encodeChildren");
     }
 
     /* (non-Javadoc)
@@ -119,17 +290,51 @@
      */
     @Override
     public void startElement(AnyElement anyElement) throws CdkException {
-        // TODO Auto-generated method stub
+        QName elementName = anyElement.getName();
+        Map<QName, Object> elementAttributes = anyElement.getAttributes();
+        
+        if (!isDefaultNamespace(elementName.getNamespaceURI())) {
+        	//TODO: add support
+        }
+        
+        currentStatement.addStatement(new StartElementStatement(elementName.getLocalPart()));
+        
+        if (elementAttributes != null) {
+            for (Map.Entry<QName, Object> attribute : elementAttributes.entrySet()) {
+            	QName attributeName = attribute.getKey();
+            	Object attributeValue = attribute.getValue();
+            	
+            	if (!isDefaultNamespace(attributeName.getNamespaceURI())) {
+                	//TODO: add support
+                	//TODO: cdk:passThrough
+                }
+                
+            	currentStatement.addStatement(new WriteAttributeStatement(attributeName.getLocalPart(), 
+            		compileEl(attributeValue.toString(), String.class)));
+    		}
+        }
+        
+    	// TODO Auto-generated method stub
 
     }
 
     /* (non-Javadoc)
-     * @see org.richfaces.cdk.templatecompiler.model.TemplateVisitor#startElement(org.richfaces.cdk.templatecompiler.model.CdkBodyElement)
+     * @see org.richfaces.cdk.templatecompiler.model.TemplateVisitor#endElement(org.richfaces.cdk.templatecompiler.model.AnyElement)
      */
     @Override
-    public void startElement(CdkBodyElement cdkBodyElement) throws CdkException {
-        // TODO Auto-generated method stub
+    public void endElement(AnyElement anyElement) throws CdkException {
+    	QName elementName = anyElement.getName();
+        currentStatement.addStatement(new EndElementStatement(elementName.getLocalPart()));
+    }
 
+    /* (non-Javadoc)
+     * @see org.richfaces.cdk.templatecompiler.model.TemplateVisitor#visitElement(java.lang.String)
+     */
+    @Override
+    public void visitElement(String child) throws CdkException {
+    	if (child != null && child.length() != 0) {
+        	currentStatement.addStatement(new WriteTextStatement(compileEl(child, String.class)));
+    	}
     }
 
     /* (non-Javadoc)
@@ -137,89 +342,145 @@
      */
     @Override
     public void visitElement(CdkCallElement cdkCallElement) throws CdkException {
-        // TODO Auto-generated method stub
-
+    	currentStatement.addStatement(cdkCallElement.getExpression() + ";");
     }
 
     /* (non-Javadoc)
-     * @see org.richfaces.cdk.templatecompiler.model.TemplateVisitor#visitElement(java.lang.String)
-     */
-    @Override
-    public void visitElement(String child) throws CdkException {
-        // TODO Auto-generated method stub
+	 * @see org.richfaces.cdk.templatecompiler.model.TemplateVisitor#startElement(org.richfaces.cdk.templatecompiler.model.CdkIfElement)
+	 */
+	@Override
+	public void startElement(CdkIfElement cdkIfElement) {
+		String compiledTestExpression = compileEl(cdkIfElement.getTest(), Boolean.class);
+		
+		pushStatement(new IfElseStatement());
+    	pushStatement(new IfStatement(compiledTestExpression));
+	}
 
-    }
 	/* (non-Javadoc)
 	 * @see org.richfaces.cdk.templatecompiler.model.TemplateVisitor#endElement(org.richfaces.cdk.templatecompiler.model.CdkIfElement)
 	 */
 	@Override
 	public void endElement(CdkIfElement cdkIfElement) {
-		// TODO Auto-generated method stub
-		
+		popStatement();
+		popStatement();
 	}
+	
 	/* (non-Javadoc)
-	 * @see org.richfaces.cdk.templatecompiler.model.TemplateVisitor#startElement(org.richfaces.cdk.templatecompiler.model.CdkIfElement)
+	 * @see org.richfaces.cdk.templatecompiler.model.TemplateVisitor#startElement(org.richfaces.cdk.templatecompiler.model.CdkChooseElement)
 	 */
 	@Override
-	public void startElement(CdkIfElement cdkIfElement) {
-		// TODO Auto-generated method stub
+	public void startElement(CdkChooseElement cdkChooseElement) {
+    	pushStatement(new IfElseStatement());
+	}
+
+	/* (non-Javadoc)
+	 * @see org.richfaces.cdk.templatecompiler.model.TemplateVisitor#endElement(org.richfaces.cdk.templatecompiler.model.CdkChooseElement)
+	 */
+	@Override
+	public void endElement(CdkChooseElement cdkChooseElement) {
+		popStatement();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.richfaces.cdk.templatecompiler.model.TemplateVisitor#startElement(org.richfaces.cdk.templatecompiler.model.CdkWhenElement)
+	 */
+	@Override
+	public void startElement(CdkWhenElement cdkWhenElement) {
+		String compiledTestExpression = compileEl(cdkWhenElement.getTest(), Boolean.class);
 		
+		pushStatement(new IfStatement(compiledTestExpression));
 	}
+
 	/* (non-Javadoc)
 	 * @see org.richfaces.cdk.templatecompiler.model.TemplateVisitor#endElement(org.richfaces.cdk.templatecompiler.model.CdkWhenElement)
 	 */
 	@Override
 	public void endElement(CdkWhenElement cdkWhenElement) {
-		// TODO Auto-generated method stub
-		
+		popStatement();
 	}
+
 	/* (non-Javadoc)
-	 * @see org.richfaces.cdk.templatecompiler.model.TemplateVisitor#endElement(org.richfaces.cdk.templatecompiler.model.CdkChooseElement)
+	 * @see org.richfaces.cdk.templatecompiler.model.TemplateVisitor#startElement(org.richfaces.cdk.templatecompiler.model.CdkOtherwiseElement)
 	 */
 	@Override
-	public void endElement(CdkChooseElement cdkChooseElement) {
-		// TODO Auto-generated method stub
-		
+	public void startElement(CdkOtherwiseElement cdkOtherwiseElement) {
+		pushStatement(new IfStatement(""));
 	}
+	
 	/* (non-Javadoc)
 	 * @see org.richfaces.cdk.templatecompiler.model.TemplateVisitor#endElement(org.richfaces.cdk.templatecompiler.model.CdkOtherwiseElement)
 	 */
 	@Override
 	public void endElement(CdkOtherwiseElement cdkOtherwiseElement) {
-		// TODO Auto-generated method stub
-		
+		popStatement();
 	}
+
 	/* (non-Javadoc)
-	 * @see org.richfaces.cdk.templatecompiler.model.TemplateVisitor#startElement(org.richfaces.cdk.templatecompiler.model.CdkWhenElement)
+	 * @see org.richfaces.cdk.templatecompiler.model.TemplateVisitor#visitElement(org.richfaces.cdk.templatecompiler.model.CdkObjectElement)
 	 */
 	@Override
-	public void startElement(CdkWhenElement cdkWhenElement) {
-		// TODO Auto-generated method stub
+	public void visitElement(CdkObjectElement cdkObjectElement) {
+		String name = cdkObjectElement.getName();
 		
+		String value = cdkObjectElement.getValue();
+		if (value == null || value.length() == 0) {
+			value = cdkObjectElement.getBodyValue();
+		}
+		
+		String type = cdkObjectElement.getType();
+
+		if (value != null && value.length() != 0) {
+			if (type == null || type.length() == 0) {
+				type = getElExpressionType(value);
+			}
+
+			value = compileEl(value, Object.class);
+			currentStatement.addStatement(type + " " + name + " = " + value + ";");
+		} else {
+			currentStatement.addStatement(type + " " + name + ";");
+		}
 	}
+
 	/* (non-Javadoc)
-	 * @see org.richfaces.cdk.templatecompiler.model.TemplateVisitor#startElement(org.richfaces.cdk.templatecompiler.model.CdkChooseElement)
+	 * @see org.richfaces.cdk.templatecompiler.model.TemplateVisitor#startElement(org.richfaces.cdk.templatecompiler.model.CdkForEachElement)
 	 */
 	@Override
-	public void startElement(CdkChooseElement cdkChooseElement) {
-		// TODO Auto-generated method stub
-		
+	public void startElement(CdkForEachElement cdkForEachElement) {
+		String items = cdkForEachElement.getItems();
+		String itemsExpression = compileEl(items, Iterable.class);
+		pushStatement(new ForEachStatement(itemsExpression, cdkForEachElement.getVar(), 
+			getElExpressionContainerType(items)));
 	}
+
 	/* (non-Javadoc)
-	 * @see org.richfaces.cdk.templatecompiler.model.TemplateVisitor#startElement(org.richfaces.cdk.templatecompiler.model.CdkOtherwiseElement)
+	 * @see org.richfaces.cdk.templatecompiler.model.TemplateVisitor#endElement(org.richfaces.cdk.templatecompiler.model.CdkForEachElement)
 	 */
 	@Override
-	public void startElement(CdkOtherwiseElement cdkOtherwiseElement) {
-		// TODO Auto-generated method stub
-		
+	public void endElement(CdkForEachElement cdkForEachElement) {
+		popStatement();
 	}
-	/* (non-Javadoc)
-	 * @see org.richfaces.cdk.templatecompiler.model.TemplateVisitor#visitElement(org.richfaces.cdk.templatecompiler.model.CdkObjectElement)
+
+	/**
+	 * 
 	 */
-	@Override
-	public void visitElement(CdkObjectElement cdkObjectElement) {
-		// TODO Auto-generated method stub
-		
+	public void preProcess() {
+        this.rendererClass = createJavaClassByName(compositeInterface.getJavaClass());
+    	this.rendererClass.addModifier(JavaModifier.PUBLIC);
+        this.rendererClass.setSuperClass(createJavaClassByName(compositeInterface.getBaseClass()));
+
+        this.rendererClass.addImport(FacesContext.class);
+        this.rendererClass.addImport(Renderer.class);
+    	this.rendererClass.addImport(ResponseWriter.class);
+        this.rendererClass.addImport(UIComponent.class);
+        
+        this.currentStatement = new MethodBody();
 	}
 
+	/**
+	 * 
+	 */
+	public void postProcess() {
+		flushToEncodeMethod("encodeEnd");
+	}
+
 }

Added: root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/RenderingContext.java
===================================================================
--- root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/RenderingContext.java	                        (rev 0)
+++ root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/RenderingContext.java	2009-11-17 18:22:36 UTC (rev 15903)
@@ -0,0 +1,80 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2009, Red Hat, Inc. and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software 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 software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.richfaces.cdk.templatecompiler;
+
+import java.io.IOException;
+import java.io.StringWriter;
+import java.io.Writer;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.richfaces.cdk.freemarker.CdkConfiguration;
+
+import freemarker.template.Template;
+import freemarker.template.TemplateException;
+
+/**
+ * @author Nick Belaevski
+ * @since 4.0
+ */
+class RenderingContext {
+
+	private static ThreadLocal<CdkConfiguration> cdkConfigurationHolder = new ThreadLocal<CdkConfiguration>();
+
+	static void setCdkConfiguration(CdkConfiguration cdkConfiguration) {
+		cdkConfigurationHolder.set(cdkConfiguration);
+	}
+
+	static void writeSnippet(String templateName, Object object, Writer writer) throws IOException, TemplateException {
+		Template t = cdkConfigurationHolder.get().getTemplate("java/" + templateName + ".ftl");
+		Map<String, Object> rootMap = new HashMap<String, Object>();
+		rootMap.put("modelItem", object);
+
+		rootMap.put("facesContextVariable", RendererClassVisitor.FACES_CONTEXT_VARIABLE);
+		rootMap.put("componentVariable", RendererClassVisitor.COMPONENT_VARIABLE);
+		rootMap.put("responseWriterVariable", RendererClassVisitor.RESPONSE_WRITER_VARIABLE);
+						
+		t.process(rootMap, writer);
+	}
+	
+	static String renderSnippet(String templateName, Object object) {
+		StringWriter writer = new StringWriter();
+		try {
+			writeSnippet(templateName, object, writer);
+			
+			return writer.toString();
+		} catch (IOException e) {
+			// TODO: handle exception
+			return e.getMessage();
+		} catch (TemplateException e) {
+			// TODO: handle exception
+			return e.getMessage();
+		} finally {
+			try {
+				writer.close();
+			} catch (IOException e) {
+				//do nothing
+			}
+		}
+	}
+
+}

Added: root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/StartElementStatement.java
===================================================================
--- root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/StartElementStatement.java	                        (rev 0)
+++ root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/StartElementStatement.java	2009-11-17 18:22:36 UTC (rev 15903)
@@ -0,0 +1,49 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2009, Red Hat, Inc. and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software 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 software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.richfaces.cdk.templatecompiler;
+
+
+/**
+ * @author Nick Belaevski
+ * @since 4.0
+ */
+public class StartElementStatement extends AbstractTemplateMethodBodyStatement {
+
+	private String elementName;
+	
+	public StartElementStatement(String elementName) {
+		this("start-element", elementName);
+	}
+
+	protected StartElementStatement(String templateName, String elementName) {
+		super(templateName);
+		this.elementName = elementName;
+	}
+
+	/**
+	 * @return the elementName
+	 */
+	public String getElementName() {
+		return elementName;
+	}
+
+}

Added: root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/WriteAttributeStatement.java
===================================================================
--- root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/WriteAttributeStatement.java	                        (rev 0)
+++ root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/WriteAttributeStatement.java	2009-11-17 18:22:36 UTC (rev 15903)
@@ -0,0 +1,49 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2009, Red Hat, Inc. and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software 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 software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.richfaces.cdk.templatecompiler;
+
+
+/**
+ * @author Nick Belaevski
+ * 
+ */
+public class WriteAttributeStatement extends AbstractTemplateMethodBodyStatement {
+
+	private String attributeName;
+	
+	private String valueExpression;
+
+	public WriteAttributeStatement(String attributeName, String valueExpression) {
+		super("write-attribute");
+		this.attributeName = attributeName;
+		this.valueExpression = valueExpression;
+	}
+	
+	public String getAttributeName() {
+		return attributeName;
+	}
+	
+	public String getValueExpression() {
+		return valueExpression;
+	}
+	
+}

Added: root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/WriteTextStatement.java
===================================================================
--- root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/WriteTextStatement.java	                        (rev 0)
+++ root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/WriteTextStatement.java	2009-11-17 18:22:36 UTC (rev 15903)
@@ -0,0 +1,42 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2009, Red Hat, Inc. and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software 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 software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.richfaces.cdk.templatecompiler;
+
+
+/**
+ * @author Nick Belaevski
+ * 
+ */
+public class WriteTextStatement extends AbstractTemplateMethodBodyStatement {
+
+	private String textExpression;
+
+	public WriteTextStatement(String textExpression) {
+		super("write-text");
+		this.textExpression = textExpression;
+	}
+	
+	public String getTextExpression() {
+		return textExpression;
+	}
+
+}

Modified: root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/model/CdkBodyElement.java
===================================================================
--- root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/model/CdkBodyElement.java	2009-11-17 18:10:31 UTC (rev 15902)
+++ root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/model/CdkBodyElement.java	2009-11-17 18:22:36 UTC (rev 15903)
@@ -23,6 +23,8 @@
 
 package org.richfaces.cdk.templatecompiler.model;
 
+import javax.xml.bind.annotation.XmlRootElement;
+
 import org.richfaces.cdk.CdkException;
 
 /**
@@ -30,8 +32,10 @@
  * @author asmirnov at exadel.com
  *
  */
+ at XmlRootElement(name = "body", namespace = Template.CDK_NAMESPACE)
 public class CdkBodyElement extends ModelFragment {
-    @Override
+
+	@Override
     public void beforeVisit(TemplateVisitor visitor) throws CdkException {
         visitor.startElement(this);
     }

Modified: root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/model/CdkChooseElement.java
===================================================================
--- root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/model/CdkChooseElement.java	2009-11-17 18:10:31 UTC (rev 15902)
+++ root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/model/CdkChooseElement.java	2009-11-17 18:22:36 UTC (rev 15903)
@@ -21,6 +21,7 @@
  */
 package org.richfaces.cdk.templatecompiler.model;
 
+import java.util.Iterator;
 import java.util.List;
 
 import javax.xml.bind.annotation.XmlElement;
@@ -50,6 +51,9 @@
 		super.setChildren(body);
 	}
 
+	/* (non-Javadoc)
+	 * @see org.richfaces.cdk.templatecompiler.model.ModelFragment#visit(org.richfaces.cdk.templatecompiler.model.TemplateVisitor)
+	 */
 	@Override
 	public void beforeVisit(TemplateVisitor visitor) throws CdkException {
 		visitor.startElement(this);

Added: root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/model/CdkForEachElement.java
===================================================================
--- root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/model/CdkForEachElement.java	                        (rev 0)
+++ root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/model/CdkForEachElement.java	2009-11-17 18:22:36 UTC (rev 15903)
@@ -0,0 +1,79 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2009, Red Hat, Inc. and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software 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 software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.richfaces.cdk.templatecompiler.model;
+
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlRootElement;
+
+import org.richfaces.cdk.CdkException;
+
+/**
+ * @author Nick Belaevski
+ * @since 4.0
+ */
+ at XmlRootElement(name = "forEach", namespace = Template.JSTL_CORE_NAMESPACE)
+public class CdkForEachElement extends ModelFragment {
+
+	private String items;
+	
+	private String var;
+	
+	/**
+	 * @return the items
+	 */
+	@XmlAttribute
+	public String getItems() {
+		return items;
+	}
+
+	/**
+	 * @param items the items to set
+	 */
+	public void setItems(String items) {
+		this.items = items;
+	}
+
+	/**
+	 * @return the var
+	 */
+	@XmlAttribute
+	public String getVar() {
+		return var;
+	}
+
+	/**
+	 * @param var the var to set
+	 */
+	public void setVar(String var) {
+		this.var = var;
+	}
+
+	@Override
+	public void beforeVisit(TemplateVisitor visitor) throws CdkException {
+		visitor.startElement(this);
+	}
+	
+	@Override
+	public void afterVisit(TemplateVisitor visitor) throws CdkException {
+		visitor.endElement(this);
+	}
+}

Modified: root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/model/CompositeImplementation.java
===================================================================
--- root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/model/CompositeImplementation.java	2009-11-17 18:10:31 UTC (rev 15902)
+++ root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/model/CompositeImplementation.java	2009-11-17 18:22:36 UTC (rev 15903)
@@ -34,5 +34,4 @@
 @XmlType(name="ImplementationType",namespace=Template.COMPOSITE_NAMESPACE)
 public class CompositeImplementation extends ModelFragment {
     
-
 }

Modified: root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/model/ElementsHandler.java
===================================================================
--- root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/model/ElementsHandler.java	2009-11-17 18:10:31 UTC (rev 15902)
+++ root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/model/ElementsHandler.java	2009-11-17 18:22:36 UTC (rev 15903)
@@ -115,11 +115,15 @@
         if( n instanceof Document ) {
             return ((Document)n).getDocumentElement();
         }
-        if( n instanceof Element )
-            return (Element)n;
-        if( n instanceof DocumentFragment )
+        
+        if( n instanceof Element ) {
+            return (Element) n;
+        }
+        
+        if( n instanceof DocumentFragment ) {
             return (Element)n.getChildNodes().item(0);
-
+        }
+        
         // if the result object contains something strange,
         // it is not a user problem, but it is a JAXB provider's problem.
         // That's why we throw a runtime exception.

Modified: root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/model/ModelFragment.java
===================================================================
--- root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/model/ModelFragment.java	2009-11-17 18:10:31 UTC (rev 15902)
+++ root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/model/ModelFragment.java	2009-11-17 18:22:36 UTC (rev 15903)
@@ -18,48 +18,52 @@
 	CdkCallElement.class, 
 	CdkBodyElement.class, 
 	CdkIfElement.class, 
+	CdkObjectElement.class,
 	CdkChooseElement.class,
-	CdkObjectElement.class
+	CdkForEachElement.class
 })
 public class ModelFragment implements LeafModelElement {
 
-    private List<Object> children;
+	private List<Object> children;
 
 
-    //TODO filter unhandled elements from known namespaces
-    @XmlAnyElement(lax=true, value=ElementsHandler.class)
-    @XmlMixed
-    public List<Object> getChildren() {
-        return this.children;
-    }
+	//TODO filter unhandled elements from known namespaces
+	@XmlAnyElement(lax=true, value=ElementsHandler.class)
+	@XmlMixed
+	public List<Object> getChildren() {
+		return this.children;
+	}
 
-    /**
-     * <p class="changed_added_4_0"></p>
-     * @param body the body to set
-     */
-    public void setChildren(List<Object> body) {
-        this.children = body;
-    }
+	/**
+	 * <p class="changed_added_4_0"></p>
+	 * @param body the body to set
+	 */
+	public void setChildren(List<Object> body) {
+		this.children = body;
+	}
 
-    @Override
-    public void visit(TemplateVisitor visitor) throws CdkException {
-        beforeVisit(visitor);
-        for (Object child : getChildren()) {
-          if (child instanceof String) {
-            visitor.visitElement((String) child);
-        } else if (child instanceof ModelElement) {
-            ((ModelElement) child).visit(visitor);
-        } else {
-            throw new CdkException("Unknown type of element in renderer template "+child.getClass());
-        }
-        }
-        afterVisit(visitor);
-    }
+	@Override
+	public void visit(TemplateVisitor visitor) throws CdkException {
+		beforeVisit(visitor);
+		List<Object> childrenList = getChildren();
+		if (childrenList != null) {
+			for (Object child : childrenList) {
+				if (child instanceof String) {
+					visitor.visitElement((String) child);
+				} else if (child instanceof ModelElement) {
+					((ModelElement) child).visit(visitor);
+				} else {
+					throw new CdkException("Unknown type of element in renderer template "+child.getClass());
+				}
+			}
+		}
+		afterVisit(visitor);
+	}
 
-    public void afterVisit(TemplateVisitor visitor) throws CdkException  {
-    }
+	public void afterVisit(TemplateVisitor visitor) throws CdkException  {
+	}
 
-    public void beforeVisit(TemplateVisitor visitor) throws CdkException  {
-    }
+	public void beforeVisit(TemplateVisitor visitor) throws CdkException  {
+	}
 
 }
\ No newline at end of file

Modified: root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/model/TemplateVisitor.java
===================================================================
--- root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/model/TemplateVisitor.java	2009-11-17 18:10:31 UTC (rev 15902)
+++ root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/templatecompiler/model/TemplateVisitor.java	2009-11-17 18:22:36 UTC (rev 15903)
@@ -62,4 +62,8 @@
 
 	void visitElement(CdkObjectElement cdkObjectElement);
 
+	void startElement(CdkForEachElement cdkForEachElement);
+
+	void endElement(CdkForEachElement cdkForEachElement);
+
 }

Modified: root/cdk/trunk/plugins/generator/src/main/resources/META-INF/schema/cdk-composite.xsd
===================================================================
--- root/cdk/trunk/plugins/generator/src/main/resources/META-INF/schema/cdk-composite.xsd	2009-11-17 18:10:31 UTC (rev 15902)
+++ root/cdk/trunk/plugins/generator/src/main/resources/META-INF/schema/cdk-composite.xsd	2009-11-17 18:22:36 UTC (rev 15903)
@@ -1,10 +1,42 @@
 <?xml version = "1.0" encoding = "UTF-8"?>
 
+<!--
+JBoss, Home of Professional Open Source
+Copyright ${year}, Red Hat, Inc. and individual contributors
+by the @authors tag. See the copyright.txt in the distribution for a
+full listing of individual contributors.
+
+
+This is free software; you can redistribute it and/or modify it
+under the terms of the GNU Lesser General Public License as
+published by the Free Software Foundation; either version 2.1 of
+the License, or (at your option) any later version.
+
+
+This software 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 software; if not, write to the Free
+Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+02110-1301 USA, or see the FSF site: http://www.fsf.org.
+--> 
+
 <xs:schema targetNamespace="http://java.sun.com/jsf/composite"
 	xmlns:cc="http://java.sun.com/jsf/composite" xmlns:xs="http://www.w3.org/2001/XMLSchema"
 	xmlns:xml="http://www.w3.org/XML/1998/namespace" elementFormDefault="qualified"
 	attributeFormDefault="unqualified">
 
+	<xs:annotation>
+		<xs:documentation>
+		NB: this schema covers only subset of elements supported by RichFaces CDK and therefore it 
+		shouldn't be used as a reference document for development of composite components.
+		</xs:documentation>
+	</xs:annotation>
+
 	<xs:attributeGroup name="beanDescriptorAttributes">
 		<xs:attribute name="displayName">
 			<xs:annotation>

Modified: root/cdk/trunk/plugins/generator/src/main/resources/META-INF/schema/cdk-jstl-core.xsd
===================================================================
--- root/cdk/trunk/plugins/generator/src/main/resources/META-INF/schema/cdk-jstl-core.xsd	2009-11-17 18:10:31 UTC (rev 15902)
+++ root/cdk/trunk/plugins/generator/src/main/resources/META-INF/schema/cdk-jstl-core.xsd	2009-11-17 18:22:36 UTC (rev 15903)
@@ -1,9 +1,41 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+JBoss, Home of Professional Open Source
+Copyright ${year}, Red Hat, Inc. and individual contributors
+by the @authors tag. See the copyright.txt in the distribution for a
+full listing of individual contributors.
+
+
+This is free software; you can redistribute it and/or modify it
+under the terms of the GNU Lesser General Public License as
+published by the Free Software Foundation; either version 2.1 of
+the License, or (at your option) any later version.
+
+
+This software 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 software; if not, write to the Free
+Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+02110-1301 USA, or see the FSF site: http://www.fsf.org.
+--> 
+
 <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
 	targetNamespace="http://java.sun.com/jsp/jstl/core" xmlns="http://java.sun.com/jsp/jstl/core"
 	xmlns:cdk="http://richfaces.org/cdk"
 	elementFormDefault="qualified" attributeFormDefault="unqualified">
 
+	<xs:annotation>
+		<xs:documentation>
+		NB: this schema covers only subset of elements supported by RichFaces CDK and therefore it 
+		shouldn't be used as a reference document for development of application pages.
+		</xs:documentation>
+	</xs:annotation>
+
 	<xs:import schemaLocation="cdk-template.xsd" namespace="http://richfaces.org/cdk" />
 
 	<xs:attributeGroup name="testGroup">
@@ -35,4 +67,21 @@
 			</xs:sequence>
 		</xs:complexType>
 	</xs:element>
+	<xs:element name="forEach">
+		<xs:complexType>
+			<xs:complexContent>
+				<xs:extension base="arbitraryContent">
+					<xs:attribute name="items" type="cdk:elStrictExpression" />
+					<xs:attribute name="var" type="cdk:literalExpression" />
+
+					<!--
+					<xs:attribute name="begin" type="cdk:elFreeformExpression" default="0" />
+					<xs:attribute name="end" type="cdk:elFreeformExpression" />
+					<xs:attribute name="step" type="cdk:elFreeformExpression" default="1" />
+					<xs:attribute name="varStatus" type="cdk:literalExpression" />
+					-->
+				</xs:extension>
+			</xs:complexContent>
+		</xs:complexType>
+	</xs:element>
 </xs:schema>

Modified: root/cdk/trunk/plugins/generator/src/main/resources/META-INF/schema/cdk-template.xsd
===================================================================
--- root/cdk/trunk/plugins/generator/src/main/resources/META-INF/schema/cdk-template.xsd	2009-11-17 18:10:31 UTC (rev 15902)
+++ root/cdk/trunk/plugins/generator/src/main/resources/META-INF/schema/cdk-template.xsd	2009-11-17 18:22:36 UTC (rev 15903)
@@ -1,4 +1,29 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+JBoss, Home of Professional Open Source
+Copyright ${year}, Red Hat, Inc. and individual contributors
+by the @authors tag. See the copyright.txt in the distribution for a
+full listing of individual contributors.
+
+
+This is free software; you can redistribute it and/or modify it
+under the terms of the GNU Lesser General Public License as
+published by the Free Software Foundation; either version 2.1 of
+the License, or (at your option) any later version.
+
+
+This software 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 software; if not, write to the Free
+Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+02110-1301 USA, or see the FSF site: http://www.fsf.org.
+--> 
+
 <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
 	targetNamespace="http://richfaces.org/cdk" xmlns="http://richfaces.org/cdk"
 	elementFormDefault="qualified" attributeFormDefault="unqualified"
@@ -16,6 +41,13 @@
 		</xs:restriction>
 	</xs:simpleType>
 
+	<xs:simpleType name="literalExpression">
+		<xs:restriction base="xs:string">
+			<!-- TODO -->
+			<xs:pattern value=".*" />
+		</xs:restriction>
+	</xs:simpleType>
+
 	<xs:simpleType name="elMixedExpression">
 		<xs:restriction base="xs:string">
 			<xs:pattern value=".*#\{[^\}]+\}.*" />
@@ -104,7 +136,7 @@
 		<xs:complexType mixed="true">
 			<xs:simpleContent>
 				<xs:extension base="xs:string">
-					<xs:attribute name="name" form="unqualified" use="required" />
+					<xs:attribute name="name" form="unqualified" type="literalExpression" use="required" />
 					<xs:attribute name="value" form="unqualified" />
 					<xs:attribute name="type" form="unqualified" />
 				</xs:extension>

Modified: root/cdk/trunk/plugins/generator/src/main/resources/META-INF/schema/xhtml-el.xsd
===================================================================
--- root/cdk/trunk/plugins/generator/src/main/resources/META-INF/schema/xhtml-el.xsd	2009-11-17 18:10:31 UTC (rev 15902)
+++ root/cdk/trunk/plugins/generator/src/main/resources/META-INF/schema/xhtml-el.xsd	2009-11-17 18:22:36 UTC (rev 15903)
@@ -1,4 +1,29 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+JBoss, Home of Professional Open Source
+Copyright ${year}, Red Hat, Inc. and individual contributors
+by the @authors tag. See the copyright.txt in the distribution for a
+full listing of individual contributors.
+
+
+This is free software; you can redistribute it and/or modify it
+under the terms of the GNU Lesser General Public License as
+published by the Free Software Foundation; either version 2.1 of
+the License, or (at your option) any later version.
+
+
+This software 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 software; if not, write to the Free
+Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+02110-1301 USA, or see the FSF site: http://www.fsf.org.
+--> 
+
 <xs:schema version="1.0" xml:lang="en"
 	xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://richfaces.org/xhtml-el"
 	xmlns="http://richfaces.org/xhtml-el" xmlns:xml="http://www.w3.org/XML/1998/namespace"

Modified: root/cdk/trunk/plugins/generator/src/main/resources/META-INF/templates/component.ftl
===================================================================
--- root/cdk/trunk/plugins/generator/src/main/resources/META-INF/templates/component.ftl	2009-11-17 18:10:31 UTC (rev 15902)
+++ root/cdk/trunk/plugins/generator/src/main/resources/META-INF/templates/component.ftl	2009-11-17 18:22:36 UTC (rev 15903)
@@ -44,7 +44,7 @@
 /**
  * ${description?if_exists} 
  **/
- at Generated({"RicFaces CDK","4.0.0-SNAPSHOT"})
+ at Generated({"RichFaces CDK", "4.0.0-SNAPSHOT"})
 public class ${componentClass.simpleName} extends ${baseClass} <#if (eventNames?size > 0)>implements ClientBehaviorHolder</#if>	{
 
 

Added: root/cdk/trunk/plugins/generator/src/main/resources/META-INF/templates/java/class.ftl
===================================================================
--- root/cdk/trunk/plugins/generator/src/main/resources/META-INF/templates/java/class.ftl	                        (rev 0)
+++ root/cdk/trunk/plugins/generator/src/main/resources/META-INF/templates/java/class.ftl	2009-11-17 18:22:36 UTC (rev 15903)
@@ -0,0 +1,38 @@
+package ${modelItem.package.name};
+
+<#list modelItem.imports as import>
+import ${import.name};
+</#list>
+
+<@renderCommonJavaElementStuff element=modelItem />class ${modelItem.name} <#if modelItem.superClass.name != 'java.lang.Object'>extends ${modelItem.superClass.name} </#if>{
+	<#list modelItem.fields as field>
+	<@renderCommonJavaElementStuff element=field />${field.type.simpleName} ${field.name}<#if field.value??> = ${field.value}</#if>;
+	</#list>
+	
+	<#list modelItem.methods as method>
+	<@renderCommonJavaElementStuff element=method />${method.returnType.simpleName} ${method.name}(<#list method.arguments as argument>${argument.type.simpleName} ${argument.name}<#if argument_has_next>, </#if></#list>) 
+	<#if !method.exceptions.empty>
+		throws <#list method.exceptions as exception>${exception.simpleName}<#if exception_has_next>, </#if></#list>
+	</#if> {
+		<#if method.methodBody??>
+			<#list method.methodBody.statements as methodStatement>
+			${methodStatement.code}
+			</#list>
+		</#if>
+	}
+	</#list>
+}
+
+<#macro renderCommonJavaElementStuff element>
+
+<#if !element.comments.empty>
+/*
+<#list element.comments as comment>
+ * ${comment.value}
+</#list>
+ */
+</#if>
+<#list element.annotations as annotation>
+@${annotation.type.simpleName}<#if !annotation.arguments.empty>(<#list annotation.arguments as argument>${argument}<#if argument_has_next>, </#if></#list>)</#if>
+</#list>
+<#list element.modifiers as modifier>${modifier} </#list></#macro>
\ No newline at end of file

Added: root/cdk/trunk/plugins/generator/src/main/resources/META-INF/templates/java/encode-method-preface.ftl
===================================================================
--- root/cdk/trunk/plugins/generator/src/main/resources/META-INF/templates/java/encode-method-preface.ftl	                        (rev 0)
+++ root/cdk/trunk/plugins/generator/src/main/resources/META-INF/templates/java/encode-method-preface.ftl	2009-11-17 18:22:36 UTC (rev 15903)
@@ -0,0 +1 @@
+ResponseWriter ${responseWriterVariable} = ${facesContextVariable}.getResponseWriter(); 
\ No newline at end of file

Added: root/cdk/trunk/plugins/generator/src/main/resources/META-INF/templates/java/end-element.ftl
===================================================================
--- root/cdk/trunk/plugins/generator/src/main/resources/META-INF/templates/java/end-element.ftl	                        (rev 0)
+++ root/cdk/trunk/plugins/generator/src/main/resources/META-INF/templates/java/end-element.ftl	2009-11-17 18:22:36 UTC (rev 15903)
@@ -0,0 +1 @@
+${responseWriterVariable}.endElement("${modelItem.elementName}"); 
\ No newline at end of file

Added: root/cdk/trunk/plugins/generator/src/main/resources/META-INF/templates/java/for-each.ftl
===================================================================
--- root/cdk/trunk/plugins/generator/src/main/resources/META-INF/templates/java/for-each.ftl	                        (rev 0)
+++ root/cdk/trunk/plugins/generator/src/main/resources/META-INF/templates/java/for-each.ftl	2009-11-17 18:22:36 UTC (rev 15903)
@@ -0,0 +1,5 @@
+for (${modelItem.varType} ${modelItem.var}: ${modelItem.itemsExpression}) {
+	<#list modelItem.statements as subStatement>
+	${subStatement.code}
+	</#list>
+}
\ No newline at end of file

Added: root/cdk/trunk/plugins/generator/src/main/resources/META-INF/templates/java/if-else.ftl
===================================================================
--- root/cdk/trunk/plugins/generator/src/main/resources/META-INF/templates/java/if-else.ftl	                        (rev 0)
+++ root/cdk/trunk/plugins/generator/src/main/resources/META-INF/templates/java/if-else.ftl	2009-11-17 18:22:36 UTC (rev 15903)
@@ -0,0 +1,10 @@
+<#list modelItem.statements as statement>
+	<#if statement_index == 0>
+	if (${statement.test}) {
+	<#else>
+	} else <#if statement.test.length() != 0>if (${statement.test}) </#if> { 
+	</#if>
+	<#list statement.statements as subStatement>
+	${subStatement.code}
+	</#list>
+</#list>}
\ No newline at end of file

Added: root/cdk/trunk/plugins/generator/src/main/resources/META-INF/templates/java/start-element.ftl
===================================================================
--- root/cdk/trunk/plugins/generator/src/main/resources/META-INF/templates/java/start-element.ftl	                        (rev 0)
+++ root/cdk/trunk/plugins/generator/src/main/resources/META-INF/templates/java/start-element.ftl	2009-11-17 18:22:36 UTC (rev 15903)
@@ -0,0 +1 @@
+${responseWriterVariable}.startElement("${modelItem.elementName}", ${componentVariable}); 
\ No newline at end of file

Added: root/cdk/trunk/plugins/generator/src/main/resources/META-INF/templates/java/write-attribute.ftl
===================================================================
--- root/cdk/trunk/plugins/generator/src/main/resources/META-INF/templates/java/write-attribute.ftl	                        (rev 0)
+++ root/cdk/trunk/plugins/generator/src/main/resources/META-INF/templates/java/write-attribute.ftl	2009-11-17 18:22:36 UTC (rev 15903)
@@ -0,0 +1 @@
+${responseWriterVariable}.writeAttribute("${modelItem.attributeName}", ${modelItem.valueExpression}, null);
\ No newline at end of file

Added: root/cdk/trunk/plugins/generator/src/main/resources/META-INF/templates/java/write-text.ftl
===================================================================
--- root/cdk/trunk/plugins/generator/src/main/resources/META-INF/templates/java/write-text.ftl	                        (rev 0)
+++ root/cdk/trunk/plugins/generator/src/main/resources/META-INF/templates/java/write-text.ftl	2009-11-17 18:22:36 UTC (rev 15903)
@@ -0,0 +1 @@
+${responseWriterVariable}.writeText(${modelItem.textExpression}, null); 
\ No newline at end of file

Added: root/cdk/trunk/plugins/generator/src/main/resources/META-INF/templates/method.ftl
===================================================================
--- root/cdk/trunk/plugins/generator/src/main/resources/META-INF/templates/method.ftl	                        (rev 0)
+++ root/cdk/trunk/plugins/generator/src/main/resources/META-INF/templates/method.ftl	2009-11-17 18:22:36 UTC (rev 15903)
@@ -0,0 +1,6 @@
+<#list method.comments as comment>
+//${comment}
+</#list>
+<#list method.modifiers as modifier>${modifier} </#list> ${method.returnType} ${method.name}(<#list method.arguments as argument>${argument.type} ${argument.name}<#if argument_has_next>, </#if></#list>) {
+	${method.methodBody.toCode()}
+}

Added: root/cdk/trunk/plugins/generator/src/main/resources/META-INF/templates/object.ftl
===================================================================

Deleted: root/cdk/trunk/plugins/generator/src/test/java/org/richfaces/cdk/TemplateReaderTest.java
===================================================================
--- root/cdk/trunk/plugins/generator/src/test/java/org/richfaces/cdk/TemplateReaderTest.java	2009-11-17 18:10:31 UTC (rev 15902)
+++ root/cdk/trunk/plugins/generator/src/test/java/org/richfaces/cdk/TemplateReaderTest.java	2009-11-17 18:22:36 UTC (rev 15903)
@@ -1,121 +0,0 @@
-package org.richfaces.cdk;
-
-import static org.junit.Assert.*;
-
-import java.io.IOException;
-import java.io.InputStream;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-import org.richfaces.builder.model.JavaClass;
-import org.richfaces.builder.model.JavaMethod;
-import org.richfaces.builder.templates.TemplateReader;
-
-public class TemplateReaderTest {
-    private static final String ENCODE_BEGIN_METHOD = "encodeBegin";
-    private static final String ENCODE_CHILDREN_METHOD = "encodeChildren";
-    private static final String ENCODE_END_METHOD = "encodeEnd";
-    private static final String END_DIV_FRAGMENT = "responseWriter.endElement(\"div\");";
-    private static final String END_TABLE_FRAGMENT = "responseWriter.endElement(\"table\");";
-    private static final String FULL_NAME = "org.richfaces.renderkit.html.TabPanelRenderer";
-    private static final String IF_FRAGMENT = "if (";
-    private static final String PACKAGE = "org.richfaces.renderkit.html";
-    private static final String START_DIV_FRAGMENT = "responseWriter.startElement(\"div\", component);";
-    private static final String START_TABLE_FRAGMENT = "responseWriter.startElement(\"table\", component);";
-    private static final String SUPERCLASS = "javax.faces.render.Renderer";
-    private static final String TAB_PANEL_RENDERER = "TabPanelRenderer";
-    private static final String TEMPLATE_SIMPLE_XML = "template-simple.xml";
-    private static final String TEMPLATE_XML = "template.xml";
-    private static final String WRITE_ATTRIBBUTE_FRAGMENT =
-        "responseWriter.writeAttribute(\"id\", component.getClientId(context), \"id\");";
-    InputStream stream = null;
-
-    @Before
-    public void create() {}
-
-    @After
-    public void destroy() {
-        try {
-            stream.close();
-        } catch (IOException e) {
-            e.printStackTrace();
-        }
-    }
-
-    @Test
-    public void testSimpleTemplate() throws Exception {
-        stream = this.getClass().getResourceAsStream(TEMPLATE_SIMPLE_XML);
-
-        JavaClass claz = TemplateReader.parse(stream);
-
-        /*
-         * JavaClassRenderer renderer = new JavaClassRenderer();
-         * renderer.render(claz, new PrintWriter(System.out));
-         */
-        assertEquals(claz.getFullName(), FULL_NAME);
-        assertEquals(claz.getName(), TAB_PANEL_RENDERER);
-        assertEquals(claz.getPakg().getName(), PACKAGE);
-        assertEquals(claz.getSuperClass().getFullName(), SUPERCLASS);
-        assertTrue(containMethod(claz, ENCODE_BEGIN_METHOD));
-        assertTrue(containMethod(claz, ENCODE_END_METHOD));
-        assertTrue(containMethod(claz, ENCODE_CHILDREN_METHOD));
-    }
-
-    @Test
-    public void testFullTemplate() throws Exception {
-        stream = this.getClass().getResourceAsStream(TEMPLATE_XML);
-
-        JavaClass claz = TemplateReader.parse(stream);
-
-        /*
-         * JavaClassRenderer renderer = new JavaClassRenderer();
-         * renderer.render(claz, new PrintWriter(System.err));
-         */
-        assertEquals(claz.getFullName(), FULL_NAME);
-        assertEquals(claz.getName(), TAB_PANEL_RENDERER);
-        assertEquals(claz.getPakg().getName(), PACKAGE);
-        assertEquals(claz.getSuperClass().getFullName(), SUPERCLASS);
-        assertTrue(containMethod(claz, ENCODE_BEGIN_METHOD));
-        assertTrue(containMethod(claz, ENCODE_CHILDREN_METHOD));
-        assertTrue(containMethod(claz, ENCODE_END_METHOD));
-
-        JavaMethod method = getMethodByName(claz, ENCODE_CHILDREN_METHOD);
-
-        assertNotNull(method);
-
-        String code = method.getMethodBody().toCode();
-
-        assertTrue(code.lastIndexOf(IF_FRAGMENT) != -1);
-        assertTrue(code.lastIndexOf(START_TABLE_FRAGMENT) != -1);
-        assertTrue(code.lastIndexOf(WRITE_ATTRIBBUTE_FRAGMENT) != -1);
-        assertTrue(code.lastIndexOf(START_DIV_FRAGMENT) != -1);
-        assertTrue(code.lastIndexOf(END_TABLE_FRAGMENT) != -1);
-        assertTrue(code.lastIndexOf(END_DIV_FRAGMENT) != -1);
-        assertTrue(code.lastIndexOf(START_TABLE_FRAGMENT) < code.lastIndexOf(START_DIV_FRAGMENT));
-        assertTrue(code.lastIndexOf(WRITE_ATTRIBBUTE_FRAGMENT) < code.lastIndexOf(START_DIV_FRAGMENT));
-        assertTrue(code.lastIndexOf(WRITE_ATTRIBBUTE_FRAGMENT) < code.lastIndexOf(END_TABLE_FRAGMENT));
-        assertTrue(code.lastIndexOf(END_TABLE_FRAGMENT) > code.lastIndexOf(END_DIV_FRAGMENT));
-    }
-
-    private JavaMethod getMethodByName(JavaClass clazz, String name) {
-        for (JavaMethod method : clazz.getMethods()) {
-            if (method.getName().equals(name)) {
-                return method;
-            }
-        }
-
-        return null;
-    }
-
-    private boolean containMethod(JavaClass clazz, String name) {
-        for (JavaMethod method : clazz.getMethods()) {
-            if (method.getName().equals(name)) {
-                return true;
-            }
-        }
-
-        return false;
-    }
-}

Modified: root/cdk/trunk/plugins/generator/src/test/java/org/richfaces/cdk/templatecompiler/model/TemplateTest.java
===================================================================
--- root/cdk/trunk/plugins/generator/src/test/java/org/richfaces/cdk/templatecompiler/model/TemplateTest.java	2009-11-17 18:10:31 UTC (rev 15902)
+++ root/cdk/trunk/plugins/generator/src/test/java/org/richfaces/cdk/templatecompiler/model/TemplateTest.java	2009-11-17 18:22:36 UTC (rev 15903)
@@ -83,6 +83,9 @@
                 	"</c:when>" +
                 	"<c:otherwise>otherwise content</c:otherwise>" +
 				"</c:choose>" +
+				"<c:forEach items=\"#{someCollection}\" var=\"iterationVar\">" +
+					"forEach content" +
+				"</c:forEach>" +
 				"finish" + 
                 TEMPLATE_EPILOG);
 	
@@ -91,7 +94,7 @@
         
         List<Object> children = implementation.getChildren();
         assertNotNull(children);
-        assertEquals(4, children.size());
+        assertEquals(5, children.size());
         assertEquals("start", children.get(0));
         assertEquals(CdkIfElement.class, children.get(1).getClass());
         CdkIfElement ifElement = (CdkIfElement) children.get(1);
@@ -138,7 +141,17 @@
         assertEquals(1, childrenOfOtherwiseElement.size());
         assertEquals("otherwise content", childrenOfOtherwiseElement.get(0));
         
-        assertEquals("finish", children.get(3));
+        assertEquals(CdkForEachElement.class, children.get(3).getClass());
+        CdkForEachElement forEachElement = (CdkForEachElement) children.get(3);
+        assertEquals("#{someCollection}", forEachElement.getItems());
+        assertEquals("iterationVar", forEachElement.getVar());
+
+        List<Object> forEachChildren = forEachElement.getChildren();
+        assertNotNull(forEachChildren);
+        assertEquals(1, forEachChildren.size());
+        assertEquals("forEach content", forEachChildren.get(0));
+        
+        assertEquals("finish", children.get(4));
     }
     
     @Test

Deleted: root/cdk/trunk/plugins/generator/src/test/resources/org/richfaces/cdk/template-simple.xml
===================================================================
--- root/cdk/trunk/plugins/generator/src/test/resources/org/richfaces/cdk/template-simple.xml	2009-11-17 18:10:31 UTC (rev 15902)
+++ root/cdk/trunk/plugins/generator/src/test/resources/org/richfaces/cdk/template-simple.xml	2009-11-17 18:22:36 UTC (rev 15903)
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<cdk:root xmlns:cdk="http://richfaces.org/cdk"
-	class="org.richfaces.renderkit.html.TabPanelRenderer" componentclass="org.richfaces.component.UITabPanel">
-	<cdk:body>
-	<table border="0" cellpadding="0" cellspacing="0" id="#{clientId}"
-		class="rich-tabpanel #{component.attributes['styleClass']}"/>
-</cdk:body>
-</cdk:root>
\ No newline at end of file

Deleted: root/cdk/trunk/plugins/generator/src/test/resources/org/richfaces/cdk/template.xml
===================================================================
--- root/cdk/trunk/plugins/generator/src/test/resources/org/richfaces/cdk/template.xml	2009-11-17 18:10:31 UTC (rev 15902)
+++ root/cdk/trunk/plugins/generator/src/test/resources/org/richfaces/cdk/template.xml	2009-11-17 18:22:36 UTC (rev 15903)
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<cdk:root xmlns:cdk="http://richfaces.org/cdk"
-	class="org.richfaces.renderkit.html.TabPanelRenderer"
-	componentclass="org.richfaces.component.UITabPanel">
-<cdk:body>
-<cdk:clientid var="clientId" />
-<table border="0" cellpadding="0" cellspacing="0" id="#{clientId}"
-		class="rich-tabpanel #{component.attributes['styleClass']}">
-		<tbody>
-			<tr>
-				<td align="#{component.attributes['headerAlignment']}" class="rich-tab-bottom-line #{component.attributes['headerClass']}">	
-					<div style="display: none;">
-						<cdk:if test="#{clientSide}">
-							<input autocomplete="off" type="hidden"
-							id="#{clientId}_input" 
-							name="#{clientId}"
-							value=" " /> 
-						</cdk:if> 
-					</div>
-				</td>
-			</tr>
-		</tbody>
-	</table>
-	</cdk:body>
-</cdk:root>
\ No newline at end of file



More information about the richfaces-svn-commits mailing list