blob: 818f06ac00ef5fe0865b7ba78749ff55019029ac [file] [log] [blame]
/*
* Copyright 2002,2004 The Apache Software Foundation.
*
* Licensed 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.commons.jelly.tags.sql;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.jsp.jstl.sql.SQLExecutionTag;
import javax.sql.DataSource;
import org.apache.commons.jelly.JellyTagException;
import org.apache.commons.jelly.TagSupport;
import org.apache.commons.jelly.tags.Resources;
/**
* <p>Abstract base class for any SQL related tag in JSTL.
*
* @author Hans Bergsten
* @author Justyna Horwat
* @author <a href="mailto:jstrachan@apache.org">James Strachan</a>
*/
public abstract class SqlTagSupport extends TagSupport implements SQLExecutionTag {
protected String var;
protected String scope = "page";
/*
* The following properties take expression values, so the
* setter methods are implemented by the expression type
* specific subclasses.
*/
protected Object rawDataSource;
protected boolean dataSourceSpecified;
protected String sql;
/*
* Instance variables that are not for attributes
*/
private List parameters;
protected boolean isPartOfTransaction;
//*********************************************************************
// Constructor and initialization
public SqlTagSupport() {
super.setEscapeText(false);
}
//*********************************************************************
// Accessor methods
/**
* Sets the name of the variable to hold the
* result.
*/
public void setVar(String var) {
this.var = var;
}
/**
* Sets the scope of the variable to hold the
* result.
*/
public void setScope(String scopeName) {
this.scope = scopeName;
}
/**
* Sets the SQL DataSource. DataSource can be
* a String or a DataSource object.
*/
public void setDataSource(Object dataSource) {
this.rawDataSource = dataSource;
this.dataSourceSpecified = true;
}
/**
* Sets the SQL statement to use for the
* query. The statement may contain parameter markers
* (question marks, ?). If so, the parameter values must
* be set using nested value elements.
*/
public void setSql(String sql) {
this.sql = sql;
}
//*********************************************************************
// Public utility methods
/**
* Called by nested parameter elements to add PreparedStatement
* parameter values.
*/
public void addSQLParameter(Object o) {
if (parameters == null) {
parameters = new ArrayList();
}
parameters.add(o);
}
//*********************************************************************
// Protected utility methods
/**
* @return true if there are SQL parameters
*/
protected boolean hasParameters() {
return parameters != null && parameters.size() > 0;
}
protected void clearParameters() {
parameters = null;
}
protected Connection getConnection() throws JellyTagException, SQLException {
// Fix: Add all other mechanisms
Connection conn = null;
isPartOfTransaction = false;
TransactionTag parent =
(TransactionTag) findAncestorWithClass(TransactionTag.class);
if (parent != null) {
if (dataSourceSpecified) {
throw new JellyTagException(Resources.getMessage("ERROR_NESTED_DATASOURCE"));
}
conn = parent.getSharedConnection();
isPartOfTransaction = true;
}
else {
if ((rawDataSource == null) && dataSourceSpecified) {
throw new JellyTagException(Resources.getMessage("SQL_DATASOURCE_NULL"));
}
DataSource dataSource = DataSourceUtil.getDataSource(rawDataSource, context);
try {
conn = dataSource.getConnection();
}
catch (Exception ex) {
throw new JellyTagException(
Resources.getMessage("DATASOURCE_INVALID", ex.getMessage()));
}
}
return conn;
}
protected void setParameters(PreparedStatement ps)
throws SQLException {
if (parameters != null) {
for (int i = 0; i < parameters.size(); i++) {
// The first parameter has index 1
ps.setObject(i + 1, parameters.get(i));
}
}
}
}