/*
* JBoss, Home of Professional Open Source.
*
* See the LEGAL.txt file distributed with this work for information regarding copyright ownership and licensing.
*
* See the AUTHORS.txt file distributed with this work for a full listing of individual contributors.
*/
package org.teiid.designer.metamodels.relational.util;
import java.util.ArrayList;
import java.util.Collection;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.emf.ecore.EObject;
import org.teiid.core.designer.ModelerCoreException;
import org.teiid.core.designer.util.CoreArgCheck;
import org.teiid.core.designer.util.StringConstants;
import org.teiid.designer.core.ModelerCore;
import org.teiid.designer.core.validation.rules.StringNameValidator;
import org.teiid.designer.metamodels.relational.RelationalPlugin;
/**
* Class to hold basic Pushdown-function data structure and method access to key values
*
* @since 8.0
*/
public class PushdownFunctionData {
String name;
String description;
boolean deterministic;
String nameInSource;
Collection<ParameterData> inputParameters;
ParameterData returnParameter;
public static String DEFAULT_TYPE = "string"; //$NON-NLS-1$
public static int DEFAULT_LENGTH = 255;
public static String DETERMINISTIC_PROPERTY_KEY = "ext-custom:deterministic"; //$NON-NLS-1$
private StringNameValidator validator = new StringNameValidator(1, 200, false);
public PushdownFunctionData() {
super();
this.inputParameters = new ArrayList<ParameterData>();
}
public void setToDefault(String name, String description, int numParams, int maxParams) {
setName(name);
setDescription(description);
ParameterData param = null;
Collection<ParameterData> params = new ArrayList<ParameterData>(5);
for( int i=0; i<numParams; i++ ) {
//param = new ParameterData("param_"+Integer.toString(i+1), defaultType, defaultLength);
param = new ParameterData(StringConstants.EMPTY_STRING, PushdownFunctionData.DEFAULT_TYPE, PushdownFunctionData.DEFAULT_LENGTH);
param.include();
params.add(param);
}
for( int i=numParams; i<maxParams; i++ ) {
//param = new ParameterData("param_"+Integer.toString(i+1), defaultType, defaultLength);
param = new ParameterData(StringConstants.EMPTY_STRING, PushdownFunctionData.DEFAULT_TYPE, PushdownFunctionData.DEFAULT_LENGTH);
params.add(param);
}
setInputParameters(params);
setReturnParameterName(StringConstants.EMPTY_STRING);
setReturnParameterLength(PushdownFunctionData.DEFAULT_LENGTH);
setReturnParameterType(PushdownFunctionData.DEFAULT_TYPE);
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return this.description;
}
public void setDescription(String description) {
this.description = description;
}
public String getNameInSource() {
return this.nameInSource;
}
public void setNameInSource(String nameInSource) {
this.nameInSource = nameInSource;
}
public boolean getDeterministic() {
return this.deterministic;
}
public void setDeterministic(boolean deterministic) {
this.deterministic = deterministic;
}
public String getReturnParameterName() {
if( this.returnParameter != null ) {
return this.returnParameter.getName();
}
return null;
}
public ParameterData getReturnParameterData() {
return this.returnParameter;
}
public void setReturnParameterName(String returnParameterName) {
if( this.returnParameter == null ) {
this.returnParameter = new ParameterData(returnParameterName, PushdownFunctionData.DEFAULT_TYPE, PushdownFunctionData.DEFAULT_LENGTH);
} else {
this.returnParameter.setName(returnParameterName);
}
}
public String getReturnParameterType() {
if( this.returnParameter != null ) {
return this.returnParameter.getType();
}
return null;
}
public int getReturnParameterLength() {
if( this.returnParameter != null ) {
return this.returnParameter.getLength();
}
return 255;
}
public void setReturnParameterLength(int length) {
if( this.returnParameter != null ) {
this.returnParameter.setLength(length);
}
}
public void setReturnParameterType(String returnParameterType) {
if( this.returnParameter != null ) {
this.returnParameter.setType(returnParameterType);
}
}
public Collection<ParameterData> getInputParameters() {
return this.inputParameters;
}
public void addInputParameter(String name, String type, int length) {
CoreArgCheck.isNotNull(name, "name"); //$NON-NLS-1$
CoreArgCheck.isNotNull(name, "type"); //$NON-NLS-1$
if( !inputParameterExists(name) ) {
this.inputParameters.add(new ParameterData(name, type, length));
}
}
public void setInputParameters(Collection<ParameterData> params) {
this.inputParameters.clear();
this.inputParameters.addAll(params);
}
public void addInputParameter(ParameterData param) {
CoreArgCheck.isNotNull(param, "data"); //$NON-NLS-1$
if( !inputParameterExists(param.getName()) ) {
this.inputParameters.add(param);
}
}
public boolean inputParameterExists(String name) {
for( ParameterData data : this.inputParameters ) {
if( data.getName().equalsIgnoreCase(name) ) {
return true;
}
}
return false;
}
public ParameterData getParameterData(int index) {
int nParams = this.inputParameters.size();
if( index < nParams) {
return (ParameterData)((ArrayList)this.inputParameters).get(index);
}
return null;
}
public void setInputParameterData(int index, String name, String type, int length) {
int nParams = this.inputParameters.size();
if( index < nParams) {
ParameterData data = (ParameterData)((ArrayList)this.inputParameters).get(index);
data.setName(name);
data.setType(type);
data.setLength(length);
}
}
public void removeInputLastParameter() {
// Should only remove the "last" parameter in the lists
int nParams = this.inputParameters.size();
if( nParams > 0 ) {
((ArrayList)this.inputParameters).remove(nParams-1);
}
}
/**
*
* @return status the IStatus
*/
public IStatus validate() {
IStatus status = new Status(IStatus.OK, RelationalPlugin.PLUGIN_ID, "OK"); //$NON-NLS-1$
String errorMessage = this.validator.checkValidName(this.name);
if( errorMessage != null ) {
return new Status(IStatus.ERROR, RelationalPlugin.PLUGIN_ID, errorMessage);
}
Collection<String> paramNames = new ArrayList<String>();
for( ParameterData param : getInputParameters() ) {
if( param.isIncluded() ) {
errorMessage = this.validator.checkValidName(param.getName());
if( errorMessage != null ) {
return new Status(IStatus.ERROR, RelationalPlugin.PLUGIN_ID,
RelationalPlugin.Util.getString("PushdownFunctionData.invalidInputParameterName", errorMessage)); //$NON-NLS-1$
}
int length = param.getLength();
if( length < 0 || length > 65000 ) {
return new Status(IStatus.ERROR, RelationalPlugin.PLUGIN_ID,
RelationalPlugin.Util.getString("PushdownFunctionData.invalidParameterLength", Integer.toString(length))); //$NON-NLS-1$
}
if( paramNames.contains(param.getName().toUpperCase())) {
return new Status(IStatus.ERROR, RelationalPlugin.PLUGIN_ID,
RelationalPlugin.Util.getString("PushdownFunctionData.duplicateInputParameterName", param.getName())); //$NON-NLS-1$
}
paramNames.add(param.getName().toUpperCase());
}
}
errorMessage = this.validator.checkValidName(getReturnParameterName());
if( errorMessage != null ) {
return new Status(IStatus.ERROR, RelationalPlugin.PLUGIN_ID,
RelationalPlugin.Util.getString("PushdownFunctionData.invalidReturnParameterName", errorMessage)); //$NON-NLS-1$
}
return status;
}
public EObject getDatatype(String type) {
EObject datatype = null;
try {
datatype = ModelerCore.getBuiltInTypesManager().findDatatype(type);
} catch (ModelerCoreException ex) {
// TODO Auto-generated catch block
ex.printStackTrace();
}
return datatype;
}
}