/* * 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 org.apache.synapse.config.xml; import org.apache.axiom.om.OMElement; import org.apache.axiom.om.OMNode; import org.apache.axiom.om.OMText; import org.apache.synapse.SynapseException; import org.apache.synapse.mediators.db.AbstractDBMediator; import org.apache.synapse.mediators.db.Statement; import javax.xml.namespace.QName; import javax.xml.stream.XMLStreamConstants; import java.sql.Types; /** * Base class for serializers for database related mediators. * * <dbreport | dblookup | .. etc> * <connection> * <pool> * ( * <driver/> * <url/> * <user/> * <password/> * | * <dsName/> * | * <dsName/> * <icClass/> * <url/> * <user/> * <password/> * ) * <property name="name" value="value"/>* * </pool> * </connection> * <statement> * <sql>insert into table values (?, ?, ..) OR select target from destinations where src = ?</sql> * <parameter (value="const" | expression="xpath") type="INTEGER|VARCHAR|..."/>* * <result name="propName" column="target | number"/>* * </statement>+ * </dbreport | dblookup | .. etc> * * Supported properties * autocommit = true | false * isolation = Connection.TRANSACTION_NONE * | Connection.TRANSACTION_READ_COMMITTED * | Connection.TRANSACTION_READ_UNCOMMITTED * | Connection.TRANSACTION_REPEATABLE_READ * | Connection.TRANSACTION_SERIALIZABLE * initialsize = int * maxactive = int * maxidle = int * maxopenstatements = int * maxwait = long * minidle = int * poolstatements = true | false * testonborrow = true | false * testonreturn = true | false * testwhileidle = true | false * validationquery = String */ public abstract class AbstractDBMediatorSerializer extends AbstractMediatorSerializer { protected void serializeDBInformation(AbstractDBMediator mediator, OMElement dbParent) { OMElement connElt = fac.createOMElement("connection", synNS); connElt.addChild(createPoolElement(mediator)); dbParent.addChild(connElt); // process statements for (Statement statement : mediator.getStatementList()) { dbParent.addChild(createStatementElement(statement)); } } private OMNode createPoolElement(AbstractDBMediator mediator) { OMElement poolElt = fac.createOMElement("pool", synNS); for (Object o : mediator.getDataSourceProps().keySet()) { String value = mediator.getDataSourceProps().get(o); if (o instanceof QName) { QName name = (QName) o; OMElement elt = fac.createOMElement(name.getLocalPart(), synNS); elt.setText(value); poolElt.addChild(elt); } else if (o instanceof String) { OMElement elt = fac.createOMElement( AbstractDBMediatorFactory.PROP_Q.getLocalPart(), synNS); elt.addAttribute(fac.createOMAttribute("name", nullNS, (String) o)); elt.addAttribute(fac.createOMAttribute("value", nullNS, value)); poolElt.addChild(elt); } } return poolElt; } private OMNode createStatementElement(Statement statement) { OMElement stmntElt = fac.createOMElement( AbstractDBMediatorFactory.STMNT_Q.getLocalPart(), synNS); OMElement sqlElt = fac.createOMElement( AbstractDBMediatorFactory.SQL_Q.getLocalPart(), synNS); OMText sqlText = fac.createOMText(statement.getRawStatement(), XMLStreamConstants.CDATA); sqlElt.addChild(sqlText); stmntElt.addChild(sqlElt); // serialize parameters of the statement for (Statement.Parameter param : statement.getParameters()) { OMElement paramElt = createStatementParamElement(param); stmntElt.addChild(paramElt); } // serialize any optional results of the statement for (String name : statement.getResultsMap().keySet()) { String columnStr = statement.getResultsMap().get(name); OMElement resultElt = fac.createOMElement( AbstractDBMediatorFactory.RESULT_Q.getLocalPart(), synNS); resultElt.addAttribute( fac.createOMAttribute("name", nullNS, name)); resultElt.addAttribute( fac.createOMAttribute("column", nullNS, columnStr)); stmntElt.addChild(resultElt); } return stmntElt; } private OMElement createStatementParamElement(Statement.Parameter param) { OMElement paramElt = fac.createOMElement( AbstractDBMediatorFactory.PARAM_Q.getLocalPart(), synNS); if (param.getPropertyName() != null) { paramElt.addAttribute( fac.createOMAttribute("value", nullNS, param.getPropertyName())); } if (param.getXpath() != null) { SynapseXPathSerializer.serializeXPath(param.getXpath(), paramElt, "expression"); } switch (param.getType()) { case Types.CHAR: { paramElt.addAttribute(fac.createOMAttribute("type", nullNS, "CHAR")); break; } case Types.VARCHAR: { paramElt.addAttribute(fac.createOMAttribute("type", nullNS, "VARCHAR")); break; } case Types.LONGVARCHAR: { paramElt.addAttribute(fac.createOMAttribute("type", nullNS, "LONGVARCHAR")); break; } case Types.NUMERIC: { paramElt.addAttribute(fac.createOMAttribute("type", nullNS, "NUMERIC")); break; } case Types.DECIMAL: { paramElt.addAttribute(fac.createOMAttribute("type", nullNS, "DECIMAL")); break; } case Types.BIT: { paramElt.addAttribute(fac.createOMAttribute("type", nullNS, "BIT")); break; } case Types.TINYINT: { paramElt.addAttribute(fac.createOMAttribute("type", nullNS, "TINYINT")); break; } case Types.SMALLINT: { paramElt.addAttribute(fac.createOMAttribute("type", nullNS, "SMALLINT")); break; } case Types.INTEGER: { paramElt.addAttribute(fac.createOMAttribute("type", nullNS, "INTEGER")); break; } case Types.BIGINT: { paramElt.addAttribute(fac.createOMAttribute("type", nullNS, "BIGINT")); break; } case Types.REAL: { paramElt.addAttribute(fac.createOMAttribute("type", nullNS, "REAL")); break; } case Types.FLOAT: { paramElt.addAttribute(fac.createOMAttribute("type", nullNS, "FLOAT")); break; } case Types.DOUBLE: { paramElt.addAttribute(fac.createOMAttribute("type", nullNS, "DOUBLE")); break; } case Types.DATE: { paramElt.addAttribute(fac.createOMAttribute("type", nullNS, "DATE")); break; } case Types.TIME: { paramElt.addAttribute(fac.createOMAttribute("type", nullNS, "TIME")); break; } case Types.TIMESTAMP: { paramElt.addAttribute(fac.createOMAttribute("type", nullNS, "TIMESTAMP")); break; } default: { throw new SynapseException("Unknown or unsupported JDBC type : " + param.getType()); } } return paramElt; } }