package au.com.vaadinutils.jasper.parameter; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.text.ParseException; import java.util.Date; import java.util.LinkedHashSet; import java.util.Set; import com.google.common.base.Preconditions; import com.vaadin.data.Property.ReadOnlyException; import com.vaadin.data.Validator.InvalidValueException; import com.vaadin.data.util.converter.Converter.ConversionException; import com.vaadin.server.ErrorMessage; import com.vaadin.ui.AbstractField; import com.vaadin.ui.Component; import au.com.vaadinutils.jasper.filter.ValidateListener; import au.com.vaadinutils.jasper.scheduler.entities.DateParameterType; public abstract class ReportParameter<T> { final Set<String> parameters = new LinkedHashSet<String>(); final protected String label; protected ValidateListener validateListener; public ReportParameter(String label, String parameterName) { Preconditions.checkNotNull(label, "Label may not be null, as it is used for hashcode/equals"); parameters.add(parameterName); this.label = label; } public ReportParameter(String label, String parameterNames[]) { Preconditions.checkNotNull(label, "Label may not be null, as it is used for hashcode/equals"); for (String param : parameterNames) { parameters.add(param); } this.label = label; } public String getUrlEncodedKeyAndParameter(String parameterName) throws UnsupportedEncodingException { return parameterName + "=" + URLEncoder.encode(getValue(parameterName).toString(), "UTF-8"); } public abstract Object getValue(String parameterName); public abstract Component getComponent(); public abstract boolean shouldExpand(); public abstract void setDefaultValue(T defaultValue); public Set<String> getParameterNames() { return parameters; } public abstract String getExpectedParameterClassName(); public String getLabel(String parameterName) { return label; } public boolean showFilter() { return true; } abstract public String getDisplayValue(String parameterName); abstract public boolean validate(); protected boolean validateField(AbstractField<T> field) { boolean valid = false; try { field.setComponentError(null); if (validateListener != null) { validateListener.setComponentError(null); } field.validate(); valid = true; } catch (final InvalidValueException e) { ErrorMessage componentError = new ErrorMessage() { private static final long serialVersionUID = -2976235476811651668L; @Override public String getFormattedHtmlMessage() { return e.getHtmlMessage(); } @Override public ErrorLevel getErrorLevel() { return ErrorLevel.ERROR; } }; field.setComponentError(componentError); if (validateListener != null) { validateListener.setComponentError(componentError); } } return valid; } public void addValidateListener(ValidateListener listener) { this.validateListener = listener; } public boolean displayInreport() { return true; } abstract public void setValueAsString(String value, String paramterName) throws ReadOnlyException, ConversionException, ParseException; abstract public boolean isDateField(); abstract public DateParameterType getDateParameterType(); public Date getStartDate() { throw new RuntimeException( "Date Parameters must overide and implement this method: " + this.getClass().getCanonicalName()); } public Date getEndDate() { throw new RuntimeException( "Date Parameters must overide and implement this method: " + this.getClass().getCanonicalName()); } public void setStartDate(Date date) { throw new RuntimeException( "Date Parameters must overide and implement this method: " + this.getClass().getCanonicalName()); } public void setEndDate(Date date) { throw new RuntimeException( "Date Parameters must overide and implement this method: " + this.getClass().getCanonicalName()); } /* * (non-Javadoc) * * @see java.lang.Object#hashCode() */ @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((label == null) ? 0 : label.hashCode()); return result; } /* * (non-Javadoc) * * @see java.lang.Object#equals(java.lang.Object) */ @Override public boolean equals(Object obj) { if (this == obj) { return true; } if (obj == null) { return false; } if (!(obj instanceof ReportParameter)) { return false; } ReportParameter<?> other = (ReportParameter<?>) obj; if (label == null) { if (other.label != null) { return false; } } else if (!label.equals(other.label)) { return false; } return true; } public void alterParameterNames(String names) { Preconditions.checkArgument(parameters.size() == 1); parameters.clear(); parameters.add(names); } }