/* | |
* Licensed to the Apache Software Foundation (ASF) under one | |
* or more contributor license agreements. See the NOTICE file | |
* distributed with this work for additional information | |
* regarding copyright ownership. The ASF licenses this file | |
* to you 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.buildtools.maven2.plugin.faces.generator.taglib; | |
import org.apache.myfaces.buildtools.maven2.plugin.faces.io.PrettyWriter; | |
import org.apache.myfaces.buildtools.maven2.plugin.faces.parse.AbstractTagBean; | |
import org.apache.myfaces.buildtools.maven2.plugin.faces.parse.ConverterBean; | |
import org.apache.myfaces.buildtools.maven2.plugin.faces.parse.PropertyBean; | |
import org.apache.myfaces.buildtools.maven2.plugin.faces.util.FilteredIterator; | |
import org.apache.myfaces.buildtools.maven2.plugin.faces.util.Util; | |
import org.apache.maven.plugin.logging.Log; | |
import java.io.File; | |
import java.io.StringWriter; | |
import java.io.FileWriter; | |
import java.io.IOException; | |
import java.util.Set; | |
import java.util.Iterator; | |
public abstract class AbstractConverterTagGenerator extends AbstractTagGenerator { | |
protected AbstractConverterTagGenerator(boolean is12, String licenseHeader, Log log) { | |
super(is12, licenseHeader, log); | |
} | |
public void generateTagHandler( | |
ConverterBean converter, File generatedSourceDirectory) | |
{ | |
try | |
{ | |
getLog().debug("Generating " + converter.getTagClass()); | |
StringWriter sw = new StringWriter(); | |
PrettyWriter out = new PrettyWriter(sw); | |
Set imports = createImports(converter); | |
writeHeader(out, converter, imports); | |
writeClass(out, converter); | |
writeConstructor(out, converter); | |
writePropertyMethods(out, converter); | |
writeDoStartTag(out, converter); | |
writeCreateConverter(out, converter); | |
writeSetProperties(out, converter); | |
writeRelease(out, converter); | |
writeEnd(out); | |
// delay write in case of error | |
// timestamp should not be updated when an error occurs | |
// delete target file first, because it is readonly | |
File targetFile = createFile(generatedSourceDirectory, converter.getTagClass()); | |
targetFile.delete(); | |
FileWriter fw = new FileWriter(targetFile); | |
StringBuffer buf = sw.getBuffer(); | |
fw.write(buf.toString()); | |
fw.close(); | |
targetFile.setReadOnly(); | |
} | |
catch (Throwable e) | |
{ | |
getLog().error("Error generating " + converter.getTagClass(), e); | |
} | |
} | |
protected abstract Set createImports(ConverterBean converter); | |
protected abstract void writeSetProperty(PrettyWriter out, PropertyBean property); | |
private void writeSetProperties( | |
PrettyWriter out, | |
ConverterBean converter) throws IOException | |
{ | |
Iterator properties = converter.properties(); | |
properties = new FilteredIterator(properties, new TagAttributeFilter()); | |
if (properties.hasNext()) | |
{ | |
String converterFullClass = converter.getConverterClass(); | |
String converterClass = Util.getClassFromFullClass(converterFullClass); | |
out.println(); | |
out.println("private void _setProperties("); | |
out.indent(); | |
out.println(converterClass + " converter) throws JspException"); | |
out.unindent(); | |
out.println("{"); | |
out.indent(); | |
while (properties.hasNext()) | |
{ | |
PropertyBean property = (PropertyBean)properties.next(); | |
writeSetProperty(out, property); | |
} | |
out.unindent(); | |
out.println("}"); | |
} | |
} | |
protected void writeCreateConverter( | |
PrettyWriter out, | |
ConverterBean converter) throws IOException | |
{ | |
Iterator properties = converter.properties(); | |
properties = new FilteredIterator(properties, new TagAttributeFilter()); | |
if (properties.hasNext()) | |
{ | |
String converterFullClass = converter.getConverterClass(); | |
String converterClass = Util.getClassFromFullClass(converterFullClass); | |
out.println(); | |
// TODO: restore coding standards, and make final | |
if (is12()) { | |
out.println("@Override"); | |
} | |
out.println("protected Converter createConverter() throws JspException"); | |
out.println("{"); | |
out.indent(); | |
if (is12()) | |
{ | |
out.println("String converterId = " + converterClass + ".CONVERTER_ID;"); | |
out.println("Application appl = FacesContext.getCurrentInstance().getApplication();"); | |
out.println(converterClass + " converter = " + | |
"(" + converterClass + ")appl.createConverter(converterId);"); | |
} | |
else | |
{ | |
out.println(converterClass + " converter = " + | |
"(" + converterClass + ")super.createConverter();"); | |
} | |
out.println("_setProperties(converter);"); | |
out.println("return converter;"); | |
out.unindent(); | |
out.println("}"); | |
} | |
} | |
protected void writeDoStartTag( | |
PrettyWriter out, | |
ConverterBean converter) throws IOException | |
{ | |
if (!is12()) | |
{ | |
String converterFullClass = converter.getConverterClass(); | |
String converterClass = Util.getClassFromFullClass(converterFullClass); | |
out.println(); | |
// TODO: restore coding standards, and make final | |
out.println("@Override"); | |
out.println("public int doStartTag() throws JspException"); | |
out.println("{"); | |
out.indent(); | |
out.println("super.setConverterId(" + converterClass + ".CONVERTER_ID);"); | |
out.println("return super.doStartTag();"); | |
out.unindent(); | |
out.println("}"); | |
} | |
} | |
private void writeClass(PrettyWriter out, AbstractTagBean abstractTag) { | |
String className = Util.getClassFromFullClass(abstractTag.getTagClass()); | |
if (is12()) | |
{ | |
out.println("public class " + className + | |
" extends ConverterELTag"); | |
} | |
else | |
{ | |
out.println("public class " + className + | |
" extends ConverterTag"); | |
} | |
out.println("{"); | |
out.indent(); | |
} | |
} |