package org.nocket.gen.domain.visitor.java; import gengui.domain.AbstractDomainReference; import java.util.Comparator; import java.util.HashSet; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import java.util.TreeMap; import org.nocket.gen.domain.DMDWebGenContext; import org.nocket.gen.domain.element.ButtonElement; import org.nocket.gen.domain.element.CheckboxPropertyElement; import org.nocket.gen.domain.element.ChoicerPropertyElement; import org.nocket.gen.domain.element.DomainElementI; import org.nocket.gen.domain.element.HeadlineElement; import org.nocket.gen.domain.element.HiddenPropertyElement; import org.nocket.gen.domain.element.MultivalueButtonElement; import org.nocket.gen.domain.element.MultivalueColumnElement; import org.nocket.gen.domain.element.MultivaluePropertyElement; import org.nocket.gen.domain.element.ResourceElement; import org.nocket.gen.domain.element.SimplePropertyElement; import org.nocket.util.Assert; /** * This visitor generates a utility class with constants definitions for the * wicketIds that have been generated into HTML to make coding the controller * easier and typesafe. */ public class JavaConstantsGeneratorVisitor<E extends AbstractDomainReference> extends AbstractJavaGeneratorVisitor<E> { private static final String SUFFIX = "Constants"; private final Comparator<? super String> keyComparator = new Comparator<String>() { @Override public int compare(String o1, String o2) { return o1.compareTo(o2); } }; private final Map<String, String> sortKey_wicketIdLine = new TreeMap<String, String>(keyComparator); private final Set<String> duplicateWicketIdFilter = new HashSet<String>(); private final Map<String, String> sortKey_propertyLine = new TreeMap<String, String>(keyComparator); private final Set<String> duplicatePropertyFilter = new HashSet<String>(); // Skip headline for multivalue elements, on all other circumstances, generate constant for it! private HeadlineElement<E> lastHeadline; public JavaConstantsGeneratorVisitor(DMDWebGenContext<E> context) { super(context); } @Override public void visitSimpleProperty(SimplePropertyElement<E> e) { appendConstant(e); } @Override public void visitChoicerProperty(ChoicerPropertyElement<E> e) { appendConstant(e); } @Override public void visitCheckboxProperty(CheckboxPropertyElement<E> e) { appendConstant(e); } @Override public void visitButton(ButtonElement<E> e) { appendConstant(e); } @Override public void visitResource(ResourceElement<E> e) { appendConstant(e); } @Override public void visitFieldsetOpen(HeadlineElement<E> e) { if (lastHeadline != null) { appendConstant(lastHeadline); } lastHeadline = e; } @Override public void visitMultivalueProperty(MultivaluePropertyElement<E> e) { lastHeadline = null; appendConstant(e); for (MultivalueColumnElement<E> c : e.getColumns()) { appendConstant(c, c.getPrompt(), c.getPropertiesWicketId().replace(".", "_"), c.getColumnName(), c.getPropertyName()); } for (MultivalueButtonElement<E> b : e.getButtonElements()) { appendConstant(b, b.getPrompt(), b.getPropertiesWicketId().replace(".", "_"), b.getPropertyName(), b.getPropertyName()); } } @Override public void visitFieldsetClose() { // Ignore } @Override public void visitHiddenProperty(HiddenPropertyElement<E> e) { appendConstant(e); } private void appendConstant(DomainElementI<E> e) { appendConstant(e, e.getPrompt(), e.getWicketId().replace(".", "_"), e.getWicketId(), e.getPropertyName()); } private void appendConstant(DomainElementI<E> e, String prompt, String variableName, String wicketId, String property) { if (lastHeadline != null) { HeadlineElement<E> copy = lastHeadline; lastHeadline = null; appendConstant(copy); } Assert.notNull(duplicateWicketIdFilter.add(variableName), "A constant for '" + variableName + "' isn't allowed to be created."); StringBuilder line = createVariableLine(e, prompt, variableName, wicketId); sortKey_wicketIdLine.put(variableName, line.toString()); if (duplicatePropertyFilter.add(property)) { StringBuilder proppertyLine = createPropertyLine(prompt, property); sortKey_propertyLine.put(property, proppertyLine.toString()); } } protected StringBuilder createPropertyLine(String prompt, String property) { StringBuilder proppertyLine = new StringBuilder(INDENT_1); proppertyLine.append(INDENT_1); proppertyLine.append("/** ").append(prompt).append(" */\n"); proppertyLine.append(INDENT_2).append("public static final String "); proppertyLine.append(property).append(" = \"").append(property).append("\";"); return proppertyLine; } protected StringBuilder createVariableLine(DomainElementI<E> e, String prompt, String variableName, String wicketId) { StringBuilder line = new StringBuilder(INDENT_1); line.append("/** " + e.getClass().getSimpleName() + ": "); line.append(prompt); line.append(" */\n"); line.append(INDENT_1).append("public static final String "); line.append(variableName).append(" = \"").append(wicketId).append("\";"); return line; } @Override public void finish() { if (!sortKey_wicketIdLine.isEmpty()) { StringBuilder gen = new StringBuilder(); gen.append("package ").append(getPojoPackageName()).append(";\n\n"); gen.append("// CHECKSTYLE_OFF\n"); gen.append("public final class ").append(getJavaClassName()).append(" {\n\n"); gen.append(INDENT_1).append("private ").append(getJavaClassName()).append("() {}\n\n"); for (Entry<String, String> entry : sortKey_wicketIdLine.entrySet()) { gen.append(entry.getValue()).append("\n"); } gen.append("\n"); gen.append(INDENT_1).append("public final class Properties {\n\n"); gen.append(INDENT_2).append("private Properties() {}\n\n"); for (Entry<String, String> entry : sortKey_propertyLine.entrySet()) { gen.append(entry.getValue()).append("\n"); } gen.append(INDENT_1).append("}\n\n}\n"); writeToFile(getOutputFileName(), gen); } } protected String getOutputFileName() { return getJavaClassName() + JAVAEXT; } protected String getJavaClassName() { return getPojoClassName() + SUFFIX; } }