/*
* 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.swagger;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.teiid.core.TeiidException;
import org.teiid.language.Argument;
import org.teiid.language.Argument.Direction;
import org.teiid.language.Call;
import org.teiid.language.Literal;
import org.teiid.logging.LogConstants;
import org.teiid.logging.LogManager;
import org.teiid.logging.MessageLevel;
import org.teiid.metadata.AbstractMetadataRecord;
import org.teiid.metadata.Column;
import org.teiid.metadata.RuntimeMetadata;
import org.teiid.translator.ExecutionContext;
import org.teiid.translator.TranslatorException;
import org.teiid.translator.TypeFacility;
import org.teiid.translator.WSConnection;
import org.teiid.translator.ws.BinaryWSProcedureExecution;
public class BaseQueryExecution {
protected WSConnection connection;
protected SwaggerExecutionFactory translator;
protected RuntimeMetadata metadata;
protected ExecutionContext executionContext;
public BaseQueryExecution(SwaggerExecutionFactory translator,
ExecutionContext executionContext, RuntimeMetadata metadata,
WSConnection connection) {
this.metadata = metadata;
this.executionContext = executionContext;
this.translator = translator;
this.connection = connection;
}
String getHeader(BinaryWSProcedureExecution execution, String header) {
Object value = execution.getResponseHeader(header);
if (value instanceof List) {
return (String)((List<?>)value).get(0);
}
return (String)value;
}
protected BinaryWSProcedureExecution buildInvokeHTTP(String method,
String uri, Object payload, Map<String, List<String>> headers)
throws TranslatorException {
if (LogManager.isMessageToBeRecorded(LogConstants.CTX_CONNECTOR, MessageLevel.DETAIL)) {
try {
LogManager.logDetail(LogConstants.CTX_CONNECTOR,
"Source-URL=", URLDecoder.decode(uri, "UTF-8")); //$NON-NLS-1$ //$NON-NLS-2$
} catch (UnsupportedEncodingException e) {
}
}
List<Argument> parameters = new ArrayList<Argument>();
parameters.add(new Argument(Direction.IN,
new Literal(method, TypeFacility.RUNTIME_TYPES.STRING), null));
parameters.add(new Argument(Direction.IN,
new Literal(payload, TypeFacility.RUNTIME_TYPES.STRING), null));
parameters.add(new Argument(Direction.IN,
new Literal(uri, TypeFacility.RUNTIME_TYPES.STRING), null));
parameters.add(new Argument(Direction.IN,
new Literal(true, TypeFacility.RUNTIME_TYPES.BOOLEAN), null));
//the engine currently always associates out params at resolve time even if the
// values are not directly read by the call
parameters.add(new Argument(Direction.OUT, TypeFacility.RUNTIME_TYPES.STRING, null));
Call call = this.translator.getLanguageFactory().createCall("invokeHttp", parameters, null);
BinaryWSProcedureExecution execution = new BinaryWSProcedureExecution(
call, this.metadata, this.executionContext, null,
this.connection);
execution.setUseResponseContext(true);
execution.setCustomHeaders(headers);
return execution;
}
@SuppressWarnings("unchecked")
List<?> buildRow(List<Column> columns, boolean isMapResponse,
Class<?>[] expectedType, Map<String, Object> values) throws TranslatorException {
List<Object> results = new ArrayList<Object>();
for (int i = 0; i < columns.size(); i++) {
Column column = columns.get(i);
String colName = column.getName();
if (column.getNameInSource() != null) {
colName = column.getNameInSource();
}
int arrayIndex = colName.indexOf("[]/");
if (arrayIndex !=-1) {
colName = colName.substring(0,arrayIndex)+colName.substring(colName.indexOf("/",arrayIndex+3));
}
Object value;
try {
if (isMapResponse) {
if (colName.equals(SwaggerMetadataProcessor.KEY_NAME)) {
value = values.keySet().iterator().next();
} else if (colName.equals(SwaggerMetadataProcessor.KEY_VALUE)) {
value = values.values().iterator().next();
} else {
value = values.get(colName);
}
} else {
value = values.get(colName);
}
value = SwaggerTypeManager.convertTeiidRuntimeType(value, expectedType[i]);
} catch (TeiidException e) {
throw new TranslatorException(e);
}
results.add(value);
}
return results;
}
public String getName(AbstractMetadataRecord table) {
if (table.getNameInSource() != null) {
return table.getNameInSource();
}
return table.getName();
}
}