package org.nocket.gen.domain.visitor.properties;
import gengui.annotations.Prompt;
import gengui.domain.AbstractDomainReference;
import gengui.domain.DomainClassReference;
import gengui.guibuilder.DomainClassDecoration;
import gengui.guibuilder.FormBuilder;
import gengui.guibuilder.ResourceBundleAccess;
import gengui.util.AnnotationHelper;
import java.io.File;
import java.lang.reflect.Method;
import org.apache.commons.lang.StringUtils;
import org.nocket.gen.domain.DMDWebGenContext;
import org.nocket.gen.domain.element.AbstractDomainElement;
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.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;
// TODO: Auto-generated Javadoc
/**
* This visitor creates property file according to Wicket rules. The file is
* placed in "resources" folder. Default name is "gengui_de.properties". If file
* does exists, new properties are added to it. Old properties are never
* overwritten.
*
* @author blaz02
* @param <E> the element type
*/
public class GenguiPropertiesVisitor<E extends AbstractDomainReference> extends AbstractPropertiesVisitor<E> {
/** The Constant TABLE_HEADER. */
private static final String TABLE_HEADER = "%s.%s.table.header";
/** The last property file. */
protected File lastPropertyFile;
/**
* Instantiates a new gengui properties visitor.
*
* @param context the context
*/
public GenguiPropertiesVisitor(DMDWebGenContext<E> context) {
super(context);
}
/* (non-Javadoc)
* @see org.nocket.gen.domain.visitor.properties.AbstractPropertiesVisitor#getPropertiesFile()
*/
@Override
protected File getPropertiesFile() {
String propertiesFilePath = ResourceBundleAccess.determineResourceFileForCurrentLocaleFromClasspath();
return new File(propertiesFilePath);
}
/* (non-Javadoc)
* @see org.nocket.gen.domain.visitor.properties.AbstractPropertiesVisitor#finish()
*/
@Override
public void finish() {
super.finish();
ResourceBundleAccess.clearResourceBundleCache();
}
/* (non-Javadoc)
* @see org.nocket.gen.domain.visitor.DomainElementVisitorI#visitSimpleProperty(org.nocket.gen.domain.element.SimplePropertyElement)
*/
@Override
public void visitSimpleProperty(SimplePropertyElement<E> e) {
addProperty(getPropertyKey(e), e.getPromptFormatted());
}
/* (non-Javadoc)
* @see org.nocket.gen.domain.visitor.DomainElementVisitorI#visitChoicerProperty(org.nocket.gen.domain.element.ChoicerPropertyElement)
*/
@Override
public void visitChoicerProperty(ChoicerPropertyElement<E> e) {
addProperty(getPropertyKey(e), e.getPromptFormatted());
}
/* (non-Javadoc)
* @see org.nocket.gen.domain.visitor.DomainElementVisitorI#visitCheckboxProperty(org.nocket.gen.domain.element.CheckboxPropertyElement)
*/
@Override
public void visitCheckboxProperty(CheckboxPropertyElement<E> e) {
addProperty(getPropertyKey(e), e.getPromptFormatted());
}
/* (non-Javadoc)
* @see org.nocket.gen.domain.visitor.DomainElementVisitorI#visitButton(org.nocket.gen.domain.element.ButtonElement)
*/
@Override
public void visitButton(ButtonElement<E> e) {
addProperty(getPropertyKey(e), e.getPrompt());
}
/* (non-Javadoc)
* @see org.nocket.gen.domain.visitor.DomainElementVisitorI#visitResource(org.nocket.gen.domain.element.ResourceElement)
*/
@Override
public void visitResource(ResourceElement<E> e) {
addProperty(getPropertyKey(e), e.getPrompt());
}
/* (non-Javadoc)
* @see org.nocket.gen.domain.visitor.DomainElementVisitorI#visitFieldsetOpen(org.nocket.gen.domain.element.HeadlineElement)
*/
@Override
public void visitFieldsetOpen(HeadlineElement<E> e) {
// add prompt
String key = FormBuilder.buildPromptIdentifier(e.getAccessor().getClassRef(), e.getMethod(), e.getPrompt());
addProperty(key, e.getPrompt());
}
/* (non-Javadoc)
* @see org.nocket.gen.domain.visitor.DomainElementVisitorI#visitMultivalueProperty(org.nocket.gen.domain.element.MultivaluePropertyElement)
*/
@Override
public void visitMultivalueProperty(MultivaluePropertyElement<E> e) {
for (MultivalueColumnElement<E> column : e.getColumns()) {
addProperty(getPropertyKeyForTableHeader(column, true), column.getPrompt());
}
for (MultivalueButtonElement<E> button : e.getButtonElements()) {
String key = getPropertyKeyForTableHeader(button, false);
boolean buttonAdded = addProperty(key, button.getPrompt());
if (buttonAdded) {
// only add icon properties initially
String newKey = StringUtils.removeEnd(key, ".table.header");
addProperty(newKey + ".icon.enabled", "");
addProperty(newKey + ".icon.disabled", "");
}
}
}
/* (non-Javadoc)
* @see org.nocket.gen.domain.visitor.DomainElementVisitorI#visitFieldsetClose()
*/
@Override
public void visitFieldsetClose() {
// ignore
}
/* (non-Javadoc)
* @see org.nocket.gen.domain.visitor.DomainElementVisitorI#visitHiddenProperty(org.nocket.gen.domain.element.HiddenPropertyElement)
*/
@Override
public void visitHiddenProperty(HiddenPropertyElement<E> e) {
// ignore
}
/**
* Returns property key according to gengui rules. This will be either the
* value of @Prompt annotation or key will be assembled in this way:
* package.Class._propertyname.text
*
* @param e the e
* @return the property key
*/
private String getPropertyKey(AbstractDomainElement<E> e) {
String key = FormBuilder.buildPromptIdentifier(e.getAccessor().getClassRef(), e.getMethod(),
e.getPrompt());
return key;
}
/**
* Returns property key for the table column or table method according to
* gengui rules.
*
* @param e
* Column element
*
* @param capitalize
* If true, property name will be capitalized while assembling
* full property key
*
* @return This will be either the value of @Prompt annotation or key will
* be assembled in this way:
* package.Class.propertyname.table.header.
*/
private String getPropertyKeyForTableHeader(AbstractDomainElement<E> e, boolean capitalize) {
DomainClassReference classRef = e.getAccessor().getClassRef();
Method method = e.getMethod();
DomainClassDecoration interception = classRef.getDecorations("");
method = interception.getTarget(method.getName(), method);
Prompt prompt = new AnnotationHelper(method).getAnnotation(Prompt.class);
if (prompt != null)
return prompt.value();
return String.format(TABLE_HEADER, classRef.getDomainClass().getName(), capitalize ?
StringUtils.capitalize(e.getPropertyName()) : e.getPropertyName());
}
}