Author: alexsmirnov
Date: 2010-05-24 18:53:06 -0400 (Mon, 24 May 2010)
New Revision: 17223
Added:
root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/generate/java/EventSourceInterfaceGenerator.java
root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/generate/java/taghandler/ListenerTagHandlerGenerator.java
root/cdk/trunk/plugins/generator/src/main/resources/META-INF/templates/sourceInterface.ftl
Modified:
root/cdk/trunk/plugins/annotations/src/main/java/org/richfaces/cdk/annotations/Event.java
root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/apt/processors/EventProcessor.java
root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/generate/java/ClassGeneratorModule.java
root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/generate/java/taghandler/TagHandlerGeneratorVisitor.java
root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/model/EventModel.java
root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/model/validator/ValidatorImpl.java
root/cdk/trunk/plugins/maven-cdk-plugin/src/it/annotated-component/src/main/java/org/richfaces/cdk/test/component/AbstractTestComponent.java
Log:
CODING IN PROGRESS - issue RF-7789: Process JSF events.
https://jira.jboss.org/browse/RF-7789
Modified:
root/cdk/trunk/plugins/annotations/src/main/java/org/richfaces/cdk/annotations/Event.java
===================================================================
---
root/cdk/trunk/plugins/annotations/src/main/java/org/richfaces/cdk/annotations/Event.java 2010-05-24
22:46:49 UTC (rev 17222)
+++
root/cdk/trunk/plugins/annotations/src/main/java/org/richfaces/cdk/annotations/Event.java 2010-05-24
22:53:06 UTC (rev 17223)
@@ -59,13 +59,11 @@
public Class<? extends FacesListener> listener();
/**
- * <p class="changed_added_4_0">
- * Name of the class that implements listener interface and wraps binding to the
actual instance or process method.
- * </p>
- *
- * @return name of generated listener interface..
+ * <p class="changed_added_4_0">Name for the listener interface
method that process annotated event type.</p>
+ * @return
*/
- public String listenerWrapper() default "";
+ public String listenerMethod() default "";
+
/**
* <p class="changed_added_4_0">
* Name of the interface class that fires annotated events and accepts its
listeners.
@@ -82,6 +80,6 @@
*
* @return
*/
- public Tag[] tag() default { @Tag };
+ public Tag[] tag() default {};
}
Modified:
root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/apt/processors/EventProcessor.java
===================================================================
---
root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/apt/processors/EventProcessor.java 2010-05-24
22:46:49 UTC (rev 17222)
+++
root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/apt/processors/EventProcessor.java 2010-05-24
22:53:06 UTC (rev 17223)
@@ -68,8 +68,8 @@
} catch (MirroredTypeException mirror) {
model.setListenerInterface(ClassName.parseName(mirror.getTypeMirror().toString()));
}
+ model.setListenerMethodName(event.listenerMethod());
model.setSourceInterface(ClassName.parseName(event.source()));
- model.setListenerWrapper(ClassName.parseName(event.listenerWrapper()));
for (Tag tag : event.tag()) {
if(!TagType.None.equals(tag.type())){
model.getTags().add(processTag(tag));
Modified:
root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/generate/java/ClassGeneratorModule.java
===================================================================
---
root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/generate/java/ClassGeneratorModule.java 2010-05-24
22:46:49 UTC (rev 17222)
+++
root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/generate/java/ClassGeneratorModule.java 2010-05-24
22:53:06 UTC (rev 17223)
@@ -45,6 +45,7 @@
setBinder.addBinding().to(ConverterClassGenerator.class);
setBinder.addBinding().to(ValidatorClassGenerator.class);
setBinder.addBinding().to(BehaviorClassGenerator.class);
+ setBinder.addBinding().to(EventSourceInterfaceGenerator.class);
}
}
Added:
root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/generate/java/EventSourceInterfaceGenerator.java
===================================================================
---
root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/generate/java/EventSourceInterfaceGenerator.java
(rev 0)
+++
root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/generate/java/EventSourceInterfaceGenerator.java 2010-05-24
22:53:06 UTC (rev 17223)
@@ -0,0 +1,72 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright , 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.generate.java;
+
+import java.io.File;
+import java.util.Collection;
+
+import org.richfaces.cdk.CdkException;
+import org.richfaces.cdk.CdkWriter;
+import org.richfaces.cdk.FileManager;
+import org.richfaces.cdk.Output;
+import org.richfaces.cdk.Outputs;
+import org.richfaces.cdk.generate.freemarker.FreeMarkerRenderer;
+import org.richfaces.cdk.model.ComponentLibrary;
+import org.richfaces.cdk.model.EventModel;
+
+import com.google.inject.Inject;
+
+import freemarker.template.Configuration;
+
+/**
+ * @author asmirnov
+ * @since Jan 20, 2010
+ */
+public class EventSourceInterfaceGenerator extends FreeMarkerRenderer<EventModel>
implements CdkWriter {
+
+ @Inject
+ public EventSourceInterfaceGenerator(Configuration configuration, ComponentLibrary
library,
+ @Output(Outputs.JAVA_CLASSES) FileManager output) {
+ super(configuration, library, output);
+ }
+
+ @Override
+ public void render() throws CdkException {
+ Collection<EventModel> models = library.getEvents();
+ for (EventModel model : models) {
+ if (model.isGenerateSource()) {
+ this.generate(model);
+ }
+ }
+ }
+
+ @Override
+ protected String getOutputFile(EventModel c) throws CdkException {
+ return c.getSourceInterface().getName().replace('.', File.separatorChar)
+ ".java";
+ }
+
+ @Override
+ protected String getTemplateName() {
+ return "sourceInterface.ftl";
+ }
+}
Property changes on:
root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/generate/java/EventSourceInterfaceGenerator.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added:
root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/generate/java/taghandler/ListenerTagHandlerGenerator.java
===================================================================
---
root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/generate/java/taghandler/ListenerTagHandlerGenerator.java
(rev 0)
+++
root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/generate/java/taghandler/ListenerTagHandlerGenerator.java 2010-05-24
22:53:06 UTC (rev 17223)
@@ -0,0 +1,80 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright , 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.generate.java.taghandler;
+
+import java.io.File;
+import java.util.Collection;
+
+import org.richfaces.cdk.CdkException;
+import org.richfaces.cdk.CdkWriter;
+import org.richfaces.cdk.FileManager;
+import org.richfaces.cdk.Output;
+import org.richfaces.cdk.Outputs;
+import org.richfaces.cdk.annotations.TagType;
+import org.richfaces.cdk.generate.freemarker.FreeMarkerRenderer;
+import org.richfaces.cdk.model.ComponentLibrary;
+import org.richfaces.cdk.model.EventModel;
+import org.richfaces.cdk.model.TagModel;
+
+import com.google.inject.Inject;
+
+import freemarker.template.Configuration;
+
+/**
+ * @author akolonitsky
+ * @since Jan 20, 2010
+ */
+public class ListenerTagHandlerGenerator extends FreeMarkerRenderer<TagModel>
implements CdkWriter {
+
+ @Inject
+ public ListenerTagHandlerGenerator(Configuration configuration, ComponentLibrary
library,
+ @Output(Outputs.JAVA_CLASSES) FileManager output) {
+ super(configuration, library, output);
+ }
+
+ @Override
+ public void render() throws CdkException {
+ Collection<EventModel> models = library.getEvents();
+ for (EventModel model : models) {
+ for (TagModel tag : model.getTags()) {
+ if ((TagType.All.equals(tag.getType()) ||
TagType.Facelets.equals(tag.getType())) && tag.isGenerate()) {
+ process(model,tag);
+ }
+ }
+ }
+ }
+
+ protected void process(EventModel model, TagModel tag) {
+
+ }
+
+ @Override
+ protected String getOutputFile(TagModel c) throws CdkException {
+ return c.getTargetClass().getName().replace('.', File.separatorChar) +
".java";
+ }
+
+ @Override
+ protected String getTemplateName() {
+ return "listenerTagHandler.ftl";
+ }
+}
Property changes on:
root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/generate/java/taghandler/ListenerTagHandlerGenerator.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Modified:
root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/generate/java/taghandler/TagHandlerGeneratorVisitor.java
===================================================================
---
root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/generate/java/taghandler/TagHandlerGeneratorVisitor.java 2010-05-24
22:46:49 UTC (rev 17222)
+++
root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/generate/java/taghandler/TagHandlerGeneratorVisitor.java 2010-05-24
22:53:06 UTC (rev 17223)
@@ -22,6 +22,7 @@
package org.richfaces.cdk.generate.java.taghandler;
+import org.richfaces.cdk.annotations.TagType;
import org.richfaces.cdk.model.BehaviorModel;
import org.richfaces.cdk.model.ComponentModel;
import org.richfaces.cdk.model.ConverterModel;
@@ -68,10 +69,11 @@
generateTagHandler(model);
return null;
}
+
private void generateTagHandler(ModelElementBase model) {
for (TagModel tag : model.getTags()) {
- if (tag.isGenerate()) {
+ if ((TagType.All.equals(tag.getType()) ||
TagType.Facelets.equals(tag.getType())) && tag.isGenerate()) {
tagGenerator.process(model,tag);
}
}
Modified:
root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/model/EventModel.java
===================================================================
---
root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/model/EventModel.java 2010-05-24
22:46:49 UTC (rev 17222)
+++
root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/model/EventModel.java 2010-05-24
22:53:06 UTC (rev 17223)
@@ -44,8 +44,10 @@
public class EventModel implements ModelElement<EventModel> {
private String description;
private ClassName listenerInterface;
- private ClassName listenerWrapper;
+ private String listenerMethodName;
+ private boolean generateListener;
private ClassName sourceInterface;
+ private boolean generateSource;
private final ModelCollection<TagModel> tags =
ModelSet.<TagModel>create();
/**
@@ -58,6 +60,7 @@
* <p class="changed_added_4_0"></p>
* @return the description
*/
+ @Merge
public String getDescription() {
return description;
}
@@ -90,6 +93,7 @@
* <p class="changed_added_4_0"></p>
* @return the listenerInterface
*/
+ @Merge
public ClassName getListenerInterface() {
return listenerInterface;
}
@@ -104,8 +108,43 @@
/**
* <p class="changed_added_4_0"></p>
+ * @return the listenerMethodName
+ */
+ @Merge
+ public String getListenerMethodName() {
+ return this.listenerMethodName;
+ }
+
+ /**
+ * <p class="changed_added_4_0"></p>
+ * @param listenerMethodName the listenerMethodName to set
+ */
+ public void setListenerMethodName(String listenerMethodName) {
+ this.listenerMethodName = listenerMethodName;
+ }
+
+ /**
+ * <p class="changed_added_4_0"></p>
+ * @return the generateListener
+ */
+ @Merge
+ public boolean isGenerateListener() {
+ return this.generateListener;
+ }
+
+ /**
+ * <p class="changed_added_4_0"></p>
+ * @param generateListener the generateListener to set
+ */
+ public void setGenerateListener(boolean generateListener) {
+ this.generateListener = generateListener;
+ }
+
+ /**
+ * <p class="changed_added_4_0"></p>
* @return the sourceInterface
*/
+ @Merge
public ClassName getSourceInterface() {
return sourceInterface;
}
@@ -120,19 +159,19 @@
/**
* <p class="changed_added_4_0"></p>
- * @return the listenerWrapper
+ * @return the generateSource
*/
@Merge
- public ClassName getListenerWrapper() {
- return this.listenerWrapper;
+ public boolean isGenerateSource() {
+ return this.generateSource;
}
/**
* <p class="changed_added_4_0"></p>
- * @param listenerWrapper the listenerWrapper to set
+ * @param generateSource the generateSource to set
*/
- public void setListenerWrapper(ClassName listenerWrapper) {
- this.listenerWrapper = listenerWrapper;
+ public void setGenerateSource(boolean generateSource) {
+ this.generateSource = generateSource;
}
/**
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-24
22:46:49 UTC (rev 17222)
+++
root/cdk/trunk/plugins/generator/src/main/java/org/richfaces/cdk/model/validator/ValidatorImpl.java 2010-05-24
22:53:06 UTC (rev 17223)
@@ -42,6 +42,7 @@
import org.richfaces.cdk.model.ComponentLibrary;
import org.richfaces.cdk.model.ComponentModel;
import org.richfaces.cdk.model.DescriptionGroup;
+import org.richfaces.cdk.model.EventModel;
import org.richfaces.cdk.model.FacesComponent;
import org.richfaces.cdk.model.FacesId;
import org.richfaces.cdk.model.FacetModel;
@@ -71,6 +72,7 @@
public static final ClassName DEFAULT_VALIDATOR_HANDLER = new
ClassName(ValidatorHandler.class);
public static final ClassName DEFAULT_CONVERTER_HANDLER = new
ClassName(ConverterHandler.class);
public static final ClassName DEFAULT_BEHAVIOR_HANDLER = new
ClassName(BehaviorHandler.class);
+
/**
* <p class="changed_added_4_0">
* </p>
@@ -107,31 +109,59 @@
@Override
public void verify(ComponentLibrary library) throws CdkException {
verifyComponents(library);
+ verifyEvents(library);
verifyBehaviors(library);
verifyRenderers(library);
verifyTaglib(library);
}
+ protected void verifyEvents(ComponentLibrary library) {
+ for (EventModel event : library.getEvents()) {
+ ClassName listenerInterface = event.getListenerInterface();
+ if (null == listenerInterface) {
+ // TODO - infer listener interface name.
+ }
+ event.setGenerateListener(null ==
sourceUtils.asTypeElement(listenerInterface));
+ String methodName = event.getListenerMethodName();
+ if (null == methodName) {
+ // TODO infer listener method name.
+ }
+ ClassName sourceInterface = event.getSourceInterface();
+ if (null == sourceInterface) {
+ // TODO - infer source interface.
+ }
+ event.setGenerateSource(null == sourceUtils.asTypeElement(sourceInterface));
+ // Propagate event to corresponding components.
+ for (ComponentModel component : library.getComponents()) {
+ for (EventModel componentEvent : component.getEvents()) {
+ if (event.getType().equals(componentEvent.getType())) {
+ componentEvent.merge(event);
+ }
+ }
+ }
+ }
+ }
+
protected void verifyTaglib(ComponentLibrary library) {
Taglib taglib = library.getTaglib();
- if(null == taglib){
+ if (null == taglib) {
// Oops, create taglib model
taglib = new Taglib();
library.setTaglib(taglib);
}
// Verify URI
String uri = taglib.getUri();
- if(null == uri){
+ if (null == uri) {
// infer default value.
uri = namingConventions.inferTaglibUri(library);
taglib.setUri(uri);
-// log.error("No uri defined for taglib");
+ // log.error("No uri defined for taglib");
}
String shortName = taglib.getShortName();
- if(null == shortName){
+ if (null == shortName) {
shortName = namingConventions.inferTaglibName(uri);
taglib.setShortName(shortName);
-// log.error("No short defined for taglib");
+ // log.error("No short defined for taglib");
}
}
@@ -158,14 +188,13 @@
return namingConventions.inferBehaviorClass(id);
}
});
- for(TagModel tag : behavior.getTags()){
+ for (TagModel tag : behavior.getTags()) {
verifyTag(tag, behavior.getId(), DEFAULT_BEHAVIOR_HANDLER);
}
}
}
-
protected void verifyRenderers(ComponentLibrary library) {
for (RenderKitModel renderKit : library.getRenderKits()) {
// Check render kit name and class.
@@ -245,7 +274,7 @@
// compact(component.getAttributes());
// Check renderers.
// Check Tag
- for(TagModel tag : component.getTags()){
+ for (TagModel tag : component.getTags()) {
verifyTag(tag, component.getId(), DEFAULT_COMPONENT_HANDLER);
}
verifyDescription(component);
@@ -256,16 +285,16 @@
}
protected void verifyTag(TagModel tag, FacesId id, ClassName handler) {
- if(Strings.isEmpty(tag.getName())){
+ if (Strings.isEmpty(tag.getName())) {
String defaultTagName = namingConventions.inferTagName(id);
tag.setName(defaultTagName);
}
- if(tag.isGenerate()){
- if(null == tag.getBaseClass()){
+ if (tag.isGenerate()) {
+ if (null == tag.getBaseClass()) {
// TODO - choose default handler class by tag type.
- tag.setBaseClass(handler);
+ tag.setBaseClass(handler);
}
- if(null == tag.getTargetClass()){
+ if (null == tag.getTargetClass()) {
namingConventions.inferTagHandlerClass(id, tag.getType().toString());//
TODO - get markup somethere.
}
}
Added:
root/cdk/trunk/plugins/generator/src/main/resources/META-INF/templates/sourceInterface.ftl
===================================================================
---
root/cdk/trunk/plugins/generator/src/main/resources/META-INF/templates/sourceInterface.ftl
(rev 0)
+++
root/cdk/trunk/plugins/generator/src/main/resources/META-INF/templates/sourceInterface.ftl 2010-05-24
22:53:06 UTC (rev 17223)
@@ -0,0 +1,43 @@
+<#include "_copyright.ftl">
+
+package ${sourceInterface.package};
+
+import javax.annotation.Generated;
+import ${listenerInterface};
+
+/**
+ * ${description?if_exists}
+ **/
+@Generated({"RichFaces CDK", "4.0.0-SNAPSHOT"})
+public interface ${sourceInterface.simpleName} {
+
+ /**
+ * <p>Add a new {@link ${listenerInterface.simpleName}} to the set of listeners
interested
+ * in being notified when {@link ${type}}s occur.</p>
+ *
+ * @param listener The {@link ${listenerInterface.simpleName}} to be added
+ *
+ * @throws NullPointerException if <code>listener</code>
+ * is <code>null</code>
+ */
+ public void add${listenerInterface.simpleName}(${listenerInterface.simpleName}
listener);
+
+ /**
+ * <p>Remove an existing {@link ${listenerInterface.simpleName}} (if any) from
the set of
+ * listeners interested in being notified when {@link ${type}}s
+ * occur.</p>
+ *
+ * @param listener The {@link ${listenerInterface.simpleName}} to be removed
+ *
+ * @throws NullPointerException if <code>listener</code>
+ * is <code>null</code>
+ */
+ public void remove${listenerInterface.simpleName}(${listenerInterface.simpleName}
listener);
+
+ /**
+ * <p>Return the array of registered {@link ${listenerInterface.simpleName}}s
for this instance. If there are no registered listeners,
+ * a zero-length array is returned.</p>
+ */
+ public ${listenerInterface.simpleName}[] get${listenerInterface.simpleName}s();
+
+}
\ No newline at end of file
Modified:
root/cdk/trunk/plugins/maven-cdk-plugin/src/it/annotated-component/src/main/java/org/richfaces/cdk/test/component/AbstractTestComponent.java
===================================================================
---
root/cdk/trunk/plugins/maven-cdk-plugin/src/it/annotated-component/src/main/java/org/richfaces/cdk/test/component/AbstractTestComponent.java 2010-05-24
22:46:49 UTC (rev 17222)
+++
root/cdk/trunk/plugins/maven-cdk-plugin/src/it/annotated-component/src/main/java/org/richfaces/cdk/test/component/AbstractTestComponent.java 2010-05-24
22:53:06 UTC (rev 17223)
@@ -55,7 +55,7 @@
components={
@SubComponent(type = "org.richfaces.cdk.test.TestHtmlAbbr",
description=@Description(displayName="Test HTML5
abbreviation",largeIcon="large.gif",smallIcon="spall.png"),
- tag=@Tag(name="abbr"),
+
tag=(a)Tag(name="abbr",generate=true,handler="org.richfaces.cdk.test.facelets.AbbrTagHandler"),
generate="org.richfaces.cdk.test.component.html.HtmlTestAbbr",
interfaces=Html5Attributes.class,
renderer=(a)JsfRenderer(type="org.richfaces.cdk.test.HtmlAbbrRenderer")),