From adffaces-commits-return-1164-apmail-incubator-adffaces-commits-archive=incubator.apache.org@incubator.apache.org Sun Oct 29 17:32:44 2006 Return-Path: Delivered-To: apmail-incubator-adffaces-commits-archive@locus.apache.org Received: (qmail 86348 invoked from network); 29 Oct 2006 17:32:44 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.2) by minotaur.apache.org with SMTP; 29 Oct 2006 17:32:44 -0000 Received: (qmail 88398 invoked by uid 500); 29 Oct 2006 17:32:55 -0000 Delivered-To: apmail-incubator-adffaces-commits-archive@incubator.apache.org Received: (qmail 88331 invoked by uid 500); 29 Oct 2006 17:32:55 -0000 Mailing-List: contact adffaces-commits-help@incubator.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: adffaces-dev@incubator.apache.org Delivered-To: mailing list adffaces-commits@incubator.apache.org Delivered-To: moderator for adffaces-commits@incubator.apache.org Received: (qmail 55293 invoked by uid 99); 29 Oct 2006 16:50:33 -0000 X-ASF-Spam-Status: No, hits=0.6 required=10.0 tests=NO_REAL_NAME X-Spam-Check-By: apache.org Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r468935 [1/2] - in /incubator/adffaces/branches/myfaces-1_2-maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces: ./ generator/ parse/ util/ Date: Sun, 29 Oct 2006 16:49:56 -0000 To: adffaces-commits@incubator.apache.org From: baranda@apache.org X-Mailer: svnmailer-1.1.0 Message-Id: <20061029164956.B2B511A9846@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: baranda Date: Sun Oct 29 08:49:55 2006 New Revision: 468935 URL: http://svn.apache.org/viewvc?view=rev&rev=468935 Log: First refactoring of the code to adapt the plugin to be able to create the myfaces components. A new ComponentGenerator interface with implementations has been created to allow the possibility of having different component generators (e.g. myfaces, trinidad...) Added: incubator/adffaces/branches/myfaces-1_2-maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/generator/ incubator/adffaces/branches/myfaces-1_2-maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/generator/AbstractComponentGenerator.java (with props) incubator/adffaces/branches/myfaces-1_2-maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/generator/ComponentGenerator.java (with props) incubator/adffaces/branches/myfaces-1_2-maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/generator/MyFacesComponentGenerator.java (with props) incubator/adffaces/branches/myfaces-1_2-maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/generator/TrinidadComponentGenerator.java (with props) Modified: incubator/adffaces/branches/myfaces-1_2-maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/AbstractFacesMojo.java incubator/adffaces/branches/myfaces-1_2-maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/GenerateComponentsMojo.java incubator/adffaces/branches/myfaces-1_2-maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/parse/ComponentBean.java incubator/adffaces/branches/myfaces-1_2-maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/parse/PropertyBean.java incubator/adffaces/branches/myfaces-1_2-maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/util/Util.java Modified: incubator/adffaces/branches/myfaces-1_2-maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/AbstractFacesMojo.java URL: http://svn.apache.org/viewvc/incubator/adffaces/branches/myfaces-1_2-maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/AbstractFacesMojo.java?view=diff&rev=468935&r1=468934&r2=468935 ============================================================================== --- incubator/adffaces/branches/myfaces-1_2-maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/AbstractFacesMojo.java (original) +++ incubator/adffaces/branches/myfaces-1_2-maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/AbstractFacesMojo.java Sun Oct 29 08:49:55 2006 @@ -17,6 +17,8 @@ import java.io.File; import java.io.IOException; +import java.io.BufferedReader; +import java.io.FileReader; import java.net.MalformedURLException; import java.net.URL; @@ -30,6 +32,9 @@ import java.util.LinkedList; import java.util.List; import java.util.Set; +import java.util.GregorianCalendar; +import java.util.Calendar; +import java.sql.Date; import javax.xml.namespace.QName; import javax.xml.parsers.ParserConfigurationException; @@ -190,25 +195,69 @@ return false; } + /** + * @deprecated call Util.convertStringToLiteral instead + */ protected String convertStringToLiteral(String value) { - return convertStringToLiteral("String", value); + return Util.convertStringToLiteral("String", value); } + /** + * @deprecated call Util.convertStringToLiteral instead + */ protected String convertStringToLiteral(String className, String value) { - if (value == null) + return Util.convertStringToLiteral(className, value); + } + + protected String readLicenseHeader() throws MojoExecutionException + { + if (licenseHeaderFile == null) { - return null; + return _DEFAULT_LICENSE_HEADER; } - else if ("String".equals(className)) + + if (!licenseHeaderFile.exists()) { - return "\"" + value.replaceAll("\'", "\\'") + "\""; + throw new MojoExecutionException("License header file not found: " + +licenseHeaderFile.getName()); } - else + + if (licenseHeaderFile.isDirectory()) { - return value; + throw new MojoExecutionException("Expecting a file and found a directory: " + +licenseHeaderFile.getName()); } + + StringBuffer sb = new StringBuffer(); + + try + { + BufferedReader reader = new BufferedReader(new FileReader(licenseHeaderFile)); + String line; + + while ((line = reader.readLine()) != null) + { + sb.append(line+"\n"); + } + } + catch (IOException e) + { + throw new MojoExecutionException("Exception reading license header file", e); + } + + return sb.toString(); + } + + protected String getLicenseHeader() throws MojoExecutionException + { + if (_licenseHeader == null) + { + _licenseHeader = readLicenseHeader(); + } + + return _licenseHeader; } static public class URLCreationFactory extends AbstractObjectCreationFactory @@ -258,10 +307,10 @@ } protected void writePreamble( - PrettyWriter out) + PrettyWriter out) throws MojoExecutionException { out.write(_AUTO_GENERATE_WARNING); - out.write(_COPYRIGHT); + out.write(getLicenseHeader()); } protected void copyFile( @@ -290,27 +339,15 @@ } } + /** + * @deprecated use Util.writeImports instead + */ protected void writeImports( PrettyWriter out, String packageName, Set imports) { - Iterator iterator = imports.iterator(); - iterator = new FilteredIterator(iterator, - new PackageImportsFilter(packageName)); - while (iterator.hasNext()) - { - String className = (String)iterator.next(); - out.println("import " + className + ";"); - } - - out.println(); - } - - protected String convertMultilineComment( - String commentBody) - { - return commentBody.replaceAll("\n", "\n * "); + Util.writeImports(out,packageName,imports); } private ClassLoader createCompileClassLoader( @@ -573,34 +610,35 @@ } } - static private class PackageImportsFilter implements Filter - { - public PackageImportsFilter( - String packageName) - { - _packageName = packageName; - } - - public boolean accept( - Object object) - { - String className = (String)object; - String packageName = Util.getPackageFromFullClass(className); - return (!packageName.equals(_packageName) && - !packageName.equals("java.lang")); - } - - private final String _packageName; - } + /** + * @parameter + */ + private File licenseHeaderFile; private FacesConfigBean _facesConfig; + private String _licenseHeader; static final private String _AUTO_GENERATE_WARNING = "// WARNING: This file was automatically generated. Do not edit it directly,\n"+ "// or you will lose your changes.\n\n"; - static private final String _COPYRIGHT = -"/*\n" + -"** (TBD - insert proper license in generated code).\n" + -"*/\n"; + + static private final int _CURRENT_YEAR = new GregorianCalendar().get(Calendar.YEAR); + + static final private String _DEFAULT_LICENSE_HEADER = + "/*\n" + + "* Copyright "+_CURRENT_YEAR+" The Apache Software Foundation.\n" + + "*\n" + + "* Licensed under the Apache License, Version 2.0 (the \"License\");\n" + + "* you may not use this file except in compliance with the License.\n" + + "* You may obtain a copy of the License at\n" + + "*\n" + + "* http://www.apache.org/licenses/LICENSE-2.0\n" + + "*\n" + + "* Unless required by applicable law or agreed to in writing, software\n" + + "* distributed under the License is distributed on an \"AS IS\" BASIS,\n" + + "* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n" + + "* See the License for the specific language governing permissions and\n" + + "* limitations under the License.\n" + + "*/\n"; } Modified: incubator/adffaces/branches/myfaces-1_2-maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/GenerateComponentsMojo.java URL: http://svn.apache.org/viewvc/incubator/adffaces/branches/myfaces-1_2-maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/GenerateComponentsMojo.java?view=diff&rev=468935&r1=468934&r2=468935 ============================================================================== --- incubator/adffaces/branches/myfaces-1_2-maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/GenerateComponentsMojo.java (original) +++ incubator/adffaces/branches/myfaces-1_2-maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/GenerateComponentsMojo.java Sun Oct 29 08:49:55 2006 @@ -47,6 +47,9 @@ import org.apache.myfaces.trinidadbuild.plugin.faces.util.PropertyFilter; import org.apache.myfaces.trinidadbuild.plugin.faces.util.SourceTemplate; import org.apache.myfaces.trinidadbuild.plugin.faces.util.Util; +import org.apache.myfaces.trinidadbuild.plugin.faces.generator.ComponentGenerator; +import org.apache.myfaces.trinidadbuild.plugin.faces.generator.TrinidadComponentGenerator; +import org.apache.myfaces.trinidadbuild.plugin.faces.generator.MyFacesComponentGenerator; /** * @version $Id$ @@ -75,7 +78,7 @@ /** * Generates parsed components. */ - private void _generateComponents() throws IOException + private void _generateComponents() throws IOException, MojoExecutionException { // Make sure generated source directory // is added to compilation source path @@ -123,13 +126,24 @@ * @param component the parsed component metadata */ private void _generateComponent( - ComponentBean component) + ComponentBean component) throws MojoExecutionException { + ComponentGenerator generator; + String fullClassName = component.getComponentClass(); - + + if (component.isTrinidadComponent()) + { + generator = new TrinidadComponentGenerator(getLog()); + } + else + { + generator = new MyFacesComponentGenerator(getLog()); + } + try { - getLog().debug("Generating " + fullClassName); + getLog().debug("Generating " + fullClassName+", with generator: "+generator.getClass().getName()); String sourcePath = Util.convertClassToSourcePath(fullClassName, ".java"); File targetFile = new File(generatedSourceDirectory, sourcePath); @@ -189,21 +203,21 @@ out.println(); // imports - _writeImports(out, template, packageName, + generator.writeImports(out, template, packageName, fullSuperclassName, superclassName, component); // class - _writeClassBegin(out, className, superclassName, component, template); + generator.writeClassBegin(out, className, superclassName, component, template); // static final constants - _writePropertyValueConstants(out, component); - _writePropertyConstants(out, superclassName, component); - _writeFacetConstants(out, component); - _writeGenericConstants(out, componentFamily, componentType); + generator.writePropertyValueConstants(out, component); + generator.writePropertyConstants(out, superclassName, component); + generator.writeFacetConstants(out, component); + generator.writeGenericConstants(out, componentFamily, componentType); // public constructors and methods - _writeConstructor(out, component, Modifier.PUBLIC); + generator.writeConstructor(out, component, Modifier.PUBLIC); // insert template code if (template != null) @@ -212,24 +226,21 @@ template.close(); } - _writeFacetMethods(out, component); - _writePropertyMethods(out, component); + generator.writeFacetMethods(out, component); + + generator.writePropertyMethods(out, component); if (!suppressListenerMethods) - _writeListenerMethods(out, component); + generator.writeListenerMethods(out, component); - _writeGetFamily(out); + generator.writeGetFamily(out); // protected constructors and methods // TODO: reverse this order, to make protected constructor go first // for now we want consistency with previous code generation - _writeGetBeanType(out); - _writeConstructor(out, component, Modifier.PROTECTED); + generator.writeOther(out, component); - // static initializer - _writeTypeLock(out, component); - - _writeClassEnd(out); + generator.writeClassEnd(out); out.close(); @@ -251,1051 +262,6 @@ } } - private void _writeClassBegin( - PrettyWriter out, - String className, - String superclassName, - ComponentBean component, - SourceTemplate template) - { - out.println("/**"); - - // TODO: restore description (needs escaping?) -// String description = component.getDescription(); -// if (description != null) -// { -// out.println(" *"); -// out.println(" * " + convertMultilineComment(description)); -// } - - String longDescription = component.getLongDescription(); - if (longDescription != null) - { - out.println(" *"); - out.println(" * " + convertMultilineComment(longDescription)); - } - - if (component.hasEvents(true)) - { - // the events javadoc - out.println(" *"); - out.println(" *

Events:

"); - out.println(" * "); - out.println(" * "); - out.println(" * "); - out.println(" * "); - out.println(" * "); - out.println(" * "); - Iterator events = component.events(true); - while (events.hasNext()) - { - EventRefBean eventRef = (EventRefBean)events.next(); - EventBean event = eventRef.resolveEventType(); - if (event != null) - { - String eventClass = event.getEventClass(); - String[] eventPhases = eventRef.getEventDeliveryPhases(); - String eventDescription = event.getDescription(); - out.println(" * "); - out.println(" * "); - out.print(" * "); - out.println(" * "); - out.println(" * "); - } - } - out.println(" *
TypePhasesDescription
" + eventClass + ""); - if (eventPhases != null) - { - for (int i=0; i < eventPhases.length; i++) - { - if (i > 0) - out.print("
"); - out.print(eventPhases[i]); - } - } - out.println("
" + eventDescription + "
"); - } - - if (!component.hasChildren()) - { - out.println(" *

"); - out.println(" * It does not support any children."); - } - - out.println(" */"); - - // TODO: eliminate metadata - int modifiers = component.getComponentClassModifiers(); - String classStart = Modifier.toString(modifiers); - // TODO: use canonical ordering - classStart = classStart.replaceAll("public abstract", "abstract public"); - out.println(classStart + " class " + className + - " extends " + superclassName); - - Set interfaces = new HashSet(); - if (template != null) - interfaces.addAll(template.getImplements()); - - if (component.isNamingContainer()) - interfaces.add("javax.faces.component.NamingContainer"); - - Iterator events = component.events(); - while (events.hasNext()) - { - EventRefBean eventRef = (EventRefBean)events.next(); - EventBean event = eventRef.resolveEventType(); - if (event != null) - { - if (!eventRef.isIgnoreSourceInterface()) - { - String source = event.getEventSourceInterface(); - if (source != null) - interfaces.add(Util.getClassFromFullClass(source)); - } - } - } - - if (!interfaces.isEmpty()) - { - Set implementsSet = new HashSet(); - for (Iterator iter=interfaces.iterator(); iter.hasNext();) - { - String fcqn = (String)iter.next(); - implementsSet.add(Util.getClassFromFullClass(fcqn)); - } - - // implements clause spans multiple lines - char[] indent = new char[classStart.length() + - " class ".length() + - className.length() + 1]; - Arrays.fill(indent, ' '); - out.print(indent); - out.print("implements "); - for (Iterator iter=implementsSet.iterator(); iter.hasNext();) - { - out.print((String)iter.next()); - if (iter.hasNext()) - { - out.println(","); - out.print(indent); - out.print(" "); // same length as "implements " - } - } - out.println(); - } - - out.println("{"); - out.indent(); - } - - private void _writeClassEnd( - PrettyWriter out) - { - out.unindent(); - out.println("}"); - } - - private void _writeImports( - PrettyWriter out, - SourceTemplate template, - String packageName, - String fullSuperclassName, - String superclassName, - ComponentBean component) - { - Set imports = new TreeSet(); - - // Use the template imports - if (template != null) - imports.addAll(template.getImports()); - - // FacesBean is always needed to define the TYPE - imports.add("org.apache.myfaces.trinidad.bean.FacesBean"); - - // Detect NamingContainer - if (component.isNamingContainer()) - imports.add("javax.faces.component.NamingContainer"); - - Iterator properties = component.properties(); - properties = new FilteredIterator(properties, new NonVirtualFilter()); - // PropertyKey only needed if there are properties - if (properties.hasNext()) - { - imports.add("org.apache.myfaces.trinidad.bean.PropertyKey"); - - PropertyFilter resolvable = new ResolvableTypeFilter(); - while (properties.hasNext()) - { - PropertyBean property = (PropertyBean)properties.next(); - String propertyClass = property.getPropertyClass(); - if (propertyClass != null) - { - imports.add(propertyClass); - // Check for generics - String[] types = property.getAttributeClassParameters(); - if(types != null) - { - for(int i = types.length - 1; i >= 0; i--) - { - _addGenericImports(imports, types[i]); - } - } - } - - // ComponentUtils only needed for resolvable properties - if (resolvable.accept(property)) - imports.add("org.apache.myfaces.trinidad.util.ComponentUtils"); - } - } - - Iterator facets = component.facets(); - // UIComponent needed if there are facets - if (facets.hasNext()) - imports.add("javax.faces.component.UIComponent"); - - Iterator events = component.events(); - while (events.hasNext()) - { - EventRefBean eventRef = (EventRefBean)events.next(); - EventBean event = eventRef.resolveEventType(); - - if (event == null) - { - getLog().warn("Unknown event type \"" + eventRef.getEventType() + "\""+ - " in component:"+component.getComponentType()); - } - else - { - String listenerClass = event.getEventListenerClass(); - if (listenerClass != null) - imports.add(listenerClass); - - if (!eventRef.isIgnoreSourceInterface()) - { - String sourceInterface = event.getEventSourceInterface(); - if (sourceInterface != null) - imports.add(sourceInterface); - } - } - } - - // Import causes a collision if className and superclassName are equal - if (!superclassName.equals(fullSuperclassName)) - { - String superPackageName = Util.getPackageFromFullClass(fullSuperclassName); - // component superclass only needed if not in - // same package as component class - if (superPackageName != packageName) - imports.add(fullSuperclassName); - } - - // do not import implicit types! - imports.removeAll(Util.PRIMITIVE_TYPES); - - writeImports(out, packageName, imports); - } - - private void _addGenericImports(Set imports, String type) - { - Matcher matcher = _GENERIC_TYPE.matcher(type); - if(matcher.matches()) - { - // Generic type - imports.add(matcher.group(1)); - String[] types = matcher.group(2).split(","); - for(int i = types.length - 1; i >= 0; i--) - { - _addGenericImports(imports, types[i]); - } - } - else - { - // Non-generic type - imports.add(type); - } - } - - private void _writeGenericConstants( - PrettyWriter out, - String componentFamily, - String componentType) throws IOException - { - out.println(); - out.println("static public final String COMPONENT_FAMILY ="); - out.println(" \"" + componentFamily + "\";"); - out.println("static public final String COMPONENT_TYPE ="); - out.println(" \"" + componentType + "\";"); - } - - private void _writePropertyConstants( - PrettyWriter out, - String superclassName, - ComponentBean component) throws IOException - { - out.println("static public final FacesBean.Type TYPE = new FacesBean.Type("); - out.indent(); - out.println(superclassName + ".TYPE);"); - out.unindent(); - - // component property keys - Iterator properties = component.properties(); - properties = new FilteredIterator(properties, new NonVirtualFilter()); - while (properties.hasNext()) - { - PropertyBean property = (PropertyBean)properties.next(); - String propName = property.getPropertyName(); - String propKey = Util.getConstantNameFromProperty(propName, "_KEY"); - String propAlias = property.getAliasOf(); - - out.println("static public final PropertyKey " + propKey + " ="); - out.indent(); - if (propAlias != null) - { - String aliasKey = Util.getConstantNameFromProperty(propAlias, "_KEY"); - out.print("TYPE.registerAlias(" + aliasKey + ", \"" + propName + "\");"); - } - else - { - out.print("TYPE.registerKey(\"" + propName + "\""); - - // property class - String propFullClass = property.getPropertyClass(); - String propClass = Util.getClassFromFullClass(propFullClass); - if (propClass == null) - { - propClass = "String"; - } - String propDefault = property.getDefaultValue(); - - if (!"Object".equals(propClass) || propDefault != null) - { - // TODO: do not use boxed class here - String boxedClass = Util.getBoxedClass(propClass); - out.print(", " + boxedClass + ".class"); - } - - if (propDefault != null) - { - out.print(", " + _convertStringToBoxedLiteral(propClass, propDefault)); - } - - // property capabilities - String propCaps = _getPropertyCapabilities(property); - if (propCaps != null) - out.print(", " + propCaps); - out.println(");"); - } - out.unindent(); - } - } - - private void _writePropertyValueConstants( - PrettyWriter out, - ComponentBean component) throws IOException - { - // component property keys - Iterator properties = component.properties(); - properties = new FilteredIterator(properties, new NonVirtualFilter()); - while (properties.hasNext()) - { - PropertyBean property = (PropertyBean)properties.next(); - String[] propertyValues = property.getPropertyValues(); - - if (propertyValues != null) - { - String propName = property.getPropertyName(); - - for (int i=0; i < propertyValues.length; i++) - { - String propValue = propertyValues[i]; - String propValueName = propName + - Character.toUpperCase(propValue.charAt(0)) + - propValue.substring(1); - String propValueKey = Util.getConstantNameFromProperty(propValueName); - - out.println("static public final String " + propValueKey + " = \"" + propValue + "\";"); - } - - } - } - } - - private void _writeFacetConstants( - PrettyWriter out, - ComponentBean component) throws IOException - { - Iterator facets = component.facets(); - while (facets.hasNext()) - { - FacetBean facet = (FacetBean)facets.next(); - String facetName = facet.getFacetName(); - String facetKey = Util.getConstantNameFromProperty(facetName, "_FACET"); - out.println("static public final " + - "String " + facetKey + " = \"" + facetName + "\";"); - } - } - - private String _convertStringToBoxedLiteral( - String className, - String value) - { - if (value == null) - { - return null; - } - else if ("String".equals(className)) - { - return "\"" + value.replaceAll("\'", "\\'") + "\""; - } - else if ("boolean".equals(className)) - { - return ("true".equals(value)) ? "Boolean.TRUE" : "Boolean.FALSE"; - } - else if ("char".equals(className)) - { - return "new Character('" + value.replaceAll("\'", "\\'") + "')"; - } - else if ("int".equals(className)) - { - return "new Integer(" + value + ")"; - } - else if ("float".equals(className)) - { - return "new Float(" + value + ")"; - } - else - { - throw new IllegalStateException(); - } - } - - private void _writeConstructor( - PrettyWriter out, - ComponentBean component, - int modifiers) throws IOException - { - String fullClassName = component.getComponentClass(); - String className = Util.getClassFromFullClass(fullClassName); - - if (Modifier.isPublic(modifiers)) - { - // TODO: eliminate this inconsistency - if (!Modifier.isAbstract(component.getComponentClassModifiers())) - { - String rendererType = component.getRendererType(); - - if (rendererType != null) - rendererType = _convertStringToBoxedLiteral("String", rendererType); - - out.println(); - out.println("/**"); - // TODO: restore this correctly phrased comment (tense vs. command) - //out.println(" * Constructs an instance of " + className + "."); - out.println(" * Construct an instance of the " + className + "."); - out.println(" */"); - out.println("public " + className + "()"); - out.println("{"); - out.indent(); - out.println("super(" + rendererType + ");"); - out.unindent(); - out.println("}"); - } - } - else if (Modifier.isProtected(modifiers)) - { - out.println(); - out.println("/**"); - // TODO: restore this more descriptive comment with param docs - //out.println(" * Construct an instance of the " + className); - //out.println(" * with the specified renderer type."); - //out.println(" * "); - //out.println(" * @param rendererType the renderer type"); - out.println(" * Construct an instance of the " + className + "."); - out.println(" */"); - out.println("protected " + className + "("); - out.indent(); - out.println("String rendererType"); - out.println(")"); - out.unindent(); - out.println("{"); - out.indent(); - out.println("super(rendererType);"); - out.unindent(); - out.println("}"); - - // TODO: eliminate this inconsistency - if (Modifier.isAbstract(component.getComponentClassModifiers())) - { - out.println(); - out.println("/**"); - // TODO: restore this correctly phrased comment (tense vs. command) - //out.println(" * Constructs an instance of " + className + "."); - out.println(" * Construct an instance of the " + className + "."); - out.println(" */"); - out.println("protected " + className + "()"); - out.println("{"); - out.indent(); - out.println("this(null);"); - out.unindent(); - out.println("}"); - } - } - } - - private void _writeGetFamily( - PrettyWriter out) throws IOException - { - out.println(); - out.println("@Override"); - out.println("public String getFamily()"); - out.println("{"); - out.indent(); - out.println("return COMPONENT_FAMILY;"); - out.unindent(); - out.println("}"); - } - - private void _writeGetBeanType( - PrettyWriter out) throws IOException - { - out.println(); - out.println("@Override"); - out.println("protected FacesBean.Type getBeanType()"); - out.println("{"); - out.indent(); - out.println("return TYPE;"); - out.unindent(); - out.println("}"); - } - - private void _writePropertyMethods( - PrettyWriter out, - ComponentBean component) throws IOException - { - Iterator properties = component.properties(); - properties = new FilteredIterator(properties, new NonVirtualFilter()); - while (properties.hasNext()) - { - PropertyBean property = (PropertyBean)properties.next(); - if (property.isList()) - _writePropertyListMethods(out, property); - else - { - _writePropertyGet(out, property); - _writePropertySet(out, property); - } - } - } - - private void _writePropertyListMethods( - PrettyWriter out, - PropertyBean property) throws IOException - { - String propName = property.getPropertyName(); - String propKey = Util.getConstantNameFromProperty(propName, "_KEY"); - String propertyClass = property.getPropertyClass(); - if (!"java.util.List".equals(propertyClass)) - { - getLog().error("Invalid list type: " + propertyClass); - return; - } - - // Look for the generic type - if it doesn't exist, then - // we'll be an Object. - String[] params = property.getPropertyClassParameters(); - if ((params == null) || (params.length == 0)) - propertyClass = "java.lang.Object"; - else - propertyClass = params[0]; - - propertyClass = Util.getClassFromFullClass(propertyClass); - - String singularName = _getSingular(propName); - String propVar = Util.getVariableFromName(singularName); - String description = property.getDescription(); - String addMethod = Util.getPrefixedPropertyName("add", singularName); - String removeMethod = Util.getPrefixedPropertyName("remove", singularName); - String getMethod = Util.getPrefixedPropertyName("get", propName); - - out.println(); - out.println("/**"); - if (description != null) - { - out.println(" * Adds a " + convertMultilineComment(description)); - } - out.println(" */"); - out.println("final public void " + addMethod + "(" + propertyClass + " " + - propVar + ")"); - out.println("{"); - out.indent(); - out.println("if (" + propVar + " == null)"); - out.println(" throw new NullPointerException();"); - out.println(); - out.println("getFacesBean().addEntry(" + propKey + ", " + propVar + ");"); - out.unindent(); - out.println("}"); - - out.println(); - out.println("/**"); - if (description != null) - { - out.println(" * Removes a " + convertMultilineComment(description)); - } - out.println(" */"); - out.println("final public void " + removeMethod + "(" + propertyClass + " " + - propVar + ")"); - out.println("{"); - out.indent(); - out.println("if (" + propVar + " == null)"); - out.println(" throw new NullPointerException();"); - out.println(); - out.println("getFacesBean().removeEntry(" + propKey + ", " + propVar + ");"); - out.unindent(); - out.println("}"); - - out.println(); - out.println("/**"); - if (description != null) - { - out.println(" * Gets all " + convertMultilineComment(description)); - } - out.println(" */"); - out.println("final public " + propertyClass + "[] " + getMethod + "()"); - out.println("{"); - out.indent(); - out.println("return (" + propertyClass + "[]) getFacesBean().getEntries("); - out.println(" " + propKey + ", " + propertyClass + ".class);"); - out.unindent(); - out.println("}"); - } - - static private String _getSingular(String plural) - { - if (plural.endsWith("s")) - return plural.substring(0, plural.length() - 1); - return plural; - } - - private void _writePropertySet( - PrettyWriter out, - PropertyBean property) throws IOException - { - String propertyClass = Util.getPropertyClass(property); - _writePropertySet(out, property, propertyClass); - - if (property.getAlternateClass() != null) - { - String alternateClass = Util.getAlternatePropertyClass(property); - _writePropertySet(out, property, alternateClass); - } - } - - private void _writePropertySet( - PrettyWriter out, - PropertyBean property, - String propertyClass) throws IOException - { - String propName = property.getPropertyName(); - String propKey = Util.getConstantNameFromProperty(propName, "_KEY"); - String propVar = Util.getVariableFromName(propName); - String description = property.getDescription(); - String setMethod = Util.getPrefixedPropertyName("set", propName); - - out.println(); - out.println("/**"); - if (description != null) - { - out.println(" * Sets " + convertMultilineComment(description)); - } - // TODO: restore this comment. -// if (property.isRequired()) -// { -// out.println(" *

"); -// out.println(" * This is a required property on the component."); -// } - // TODO: put this back in - //out.println(" * "); - //out.println(" * @param " + propName + " the new " + propName + " value"); - out.println(" */"); - - out.println("final public void " + setMethod + "(" + propertyClass + " " + propVar + ")"); - out.println("{"); - out.indent(); - if (Util.isPrimitiveClass(propertyClass)) - { - // TODO: use UIXComponentBase setXXXProperty methods when possible - if (propertyClass.equals("boolean")) - { - // TODO: add back space before ternary operator - out.println("setProperty(" + propKey + ", " + propVar + "? Boolean.TRUE : Boolean.FALSE);"); - } - else - { - String boxedClass = Util.getBoxedClass(propertyClass); - out.println("setProperty(" + propKey + ", new " + boxedClass + "(" + propVar + "));"); - } - } - else - { - out.println("setProperty(" + propKey + ", (" + propVar + "));"); - } - out.unindent(); - out.println("}"); - } - - private void _writePropertyGet( - PrettyWriter out, - PropertyBean property) throws IOException - { - String propName = property.getPropertyName(); - String propKey = Util.getConstantNameFromProperty(propName, "_KEY"); - String propertyFullClass = property.getPropertyClass(); - String propertyClass = Util.getClassFromFullClass(propertyFullClass); - String description = property.getDescription(); - String getMethod = Util.getMethodReaderFromProperty(propName, propertyClass); - - boolean isUnchecked = false; - String[] genericTypes = property.getPropertyClassParameters(); - if(genericTypes != null && genericTypes.length > 0) - { - isUnchecked = true; - propertyClass = Util.getPropertyClass(property); - } - - out.println(); - out.println("/**"); - if (description != null) - { - out.println(" * Gets " + convertMultilineComment(description)); - } - if (property.isRequired()) - { - out.println(" *

"); - out.println(" * This is a required property on the component."); - out.println(" *

"); - } - // TODO: put this back in - //out.println(" *"); - //out.println(" * @return the new " + propName + " value"); - out.println(" */"); - - if(isUnchecked) - { - out.println("@SuppressWarnings(\"unchecked\")"); - } - - out.println("final public " + propertyClass + " " + getMethod + "()"); - out.println("{"); - out.indent(); - - String resolvableType = _resolveType(propertyFullClass); - if (resolvableType != null) - { - // TODO: change signature of ComponentUtils.resolveCharacter - // to take Object instead of Character - if (resolvableType.equals("Character")) - { - out.println("return ComponentUtils.resolveCharacter((Character)getProperty(" + propKey + "));"); - } - else - { - // TODO: stop specifying default values in the getters - String resolveMethod = Util.getPrefixedPropertyName("resolve", resolvableType); - String propertyDefault = property.getDefaultValue(); - out.print("return ComponentUtils." + resolveMethod + "(getProperty(" + propKey + ")"); - if (propertyDefault != null) - { - out.print(", " + convertStringToLiteral(propertyClass, - propertyDefault)); - } - out.println(");"); - } - } - else - { - if(propertyClass.equals("Object")) - { - // Cast is not necessary if the property class is Object - out.println("return getProperty(" + propKey + ");"); - } - else - { - out.println("return (" + propertyClass + ")" + - "getProperty(" + propKey + ");"); - } - } - out.unindent(); - out.println("}"); - } - - private void _writeFacetMethods( - PrettyWriter out, - ComponentBean component) throws IOException - { - Iterator facets = component.facets(); - while (facets.hasNext()) - { - FacetBean facet = (FacetBean)facets.next(); - _writeFacetGet(out, facet); - _writeFacetSet(out, facet); - } - } - - private void _writeFacetSet( - PrettyWriter out, - FacetBean facet) throws IOException - { - String facetName = facet.getFacetName(); - // TODO: drop the unnecessary "Facet" suffix - String facetVar = facetName + "Facet"; - String facetKey = Util.getConstantNameFromProperty(facetName, "_FACET"); - String setMethod = Util.getPrefixedPropertyName("set", facetName); - String description = facet.getDescription(); - - out.println(); - out.println("/**"); - if (description != null) - { - out.println(" * " + convertMultilineComment(description)); - } - if (facet.isRequired()) - { - out.println(" *

"); - out.println(" * This is a required facet on the component."); - } - // TODO: put this back in - //out.println(" * "); - //out.println(" * @param " + facetVar + " the new " + facetName + " facet"); - out.println(" */"); - - // Remove type safety warning since getFacets is not generics enabled - // under JSF 1.1 spec - // TODO: Remove this line when Trinidad switch to JSF 1.2 - out.println("@SuppressWarnings(\"unchecked\")"); - - out.println("final public void " + setMethod + "(UIComponent " + facetVar + ")"); - out.println("{"); - out.indent(); - out.println("getFacets().put(" + facetKey + ", " + facetVar + ");"); - out.unindent(); - out.println("}"); - } - - private void _writeFacetGet( - PrettyWriter out, - FacetBean facet) throws IOException - { - String facetName = facet.getFacetName(); - String facetKey = Util.getConstantNameFromProperty(facetName, "_FACET"); - String getMethod = Util.getPrefixedPropertyName("get", facetName); - String description = facet.getDescription(); - - out.println(); - out.println("/**"); - if (description != null) - { - out.println(" * " + convertMultilineComment(description)); - } - if (facet.isRequired()) - { - out.println(" *

"); - out.println(" * This is a required facet on the component."); - } - // TODO: put this back in - //out.println(" * "); - //out.println(" * @return the " + facetName + " facet"); - out.println(" */"); - - out.println("final public UIComponent " + getMethod + "()"); - out.println("{"); - out.indent(); - out.println("return getFacet(" + facetKey + ");"); - out.unindent(); - out.println("}"); - } - - private void _writeListenerMethods( - PrettyWriter out, - ComponentBean component) throws IOException - { - Iterator events = component.events(); - while (events.hasNext()) - { - EventRefBean eventRef = (EventRefBean)events.next(); - EventBean event = eventRef.resolveEventType(); - if (event != null) - { - _writeListenerAdd(out, event); - _writeListenerRemove(out, event); - _writeListenersGet(out, event); - } - } - } - - private void _writeListenerAdd( - PrettyWriter out, - EventBean event) throws IOException - { - String listenerFullClass = event.getEventListenerClass(); - String listenerClass = Util.getClassFromFullClass(listenerFullClass); - - String eventName = event.getEventName(); - String addMethod = Util.getMethodNameFromEvent("add", eventName, "Listener"); - - out.println(); - out.println("/**"); - out.println(" * Adds a " + eventName + " listener."); - out.println(" *"); - out.println(" * @param listener the " + eventName + " listener to add"); - out.println(" */"); - - out.println("final public void " + addMethod + "("); - out.indent(); - out.println(listenerClass + " listener)"); - out.unindent(); - out.println("{"); - out.indent(); - out.println("addFacesListener(listener);"); - out.unindent(); - out.println("}"); - } - - private void _writeListenerRemove( - PrettyWriter out, - EventBean event) throws IOException - { - String listenerFullClass = event.getEventListenerClass(); - String listenerClass = Util.getClassFromFullClass(listenerFullClass); - - String eventName = event.getEventName(); - String removeMethod = Util.getMethodNameFromEvent("remove", eventName, "Listener"); - - out.println(); - out.println("/**"); - out.println(" * Removes a " + eventName + " listener."); - out.println(" *"); - out.println(" * @param listener the " + eventName + " listener to remove"); - out.println(" */"); - - out.println("final public void " + removeMethod + "("); - out.indent(); - out.println(listenerClass + " listener)"); - out.unindent(); - out.println("{"); - out.indent(); - out.println("removeFacesListener(listener);"); - out.unindent(); - out.println("}"); - } - - private void _writeListenersGet( - PrettyWriter out, - EventBean event) throws IOException - { - String listenerFullClass = event.getEventListenerClass(); - String listenerClass = Util.getClassFromFullClass(listenerFullClass); - - String eventName = event.getEventName(); - String getMethod = Util.getMethodNameFromEvent("get", eventName, "Listeners"); - - out.println(); - out.println("/**"); - out.println(" * Returns an array of attached " + eventName + " listeners."); - out.println(" *"); - out.println(" * @return an array of attached " + eventName + " listeners."); - out.println(" */"); - - out.println("final public " + listenerClass + "[] " + getMethod + "()"); - out.println("{"); - out.indent(); - out.println("return (" + listenerClass + "[])" + - "getFacesListeners(" + listenerClass + ".class);"); - out.unindent(); - out.println("}"); - } - - private void _writeTypeLock( - PrettyWriter out, ComponentBean component) throws IOException - { - out.println(); - out.println("static"); - out.println("{"); - out.indent(); - String rendererType = component.getRendererType(); - if (rendererType == null) - { - out.println("TYPE.lock();"); - } - else - { - String componentFamily = component.findComponentFamily(); - out.println("TYPE.lockAndRegister(\"" + componentFamily + "\"," + - "\"" + rendererType + "\");"); - } - - out.unindent(); - out.println("}"); - } - - private String _getPropertyCapabilities( - PropertyBean property) - { - List caps = new ArrayList(); - - if (property.isMethodBinding() || - property.isLiteralOnly()) - { - caps.add("PropertyKey.CAP_NOT_BOUND"); - } - - if (property.isStateHolder()) - { - caps.add("PropertyKey.CAP_STATE_HOLDER"); - } - - if (property.isTransient()) - { - caps.add("PropertyKey.CAP_TRANSIENT"); - } - - if (property.isList()) - { - caps.add("PropertyKey.CAP_LIST"); - } - - if (caps.isEmpty()) - return null; - - StringBuffer sb = new StringBuffer(); - for (int i=0; i < caps.size(); i++) - { - if (i > 0) - sb.append(" | "); - sb.append(caps.get(i)); - } - return sb.toString(); - } - - private class NonVirtualFilter extends PropertyFilter - { - protected boolean accept( - PropertyBean property) - { - return (!property.isVirtual()); - } - } - - private class ResolvableTypeFilter extends PropertyFilter - { - protected boolean accept( - PropertyBean property) - { - String propertyClass = property.getPropertyClass(); - String resolvableType = _resolveType(propertyClass); - return (resolvableType != null); - } - } - private class IfModifiedFilter extends ComponentFilter { protected boolean accept( @@ -1313,32 +279,6 @@ } } - static private String _resolveType( - String className) - { - return (String)_RESOLVABLE_TYPES.get(className); - } - - static private Map _createResolvableTypes() - { - Map resolvableTypes = new HashMap(); - - resolvableTypes.put("boolean", "Boolean"); - resolvableTypes.put("char", "Character"); - // TODO: put this back in - //resolvableTypes.put("java.util.Date", "Date"); - resolvableTypes.put("int", "Integer"); - resolvableTypes.put("float", "Float"); - resolvableTypes.put("java.util.Locale", "Locale"); - resolvableTypes.put("long", "Long"); - resolvableTypes.put("java.lang.String", "String"); - // TODO: put this back in - //resolvableTypes.put("java.lang.String[]", "StringArray"); - resolvableTypes.put("java.util.TimeZone", "TimeZone"); - - return Collections.unmodifiableMap(resolvableTypes); - } - /** * @parameter expression="${project}" * @readonly @@ -1384,7 +324,4 @@ * @parameter */ private boolean suppressListenerMethods; - - static private final Pattern _GENERIC_TYPE = Pattern.compile("([^<]+)<(.+)>"); - static final private Map _RESOLVABLE_TYPES = _createResolvableTypes(); } Added: incubator/adffaces/branches/myfaces-1_2-maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/generator/AbstractComponentGenerator.java URL: http://svn.apache.org/viewvc/incubator/adffaces/branches/myfaces-1_2-maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/generator/AbstractComponentGenerator.java?view=auto&rev=468935 ============================================================================== --- incubator/adffaces/branches/myfaces-1_2-maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/generator/AbstractComponentGenerator.java (added) +++ incubator/adffaces/branches/myfaces-1_2-maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/generator/AbstractComponentGenerator.java Sun Oct 29 08:49:55 2006 @@ -0,0 +1,915 @@ +/* + * Copyright 2006 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.myfaces.trinidadbuild.plugin.faces.generator; + +import org.apache.myfaces.trinidadbuild.plugin.faces.io.PrettyWriter; +import org.apache.myfaces.trinidadbuild.plugin.faces.parse.ComponentBean; +import org.apache.myfaces.trinidadbuild.plugin.faces.parse.EventBean; +import org.apache.myfaces.trinidadbuild.plugin.faces.parse.EventRefBean; +import org.apache.myfaces.trinidadbuild.plugin.faces.parse.FacetBean; +import org.apache.myfaces.trinidadbuild.plugin.faces.parse.PropertyBean; +import org.apache.myfaces.trinidadbuild.plugin.faces.util.FilteredIterator; +import org.apache.myfaces.trinidadbuild.plugin.faces.util.PropertyFilter; +import org.apache.myfaces.trinidadbuild.plugin.faces.util.SourceTemplate; +import org.apache.myfaces.trinidadbuild.plugin.faces.util.Util; +import org.apache.maven.plugin.logging.Log; + +import java.io.IOException; +import java.lang.reflect.Modifier; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.TreeSet; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public abstract class AbstractComponentGenerator implements ComponentGenerator +{ + + private Log _log; + + public AbstractComponentGenerator(Log log) + { + _log = log; + } + + protected Log getLog() + { + return _log; + } + + public void writeClassBegin( + PrettyWriter out, + String className, + String superclassName, + ComponentBean component, + SourceTemplate template) + { + out.println("/**"); + + // TODO: restore description (needs escaping?) +// String description = component.getDescription(); +// if (description != null) +// { +// out.println(" *"); +// out.println(" * " + convertMultilineComment(description)); +// } + + String longDescription = component.getLongDescription(); + if (longDescription != null) + { + out.println(" *"); + out.println(" * " + convertMultilineComment(longDescription)); + } + + if (component.hasEvents(true)) + { + // the events javadoc + out.println(" *"); + out.println(" *

Events:

"); + out.println(" * "); + out.println(" * "); + out.println(" * "); + out.println(" * "); + out.println(" * "); + out.println(" * "); + Iterator events = component.events(true); + while (events.hasNext()) + { + EventRefBean eventRef = (EventRefBean) events.next(); + EventBean event = eventRef.resolveEventType(); + if (event != null) + { + String eventClass = event.getEventClass(); + String[] eventPhases = eventRef.getEventDeliveryPhases(); + String eventDescription = event.getDescription(); + out.println(" * "); + out.println(" * "); + out.print(" * "); + out.println(" * "); + out.println(" * "); + } + } + out.println(" *
TypePhasesDescription
" + eventClass + ""); + if (eventPhases != null) + { + for (int i = 0; i < eventPhases.length; i++) + { + if (i > 0) + out.print("
"); + out.print(eventPhases[i]); + } + } + out.println("
" + eventDescription + "
"); + } + + if (!component.hasChildren()) + { + out.println(" *

"); + out.println(" * It does not support any children."); + } + + out.println(" */"); + + // TODO: eliminate metadata + int modifiers = component.getComponentClassModifiers(); + String classStart = Modifier.toString(modifiers); + // TODO: use canonical ordering + classStart = classStart.replaceAll("public abstract", "abstract public"); + out.println(classStart + " class " + className + + " extends " + superclassName); + + Set interfaces = new HashSet(); + if (template != null) + interfaces.addAll(template.getImplements()); + + if (component.isNamingContainer()) + interfaces.add("javax.faces.component.NamingContainer"); + + Iterator events = component.events(); + while (events.hasNext()) + { + EventRefBean eventRef = (EventRefBean) events.next(); + EventBean event = eventRef.resolveEventType(); + if (event != null) + { + if (!eventRef.isIgnoreSourceInterface()) + { + String source = event.getEventSourceInterface(); + if (source != null) + interfaces.add(Util.getClassFromFullClass(source)); + } + } + } + + if (!interfaces.isEmpty()) + { + Set implementsSet = new HashSet(); + for (Iterator iter = interfaces.iterator(); iter.hasNext();) + { + String fcqn = (String) iter.next(); + implementsSet.add(Util.getClassFromFullClass(fcqn)); + } + + // implements clause spans multiple lines + char[] indent = new char[classStart.length() + + " class ".length() + + className.length() + 1]; + Arrays.fill(indent, ' '); + out.print(indent); + out.print("implements "); + for (Iterator iter = implementsSet.iterator(); iter.hasNext();) + { + out.print((String) iter.next()); + if (iter.hasNext()) + { + out.println(","); + out.print(indent); + out.print(" "); // same length as "implements " + } + } + out.println(); + } + + out.println("{"); + out.indent(); + } + + public void writeClassEnd( + PrettyWriter out) + { + out.unindent(); + out.println("}"); + } + + public void writeImports( + PrettyWriter out, + SourceTemplate template, + String packageName, + String fullSuperclassName, + String superclassName, + ComponentBean component) + { + Set imports = new TreeSet(); + + // Use the template imports + if (template != null) + imports.addAll(template.getImports()); + + // Detect NamingContainer + if (component.isNamingContainer()) + imports.add("javax.faces.component.NamingContainer"); + + Iterator properties = component.properties(); + properties = new FilteredIterator(properties, new NonVirtualFilter()); + // PropertyKey only needed if there are properties + if (properties.hasNext()) + { + while (properties.hasNext()) + { + PropertyBean property = (PropertyBean) properties.next(); + String propertyClass = property.getPropertyClass(); + if (propertyClass != null) + { + imports.add(propertyClass); + // Check for generics + String[] types = property.getAttributeClassParameters(); + if (types != null) + { + for (int i = types.length - 1; i >= 0; i--) + { + addGenericImports(imports, types[i]); + } + } + } + } + } + + Iterator facets = component.facets(); + // UIComponent needed if there are facets + if (facets.hasNext()) + imports.add("javax.faces.component.UIComponent"); + + Iterator events = component.events(); + while (events.hasNext()) + { + EventRefBean eventRef = (EventRefBean) events.next(); + EventBean event = eventRef.resolveEventType(); + + if (event == null) + { + getLog().warn("Unknown event type \"" + eventRef.getEventType() + "\"" + + " in component:" + component.getComponentType()); + } + else + { + String listenerClass = event.getEventListenerClass(); + if (listenerClass != null) + imports.add(listenerClass); + + if (!eventRef.isIgnoreSourceInterface()) + { + String sourceInterface = event.getEventSourceInterface(); + if (sourceInterface != null) + imports.add(sourceInterface); + } + } + } + + // Import causes a collision if className and superclassName are equal + if (!superclassName.equals(fullSuperclassName)) + { + String superPackageName = Util.getPackageFromFullClass(fullSuperclassName); + // component superclass only needed if not in + // same package as component class + if (superPackageName != packageName) + imports.add(fullSuperclassName); + } + + // add other imports (generator specific) + addSpecificImports(imports, component); + + // do not import implicit types! + imports.removeAll(Util.PRIMITIVE_TYPES); + + Util.writeImports(out, packageName, imports); + } + + protected void addSpecificImports( + Set imports, + ComponentBean component) + { + // nothing by default + } + + public void addGenericImports(Set imports, String type) + { + Matcher matcher = _GENERIC_TYPE.matcher(type); + if (matcher.matches()) + { + // Generic type + imports.add(matcher.group(1)); + String[] types = matcher.group(2).split(","); + for (int i = types.length - 1; i >= 0; i--) + { + addGenericImports(imports, types[i]); + } + } + else + { + // Non-generic type + imports.add(type); + } + } + + public void writeGenericConstants( + PrettyWriter out, + String componentFamily, + String componentType) throws IOException + { + out.println(); + out.println("static public final String COMPONENT_FAMILY ="); + out.println(" \"" + componentFamily + "\";"); + out.println("static public final String COMPONENT_TYPE ="); + out.println(" \"" + componentType + "\";"); + } + + public void writePropertyConstants( + PrettyWriter out, + String superclassName, + ComponentBean component) throws IOException + { + // nothing + } + + public void writePropertyValueConstants( + PrettyWriter out, + ComponentBean component) throws IOException + { + // component property keys + Iterator properties = component.properties(); + properties = new FilteredIterator(properties, new NonVirtualFilter()); + while (properties.hasNext()) + { + PropertyBean property = (PropertyBean) properties.next(); + String[] propertyValues = property.getPropertyValues(); + + if (propertyValues != null) + { + String propName = property.getPropertyName(); + + for (int i = 0; i < propertyValues.length; i++) + { + String propValue = propertyValues[i]; + String propValueName = propName + + Character.toUpperCase(propValue.charAt(0)) + + propValue.substring(1); + String propValueKey = Util.getConstantNameFromProperty(propValueName); + + out.println("static public final String " + propValueKey + " = \"" + propValue + "\";"); + } + + } + } + } + + public void writeFacetConstants( + PrettyWriter out, + ComponentBean component) throws IOException + { + Iterator facets = component.facets(); + while (facets.hasNext()) + { + FacetBean facet = (FacetBean) facets.next(); + String facetName = facet.getFacetName(); + String facetKey = Util.getConstantNameFromProperty(facetName, "_FACET"); + out.println("static public final " + + "String " + facetKey + " = \"" + facetName + "\";"); + } + } + + protected String convertStringToBoxedLiteral( + String className, + String value) + { + if (value == null) + { + return null; + } + else + if ("String".equals(className)) + { + return "\"" + value.replaceAll("\'", "\\'") + "\""; + } + else + if ("boolean".equals(className)) + { + return ("true".equals(value)) ? "Boolean.TRUE" : "Boolean.FALSE"; + } + else + if ("char".equals(className)) + { + return "new Character('" + value.replaceAll("\'", "\\'") + "')"; + } + else + if ("int".equals(className)) + { + return "new Integer(" + value + ")"; + } + else + if ("float".equals(className)) + { + return "new Float(" + value + ")"; + } + else + { + throw new IllegalStateException(); + } + } + + public void writeConstructor( + PrettyWriter out, + ComponentBean component, + int modifiers) throws IOException + { + String fullClassName = component.getComponentClass(); + String className = Util.getClassFromFullClass(fullClassName); + + if (Modifier.isPublic(modifiers)) + { + // TODO: eliminate this inconsistency + if (!Modifier.isAbstract(component.getComponentClassModifiers())) + { + String rendererType = component.getRendererType(); + + if (rendererType != null) + rendererType = convertStringToBoxedLiteral("String", rendererType); + + out.println(); + out.println("/**"); + // TODO: restore this correctly phrased comment (tense vs. command) + //out.println(" * Constructs an instance of " + className + "."); + out.println(" * Construct an instance of the " + className + "."); + out.println(" */"); + out.println("public " + className + "()"); + out.println("{"); + out.indent(); + + writeConstructorContent(out, component, modifiers, rendererType); + + out.unindent(); + out.println("}"); + } + } + else + if (Modifier.isProtected(modifiers)) + { + out.println(); + out.println("/**"); + // TODO: restore this more descriptive comment with param docs + //out.println(" * Construct an instance of the " + className); + //out.println(" * with the specified renderer type."); + //out.println(" * "); + //out.println(" * @param rendererType the renderer type"); + out.println(" * Construct an instance of the " + className + "."); + out.println(" */"); + out.println("protected " + className + "("); + out.indent(); + out.println("String rendererType"); + out.println(")"); + out.unindent(); + out.println("{"); + out.indent(); + + writeConstructorContent(out, component, modifiers, "rendererType"); + + out.unindent(); + out.println("}"); + + // TODO: eliminate this inconsistency + if (Modifier.isAbstract(component.getComponentClassModifiers())) + { + out.println(); + out.println("/**"); + // TODO: restore this correctly phrased comment (tense vs. command) + //out.println(" * Constructs an instance of " + className + "."); + out.println(" * Construct an instance of the " + className + "."); + out.println(" */"); + out.println("protected " + className + "()"); + out.println("{"); + out.indent(); + out.println("this(null);"); + out.unindent(); + out.println("}"); + } + } + } + + protected abstract void writeConstructorContent( + PrettyWriter out, + ComponentBean component, + int modifiers, String rendererType) throws IOException; + + public void writeGetFamily( + PrettyWriter out) throws IOException + { + out.println(); + out.println("@Override"); + out.println("public String getFamily()"); + out.println("{"); + out.indent(); + out.println("return COMPONENT_FAMILY;"); + out.unindent(); + out.println("}"); + } + + public void writePropertyMethods( + PrettyWriter out, + ComponentBean component) throws IOException + { + Iterator properties = component.properties(); + properties = new FilteredIterator(properties, new NonVirtualFilter()); + while (properties.hasNext()) + { + PropertyBean property = (PropertyBean) properties.next(); + if (property.isList()) + writePropertyListMethods(out, property); + else + { + writePropertyDeclaration(out, property); + writePropertyGet(out, property); + writePropertySet(out, property); + } + } + } + + abstract protected void writePropertyListMethods( + PrettyWriter out, + PropertyBean property) throws IOException; + + static protected String getSingular(String plural) + { + if (plural.endsWith("s")) + return plural.substring(0, plural.length() - 1); + return plural; + } + + protected abstract void writePropertyDeclaration( + PrettyWriter out, + PropertyBean property) throws IOException; + + protected void writePropertySet( + PrettyWriter out, + PropertyBean property) throws IOException + { + String propertyClass = Util.getPropertyClass(property); + writePropertySet(out, property, propertyClass); + + if (property.getAlternateClass() != null) + { + String alternateClass = Util.getAlternatePropertyClass(property); + writePropertySet(out, property, alternateClass); + } + } + + protected void writePropertySet( + PrettyWriter out, + PropertyBean property, + String propertyClass) throws IOException + { + String propName = property.getPropertyName(); + String propVar = Util.getVariableFromName(propName); + String description = property.getDescription(); + String setMethod = Util.getPrefixedPropertyName("set", propName); + + out.println(); + out.println("/**"); + if (description != null) + { + out.println(" * Sets " + convertMultilineComment(description)); + } + // TODO: restore this comment. +// if (property.isRequired()) +// { +// out.println(" *

"); +// out.println(" * This is a required property on the component."); +// } + // TODO: put this back in + //out.println(" * "); + //out.println(" * @param " + propName + " the new " + propName + " value"); + out.println(" */"); + + out.println("final public void " + setMethod + "(" + propertyClass + " " + propVar + ")"); + out.println("{"); + out.indent(); + writePropertySetterContent(out, property, propertyClass); + out.unindent(); + out.println("}"); + } + + protected abstract void writePropertySetterContent( + PrettyWriter out, + PropertyBean property, + String propertyClass) throws IOException; + + protected void writePropertyGet( + PrettyWriter out, + PropertyBean property) throws IOException + { + String propName = property.getPropertyName(); + String propertyFullClass = property.getPropertyClass(); + String propertyClass = Util.getClassFromFullClass(propertyFullClass); + String description = property.getDescription(); + String getMethod = Util.getMethodReaderFromProperty(propName, propertyClass); + + boolean isUnchecked = false; + String[] genericTypes = property.getPropertyClassParameters(); + if (genericTypes != null && genericTypes.length > 0) + { + isUnchecked = true; + propertyClass = Util.getPropertyClass(property); + } + + out.println(); + out.println("/**"); + if (description != null) + { + out.println(" * Gets " + convertMultilineComment(description)); + } + if (property.isRequired()) + { + out.println(" *

"); + out.println(" * This is a required property on the component."); + out.println(" *

"); + } + // TODO: put this back in + //out.println(" *"); + //out.println(" * @return the new " + propName + " value"); + out.println(" */"); + + if (isUnchecked) + { + out.println("@SuppressWarnings(\"unchecked\")"); + } + + out.println("final public " + propertyClass + " " + getMethod + "()"); + out.println("{"); + out.indent(); + + writePropertyGetterContent(out, property); + + out.unindent(); + out.println("}"); + } + + protected abstract void writePropertyGetterContent( + PrettyWriter out, + PropertyBean property) throws IOException; + + public void writeFacetMethods( + PrettyWriter out, + ComponentBean component) throws IOException + { + Iterator facets = component.facets(); + while (facets.hasNext()) + { + FacetBean facet = (FacetBean) facets.next(); + writeFacetGet(out, facet); + writeFacetSet(out, facet); + } + } + + public void writeFacetSet( + PrettyWriter out, + FacetBean facet) throws IOException + { + String facetName = facet.getFacetName(); + // TODO: drop the unnecessary "Facet" suffix + String facetVar = facetName + "Facet"; + String facetKey = Util.getConstantNameFromProperty(facetName, "_FACET"); + String setMethod = Util.getPrefixedPropertyName("set", facetName); + String description = facet.getDescription(); + + out.println(); + out.println("/**"); + if (description != null) + { + out.println(" * " + convertMultilineComment(description)); + } + if (facet.isRequired()) + { + out.println(" *

"); + out.println(" * This is a required facet on the component."); + } + // TODO: put this back in + //out.println(" * "); + //out.println(" * @param " + facetVar + " the new " + facetName + " facet"); + out.println(" */"); + + // Remove type safety warning since getFacets is not generics enabled + // under JSF 1.1 spec + // TODO: Remove this line when Trinidad switch to JSF 1.2 + out.println("@SuppressWarnings(\"unchecked\")"); + + out.println("final public void " + setMethod + "(UIComponent " + facetVar + ")"); + out.println("{"); + out.indent(); + out.println("getFacets().put(" + facetKey + ", " + facetVar + ");"); + out.unindent(); + out.println("}"); + } + + public void writeFacetGet( + PrettyWriter out, + FacetBean facet) throws IOException + { + String facetName = facet.getFacetName(); + String facetKey = Util.getConstantNameFromProperty(facetName, "_FACET"); + String getMethod = Util.getPrefixedPropertyName("get", facetName); + String description = facet.getDescription(); + + out.println(); + out.println("/**"); + if (description != null) + { + out.println(" * " + convertMultilineComment(description)); + } + if (facet.isRequired()) + { + out.println(" *

"); + out.println(" * This is a required facet on the component."); + } + // TODO: put this back in + //out.println(" * "); + //out.println(" * @return the " + facetName + " facet"); + out.println(" */"); + + out.println("final public UIComponent " + getMethod + "()"); + out.println("{"); + out.indent(); + out.println("return getFacet(" + facetKey + ");"); + out.unindent(); + out.println("}"); + } + + public void writeListenerMethods( + PrettyWriter out, + ComponentBean component) throws IOException + { + Iterator events = component.events(); + while (events.hasNext()) + { + EventRefBean eventRef = (EventRefBean) events.next(); + EventBean event = eventRef.resolveEventType(); + if (event != null) + { + writeListenerAdd(out, event); + writeListenerRemove(out, event); + writeListenersGet(out, event); + } + } + } + + public void writeListenerAdd( + PrettyWriter out, + EventBean event) throws IOException + { + String listenerFullClass = event.getEventListenerClass(); + String listenerClass = Util.getClassFromFullClass(listenerFullClass); + + String eventName = event.getEventName(); + String addMethod = Util.getMethodNameFromEvent("add", eventName, "Listener"); + + out.println(); + out.println("/**"); + out.println(" * Adds a " + eventName + " listener."); + out.println(" *"); + out.println(" * @param listener the " + eventName + " listener to add"); + out.println(" */"); + + out.println("final public void " + addMethod + "("); + out.indent(); + out.println(listenerClass + " listener)"); + out.unindent(); + out.println("{"); + out.indent(); + out.println("addFacesListener(listener);"); + out.unindent(); + out.println("}"); + } + + public void writeListenerRemove( + PrettyWriter out, + EventBean event) throws IOException + { + String listenerFullClass = event.getEventListenerClass(); + String listenerClass = Util.getClassFromFullClass(listenerFullClass); + + String eventName = event.getEventName(); + String removeMethod = Util.getMethodNameFromEvent("remove", eventName, "Listener"); + + out.println(); + out.println("/**"); + out.println(" * Removes a " + eventName + " listener."); + out.println(" *"); + out.println(" * @param listener the " + eventName + " listener to remove"); + out.println(" */"); + + out.println("final public void " + removeMethod + "("); + out.indent(); + out.println(listenerClass + " listener)"); + out.unindent(); + out.println("{"); + out.indent(); + out.println("removeFacesListener(listener);"); + out.unindent(); + out.println("}"); + } + + public void writeListenersGet( + PrettyWriter out, + EventBean event) throws IOException + { + String listenerFullClass = event.getEventListenerClass(); + String listenerClass = Util.getClassFromFullClass(listenerFullClass); + + String eventName = event.getEventName(); + String getMethod = Util.getMethodNameFromEvent("get", eventName, "Listeners"); + + out.println(); + out.println("/**"); + out.println(" * Returns an array of attached " + eventName + " listeners."); + out.println(" *"); + out.println(" * @return an array of attached " + eventName + " listeners."); + out.println(" */"); + + out.println("final public " + listenerClass + "[] " + getMethod + "()"); + out.println("{"); + out.indent(); + out.println("return (" + listenerClass + "[])" + + "getFacesListeners(" + listenerClass + ".class);"); + out.unindent(); + out.println("}"); + } + + public void writeOther( + PrettyWriter out, ComponentBean component) throws IOException + { + // nothing + } + + protected String convertMultilineComment( + String commentBody) + { + return commentBody.replaceAll("\n", "\n * "); + } + + protected class ResolvableTypeFilter extends PropertyFilter + { + protected boolean accept( + PropertyBean property) + { + String propertyClass = property.getPropertyClass(); + String resolvableType = resolveType(propertyClass); + return (resolvableType != null); + } + } + + protected class NonVirtualFilter extends PropertyFilter + { + protected boolean accept( + PropertyBean property) + { + return (!property.isVirtual()); + } + } + + static protected String resolveType( + String className) + { + return (String) _RESOLVABLE_TYPES.get(className); + } + + + static private Map _createResolvableTypes() + { + Map resolvableTypes = new HashMap(); + + resolvableTypes.put("boolean", "Boolean"); + resolvableTypes.put("char", "Character"); + // TODO: put this back in + //resolvableTypes.put("java.util.Date", "Date"); + resolvableTypes.put("int", "Integer"); + resolvableTypes.put("float", "Float"); + resolvableTypes.put("java.util.Locale", "Locale"); + resolvableTypes.put("long", "Long"); + resolvableTypes.put("java.lang.String", "String"); + // TODO: put this back in + //resolvableTypes.put("java.lang.String[]", "StringArray"); + resolvableTypes.put("java.util.TimeZone", "TimeZone"); + + return Collections.unmodifiableMap(resolvableTypes); + } + + static private final Pattern _GENERIC_TYPE = Pattern.compile("([^<]+)<(.+)>"); + static final private Map _RESOLVABLE_TYPES = _createResolvableTypes(); +} Propchange: incubator/adffaces/branches/myfaces-1_2-maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/generator/AbstractComponentGenerator.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: incubator/adffaces/branches/myfaces-1_2-maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/generator/AbstractComponentGenerator.java ------------------------------------------------------------------------------ svn:keywords = Date Author Id Revision HeadURL Added: incubator/adffaces/branches/myfaces-1_2-maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/generator/ComponentGenerator.java URL: http://svn.apache.org/viewvc/incubator/adffaces/branches/myfaces-1_2-maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/generator/ComponentGenerator.java?view=auto&rev=468935 ============================================================================== --- incubator/adffaces/branches/myfaces-1_2-maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/generator/ComponentGenerator.java (added) +++ incubator/adffaces/branches/myfaces-1_2-maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/generator/ComponentGenerator.java Sun Oct 29 08:49:55 2006 @@ -0,0 +1,75 @@ +package org.apache.myfaces.trinidadbuild.plugin.faces.generator; + +import org.apache.myfaces.trinidadbuild.plugin.faces.io.PrettyWriter; +import org.apache.myfaces.trinidadbuild.plugin.faces.parse.ComponentBean; +import org.apache.myfaces.trinidadbuild.plugin.faces.util.SourceTemplate; + +import java.io.IOException; + +/** + * Generates component classes + * + * @author Bruno Aranda (latest modification by $Author$) + * @version $Revision$ $Date$ + */ +public interface ComponentGenerator +{ + void writeClassBegin( + PrettyWriter out, + String className, + String superclassName, + ComponentBean component, + SourceTemplate template); + + void writeClassEnd( + PrettyWriter out); + + void writeImports( + PrettyWriter out, + SourceTemplate template, + String packageName, + String fullSuperclassName, + String superclassName, + ComponentBean component); + + void writeGenericConstants( + PrettyWriter out, + String componentFamily, + String componentType) throws IOException; + + void writePropertyConstants( + PrettyWriter out, + String superclassName, + ComponentBean component) throws IOException; + + void writePropertyValueConstants( + PrettyWriter out, + ComponentBean component) throws IOException; + + void writeFacetConstants( + PrettyWriter out, + ComponentBean component) throws IOException; + + void writeConstructor( + PrettyWriter out, + ComponentBean component, + int modifiers) throws IOException; + + void writeGetFamily( + PrettyWriter out) throws IOException; + + void writePropertyMethods( + PrettyWriter out, + ComponentBean component) throws IOException; + + void writeFacetMethods( + PrettyWriter out, + ComponentBean component) throws IOException; + + void writeListenerMethods( + PrettyWriter out, + ComponentBean component) throws IOException; + + void writeOther( + PrettyWriter out, ComponentBean component) throws IOException; +} Propchange: incubator/adffaces/branches/myfaces-1_2-maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/generator/ComponentGenerator.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: incubator/adffaces/branches/myfaces-1_2-maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/generator/ComponentGenerator.java ------------------------------------------------------------------------------ svn:keywords = Date Author Id Revision HeadURL Added: incubator/adffaces/branches/myfaces-1_2-maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/generator/MyFacesComponentGenerator.java URL: http://svn.apache.org/viewvc/incubator/adffaces/branches/myfaces-1_2-maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/generator/MyFacesComponentGenerator.java?view=auto&rev=468935 ============================================================================== --- incubator/adffaces/branches/myfaces-1_2-maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/generator/MyFacesComponentGenerator.java (added) +++ incubator/adffaces/branches/myfaces-1_2-maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/generator/MyFacesComponentGenerator.java Sun Oct 29 08:49:55 2006 @@ -0,0 +1,76 @@ +/* + * Copyright 2006 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.myfaces.trinidadbuild.plugin.faces.generator; + +import org.apache.maven.plugin.logging.Log; +import org.apache.myfaces.trinidadbuild.plugin.faces.parse.PropertyBean; +import org.apache.myfaces.trinidadbuild.plugin.faces.parse.ComponentBean; +import org.apache.myfaces.trinidadbuild.plugin.faces.io.PrettyWriter; +import org.apache.myfaces.trinidadbuild.plugin.faces.util.Util; + +import java.io.IOException; + +/** + * Component generator for MyFaces + * + * @author Bruno Aranda (latest modification by $Author$) + * @version $Revision$ $Date$ + */ +public class MyFacesComponentGenerator extends AbstractComponentGenerator +{ + public MyFacesComponentGenerator(Log log) + { + super(log); + } + + protected void writeConstructorContent(PrettyWriter out, ComponentBean component, int modifiers, String rendererType) throws IOException + { + out.println("setRendererType("+rendererType+");"); + } + + public void writePropertyDeclaration(PrettyWriter out, + PropertyBean property) throws IOException + { + String propName = property.getPropertyName(); + String fieldPropName = property.getFieldPropertyName(); + String propertyFullClass = property.getPropertyClass(); + String propertyClass = Util.getClassFromFullClass(propertyFullClass); + + out.println(); + out.println("// Property: " + propName); + out.println("private " + propertyClass + " " + fieldPropName + ";"); + } + + protected void writePropertySetterContent(PrettyWriter out, + PropertyBean property, + String propertyClass) throws IOException + { + out.println("this."+property.getFieldPropertyName()+" = "+property.getPropertyName()+";"); + } + + protected void writePropertyGetterContent(PrettyWriter out, + PropertyBean property) throws IOException + { + out.println("return this."+property.getFieldPropertyName()+";"); + } + + public void writePropertyListMethods( + PrettyWriter out, + PropertyBean property) throws IOException + { + // nothing + } +} Propchange: incubator/adffaces/branches/myfaces-1_2-maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/generator/MyFacesComponentGenerator.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: incubator/adffaces/branches/myfaces-1_2-maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/generator/MyFacesComponentGenerator.java ------------------------------------------------------------------------------ svn:keywords = Date Author Id Revision HeadURL