/*
* 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 ro.nextreports.engine.queryexec;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.annotation.XmlTransient;
import ro.nextreports.engine.util.StringUtil;
/**
* Parameter defined for report
*
* @author Decebal Suiu
*/
public class QueryParameter implements Serializable {
private static final long serialVersionUID = -4076375031406410286L;
/** Value for Integer java class */
public static final String INTEGER_VALUE = "java.lang.Integer";
/** Value for String java class */
public static final String STRING_VALUE = "java.lang.String";
/** Value for Boolean java class */
public static final String BOOLEAN_VALUE = "java.lang.Boolean";
/** Value for Byte java class */
public static final String BYTE_VALUE = "java.lang.Byte";
/** Value for Date java class */
public static final String DATE_VALUE = "java.util.Date";
/** Value for Timestamp java class */
public static final String TIMESTAMP_VALUE = "java.sql.Timestamp";
/** Value for Time java class */
public static final String TIME_VALUE = "java.sql.Time";
/** Value for Double java class */
public static final String DOUBLE_VALUE = "java.lang.Double";
/** Value for Float java class */
public static final String FLOAT_VALUE = "java.lang.Float";
/** Value for Long java class */
public static final String LONG_VALUE = "java.lang.Long";
/** Value for Short java class */
public static final String SHORT_VALUE = "java.lang.Short";
/** Value for BigDecimal java class */
public static final String BIGDECIMAL_VALUE = "java.math.BigDecimal";
/** Value for BigInteger java class */
public static final String BIGINTEGER_VALUE = "java.math.BigInteger";
/** Value for Object java class */
public static final String OBJECT_VALUE = "java.lang.Object";
/**
* Parameter single selection : only ine value can be selected at runtime
*/
public static final String SINGLE_SELECTION = "Single";
/**
* Parameter multiple selection : more than one value can be selected at
* runtime
*/
public static final String MULTIPLE_SELECTION = "Multiple";
/** No order for parameter source */
public static final byte NO_ORDER = -1;
// These values are used in the orderByCombo from SourceDialog (do not
// modify)
/** Select order for parameter source */
public static final byte ORDER_BY_SELECT = 0;
/** Order by name for parameter with manual source */
public static final byte ORDER_BY_NAME = 1;
/** Order by id for parameter with manual source */
public static final byte ORDER_BY_ID = 2;
/** Name of start date parameter used in intervals */
public static String INTERVAL_START_DATE_NAME = "start_date";
/** Name of end date parameter used in intervals */
public static String INTERVAL_END_DATE_NAME = "end_date";
/** All values for java classes */
public static final String[] ALL_VALUES = { INTEGER_VALUE, STRING_VALUE, BOOLEAN_VALUE, BYTE_VALUE, DATE_VALUE,
TIMESTAMP_VALUE, TIME_VALUE, DOUBLE_VALUE, FLOAT_VALUE, LONG_VALUE, SHORT_VALUE, BIGDECIMAL_VALUE,
BIGINTEGER_VALUE, OBJECT_VALUE };
/** All value sfor parameter selection */
public static final String[] SELECTIONS = { SINGLE_SELECTION, MULTIPLE_SELECTION };
protected String name;
protected String runtimeName;
protected String description;
protected String valueClassName = STRING_VALUE;
protected transient Class valueClass;
protected String source;
protected String selection;
protected boolean ignore;
protected boolean mandatory;
protected boolean manualSource; // source is a "select" written by user
protected String schema;
protected boolean isProcedureParameter;
protected String previewValue; // preview value for procedure parameter
protected byte orderBy;
protected ArrayList<Serializable> defaultValues;
protected String defaultSource;
// for true parameter does not appear at runtime
// a hidden parameter must have a default value
protected boolean hidden;
// from external parameters
protected transient List values = new ArrayList();
// values from default source
protected transient ArrayList<Serializable> defaultSourceValues;
// set if it is used inside a subreport
protected transient boolean subreportParameter = false;
/**
* public no-arg constructor added only for JAXB marshall/unmarshall
*/
public QueryParameter(){
this.name = "__default__";
this.description = "__default__";
this.valueClassName = "__default__";
}
/**
* Create a query parameter
*
* @param name
* parameter name
* @param valueClassName
* name for the value class
*/
public QueryParameter(String name, String valueClassName) {
this(name, "", valueClassName);
}
/**
* Create a query parameter
*
* @param name
* parameter name
* @param description
* parameter description
* @param valueClassName
* name for the value class
*/
public QueryParameter(String name, String description, String valueClassName) {
this.name = name;
this.description = description;
this.valueClassName = valueClassName;
}
/**
* Get parameter name
*
* @return parameter name
*/
public String getName() {
return this.name;
}
/**
* Set parameter name
*
* This method is useful if we want to clone a parameter because we need to
* change the name
*/
public void setName(String name) {
this.name = name;
}
/**
* Get parameter name at runtime
*
* @return parameter name at runtime
*/
public String getRuntimeName() {
return runtimeName;
}
/**
* Set parameter runtime name
*
* @param runtimeName
* parameter runtime name
*/
public void setRuntimeName(String runtimeName) {
this.runtimeName = runtimeName;
}
/**
* Get parameter description
*
* @return parameter description
*/
public String getDescription() {
return this.description;
}
/**
* Set parameter description
*
* @param description
* parameter description
*/
public void setDescription(String description) {
this.description = description;
}
/**
* Get java class object for the parameter value
*
* @return java class object for the parameter value
*/
public Class getValueClass() {
if (valueClass == null) {
if (valueClassName != null) {
try {
valueClass = Class.forName(valueClassName);
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
}
}
}
return valueClass;
}
/**
* Get the name of the value class
*
* @return the name of the value class
*/
public String getValueClassName() {
return valueClassName;
}
/**
* Get parameter selection
*
* @return parameter selection
*/
public String getSelection() {
return selection;
}
/**
* Set parameter selection
*
* @param selection
* parameter selection
*/
public void setSelection(String selection) {
this.selection = selection;
}
/**
* Get parameter source
*
* @return parameter source
*/
public String getSource() {
return source;
}
/**
* Set parameter source
*
* @param source
* parameter source
*/
public void setSource(String source) {
this.source = source;
}
public boolean isIgnore() {
return ignore;
}
public void setIgnore(boolean ignore) {
this.ignore = ignore;
}
/**
* Get parameter values
*
* @return parameter values
*/
public List getValues() {
return values;
}
/**
* Set parameter values
*
* @param values
* parameter values
*/
public void setValues(List values) {
this.values = values;
}
/**
* Get default parameter values
*
* @return default parameter values
*/
@XmlTransient
public ArrayList<Serializable> getDefaultValues() {
return defaultValues;
}
/**
* Set default parameter values
*
* @param defaultValues
* default parameter values
*/
public void setDefaultValues(ArrayList<Serializable> defaultValues) {
this.defaultValues = defaultValues;
}
/**
* Get default source for parameters
*
* @return default source for parameters
*/
public String getDefaultSource() {
return defaultSource;
}
/**
* Set default source for parameters
*
* @param defaultSource
* default source for parameters
*/
public void setDefaultSource(String defaultSource) {
this.defaultSource = defaultSource;
}
/**
* Get default source parameter values
*
* @return default source parameter values
*/
@XmlTransient
public ArrayList<Serializable> getDefaultSourceValues() {
return defaultSourceValues;
}
/**
* Set default source parameter values
*
* @param defaultSourceValues
* default source parameter values
*/
public void setDefaultSourceValues(ArrayList<Serializable> defaultSourceValues) {
this.defaultSourceValues = defaultSourceValues;
}
/**
* See if parameter is mandatory (must enter value(s) at runtime)
*
* @return true if parameter is mandatory
*/
public boolean isMandatory() {
return mandatory;
}
/**
* Set mandatory flag
*
* @param mandatory
* mandatory flag
*/
public void setMandatory(boolean mandatory) {
this.mandatory = mandatory;
}
/**
* See if parameter has a manual source (an sql select)
*
* @return true if parameter has a manual source
*/
public boolean isManualSource() {
return manualSource;
}
/**
* Set manual source flag
*
* @param manualSource
* manual source flag
*/
public void setManualSource(boolean manualSource) {
this.manualSource = manualSource;
}
/**
* Get database schema
*
* @return database schema
*/
public String getSchema() {
return schema;
}
/**
* Set database schema
*
* @param schema
* database schema
*/
public void setSchema(String schema) {
this.schema = schema;
}
/**
* See if this parameter is a procedure parameter
*
* @return true if this parameter is a procedure parameter
*/
public boolean isProcedureParameter() {
return isProcedureParameter;
}
/**
* Set procedure parameter
*
* @param procedureParameter
* true if this parameter is a procedure parameter, false
* otherwise
*/
public void setProcedureParameter(boolean procedureParameter) {
isProcedureParameter = procedureParameter;
}
/**
* Get preview value for procedure parameter This value must be used inside
* the business procedure to exit (so we can can the columns as fast as
* possible)
*
* @return preview value as a string
*/
public String getPreviewValue() {
return previewValue;
}
/**
* Set preview value for procedure parameter Allows to set null for any type
*
* @param previewValue
* preview value for procedure parameter
*/
public void setPreviewValue(String previewValue) {
if (!isProcedureParameter && (previewValue != null)) {
throw new IllegalArgumentException("Parameter '" + name + "' is not a procedure parameter.");
}
this.previewValue = previewValue;
}
/**
* Get order for parameter values : ORDER_BY_NAME, ORDER_BY_ID Has meaning
* only if parameter has a manual source
*
* @return order type of parameter values
*/
public byte getOrderBy() {
return orderBy;
}
/**
* Set order for parameter values :
*
* @param orderBy
* one of ORDER_BY_NAME, ORDER_BY_ID
*/
public void setOrderBy(byte orderBy) {
this.orderBy = orderBy;
}
/**
* See if current parameter is hidden (does not appear at runtime)
*
* @return true if parameter iss hidden
*/
public boolean isHidden() {
return hidden;
}
/**
* Set hidden
*
* @param hidden
* hidden
*/
public void setHidden(boolean hidden) {
this.hidden = hidden;
}
/**
* See if parameter is dependent on other parameters (its manual source
* contains other parameters names between tags '${' and '}'
*
* @return true if parameter is dependent on other parameters, false
* otherwise
*/
public boolean isDependent() {
if (isManualSource()) {
if (source.contains("${")) {
return true;
}
}
return false;
}
/**
* Get dependent parameter names
*
* @return a list of the names of all parameters the current parameter
* depends on
*/
public List<String> getDependentParameterNames() {
List<String> names = new ArrayList<String>();
if (isDependent()) {
String chunk = source;
int start = chunk.indexOf("${");
while (start != -1) {
int end = chunk.indexOf("}");
String paramName = chunk.substring(start + 2, end);
names.add(paramName);
if (end == chunk.length() - 1) {
start = -1;
} else {
chunk = chunk.substring(end + 1);
start = chunk.indexOf("${");
}
}
}
return names;
}
public boolean isSubreportParameter() {
return subreportParameter;
}
public void setSubreportParameter(boolean subreportParameter) {
this.subreportParameter = subreportParameter;
}
/**
* Equals
*
* @param o
* parameter object
* @return true if current parameter object equals parameter object, false
* otherwise
*/
public boolean equals(Object o) {
if (!basicEquals(o))
return false;
QueryParameter that = (QueryParameter) o;
if (ignore != that.ignore)
return false;
if (mandatory != that.mandatory)
return false;
if (description != null ? !description.equals(that.description) : that.description != null)
return false;
if (runtimeName != null ? !runtimeName.equals(that.runtimeName) : that.runtimeName != null)
return false;
if (schema != null ? !schema.equals(that.schema) : that.schema != null)
return false;
if (orderBy != that.getOrderBy())
return false;
if (source != null ? !source.equals(that.source) : that.source != null)
return false;
if (defaultSource != null ? !defaultSource.equals(that.defaultSource) : that.defaultSource != null)
return false;
return true;
}
private boolean basicEquals(Object o) {
if (this == o)
return true;
if (o == null || getClass() != o.getClass())
return false;
QueryParameter that = (QueryParameter) o;
if (manualSource != that.manualSource)
return false;
if (name != null ? !name.equals(that.name) : that.name != null)
return false;
if (selection != null ? !selection.equals(that.selection) : that.selection != null)
return false;
if (valueClassName != null ? !valueClassName.equals(that.valueClassName) : that.valueClassName != null)
return false;
if (isProcedureParameter != that.isProcedureParameter)
return false;
if (previewValue != null ? !previewValue.equals(that.previewValue) : that.previewValue != null)
return false;
if (defaultValues != null && that.defaultValues != null
&& (!defaultValues.containsAll(that.defaultValues) || !that.defaultValues.containsAll(defaultValues)))
return false;
if (hidden != that.hidden)
return false;
return true;
}
// functional comparison
public boolean compare(Object o) {
if (!basicEquals(o))
return false;
QueryParameter that = (QueryParameter) o;
// compare sources to have the same select no matter of letter-case and
// white spaces
if (!StringUtil.equalsText(source, that.source))
return false;
if (!StringUtil.equalsText(defaultSource, that.defaultSource))
return false;
return true;
}
/**
* Hash code value for this parameter
*
* @return a hash code value for this parameter
*/
public int hashCode() {
int result;
result = (name != null ? name.hashCode() : 0);
result = 31 * result + (runtimeName != null ? runtimeName.hashCode() : 0);
result = 31 * result + (description != null ? description.hashCode() : 0);
result = 31 * result + (valueClassName != null ? valueClassName.hashCode() : 0);
result = 31 * result + (source != null ? source.hashCode() : 0);
result = 31 * result + (selection != null ? selection.hashCode() : 0);
result = 31 * result + (ignore ? 1 : 0);
result = 31 * result + (mandatory ? 1 : 0);
result = 31 * result + (manualSource ? 1 : 0);
result = 31 * result + (schema != null ? schema.hashCode() : 0);
result = 31 * result + (isProcedureParameter ? 1 : 0);
result = 31 * result + (previewValue != null ? previewValue.hashCode() : 0);
result = 31 * result + orderBy;
result = 31 * result + (defaultValues != null ? defaultValues.hashCode() : 0);
result = 31 * result + (defaultSource != null ? defaultSource.hashCode() : 0);
result = 31 * result + (hidden ? 1 : 0);
return result;
}
public String toString() {
return "QueryParameter{" + "name='" + name + '\'' + ", runtimeName='" + runtimeName + '\'' + ", description='"
+ description + '\'' + ", valueClassName='" + valueClassName + '\'' + ", source='" + source + '\''
+ ", selection='" + selection + '\'' + ", ignore=" + ignore + ", mandatory=" + mandatory
+ ", manualSource=" + manualSource + ", schema='" + schema + '\'' + ", isProcedureParameter="
+ isProcedureParameter + ", previewValue='" + previewValue + '\'' + ", orderBy=" + orderBy + ", hidden="
+ hidden + ", defaultValues=" + defaultValues + ", defaultSource=" + defaultSource
+ ", defaultSourceValues=" + defaultSourceValues + '}';
}
}