Author: alexsmirnov
Date: 2010-05-07 20:12:12 -0400 (Fri, 07 May 2010)
New Revision: 16938
Added:
root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/model/FacesComponent.java
Modified:
root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/NamingConventions.java
root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/RichFacesConventions.java
root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/apt/CdkProcessor.java
root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/model/BeanModelBase.java
root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/model/BehaviorRenderer.java
root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/model/ComponentModel.java
root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/model/ModelCollection.java
root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/model/ModelElementBase.java
root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/model/Name.java
root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/model/validator/ValidatorImpl.java
root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/xmlconfig/model/BehaviorRendererBean.java
root/cdk/trunk/plugins/generator/src/test/java/org/richfaces/cdk/apt/CdkProcessorTest.java
Log:
CODING IN PROGRESS - issue RF-7736: Library model verifier.
https://jira.jboss.org/jira/browse/RF-7736
Modified:
root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/NamingConventions.java
===================================================================
---
root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/NamingConventions.java 2010-05-07
21:31:29 UTC (rev 16937)
+++
root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/NamingConventions.java 2010-05-08
00:12:12 UTC (rev 16938)
@@ -98,4 +98,8 @@
public String inferComponentFamilyByRendererClass(String s);
public String inferRendererBaseName(RendererModel.Type type);
+
+ public FacesId inferBehaviorType(ClassName targetClass);
+
+ public ClassName inferBehaviorClass(FacesId id);
}
Modified:
root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/RichFacesConventions.java
===================================================================
---
root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/RichFacesConventions.java 2010-05-07
21:31:29 UTC (rev 16937)
+++
root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/RichFacesConventions.java 2010-05-08
00:12:12 UTC (rev 16938)
@@ -14,23 +14,23 @@
/**
* <p class="changed_added_4_0">
* </p>
- *
+ *
* @author asmirnov(a)exadel.com
- *
+ *
*/
public final class RichFacesConventions implements NamingConventions {
private static final String ABSTRACT = "Abstract";
private static final String BASE = "Base";
private static final String UI = "UI";
- private static final String[] COMPONENT_SUFFIXES = {BASE};
- private static final String[] COMPONENT_PREFIXES = {UI, ABSTRACT};
+ private static final String[] COMPONENT_SUFFIXES = { BASE };
+ private static final String[] COMPONENT_PREFIXES = { UI, ABSTRACT };
// TODO - inject base name.
private String baseName;
- public RichFacesConventions() { }
+ public RichFacesConventions() {
+ }
-
@Override
public FacesId inferComponentType(ClassName componentClass) throws
InvalidNameException {
@@ -103,7 +103,7 @@
}
@Override
- public String inferUIComponentFamily (FacesId componentType) {
+ public String inferUIComponentFamily(FacesId componentType) {
if (null == componentType) {
throw new IllegalArgumentException();
}
@@ -134,7 +134,7 @@
/**
* <p class="changed_added_4_0">
* </p>
- *
+ *
* @return the baseName
*/
protected String getBaseName() {
@@ -187,5 +187,65 @@
public String inferComponentFamilyByRendererClass(String s) {
return inferComponentTypeByRendererClass(s);
}
+
+ @Override
+ public ClassName inferBehaviorClass(FacesId id) {
+ if (null == id) {
+ throw new IllegalArgumentException();
+ }
+
+ // Infer UI class name from component type.
+ Name name = Name.create(id.toString());
+
+ name.setClassifier(Classifier.component);
+ // All Behavior classes belongs to "component.behavior" package.
+ name.setMarkup("behavior");
+
+ return new ClassName(name.toString());
+ }
+
+ @Override
+ public FacesId inferBehaviorType(ClassName targetClass) {
+ // check parameters.
+ if (null == targetClass) {
+ throw new IllegalArgumentException();
+ }
+
+ Name name = Name.create(targetClass.toString());
+
+ // Use base library prefix.
+ String baseName = this.getBaseName();
+
+ if (null != baseName) {
+ name.setPrefix(baseName);
+ }
+
+ // Jsf Behavior type does not contain class or markup parts.
+ name.setClassifier(null);
+ name.setMarkup(null);
+
+ String simpleName = name.getSimpleName();
+
+ // Remove common prefixes.
+ for (int i = 0; i < COMPONENT_PREFIXES.length; i++) {
+ if (simpleName.startsWith(COMPONENT_PREFIXES[i])) {
+ simpleName = simpleName.substring(COMPONENT_PREFIXES[i].length());
+
+ break;
+ }
+ }
+
+ // Remove common suffixes.
+ for (int i = 0; i < COMPONENT_SUFFIXES.length; i++) {
+ if (simpleName.endsWith(COMPONENT_SUFFIXES[i])) {
+ simpleName = simpleName.substring(0, simpleName.length() -
COMPONENT_SUFFIXES[i].length());
+
+ break;
+ }
+ }
+
+ name.setSimpleName(simpleName);
+
+ return new FacesId(name.toString());
+ }
}
-
Modified:
root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/apt/CdkProcessor.java
===================================================================
---
root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/apt/CdkProcessor.java 2010-05-07
21:31:29 UTC (rev 16937)
+++
root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/apt/CdkProcessor.java 2010-05-08
00:12:12 UTC (rev 16938)
@@ -39,6 +39,8 @@
import javax.lang.model.element.Element;
import javax.lang.model.element.ElementKind;
import javax.lang.model.element.TypeElement;
+import javax.tools.Diagnostic.Kind;
+
import java.util.Collections;
import java.util.Set;
@@ -51,32 +53,32 @@
* @author asmirnov(a)exadel.com
*
*/
-public class CdkProcessor extends AbstractProcessor {
+public class CdkProcessor extends AbstractProcessor {
- private static final Set<String> ANY_ANNOTATION =
Collections.singleton("*");
-
+ private static final Set<String> PROCESSED_ANNOTATION =
Collections.singleton("*");
+
@Inject
private Logger log;
@Inject
- private Set<CdkAnnotationProcessor> processors;
+ private Set<CdkAnnotationProcessor> processors;
// TODO - set library as parameter.
@Inject
private ComponentLibrary library;
@Inject
- private Set<ModelBuilder> builders;
-
+ private Set<ModelBuilder> builders;
+
@Inject
private SourceUtilsProvider sourceUtilsProducer;
-
+
@Inject
private ModelValidator validator;
-
+
@Inject
private LibraryBuilder builder;
-
+
@Override
public synchronized void init(ProcessingEnvironment processingEnv) {
super.init(processingEnv);
@@ -103,17 +105,23 @@
return false;
}
-
protected void processAnnotation(CdkAnnotationProcessor processor, RoundEnvironment
environment) {
- Set<? extends Element> annotatedWith =
environment.getElementsAnnotatedWith(processor.getProcessedAnnotation());
- for (Element element : annotatedWith) {
- if (ElementKind.CLASS.equals(element.getKind())) {
- try {
- processor.process((TypeElement) element, library);
- } catch (CdkProcessingException e) {
- sendError(element, e);
+ try {
+ Set<? extends Element> rootElements = environment.getRootElements();
+ for (Element element : rootElements) {
+ if (ElementKind.CLASS.equals(element.getKind())
+ && null !=
element.getAnnotation(processor.getProcessedAnnotation())){
+ try {
+ processor.process((TypeElement) element, library);
+ } catch (CdkProcessingException e) {
+ sendError(element, e);
+ }
}
}
+ } catch (Exception e) {
+ processingEnv.getMessager().printMessage(Kind.ERROR,
+ "Errorr processing annotation " +
processor.getProcessedAnnotation() + ": " + e);
+ e.printStackTrace();
}
}
@@ -124,7 +132,7 @@
@Override
public Set<String> getSupportedAnnotationTypes() {
- return ANY_ANNOTATION;
+ return PROCESSED_ANNOTATION;
}
@Override
Modified:
root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/model/BeanModelBase.java
===================================================================
---
root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/model/BeanModelBase.java 2010-05-07
21:31:29 UTC (rev 16937)
+++
root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/model/BeanModelBase.java 2010-05-08
00:12:12 UTC (rev 16938)
@@ -23,23 +23,35 @@
package org.richfaces.cdk.model;
import java.util.Collection;
+import java.util.Comparator;
-
/**
* This is the base class for all Java Bean-like JSF objects in the model.
+ *
* @author akolonitsky
* @since Jan 22, 2010
- *
+ *
*/
public class BeanModelBase extends DescriptionGroupBase {
- private final ModelCollection<PropertyBase> attributes =
ModelCollection.<PropertyBase>create();
+ private final ModelCollection<PropertyBase> attributes =
+ ModelCollection.<PropertyBase> create(new Comparator<PropertyBase>()
{
+ @Override
+ public int compare(PropertyBase o1, PropertyBase o2) {
+ if (o1 != null && o2 != null && null != o1.getName()
&& null != o2.getName()) {
+ return o1.getName().compareTo(o2.getName());
+ } else {
+ return 0;
+ }
+ }
+ });
+
/**
* <p class="changed_added_4_0">
* Represents JSF component attributes and properties.
* </p>
- *
+ *
* @return the attributes
*/
public Collection<PropertyBase> getAttributes() {
@@ -47,7 +59,10 @@
}
/**
- * <p class="changed_added_4_0">Return bean attribute for given
name.</p>
+ * <p class="changed_added_4_0">
+ * Return bean attribute for given name.
+ * </p>
+ *
* @param name
* @return
*/
Modified:
root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/model/BehaviorRenderer.java
===================================================================
---
root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/model/BehaviorRenderer.java 2010-05-07
21:31:29 UTC (rev 16937)
+++
root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/model/BehaviorRenderer.java 2010-05-08
00:12:12 UTC (rev 16938)
@@ -31,12 +31,14 @@
*
*/
@SuppressWarnings("serial")
-public class BehaviorRenderer implements ModelElement<BehaviorRenderer> {
- private ClassName rendererClass;
- private Type type;
+public class BehaviorRenderer implements ModelElement<BehaviorRenderer>,
FacesComponent {
+ private ClassName baseClass;
+ private ClassName targetClass;
+ private boolean generate;
+ private FacesId id;
- public BehaviorRenderer(Type type) {
- this.type = type;
+ public BehaviorRenderer(FacesId type) {
+ this.id = type;
}
public BehaviorRenderer() {
@@ -44,37 +46,71 @@
/**
* <p class="changed_added_4_0"></p>
- * @param type the type to set
+ * @param id the id to set
*/
- public void setType(Type type) {
- this.type = type;
+ public void setId(FacesId type) {
+ this.id = type;
}
/**
* <p class="changed_added_4_0"></p>
- * @return the type
+ * @return the id
*/
- public Type getType() {
- return type;
+ public FacesId getId() {
+ return id;
}
/**
* <p class="changed_added_4_0"></p>
- * @return the rendererClass
+ * @return the targetClass
*/
- public ClassName getRendererClass() {
- return rendererClass;
+ @Merge
+ public ClassName getTargetClass() {
+ return targetClass;
}
/**
* <p class="changed_added_4_0"></p>
- * @param rendererClass the rendererClass to set
+ * @param targetClass the targetClass to set
*/
- public void setRendererClass(ClassName rendererClass) {
- this.rendererClass = rendererClass;
+ public void setTargetClass(ClassName rendererClass) {
+ this.targetClass = rendererClass;
}
+ /**
+ * <p class="changed_added_4_0"></p>
+ * @return the baseClass
+ */
+ @Merge
+ public ClassName getBaseClass() {
+ return this.baseClass;
+ }
+
+ /**
+ * <p class="changed_added_4_0"></p>
+ * @param baseClass the baseClass to set
+ */
+ public void setBaseClass(ClassName baseClass) {
+ this.baseClass = baseClass;
+ }
+
+ /**
+ * <p class="changed_added_4_0"></p>
+ * @return the generate
+ */
+ public boolean isGenerate() {
+ return this.generate;
+ }
+
+ /**
+ * <p class="changed_added_4_0"></p>
+ * @param generate the generate to set
+ */
+ public void setGenerate(boolean generate) {
+ this.generate = generate;
+ }
+
@Override
public void merge(BehaviorRenderer other) {
ComponentLibrary.merge(this, other);
@@ -87,30 +123,14 @@
@Override
public boolean same(BehaviorRenderer other) {
- if (null != getType() && null != other.getType()) {
+ if (null != getId() && null != other.getId()) {
// Both types not null, compare them.
- return getType().equals(other.getType());
+ return getId().equals(other.getId());
}
// one or both types are null, compare classes.
- if (null != getRendererClass() &&
getRendererClass().equals(other.getRendererClass())) {
+ if (null != getTargetClass() &&
getTargetClass().equals(other.getTargetClass())) {
return true;
}
return false;
}
- /**
- * <p class="changed_added_4_0"></p>
- * @author asmirnov(a)exadel.com
- *
- */
- @SuppressWarnings("serial")
- public static final class Type extends FacesId {
-
- /**
- * <p class="changed_added_4_0"></p>
- * @param type
- */
- public Type(String type) {
- super(type);
- }
- }
}
Modified:
root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/model/ComponentModel.java
===================================================================
---
root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/model/ComponentModel.java 2010-05-07
21:31:29 UTC (rev 16937)
+++
root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/model/ComponentModel.java 2010-05-08
00:12:12 UTC (rev 16938)
@@ -76,13 +76,19 @@
return null != getTargetClass() &&
getTargetClass().equals(other.getTargetClass());
}
/**
- * <p class="changed_added_4_0"></p>
+ * <p class="changed_added_4_0">Delegeted to setId</p>
* @param type the type to set
+ * @deprecated Use {@link ModelElementBase#setId(FacesId)} instead.
*/
public void setType(FacesId type) {
setId(type);
}
+ /**
+ * <p class="changed_added_4_0"></p>
+ * @return
+ * @deprecated Use {@link ModelElementBase#getId()} instead.
+ */
public FacesId getType() {
return getId();
}
Added:
root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/model/FacesComponent.java
===================================================================
---
root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/model/FacesComponent.java
(rev 0)
+++
root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/model/FacesComponent.java 2010-05-08
00:12:12 UTC (rev 16938)
@@ -0,0 +1,59 @@
+package org.richfaces.cdk.model;
+
+
+/**
+ * <p class="changed_added_4_0">This Interface describes all JSF objects
that can be generated by cdk:</p>
+ * <ul>
+ * <li>{@link UIComponent}</li>
+ * <li>{@link Renderer}</li>
+ * <li>{@link Converter}</li>
+ * <li>{@link Validator}</li>
+ * <li>{@link ClientBehavior}</li>
+ * <li>{@link ClientBehaviorRenderer}
+ * </ul>
+ * @author asmirnov(a)exadel.com
+ *
+ */
+public interface FacesComponent {
+
+ public FacesId getId();
+
+ public void setId(FacesId id);
+
+ /**
+ * <p class="changed_added_4_0"></p>
+ * @param targetClass the targetClass to set
+ */
+ public void setTargetClass(ClassName targetClass);
+
+ /**
+ * <p class="changed_added_4_0"></p>
+ * @return the targetClass
+ */
+ public ClassName getTargetClass();
+
+ /**
+ * <p class="changed_added_4_0"></p>
+ * @return the baseClass
+ */
+ public ClassName getBaseClass();
+
+ /**
+ * <p class="changed_added_4_0"></p>
+ * @param baseClass
+ */
+ public abstract void setBaseClass(ClassName baseClass);
+
+ /**
+ * <p class="changed_added_4_0"></p>
+ * @return
+ */
+ public boolean isGenerate();
+
+ /**
+ * <p class="changed_added_4_0"></p>
+ * @param generate
+ */
+ public void setGenerate(boolean generate);
+
+}
\ No newline at end of file
Property changes on:
root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/model/FacesComponent.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Modified:
root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/model/ModelCollection.java
===================================================================
---
root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/model/ModelCollection.java 2010-05-07
21:31:29 UTC (rev 16937)
+++
root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/model/ModelCollection.java 2010-05-08
00:12:12 UTC (rev 16938)
@@ -25,9 +25,12 @@
import com.google.common.base.Predicate;
import com.google.common.collect.Iterables;
+import com.google.common.collect.Iterators;
import com.google.common.collect.Lists;
import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import java.util.NoSuchElementException;
@@ -43,11 +46,36 @@
public class ModelCollection<E extends ModelElement<? super E>> implements
Collection<E>, Visitable {
private final List<E> elements = Lists.newArrayList();
+
+ private Comparator<E> comparator;
+
+ /**
+ * <p class="changed_added_4_0"></p>
+ * @return the comparator
+ */
+ public Comparator<E> getComparator() {
+ return this.comparator;
+ }
+
+ /**
+ * <p class="changed_added_4_0"></p>
+ * @param comparator the comparator to set
+ */
+ public void setComparator(Comparator<E> comparator) {
+ this.comparator = comparator;
+ }
+
public static <T extends ModelElement<? super T>>
ModelCollection<T> create() {
return new ModelCollection<T>();
}
+ public static <T extends ModelElement<? super T>>
ModelCollection<T> create(Comparator<T> comparator) {
+ ModelCollection<T> collection = new ModelCollection<T>();
+ collection.setComparator(comparator);
+ return collection;
+ }
+
public E find(final Predicate<? super E> predicate) {
try {
return Iterables.find(elements, predicate);
@@ -112,7 +140,13 @@
@Override
public Iterator<E> iterator() {
- return elements.iterator();
+ if(null == comparator){
+ return elements.iterator();
+ } else {
+ List<E> list = Lists.newArrayList(elements);
+ Collections.sort(list, comparator);
+ return Iterators.unmodifiableIterator(list.iterator());
+ }
}
@Override
@@ -153,7 +187,8 @@
@Override
public Object[] toArray() {
- return elements.toArray();
+ Object[] array = elements.toArray();
+ return array;
}
@Override
Modified:
root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/model/ModelElementBase.java
===================================================================
---
root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/model/ModelElementBase.java 2010-05-07
21:31:29 UTC (rev 16937)
+++
root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/model/ModelElementBase.java 2010-05-08
00:12:12 UTC (rev 16938)
@@ -10,7 +10,7 @@
* @author asmirnov(a)exadel.com
*
*/
-public class ModelElementBase extends BeanModelBase {
+public class ModelElementBase extends BeanModelBase implements FacesComponent {
private FacesId id;
@@ -39,25 +39,29 @@
return this.interfaces;
}
+ /* (non-Javadoc)
+ * @see org.richfaces.cdk.model.FacesComponent#getId()
+ */
public FacesId getId() {
return id;
}
+ /* (non-Javadoc)
+ * @see
org.richfaces.cdk.model.FacesComponent#setId(org.richfaces.cdk.model.FacesId)
+ */
public void setId(FacesId id) {
this.id = id;
}
- /**
- * <p class="changed_added_4_0"></p>
- * @param targetClass the targetClass to set
+ /* (non-Javadoc)
+ * @see
org.richfaces.cdk.model.FacesComponent#setTargetClass(org.richfaces.cdk.model.ClassName)
*/
public void setTargetClass(ClassName targetClass) {
this.targetClass = targetClass;
}
- /**
- * <p class="changed_added_4_0"></p>
- * @return the targetClass
+ /* (non-Javadoc)
+ * @see org.richfaces.cdk.model.FacesComponent#getTargetClass()
*/
public ClassName getTargetClass() {
return targetClass;
@@ -67,13 +71,13 @@
* <p class="changed_added_4_0"></p>
* @param baseClass the baseClass to set
*/
+ @Override
public void setBaseClass(ClassName baseClass) {
this.baseClass = baseClass;
}
- /**
- * <p class="changed_added_4_0"></p>
- * @return the baseClass
+ /* (non-Javadoc)
+ * @see org.richfaces.cdk.model.FacesComponent#getBaseClass()
*/
public ClassName getBaseClass() {
return baseClass;
Modified:
root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/model/Name.java
===================================================================
---
root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/model/Name.java 2010-05-07
21:31:29 UTC (rev 16937)
+++
root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/model/Name.java 2010-05-08
00:12:12 UTC (rev 16938)
@@ -93,7 +93,9 @@
/**
* <p class="changed_added_4_0"></p>
*/
- taglib;
+ taglib,
+
+ behavior;
}
/**
Modified:
root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/model/validator/ValidatorImpl.java
===================================================================
---
root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/model/validator/ValidatorImpl.java 2010-05-07
21:31:29 UTC (rev 16937)
+++
root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/model/validator/ValidatorImpl.java 2010-05-08
00:12:12 UTC (rev 16938)
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id$
*
* License Agreement.
*
@@ -21,21 +21,24 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
+package org.richfaces.cdk.model.validator;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.NoSuchElementException;
-package org.richfaces.cdk.model.validator;
-
-import com.google.common.base.Predicate;
-import com.google.common.collect.Iterables;
-import com.google.inject.Inject;
import org.richfaces.cdk.CdkException;
import org.richfaces.cdk.Logger;
import org.richfaces.cdk.ModelValidator;
import org.richfaces.cdk.NamingConventions;
import org.richfaces.cdk.apt.SourceUtils;
+import org.richfaces.cdk.model.BehaviorModel;
+import org.richfaces.cdk.model.ClassName;
import org.richfaces.cdk.model.ComponentLibrary;
import org.richfaces.cdk.model.ComponentModel;
import org.richfaces.cdk.model.DescriptionGroup;
+import org.richfaces.cdk.model.FacesComponent;
+import org.richfaces.cdk.model.FacesId;
import org.richfaces.cdk.model.FacetModel;
import org.richfaces.cdk.model.InvalidNameException;
import org.richfaces.cdk.model.PropertyBase;
@@ -43,16 +46,35 @@
import org.richfaces.cdk.model.RendererModel;
import org.richfaces.cdk.util.Strings;
-import java.util.Collection;
-import java.util.NoSuchElementException;
+import com.google.common.base.Predicate;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Sets;
+import com.google.inject.Inject;
/**
- * <p class="changed_added_4_0"></p>
+ * <p class="changed_added_4_0">
+ * </p>
+ *
* @author asmirnov(a)exadel.com
- *
+ *
*/
public class ValidatorImpl implements ModelValidator {
+ /**
+ * <p class="changed_added_4_0">
+ * </p>
+ *
+ * @author asmirnov(a)exadel.com
+ *
+ */
+ interface NamingConventionsCallback {
+
+ FacesId inferType(ClassName targetClass);
+
+ ClassName inferClass(FacesId id);
+
+ }
+
@Inject
private Logger log;
@@ -65,124 +87,189 @@
this.namingConventions = namingConventions;
this.sourceUtils = sourceUtils;
}
+
/*
- * (non-Javadoc)
+ * (non-Javadoc)
+ *
* @see
org.richfaces.cdk.ValidatorModel#verify(org.richfaces.cdk.model.ComponentLibrary)
*/
@Override
public void verify(ComponentLibrary library) throws CdkException {
+ verifyComponents(library);
+ verifyBehaviors(library);
verifyRenderers(library);
- verifyComponents(library);
+ }
- // After all, merge all similar elements.
- compact(library.getComponents());
+ /**
+ * <p class="changed_added_4_0">
+ * Verify all behaviors in the library.
+ * </p>
+ *
+ * @param library
+ */
+ protected void verifyBehaviors(ComponentLibrary library) {
+ for (BehaviorModel behavior : library.getBehaviors()) {
+ verifyTypes(behavior, new NamingConventionsCallback() {
+
+ @Override
+ public FacesId inferType(ClassName targetClass) {
+ // TODO Auto-generated method stub
+ return namingConventions.inferBehaviorType(targetClass);
+ }
+
+ @Override
+ public ClassName inferClass(FacesId id) {
+ // TODO Auto-generated method stub
+ return namingConventions.inferBehaviorClass(id);
+ }
+ });
+ }
}
+
protected void verifyRenderers(ComponentLibrary library) {
for (RenderKitModel.Id renderKitId : library.getRenderKits().keySet()) {
// Check render kit name and class.
RenderKitModel renderKit = library.getRenderKits().get(renderKitId);
for (RendererModel renderer : renderKit.getRenderers()) {
-
- vefifyRenderer(library,renderer);
- // Check type.
- // Check family.
- // Check generated class.
- // Check superclass.
- // Check component type.
+ vefifyRenderer(library, renderer);
}
- compact(renderKit.getRenderers());
}
}
- protected void vefifyRenderer(ComponentLibrary library,RendererModel renderer) {
- // TODO Auto-generated method stub
-
+ protected void vefifyRenderer(ComponentLibrary library, RendererModel renderer) {
+
+ // Check type.
+ // Check family.
+ // Check generated class.
+ // Check superclass.
+ // Check component type.
}
+
protected void verifyComponents(ComponentLibrary library) throws CdkException {
// Verify types and classes. Do it first to be sure what all all values are set
before second stage.
for (ComponentModel component : library.getComponents()) {
verifyComponentType(component);
}
- // Verify component attributes
+ // Verify component attributes
+ HashSet<ComponentModel> verified = Sets.newHashSet();
for (ComponentModel component : library.getComponents()) {
- verifyComponent(library,component);
+ verifyComponentAttributes(library, component, verified);
}
}
- protected void verifyComponent(ComponentLibrary library,final ComponentModel
component) {
- // Propagate attributes from parent component, if any.
- try {
- // Step one, lookup for parent.
- ComponentModel parentComponent = Iterables.find(library.getComponents(), new
Predicate<ComponentModel>() {
- @Override
- public boolean apply(ComponentModel input) {
- return component.getBaseClass().equals(input.getTargetClass());
+ /**
+ * <p class="changed_added_4_0">
+ * </p>
+ *
+ * @param library
+ * @param component
+ * @param verified
+ */
+ protected void verifyComponentAttributes(ComponentLibrary library, final
ComponentModel component,
+ Collection<ComponentModel> verified) {
+ // There is potential StackOverflow, so we process only components which have not
been
+ // verified before.
+ if (!verified.contains(component)) {
+ // Propagate attributes from parent component, if any.
+ verified.add(component);
+ if (null != component.getBaseClass()) {
+ try {
+ // Step one, lookup for parent.
+ ComponentModel parentComponent =
+ Iterables.find(library.getComponents(), new
Predicate<ComponentModel>() {
+
+ @Override
+ public boolean apply(ComponentModel input) {
+ return
component.getBaseClass().equals(input.getTargetClass());
+ }
+ });
+ // To be sure what all properties for parent component were
propagated.
+ verifyComponentAttributes(library, parentComponent, verified);
+ for (PropertyBase parentAttribute : parentComponent.getAttributes())
{
+ PropertyBase attribute =
component.getOrCreateAttribute(parentAttribute.getName());
+ // TODO - do not owerride properties ?
+ attribute.merge(parentAttribute);
+ // TODO Check generate status. Attribute should not be generated
if the parent component
+ // represents
+ // concrete class.
+ attribute.setGenerate(false);
+ }
+ } catch (NoSuchElementException e) {
+ // No parent component in the library
}
- });
- // To be sure what all properties for parent component were propagated.
- verifyComponent(library, parentComponent);
- for (PropertyBase parentAttribute : parentComponent.getAttributes()) {
- PropertyBase attribute =
component.getOrCreateAttribute(parentAttribute.getName());
- // TODO - do not owerride properties ?
- attribute.merge(parentAttribute);
- // TODO Check generate status. Attribute should not be generated if the
parent component represents concrete class.
- attribute.setGenerate(false);
+
+ } // Check attributes.
+ for (PropertyBase attribute : component.getAttributes()) {
+ verifyAttribute(attribute, component.isGenerate());
}
- } catch(NoSuchElementException e){
- // No parent component in the library
+ // compact(component.getAttributes());
+ // Check renderers.
+ // Check Tag
+ verifyDescription(component);
+ for (FacetModel facet : component.getFacets()) {
+ verifyDescription(facet);
+ }
}
- // Check attributes.
- for (PropertyBase attribute : component.getAttributes()) {
- verifyAttribute(attribute, component.isGenerate());
- }
- // compact(component.getAttributes());
- // Check renderers.
- // Check Tag
- verifyDescription(component);
- for (FacetModel facet : component.getFacets()) {
- verifyDescription(facet);
- }
}
+
/**
- * <p class="changed_added_4_0"></p>
+ * <p class="changed_added_4_0">
+ * </p>
+ *
* @param component
* @throws InvalidNameException
*/
protected void verifyComponentType(ComponentModel component) throws
InvalidNameException {
// Check JsfComponent type.
- if (null == component.getType()) {
+ if (verifyTypes(component, new NamingConventionsCallback() {
+
+ @Override
+ public FacesId inferType(ClassName targetClass) {
+ return namingConventions.inferComponentType(targetClass);
+ }
+
+ @Override
+ public ClassName inferClass(FacesId id) {
+ return namingConventions.inferUIComponentClass(id);
+ }
+ }) && null == component.getFamily()) {
+ // Check family.
+
component.setFamily(namingConventions.inferUIComponentFamily(component.getType()));
+ }
+ }
+
+ protected boolean verifyTypes(FacesComponent component, NamingConventionsCallback
callback) {
+ // Check JsfComponent type.
+ if (null == component.getId()) {
if (null != component.getTargetClass()) {
-
component.setType(namingConventions.inferComponentType(component.getTargetClass()));
+ component.setId(callback.inferType(component.getTargetClass()));
} else if (null != component.getBaseClass()) {
-
component.setType(namingConventions.inferComponentType(component.getBaseClass()));
+ component.setId(callback.inferType(component.getBaseClass()));
} else {
// No clue for component type, log error and return.
log.error("No type information available for component: " +
component);
- return;
+ return false;
}
}
// Check classes.
if (component.isGenerate()) {
if (null == component.getBaseClass()) {
- log.error("Base class for generated component is not set :" +
component.getType());
-// return;
+ log.error("Base class for generated component is not set :" +
component.getId());
+ // return;
} else if (null == component.getTargetClass()) {
-
component.setTargetClass(namingConventions.inferUIComponentClass(component.getType()));
+ component.setTargetClass(callback.inferClass(component.getId()));
}
} else if (null == component.getTargetClass()) {
if (null != component.getBaseClass()) {
component.setTargetClass(component.getBaseClass());
} else {
log.error("No class information available for component: " +
component);
-// return;
+ return false;
}
}
- // Check family.
- if (null == component.getFamily()) {
-
component.setFamily(namingConventions.inferUIComponentFamily(component.getType()));
- }
+ return true;
}
protected void verifyAttribute(PropertyBase attribute, boolean generatedComponent) {
@@ -191,7 +278,8 @@
log.error("No name for attribute " + attribute);
return;
}
- if (attribute.getName().contains(".") ||
Character.isDigit(attribute.getName().charAt(0)) || attribute.getName().contains("
")) {
+ if (attribute.getName().contains(".") ||
Character.isDigit(attribute.getName().charAt(0))
+ || attribute.getName().contains(" ")) {
log.error("Invalid attribute name [" + attribute.getName() +
"]");
return;
}
@@ -209,23 +297,15 @@
}
// Check "generate" flag.
if (generatedComponent) {
- // TODO Attribute should be only generated if it does not exist or abstract in
the base class.
- // Step one - check base class
+ // TODO Attribute should be only generated if it does not exist or abstract
in the base class.
+ // Step one - check base class
} else {
attribute.setGenerate(false);
}
verifyDescription(attribute);
}
-
+
protected void verifyDescription(DescriptionGroup element) {
-
- }
-
- protected void compact(Collection<?> collection) {
-// if (collection instanceof ModelCollection) {
-// ModelCollection model = (ModelCollection) collection;
-// model.mergeKeys();
-// }
}
}
Modified:
root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/xmlconfig/model/BehaviorRendererBean.java
===================================================================
---
root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/xmlconfig/model/BehaviorRendererBean.java 2010-05-07
21:31:29 UTC (rev 16937)
+++
root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/xmlconfig/model/BehaviorRendererBean.java 2010-05-08
00:12:12 UTC (rev 16938)
@@ -30,6 +30,7 @@
import org.richfaces.cdk.model.ClassName;
import org.richfaces.cdk.model.ComponentLibrary;
import org.richfaces.cdk.model.ConfigExtension;
+import org.richfaces.cdk.model.FacesId;
/**
* <p class="changed_added_4_0"></p>
@@ -38,46 +39,46 @@
*/
@XmlType(name = "faces-config-client-behavior-rendererType", namespace =
ComponentLibrary.FACES_CONFIG_NAMESPACE)
public class BehaviorRendererBean {
- private ClassName rendererClass;
- private String type;
+ private ClassName targetClass;
+ private FacesId id;
/**
* <p class="changed_added_4_0"></p>
*
- * @return the type
+ * @return the id
*/
- @XmlElement(name = "client-behavior-renderer-type", namespace =
ComponentLibrary.FACES_CONFIG_NAMESPACE)
- public String getType() {
- return type;
+ @XmlElement(name = "client-behavior-renderer-id", namespace =
ComponentLibrary.FACES_CONFIG_NAMESPACE)
+ public FacesId getId() {
+ return id;
}
/**
* <p class="changed_added_4_0"></p>
*
- * @param type the type to set
+ * @param id the id to set
*/
- public void setType(String type) {
- this.type = type;
+ public void setId(FacesId type) {
+ this.id = type;
}
/**
* <p class="changed_added_4_0"></p>
*
- * @return the rendererClass
+ * @return the targetClass
*/
@XmlElement(name = "client-behavior-renderer-class", namespace =
ComponentLibrary.FACES_CONFIG_NAMESPACE)
@XmlJavaTypeAdapter(ClassAdapter.class)
- public ClassName getRendererClass() {
- return rendererClass;
+ public ClassName getTargetClass() {
+ return targetClass;
}
/**
* <p class="changed_added_4_0"></p>
*
- * @param rendererClass the rendererClass to set
+ * @param targetClass the targetClass to set
*/
- public void setRendererClass(ClassName rendererClass) {
- this.rendererClass = rendererClass;
+ public void setTargetClass(ClassName rendererClass) {
+ this.targetClass = rendererClass;
}
/**
@@ -86,6 +87,24 @@
* @author asmirnov(a)exadel.com
*/
public static class BehaviorRendererExtension extends ConfigExtension {
+ private ClassName baseClass;
+
+ /**
+ * <p class="changed_added_4_0"></p>
+ * @return the baseClass
+ */
+ public ClassName getBaseClass() {
+ return this.baseClass;
+ }
+
+ /**
+ * <p class="changed_added_4_0"></p>
+ * @param baseClass the baseClass to set
+ */
+ public void setBaseClass(ClassName baseClass) {
+ this.baseClass = baseClass;
+ }
+
}
/**
Modified:
root/cdk/trunk/plugins/generator/src/test/java/org/richfaces/cdk/apt/CdkProcessorTest.java
===================================================================
---
root/cdk/trunk/plugins/generator/src/test/java/org/richfaces/cdk/apt/CdkProcessorTest.java 2010-05-07
21:31:29 UTC (rev 16937)
+++
root/cdk/trunk/plugins/generator/src/test/java/org/richfaces/cdk/apt/CdkProcessorTest.java 2010-05-08
00:12:12 UTC (rev 16938)
@@ -23,39 +23,38 @@
package org.richfaces.cdk.apt;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableSet;
-import com.google.inject.Binder;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import com.google.inject.TypeLiteral;
-import static org.easymock.EasyMock.createMock;
-import static org.easymock.EasyMock.expect;
-import static org.easymock.EasyMock.expectLastCall;
-import static org.easymock.EasyMock.replay;
-import static org.easymock.EasyMock.verify;
+import static org.easymock.EasyMock.*;
+
+import java.util.Collections;
+import java.util.Set;
+
+import javax.annotation.processing.Processor;
+import javax.annotation.processing.RoundEnvironment;
+import javax.lang.model.element.ElementKind;
+import javax.lang.model.element.TypeElement;
+
import org.junit.Test;
import org.junit.runner.RunWith;
import org.richfaces.cdk.CdkTestRunner;
import org.richfaces.cdk.FileManager;
import org.richfaces.cdk.LibraryBuilder;
+import org.richfaces.cdk.Logger;
import org.richfaces.cdk.Mock;
import org.richfaces.cdk.ModelBuilder;
import org.richfaces.cdk.ModelValidator;
import org.richfaces.cdk.Output;
import org.richfaces.cdk.Outputs;
import org.richfaces.cdk.Stub;
-import org.richfaces.cdk.Logger;
+import org.richfaces.cdk.apt.processors.AnnotationProcessorTest;
import org.richfaces.cdk.apt.processors.CdkAnnotationProcessor;
-import org.richfaces.cdk.apt.processors.AnnotationProcessorTest;
import org.richfaces.cdk.model.ComponentLibrary;
-import javax.annotation.processing.Processor;
-import javax.annotation.processing.RoundEnvironment;
-import javax.lang.model.element.ElementKind;
-import javax.lang.model.element.TypeElement;
-import java.util.Collections;
-import java.util.Set;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+import com.google.inject.Binder;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import com.google.inject.TypeLiteral;
/**
* <p class="changed_added_4_0">
@@ -123,9 +122,11 @@
public void testProcess() throws Exception {
expect(roundEnv.processingOver()).andReturn(false);
expect((Class<TestAnnotation2>)
cdkProcessor.getProcessedAnnotation()).andStubReturn(TestAnnotation2.class);
- expect((Set<TypeElement>)
roundEnv.getElementsAnnotatedWith(TestAnnotation2.class)).andReturn(
+ expect((Set<TypeElement>) roundEnv.getRootElements()).andReturn(
Collections.singleton(element));
expect(element.getKind()).andReturn(ElementKind.CLASS);
+ TestAnnotation2 testAnnotation2 = createNiceMock(TestAnnotation2.class);
+ expect(element.getAnnotation(TestAnnotation2.class)).andReturn(testAnnotation2);
cdkProcessor.process(element, library);
expectLastCall();
validator.verify(library);
@@ -161,8 +162,10 @@
public void testProcess3() throws Exception {
expect(roundEnv.processingOver()).andReturn(false);
expect((Class<TestAnnotation>)
cdkProcessor.getProcessedAnnotation()).andStubReturn(TestAnnotation.class);
- expect((Set<TypeElement>)
roundEnv.getElementsAnnotatedWith(TestAnnotation.class)).andReturn(
- Collections.<TypeElement> emptySet());
+ expect((Set<TypeElement>) roundEnv.getRootElements()).andReturn(
+ Collections.singleton(element));
+ expect(element.getKind()).andReturn(ElementKind.CLASS);
+ expect(element.getAnnotation(TestAnnotation.class)).andReturn(null);
validator.verify(library);
expectLastCall();
replay(element, roundEnv, builder, validator, cdkProcessor);