/*
* JBoss, Home of Professional Open Source.
* See the COPYRIGHT.txt file distributed with this work for information
* regarding copyright ownership. Some portions may be licensed
* to Red Hat, Inc. under one or more contributor license agreements.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301 USA.
*/
package org.teiid.translator.odata;
import java.util.ArrayList;
import java.util.List;
import org.teiid.language.Argument;
import org.teiid.language.Argument.Direction;
import org.teiid.language.Call;
import org.teiid.language.SQLConstants.Tokens;
import org.teiid.language.visitor.HierarchyVisitor;
import org.teiid.metadata.Column;
import org.teiid.metadata.Procedure;
import org.teiid.metadata.ProcedureParameter;
import org.teiid.metadata.RuntimeMetadata;
import org.teiid.metadata.Schema;
import org.teiid.metadata.Table;
import org.teiid.translator.TranslatorException;
import org.teiid.translator.WSConnection;
public class ODataProcedureVisitor extends HierarchyVisitor {
protected ODataExecutionFactory executionFactory;
protected RuntimeMetadata metadata;
protected ArrayList<TranslatorException> exceptions = new ArrayList<TranslatorException>();
private StringBuilder buffer = new StringBuilder();
private String method = "GET"; //$NON-NLS-1$
private String returnEntityTypeName;
private boolean returnsTable;
private Procedure procedure;
private String returnType;
private Class<?> returnTypeClass;
private boolean isComplexReturnType;
private Table entity;
private List<Column> returnColumns;
public ODataProcedureVisitor(ODataExecutionFactory executionFactory,
RuntimeMetadata metadata) {
this.executionFactory = executionFactory;
this.metadata = metadata;
}
@Override
public void visit(Call obj) {
Procedure proc = obj.getMetadataObject();
this.method = proc.getProperty(ODataMetadataProcessor.HTTP_METHOD, false);
this.procedure = proc;
this.buffer.append(obj.getProcedureName());
final List<Argument> params = obj.getArguments();
if (params != null && params.size() != 0) {
this.buffer.append("?"); //$NON-NLS-1$
Argument param = null;
StringBuilder temp = new StringBuilder();
for (int i = 0; i < params.size(); i++) {
param = params.get(i);
if (param.getDirection() == Direction.IN || param.getDirection() == Direction.INOUT) {
if (i != 0) {
this.buffer.append("&"); //$NON-NLS-1$
}
this.buffer.append(WSConnection.Util.httpURLEncode(param.getMetadataObject().getName()));
this.buffer.append(Tokens.EQ);
this.executionFactory.convertToODataInput(param.getArgumentValue(), temp);
this.buffer.append(WSConnection.Util.httpURLEncode(temp.toString()));
temp.setLength(0);
}
}
}
// this is collection based result
if(proc.getResultSet() != null) {
this.returnsTable = true;
this.returnEntityTypeName = proc.getProperty(ODataMetadataProcessor.ENTITY_TYPE, false);
this.entity = getTableWithEntityType(proc.getParent(), returnEntityTypeName);
this.isComplexReturnType = ( this.entity == null);
this.returnColumns = proc.getResultSet().getColumns();
}
else {
for (ProcedureParameter param:proc.getParameters()) {
if (param.getType().equals(ProcedureParameter.Type.ReturnValue)) {
this.returnType = param.getRuntimeType();
this.returnTypeClass = param.getJavaType();
}
}
}
}
Table getTableWithEntityType(Schema schema, String entityType) {
for (Table t:schema.getTables().values()) {
if (entityType.equals(t.getProperty(ODataMetadataProcessor.ENTITY_TYPE, false))) {
return t;
}
}
return null;
}
public String buildURL() {
return this.buffer.toString();
}
public String getMethod() {
return this.method;
}
public String getReturnEntityTypeName() {
return this.returnEntityTypeName;
}
public Table getTable() {
return this.entity;
}
public boolean hasCollectionReturn() {
return this.returnsTable;
}
public Column[] getReturnColumns() {
return this.returnColumns.toArray(new Column[this.returnColumns.size()]);
}
public boolean isReturnComplexType() {
return this.isComplexReturnType;
}
public Procedure getProcedure() {
return this.procedure;
}
public String getReturnType() {
return this.returnType;
}
public Class<?>getReturnTypeClass() {
return this.returnTypeClass;
}
}