1 /*
2 * The Apache Software License, Version 1.1
3 *
4 * Copyright (c) 1999 The Apache Software Foundation. All rights
5 * reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 *
11 * 1. Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 *
14 * 2. Redistributions in binary form must reproduce the above copyright
15 * notice, this list of conditions and the following disclaimer in
16 * the documentation and/or other materials provided with the
17 * distribution.
18 *
19 * 3. The end-user documentation included with the redistribution, if
20 * any, must include the following acknowlegement:
21 * "This product includes software developed by the
22 * Apache Software Foundation (http://www.apache.org/)."
23 * Alternately, this acknowlegement may appear in the software itself,
24 * if and wherever such third-party acknowlegements normally appear.
25 *
26 * 4. The names "The Jakarta Project", "Tomcat", and "Apache Software
27 * Foundation" must not be used to endorse or promote products derived
28 * from this software without prior written permission. For written
29 * permission, please contact apache@apache.org.
30 *
31 * 5. Products derived from this software may not be called "Apache"
32 * nor may "Apache" appear in their names without prior written
33 * permission of the Apache Group.
34 *
35 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
36 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
37 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
38 * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
39 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
40 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
41 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
42 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
43 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
44 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
45 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
46 * SUCH DAMAGE.
47 * ====================================================================
48 *
49 * This software consists of voluntary contributions made by many
50 * individuals on behalf of the Apache Software Foundation. For more
51 * information on the Apache Software Foundation, please see
52 * <http://www.apache.org/>.
53 *
54 */
55
56 package org.apache.commons.jelly.tags.sql;
57
58 import java.sql.*;
59 import java.util.*;
60 import javax.sql.DataSource;
61 import javax.naming.InitialContext;
62 import javax.naming.Context;
63 import javax.naming.NamingException;
64
65 import org.apache.commons.jelly.JellyContext;
66 import org.apache.commons.jelly.JellyException;
67 import org.apache.commons.jelly.TagSupport;
68 import org.apache.commons.jelly.XMLOutput;
69 import org.apache.commons.jelly.tags.Resources;
70
71 /***
72 * <p>Tag handler for <Update> in JSTL.
73 *
74 * @author Hans Bergsten
75 * @author Justyna Horwat
76 */
77
78 public class UpdateTag extends SqlTagSupport {
79
80 /*
81 * Instance variables that are not for attributes
82 */
83 private Connection conn;
84
85 //**********************************************************************
86 // Constructor and initialization
87
88 public UpdateTag() {
89 }
90
91 //*********************************************************************
92 // Tag logic
93
94 /**
95 * <p>Execute the SQL statement, set either through the <code>sql</code>
96 * attribute or as the body, and save the result as a variable
97 * named by the <code>var</code> attribute in the scope specified
98 * by the <code>scope</code> attribute, as an object that implements
99 * the Result interface.
100 *
101 * <p>The connection used to execute the statement comes either
102 * from the <code>DataSource</code> specified by the
103 * <code>dataSource</code> attribute, provided by a parent action
104 * element, or is retrieved from a JSP scope attribute
105 * named <code>javax.servlet.jsp.jstl.sql.dataSource</code>.
106 */
107 public void doTag(XMLOutput output) throws Exception {
108 try {
109 conn = getConnection();
110 }
111 catch (SQLException e) {
112 throw new JellyException(sql + ": " + e.getMessage(), e);
113 }
114
115 /*
116 * Use the SQL statement specified by the sql attribute, if any,
117 * otherwise use the body as the statement.
118 */
119 String sqlStatement = null;
120 if (sql != null) {
121 sqlStatement = sql;
122 }
123 else {
124 sqlStatement = getBodyText();
125 }
126 if (sqlStatement == null || sqlStatement.trim().length() == 0) {
127 throw new JellyException(Resources.getMessage("SQL_NO_STATEMENT"));
128 }
129
130 int result = 0;
131 try {
132 if ( hasParameters() ) {
133 PreparedStatement ps = conn.prepareStatement(sqlStatement);
134 setParameters(ps);
135 result = ps.executeUpdate();
136 }
137 else {
138 Statement statement = conn.createStatement();
139 result = statement.executeUpdate(sqlStatement);
140 }
141 if (var != null) {
142 context.setVariable(var, new Integer(result));
143 }
144 }
145 catch (SQLException e) {
146 throw new JellyException(sqlStatement + ": " + e.getMessage(), e);
147 }
148 finally {
149 if (conn != null && !isPartOfTransaction) {
150 try {
151 conn.close();
152 }
153 catch (SQLException e) {
154 // Not much we can do
155 }
156 }
157 clearParameters();
158 }
159 }
160 }
This page was automatically generated by Maven