/*
* 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.query.proc.wsdl;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Properties;
import org.teiid.designer.query.proc.wsdl.IWsdlColumnInfo;
import org.teiid.designer.query.proc.wsdl.IWsdlConstants;
import org.teiid.designer.query.proc.wsdl.IWsdlResponseInfo;
import org.teiid.designer.query.proc.wsdl.IWsdlWrapperInfo;
import org.teiid.designer.query.sql.ISQLConstants;
import org.teiid.designer.runtime.version.spi.ITeiidServerVersion;
/**
*
*/
public class WsdlResponseProcedureHelper extends AbstractWsdlHelper implements IWsdlConstants, ISQLConstants {
private final IWsdlResponseInfo responseInfo;
private final Properties properties;
/**
* @param teiidVersion
* @param responseInfo
* @param properties
*/
public WsdlResponseProcedureHelper(ITeiidServerVersion teiidVersion, IWsdlResponseInfo responseInfo, Properties properties) {
super(teiidVersion);
this.responseInfo = responseInfo;
this.properties = properties;
}
private IWsdlWrapperInfo getWrapperProcedure() {
return responseInfo.getWrapperProcedure();
}
private String getXmlTableString() {
// Response procedure name may have been overridden
String responseProcedureName = properties.getProperty(KEY_RESPONSE_PROCEDURE_NAME);
if( responseProcedureName == null ) {
responseProcedureName = responseInfo.getProcedureName();
}
StringBuilder sb = new StringBuilder();
String namespaceStr = getNamespaceString();
if (namespaceStr != null) {
sb.append(namespaceStr);
}
String xQueryExp = DEFAULT_XQUERY;
String rootPath = responseInfo.getRootPath();
if (rootPath != null && rootPath.length() > 0) {
xQueryExp = rootPath;
}
sb.append(S_QUOTE).append(xQueryExp).append(S_QUOTE).append(SPACE);
sb.append(PASSING)
.append(SPACE)
.append(convertSqlNameSegment(
getResponseProcedureParameter(responseProcedureName))).append(RETURN);
sb.append(TAB).append(COLUMNS).append(SPACE).append(RETURN);
int i = 0;
IWsdlColumnInfo[] bodyColumnInfoList = responseInfo.getBodyColumnInfoList();
int nColumns = bodyColumnInfoList.length;
for (IWsdlColumnInfo columnInfo : bodyColumnInfoList) {
if (columnInfo.getOrdinality()) {
sb.append(columnInfo.getSymbolName()).append(SPACE)
.append(FOR_ORDINALITY);
} else {
sb.append(TAB)
.append(TAB)
.append(convertSqlNameSegment(
columnInfo.getSymbolName())).append(SPACE)
.append(columnInfo.getDatatype());
String defValue = columnInfo.getDefaultValue();
if (defValue != null && defValue.length() > 0) {
sb.append(SPACE).append(DEFAULT).append(SPACE)
.append(S_QUOTE).append(defValue).append(S_QUOTE);
}
String relPath = columnInfo.getRelativePath();
if (relPath != null && relPath.length() > 1) {
//Strip out default namespace prefix
//relPath = relPath.replace(COLON, EMPTY_STR);
sb.append(SPACE).append(PATH).append(SPACE).append(S_QUOTE)
.append(relPath).append(S_QUOTE);
}
}
if (i < (nColumns - 1)) {
sb.append(COMMA).append(SPACE).append(RETURN);
}
i++;
}
return sb.toString();
}
private String getNamespaceString() {
//
// EXAMPLE: XMLNAMESPACES('http://www.kaptest.com/schema/1.0/party' AS
// pty)
//
Map<String, String> namespaceMap = responseInfo.getNamespaceMap();
Object nsObject = responseInfo.getOperation().getBinding().getPort().getNamespaceURI();
if (namespaceMap.isEmpty() && nsObject==null) {
return null;
}
// if (nsObject!=null){
// namespaceMap.put();
// }
//
StringBuffer sb = new StringBuffer();
sb.append(XMLNAMESPACES).append(L_PAREN);
int i = 0;
for (Entry<String, String> entry : namespaceMap.entrySet()) {
if (entry.getKey()==null || entry.getKey().equalsIgnoreCase(XSI_NAMESPACE_PREFIX)) {
continue;
}
if (i > 0) {
sb.append(COMMA).append(SPACE);
}
sb.append(S_QUOTE).append(entry.getValue()).append(S_QUOTE).append(SPACE)
.append(AS).append(SPACE).append(entry.getKey());
i++;
}
sb.append(R_PAREN).append(SPACE).append(COMMA).append(SPACE);
return sb.toString();
}
private String getResponseProcedureParameter(String procedureName) {
StringBuilder sb = new StringBuilder();
sb.append(getWrapperProcedure().getViewModelName()).append(DOT)
.append(procedureName).append(DOT)
.append("xml_in").append(SPACE); //$NON-NLS-1$
return sb.toString();
}
/**
* Generate the SQL statement for this response info
*
* @return SQL string
*/
public String getSQLStatement() {
// Generated SQL example for extract:
//
// CREATE VIRTUAL PROCEDURE
// BEGIN
// SELECT t.* FROM XMLTABLE(XMLNAMESPACES(DEFAULT
// 'http://quickstart.samples/xsd'), '/getPriceResponse' PASSING xml_in
// COLUMNS return_ double) AS t;
// END
// =============================================
// Generated SQL example for extract:
//
// CREATE VIRTUAL PROCEDURE
// BEGIN
// SELECT t.* FROM
// XMLTABLE( XMLNAMESPACES(DEFAULT
// 'http://www.oorsprong.org/websamples.countryinfo'),
// '/CapitalCityResponse'
// PASSING
// COUNTRYINFOSERVICEXML.CAPITALCITY.EXTRACT_CAPITALCITYRESPONSE.xml_in
// COLUMNS CapitalCityResult string)
// AS t;
// END
//
// CREATE VIRTUAL PROCEDURE
// BEGIN
// END
//
String alias = "t"; //$NON-NLS-1$
StringBuffer sb = new StringBuffer();
sb.append(SQL_BEGIN);
sb.append(TAB).append(SELECT).append(SPACE).append(alias).append(DOT)
.append(STAR).append(SPACE).append(FROM).append(RETURN);
sb.append(TAB).append(TAB).append(XMLTABLE).append(L_PAREN);
sb.append(getXmlTableString());
sb.append(R_PAREN);
sb.append(SPACE).append(AS).append(SPACE).append(alias)
.append(SEMI_COLON);
sb.append(SQL_END);
return sb.toString();
}
}