Author: markt Date: Tue Jan 3 12:24:27 2006 New Revision: 365735 URL: http://svn.apache.org/viewcvs?rev=365735&view=rev Log: Fix bug 16185 by porting support for localDataSource attribute from TC5
Added: tomcat/container/branches/tc4.1.x/webapps/admin/WEB-INF/classes/org/apache/webapp/admin/realm/DataSourceRealmForm.java (with props) tomcat/container/branches/tc4.1.x/webapps/admin/WEB-INF/classes/org/apache/webapp/admin/realm/SaveDataSourceRealmAction.java (with props) tomcat/container/branches/tc4.1.x/webapps/admin/realm/dataSourceRealm.jsp (with props) Modified: tomcat/container/branches/tc4.1.x/catalina/src/share/org/apache/catalina/mbeans/mbeans-descriptors.xml tomcat/container/branches/tc4.1.x/catalina/src/share/org/apache/catalina/realm/DataSourceRealm.java tomcat/container/branches/tc4.1.x/webapps/admin/WEB-INF/classes/org/apache/webapp/admin/ApplicationResources_en.properties tomcat/container/branches/tc4.1.x/webapps/admin/WEB-INF/classes/org/apache/webapp/admin/realm/AddRealmAction.java tomcat/container/branches/tc4.1.x/webapps/admin/WEB-INF/classes/org/apache/webapp/admin/realm/EditRealmAction.java tomcat/container/branches/tc4.1.x/webapps/admin/WEB-INF/struts-config.xml tomcat/container/branches/tc4.1.x/webapps/admin/resources/dataSources.jspf tomcat/container/branches/tc4.1.x/webapps/tomcat-docs/config/realm.xml tomcat/container/branches/tc4.1.x/webapps/tomcat-docs/realm-howto.xml Modified: tomcat/container/branches/tc4.1.x/catalina/src/share/org/apache/catalina/mbeans/mbeans-descriptors.xml URL: http://svn.apache.org/viewcvs/tomcat/container/branches/tc4.1.x/catalina/src/share/org/apache/catalina/mbeans/mbeans-descriptors.xml?rev=365735&r1=365734&r2=365735&view=diff ============================================================================== --- tomcat/container/branches/tc4.1.x/catalina/src/share/org/apache/catalina/mbeans/mbeans-descriptors.xml (original) +++ tomcat/container/branches/tc4.1.x/catalina/src/share/org/apache/catalina/mbeans/mbeans-descriptors.xml Tue Jan 3 12:24:27 2006 @@ -353,6 +353,11 @@ group="Realm" type="org.apache.catalina.realm.DataSourceRealm"> + <attribute name="className" + description="Fully qualified class name of the managed object" + type="java.lang.String" + writeable="false"/> + <attribute name="dataSourceName" description="The JNDI named JDBC DataSource for your database" type="java.lang.String"/> @@ -365,6 +370,10 @@ description="Digest algorithm used in storing passwords in a non-plaintext format" type="java.lang.String"/> + + <attribute name="localDataSource" + description="Configures if the DataSource is local to the webapp" + type="boolean"/> <attribute name="roleNameCol" description="The column in the user role table that names a role" Modified: tomcat/container/branches/tc4.1.x/catalina/src/share/org/apache/catalina/realm/DataSourceRealm.java URL: http://svn.apache.org/viewcvs/tomcat/container/branches/tc4.1.x/catalina/src/share/org/apache/catalina/realm/DataSourceRealm.java?rev=365735&r1=365734&r2=365735&view=diff ============================================================================== --- tomcat/container/branches/tc4.1.x/catalina/src/share/org/apache/catalina/realm/DataSourceRealm.java (original) +++ tomcat/container/branches/tc4.1.x/catalina/src/share/org/apache/catalina/realm/DataSourceRealm.java Tue Jan 3 12:24:27 2006 @@ -32,6 +32,7 @@ import org.apache.catalina.ServerFactory; import org.apache.catalina.core.StandardServer; import org.apache.catalina.util.StringManager; +import org.apache.naming.ContextBindings; /** * @@ -79,6 +80,12 @@ /** + * Does this realm use a context local datasource. + */ + protected boolean localDataSource = false; + + + /** * Descriptive information about this Realm implementation. */ protected static final String name = "DataSourceRealm"; @@ -142,6 +149,23 @@ } /** + * Return if the datasource will be looked up in the webapp JNDI Context. + */ + public boolean getLocalDataSource() { + return localDataSource; + } + + /** + * Set to true to cause the datasource to be looked up in the webapp JNDI + * Context. + * + * @param localDataSource the new flag value + */ + public void setLocalDataSource(boolean localDataSource) { + this.localDataSource = localDataSource; + } + + /** * Return the column in the user role table that names a role. * */ @@ -360,8 +384,15 @@ private Connection open() { try { - StandardServer server = (StandardServer) ServerFactory.getServer(); - Context context = server.getGlobalNamingContext(); + Context context = null; + if (localDataSource) { + context = ContextBindings.getClassLoader(); + context = (Context) context.lookup("comp/env"); + } else { + StandardServer server = + (StandardServer) ServerFactory.getServer(); + context = server.getGlobalNamingContext(); + } DataSource dataSource = (DataSource)context.lookup(dataSourceName); return dataSource.getConnection(); } catch (Exception e) { Modified: tomcat/container/branches/tc4.1.x/webapps/admin/WEB-INF/classes/org/apache/webapp/admin/ApplicationResources_en.properties URL: http://svn.apache.org/viewcvs/tomcat/container/branches/tc4.1.x/webapps/admin/WEB-INF/classes/org/apache/webapp/admin/ApplicationResources_en.properties?rev=365735&r1=365734&r2=365735&view=diff ============================================================================== --- tomcat/container/branches/tc4.1.x/webapps/admin/WEB-INF/classes/org/apache/webapp/admin/ApplicationResources_en.properties (original) +++ tomcat/container/branches/tc4.1.x/webapps/admin/WEB-INF/classes/org/apache/webapp/admin/ApplicationResources_en.properties Tue Jan 3 12:24:27 2006 @@ -244,6 +244,9 @@ realm.userPassword=User Password realm.userPattern=User Pattern realm.userSearch=User Search +realm.dataSourceName=DataSource Name +realm.localDataSource=Local DataSource +realm.userCredCol=User Credential Column valve.access.properties=Access Logger Properties valve.request.properties=Request Filter Properties valve.single.properties=Single SignOn Valve Properties @@ -288,6 +291,9 @@ error.connPassword.required=<li>Connection password is required.</li> error.connURL.required=<li>Connection URL is required.</li> error.connName.required=<li>Connection name is required.</li> +error.dataSourceName.required=<li>DataSource name is required.</li> +error.userCredCol.required=<li>User credential is required.</li> +error.userRoleTable.required=<li>User role table is required.</li> # ---------- Resources Module ---------- resources.treeBuilder.subtreeNode=Resources Modified: tomcat/container/branches/tc4.1.x/webapps/admin/WEB-INF/classes/org/apache/webapp/admin/realm/AddRealmAction.java URL: http://svn.apache.org/viewcvs/tomcat/container/branches/tc4.1.x/webapps/admin/WEB-INF/classes/org/apache/webapp/admin/realm/AddRealmAction.java?rev=365735&r1=365734&r2=365735&view=diff ============================================================================== --- tomcat/container/branches/tc4.1.x/webapps/admin/WEB-INF/classes/org/apache/webapp/admin/realm/AddRealmAction.java (original) +++ tomcat/container/branches/tc4.1.x/webapps/admin/WEB-INF/classes/org/apache/webapp/admin/realm/AddRealmAction.java Tue Jan 3 12:24:27 2006 @@ -81,11 +81,12 @@ // Fill in the form values for display and editing - String realmTypes[] = new String[4]; + String realmTypes[] = new String[5]; realmTypes[0] = "UserDatabaseRealm"; realmTypes[1] = "JNDIRealm"; realmTypes[2] = "MemoryRealm"; realmTypes[3] = "JDBCRealm"; + realmTypes[4] = "DataSourceRealm"; String parent = request.getParameter("parent"); String type = request.getParameter("type"); @@ -111,9 +112,10 @@ createJNDIRealm(session, parent); } else if ("MemoryRealm".equalsIgnoreCase(type)) { createMemoryRealm(session, parent); - } else { - //JDBC + } else if ("JDBCRealm".equalsIgnoreCase(type)){ createJDBCRealm(session, parent); + } else if ("DataSourceRealm".equalsIgnoreCase(type)) { + createDataSourceRealm(session, parent); } // Forward to the realm display page return (mapping.findForward(type)); @@ -208,6 +210,28 @@ realmFm.setRealmTypeVals(types); } + private void createDataSourceRealm(HttpSession session, String parent) { + DataSourceRealmForm realmFm = new DataSourceRealmForm(); + session.setAttribute("dataSourceRealmForm", realmFm); + realmFm.setAdminAction("Create"); + realmFm.setObjectName(""); + realmFm.setParentObjectName(parent); + String realmType = "DataSourceRealm"; + realmFm.setNodeLabel("Realm (" + realmType + ")"); + realmFm.setRealmType(realmType); + realmFm.setDebugLvl("0"); + realmFm.setDataSourceName(""); + realmFm.setDigest(""); + realmFm.setLocalDataSource("false"); + realmFm.setRoleNameCol(""); + realmFm.setUserCredCol(""); + realmFm.setUserNameCol(""); + realmFm.setUserRoleTable(""); + realmFm.setUserTable(""); + realmFm.setDebugLvlVals(Lists.getDebugLevels()); + realmFm.setRealmTypeVals(types); + realmFm.setBooleanVals(Lists.getBooleanValues()); + } } Added: tomcat/container/branches/tc4.1.x/webapps/admin/WEB-INF/classes/org/apache/webapp/admin/realm/DataSourceRealmForm.java URL: http://svn.apache.org/viewcvs/tomcat/container/branches/tc4.1.x/webapps/admin/WEB-INF/classes/org/apache/webapp/admin/realm/DataSourceRealmForm.java?rev=365735&view=auto ============================================================================== --- tomcat/container/branches/tc4.1.x/webapps/admin/WEB-INF/classes/org/apache/webapp/admin/realm/DataSourceRealmForm.java (added) +++ tomcat/container/branches/tc4.1.x/webapps/admin/WEB-INF/classes/org/apache/webapp/admin/realm/DataSourceRealmForm.java Tue Jan 3 12:24:27 2006 @@ -0,0 +1,356 @@ +/* + * Copyright 2001,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.webapp.admin.realm; + +import java.util.List; + +import javax.servlet.http.HttpServletRequest; +import org.apache.struts.action.ActionError; +import org.apache.struts.action.ActionErrors; +import org.apache.struts.action.ActionMapping; + + +/** + * Form bean for the datasource realm page. + * + * @author Amy Roh + * @version $Revision: 1.1 $ $Date: 2004/04/17 02:53:17 $ + */ + +public final class DataSourceRealmForm extends RealmForm { + + // ----------------------------------------------------- Instance Variables + + /** + * The text for the JNDI named JDBC DataSource for your database. + */ + private String dataSourceName = null; + + /** + * The text for the digest. + */ + private String digest = null; + + /** + * The text for if the DataSource is local to the webapp. + */ + private String localDataSource = "false"; + + /** + * The text for the roleNameCol. + */ + private String roleNameCol = null; + + /** + * The text for the userCredCol. + */ + private String userCredCol = null; + + /** + * The text for the userNameCol. + */ + private String userNameCol = null; + + /** + * The text for the userRoleTable. + */ + private String userRoleTable = null; + + /** + * The text for the user table. + */ + private String userTable = null; + + /** + * Represent boolean (true, false) values for unpackWARs etc. + */ + private List booleanVals = null; + + // ------------------------------------------------------------- Properties + + /** + * Return the dataSourceName. + */ + public String getDataSourceName() { + + return this.dataSourceName; + + } + + /** + * Set the dataSourceName. + */ + public void setDataSourceName(String dataSourceName) { + + this.dataSourceName = dataSourceName; + + } + + /** + * Return the digest. + */ + public String getDigest() { + + return this.digest; + + } + + /** + * Set the digest. + */ + public void setDigest(String digest) { + + this.digest = digest; + + } + + /** + * Return the localDataSource. + */ + public String getLocalDataSource() { + + return this.localDataSource; + + } + + /** + * Set the localDataSource. + */ + public void setLocalDataSource(String localDataSource) { + + this.localDataSource = localDataSource; + + } + + /** + * Return the roleNameCol. + */ + public String getRoleNameCol() { + + return this.roleNameCol; + + } + + /** + * Set the roleNameCol. + */ + public void setRoleNameCol(String roleNameCol) { + + this.roleNameCol = roleNameCol; + + } + + /** + * Return the userCredCol. + */ + public String getUserCredCol() { + + return this.userCredCol; + + } + + /** + * Set the userCredCol. + */ + public void setUserCredCol(String userCredCol) { + + this.userCredCol = userCredCol; + + } + + /** + * Return the userNameCol. + */ + public String getUserNameCol() { + + return this.userNameCol; + + } + + /** + * Set the userNameCol. + */ + public void setUserNameCol(String userNameCol) { + + this.userNameCol = userNameCol; + + } + + /** + * Return the user role table. + */ + public String getUserRoleTable() { + + return this.userRoleTable; + + } + + /** + * Set the user role table. + */ + public void setUserRoleTable(String userRoleTable) { + + this.userRoleTable = userRoleTable; + + } + + /** + * Return the user table. + */ + public String getUserTable() { + + return this.userTable; + + } + + /** + * Set the user Table. + */ + public void setUserTable(String userTable) { + + this.userTable = userTable; + + } + + /** + * Return the booleanVals. + */ + public List getBooleanVals() { + + return this.booleanVals; + + } + + /** + * Set the booleanVals. + */ + public void setBooleanVals(List booleanVals) { + + this.booleanVals = booleanVals; + + } + + // --------------------------------------------------------- Public Methods + + /** + * Reset all properties to their default values. + * + * @param mapping + * The mapping used to select this instance + * @param request + * The servlet request we are processing + */ + public void reset(ActionMapping mapping, HttpServletRequest request) { + + super.reset(mapping, request); + this.dataSourceName = null; + this.digest = null; + this.localDataSource = "false"; + this.roleNameCol = null; + this.userCredCol = null; + this.userNameCol = null; + this.userTable = null; + this.userRoleTable = null; + + } + + /** + * Render this object as a String. + */ + public String toString() { + + StringBuffer sb = new StringBuffer("DataSourceRealmForm[adminAction="); + sb.append(getAdminAction()); + sb.append(",debugLvl="); + sb.append(getDebugLvl()); + sb.append(",dataSourceName="); + sb.append(dataSourceName); + sb.append(",digest="); + sb.append(digest); + sb.append("',localDataSource='"); + sb.append(localDataSource); + sb.append("',roleNameCol="); + sb.append(roleNameCol); + sb.append("',userCredCol="); + sb.append(userCredCol); + sb.append("',userNameCol="); + sb.append(userNameCol); + sb.append("',userRoleTable="); + sb.append(userRoleTable); + sb.append("',userTable='"); + sb.append(userTable); + sb.append("',objectName='"); + sb.append(getObjectName()); + sb.append("',realmType="); + sb.append(getRealmType()); + sb.append("]"); + return (sb.toString()); + + } + + /** + * Validate the properties that have been set from this HTTP request, and + * return an <code>ActionErrors</code> object that encapsulates any + * validation errors that have been found. If no errors are found, return + * <code>null</code> or an <code>ActionErrors</code> object with no + * recorded error messages. + * + * @param mapping + * The mapping used to select this instance + * @param request + * The servlet request we are processing + */ + + public ActionErrors validate(ActionMapping mapping, + HttpServletRequest request) { + + ActionErrors errors = new ActionErrors(); + + if ((dataSourceName == null) || (dataSourceName.length() < 1)) { + errors.add("dataSourceName", new ActionError( + "error.dataSourceName.required")); + } + + if ((roleNameCol == null) || (roleNameCol.length() < 1)) { + errors.add("roleNameCol", new ActionError( + "error.roleNameCol.required")); + } + + if ((userCredCol == null) || (userCredCol.length() < 1)) { + errors.add("userCredCol", new ActionError( + "error.userCredCol.required")); + } + + if ((userNameCol == null) || (userNameCol.length() < 1)) { + errors.add("userNameCol", new ActionError( + "error.userNameCol.required")); + } + + if ((userRoleTable == null) || (userRoleTable.length() < 1)) { + errors.add("userRoleTable", new ActionError( + "error.userRoleTable.required")); + } + + if ((userTable == null) || (userTable.length() < 1)) { + errors + .add("userTable", new ActionError( + "error.userTable.required")); + } + + return errors; + } +} \ No newline at end of file Propchange: tomcat/container/branches/tc4.1.x/webapps/admin/WEB-INF/classes/org/apache/webapp/admin/realm/DataSourceRealmForm.java ------------------------------------------------------------------------------ svn:eol-style = native Modified: tomcat/container/branches/tc4.1.x/webapps/admin/WEB-INF/classes/org/apache/webapp/admin/realm/EditRealmAction.java URL: http://svn.apache.org/viewcvs/tomcat/container/branches/tc4.1.x/webapps/admin/WEB-INF/classes/org/apache/webapp/admin/realm/EditRealmAction.java?rev=365735&r1=365734&r2=365735&view=diff ============================================================================== --- tomcat/container/branches/tc4.1.x/webapps/admin/WEB-INF/classes/org/apache/webapp/admin/realm/EditRealmAction.java (original) +++ tomcat/container/branches/tc4.1.x/webapps/admin/WEB-INF/classes/org/apache/webapp/admin/realm/EditRealmAction.java Tue Jan 3 12:24:27 2006 @@ -143,8 +143,10 @@ setUpMemoryRealm(rname, response); } else if ("JDBCRealm".equalsIgnoreCase(realmType)) { setUpJDBCRealm(rname, response); - } else { + } else if ("JNDIRealm".equalsIgnoreCase(realmType)) { setUpJNDIRealm(rname, response); + } else if ("DataSourceRealm".equalsIgnoreCase(realmType)) { + setUpDataSourceRealm(rname, response); } return (mapping.findForward(realmType)); @@ -371,6 +373,70 @@ ((String) mBServer.getAttribute(rname, attribute)); attribute = "connectionURL"; realmFm.setConnectionURL + ((String) mBServer.getAttribute(rname, attribute)); + + } catch (Throwable t) { + getServlet().log + (resources.getMessage(locale, "users.error.attribute.get", + attribute), t); + response.sendError + (HttpServletResponse.SC_INTERNAL_SERVER_ERROR, + resources.getMessage(locale, "users.error.attribute.get", + attribute)); + } + } + + private void setUpDataSourceRealm(ObjectName rname, + HttpServletResponse response) + throws IOException { + // Fill in the form values for display and editing + DataSourceRealmForm realmFm = new DataSourceRealmForm(); + session.setAttribute("dataSourceRealmForm", realmFm); + realmFm.setAdminAction("Edit"); + realmFm.setObjectName(rname.toString()); + String realmType = "DataSourceRealm"; + StringBuffer sb = new StringBuffer(); + sb.append(resources.getMessage(locale, + "server.service.treeBuilder.realm")); + sb.append(" ("); + sb.append(realmType); + sb.append(")"); + realmFm.setNodeLabel(sb.toString()); + realmFm.setRealmType(realmType); + realmFm.setDebugLvlVals(Lists.getDebugLevels()); + realmFm.setAllowDeletion(allowDeletion(rname)); + realmFm.setBooleanVals(Lists.getBooleanValues()); + + String attribute = null; + try { + + // Copy scalar properties + attribute = "dataSourceName"; + realmFm.setDataSourceName + ((String) mBServer.getAttribute(rname, attribute)); + attribute = "debug"; + realmFm.setDebugLvl + (((Integer) mBServer.getAttribute(rname, attribute)).toString()); + attribute = "digest"; + realmFm.setDigest + ((String) mBServer.getAttribute(rname, attribute)); + attribute = "localDataSource"; + realmFm.setLocalDataSource + (((Boolean) mBServer.getAttribute(rname, attribute)).toString()); + attribute = "roleNameCol"; + realmFm.setRoleNameCol + ((String) mBServer.getAttribute(rname, attribute)); + attribute = "userCredCol"; + realmFm.setUserCredCol + ((String) mBServer.getAttribute(rname, attribute)); + attribute = "userNameCol"; + realmFm.setUserNameCol + ((String) mBServer.getAttribute(rname, attribute)); + attribute = "userRoleTable"; + realmFm.setUserRoleTable + ((String) mBServer.getAttribute(rname, attribute)); + attribute = "userTable"; + realmFm.setUserTable ((String) mBServer.getAttribute(rname, attribute)); } catch (Throwable t) { Added: tomcat/container/branches/tc4.1.x/webapps/admin/WEB-INF/classes/org/apache/webapp/admin/realm/SaveDataSourceRealmAction.java URL: http://svn.apache.org/viewcvs/tomcat/container/branches/tc4.1.x/webapps/admin/WEB-INF/classes/org/apache/webapp/admin/realm/SaveDataSourceRealmAction.java?rev=365735&view=auto ============================================================================== --- tomcat/container/branches/tc4.1.x/webapps/admin/WEB-INF/classes/org/apache/webapp/admin/realm/SaveDataSourceRealmAction.java (added) +++ tomcat/container/branches/tc4.1.x/webapps/admin/WEB-INF/classes/org/apache/webapp/admin/realm/SaveDataSourceRealmAction.java Tue Jan 3 12:24:27 2006 @@ -0,0 +1,285 @@ +/* + * Copyright 2001-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.webapp.admin.realm; + +import java.net.URLEncoder; +import java.util.Locale; +import java.io.IOException; +import javax.management.Attribute; +import javax.management.MBeanServer; +import javax.management.ObjectName; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; +import org.apache.struts.action.Action; +import org.apache.struts.action.ActionError; +import org.apache.struts.action.ActionErrors; +import org.apache.struts.action.ActionForm; +import org.apache.struts.action.ActionForward; +import org.apache.struts.action.ActionMapping; +import org.apache.struts.util.MessageResources; +import org.apache.webapp.admin.ApplicationServlet; +import org.apache.webapp.admin.TomcatTreeBuilder; +import org.apache.webapp.admin.TreeControl; +import org.apache.webapp.admin.TreeControlNode; +import org.apache.webapp.admin.logger.DeleteLoggerAction; + +/** + * The <code>Action</code> that completes <em>Add Realm</em> and + * <em>Edit Realm</em> transactions for DataSource realm. + * + * @author Amy Roh + * @version $Revision: 1.1 $ $Date: 2004/04/17 02:53:17 $ + */ + +public final class SaveDataSourceRealmAction extends Action { + + // ----------------------------------------------------- Instance Variables + + /** + * Signature for the <code>createDataSourceRealm</code> operation. + */ + private String createDataSourceRealmTypes[] = { "java.lang.String", // parent + "java.lang.String", // dataSourceName + "java.lang.String", // roleNameCol + "java.lang.String", // userCredCol + "java.lang.String", // userNameCol + "java.lang.String", // userRoleTable + "java.lang.String", // userTable + }; + + /** + * The MBeanServer we will be interacting with. + */ + private MBeanServer mBServer = null; + + /** + * The MessageResources we will be retrieving messages from. + */ + private MessageResources resources = null; + + // --------------------------------------------------------- Public Methods + + /** + * Process the specified HTTP request, and create the corresponding HTTP + * response (or forward to another web component that will create it). + * Return an <code>ActionForward</code> instance describing where and how + * control should be forwarded, or <code>null</code> if the response has + * already been completed. + * + * @param mapping + * The ActionMapping used to select this instance + * @param actionForm + * The optional ActionForm bean for this request (if any) + * @param request + * The HTTP request we are processing + * @param response + * The HTTP response we are creating + * + * @exception IOException + * if an input/output error occurs + * @exception ServletException + * if a servlet exception occurs + */ + public ActionForward perform(ActionMapping mapping, ActionForm form, + HttpServletRequest request, HttpServletResponse response) + throws IOException, ServletException { + + // Acquire the resources that we need + HttpSession session = request.getSession(); + Locale locale = (Locale) session.getAttribute(Action.LOCALE_KEY); + if (resources == null) { + resources = getServlet().getResources(); + } + + // Acquire a reference to the MBeanServer containing our MBeans + try { + mBServer = ((ApplicationServlet) getServlet()).getServer(); + } catch (Throwable t) { + throw new ServletException("Cannot acquire MBeanServer reference", + t); + } + + // Identify the requested action + DataSourceRealmForm rform = (DataSourceRealmForm) form; + String adminAction = rform.getAdminAction(); + String rObjectName = rform.getObjectName(); + + // Perform a "Create DataSource Realm" transaction (if requested) + if ("Create".equals(adminAction)) { + + String operation = null; + String values[] = null; + + try { + + String parent = rform.getParentObjectName(); + String objectName = DeleteLoggerAction.getObjectName(parent, + TomcatTreeBuilder.REALM_TYPE); + + ObjectName pname = new ObjectName(parent); + StringBuffer sb = new StringBuffer(pname.getDomain()); + + // For service, create the corresponding Engine mBean + // Parent in this case needs to be the container mBean for the + // service + try { + if ("Service" + .equalsIgnoreCase(pname.getKeyProperty("type"))) { + sb.append(":type=Engine"); + parent = sb.toString(); + } + } catch (Exception e) { + String message = resources.getMessage(locale, + "error.engineName.bad", sb.toString()); + getServlet().log(message); + response.sendError(HttpServletResponse.SC_BAD_REQUEST, + message); + return (null); + } + + // Ensure that the requested user database name is unique + ObjectName oname = new ObjectName(objectName); + if (mBServer.isRegistered(oname)) { + ActionErrors errors = new ActionErrors(); + errors.add("realmName", new ActionError( + "error.realmName.exists")); + saveErrors(request, errors); + return (new ActionForward(mapping.getInput())); + } + + // Look up our MBeanFactory MBean + ObjectName fname = + new ObjectName(TomcatTreeBuilder.FACTORY_TYPE); + + // Create a new DataSourceRealm object + values = new String[7]; + values[0] = parent; + values[1] = rform.getDataSourceName(); + values[2] = rform.getRoleNameCol(); + values[3] = rform.getUserCredCol(); + values[4] = rform.getUserNameCol(); + values[5] = rform.getUserRoleTable(); + values[6] = rform.getUserTable(); + operation = "createDataSourceRealm"; + rObjectName = (String) mBServer.invoke(fname, operation, + values, createDataSourceRealmTypes); + + if (rObjectName == null) { + request.setAttribute("warning", "error.datasourcerealm"); + return (mapping.findForward("Save Unsuccessful")); + } + + // Add the new Realm to our tree control node + TreeControl control = (TreeControl) session + .getAttribute("treeControlTest"); + if (control != null) { + TreeControlNode parentNode = control.findNode(rform + .getParentObjectName()); + if (parentNode != null) { + String nodeLabel = rform.getNodeLabel(); + String encodedName = URLEncoder.encode(rObjectName); + TreeControlNode childNode = + new TreeControlNode(rObjectName, + "Realm.gif", + nodeLabel, + "EditRealm.do?select=" + + encodedName, + "content", + true); + parentNode.addChild(childNode); + // FIXME - force a redisplay + } else { + getServlet().log( + "Cannot find parent node '" + parent + "'"); + } + } else { + getServlet().log("Cannot find TreeControlNode!"); + } + + } catch (Exception e) { + + getServlet().log( + resources.getMessage(locale, "users.error.invoke", + operation), e); + response.sendError( + HttpServletResponse.SC_INTERNAL_SERVER_ERROR, resources + .getMessage(locale, "users.error.invoke", + operation)); + return (null); + + } + + } + + // Perform attribute updates as requested + String attribute = null; + try { + + ObjectName roname = new ObjectName(rObjectName); + + attribute = "debug"; + int debug = 0; + try { + debug = Integer.parseInt(rform.getDebugLvl()); + } catch (Throwable t) { + debug = 0; + } + mBServer.setAttribute(roname, new Attribute("debug", new Integer( + debug))); + + attribute = "dataSourceName"; + mBServer.setAttribute(roname, new Attribute(attribute, rform + .getDataSourceName())); + attribute = "digest"; + mBServer.setAttribute(roname, new Attribute("digest", rform + .getDigest())); + + attribute = "roleNameCol"; + mBServer.setAttribute(roname, new Attribute("roleNameCol", rform + .getRoleNameCol())); + attribute = "userCredCol"; + mBServer.setAttribute(roname, new Attribute("userCredCol", rform + .getUserCredCol())); + attribute = "userNameCol"; + mBServer.setAttribute(roname, new Attribute("userNameCol", rform + .getUserNameCol())); + attribute = "userRoleTable"; + mBServer.setAttribute(roname, new Attribute("userRoleTable", rform + .getUserRoleTable())); + attribute = "userTable"; + mBServer.setAttribute(roname, new Attribute("userTable", rform + .getUserTable())); + } catch (Exception e) { + + getServlet().log( + resources.getMessage(locale, "users.error.attribute.set", + attribute), e); + response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, + resources.getMessage(locale, "users.error.attribute.set", + attribute)); + return (null); + } + + // Forward to the success reporting page + session.removeAttribute(mapping.getAttribute()); + return (mapping.findForward("Save Successful")); + + } + +} \ No newline at end of file Propchange: tomcat/container/branches/tc4.1.x/webapps/admin/WEB-INF/classes/org/apache/webapp/admin/realm/SaveDataSourceRealmAction.java ------------------------------------------------------------------------------ svn:eol-style = native Modified: tomcat/container/branches/tc4.1.x/webapps/admin/WEB-INF/struts-config.xml URL: http://svn.apache.org/viewcvs/tomcat/container/branches/tc4.1.x/webapps/admin/WEB-INF/struts-config.xml?rev=365735&r1=365734&r2=365735&view=diff ============================================================================== --- tomcat/container/branches/tc4.1.x/webapps/admin/WEB-INF/struts-config.xml (original) +++ tomcat/container/branches/tc4.1.x/webapps/admin/WEB-INF/struts-config.xml Tue Jan 3 12:24:27 2006 @@ -56,6 +56,9 @@ <!-- ============= Realm Module ============= --> + <form-bean name="dataSourceRealmForm" + type="org.apache.webapp.admin.realm.DataSourceRealmForm"/> + <form-bean name="jdbcRealmForm" type="org.apache.webapp.admin.realm.JDBCRealmForm"/> @@ -286,6 +289,10 @@ <!-- ============ Realm Module ============== --> + <forward name="DataSourceRealm" + path="/realm/dataSourceRealm.jsp" + redirect="false"/> + <forward name="JDBCRealm" path="/realm/jdbcRealm.jsp" redirect="false"/> @@ -652,6 +659,13 @@ type="org.apache.webapp.admin.realm.SaveUserDatabaseRealmAction" name="userDatabaseRealmForm" input="/realm/userDatabaseRealm.jsp" + scope="session"/> + + <!-- Perform Save DataSource Realm transaction --> + <action path="/SaveDataSourceRealm" + type="org.apache.webapp.admin.realm.SaveDataSourceRealmAction" + name="dataSourceRealmForm" + input="/realm/dataSourceRealm.jsp" scope="session"/> <!-- Perform Save JDBC Realm transaction --> Added: tomcat/container/branches/tc4.1.x/webapps/admin/realm/dataSourceRealm.jsp URL: http://svn.apache.org/viewcvs/tomcat/container/branches/tc4.1.x/webapps/admin/realm/dataSourceRealm.jsp?rev=365735&view=auto ============================================================================== --- tomcat/container/branches/tc4.1.x/webapps/admin/realm/dataSourceRealm.jsp (added) +++ tomcat/container/branches/tc4.1.x/webapps/admin/realm/dataSourceRealm.jsp Tue Jan 3 12:24:27 2006 @@ -0,0 +1,166 @@ +<!-- Standard Struts Entries --> +<%@ page language="java" import="java.net.URLEncoder" contentType="text/html;charset=utf-8" %> +<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %> +<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %> +<%@ taglib uri="/WEB-INF/controls.tld" prefix="controls" %> +<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %> + +<html:html locale="true"> + +<%@ include file="../users/header.jsp" %> + +<!-- Body --> +<body bgcolor="white" background="../images/PaperTexture.gif"> + +<!--Form --> + +<html:errors/> + +<html:form method="POST" action="/SaveDataSourceRealm"> + + <bean:define id="thisObjectName" type="java.lang.String" + name="dataSourceRealmForm" property="objectName"/> + <html:hidden property="adminAction"/> + <html:hidden property="parentObjectName"/> + <html:hidden property="objectName"/> + <html:hidden property="allowDeletion"/> + + <table width="100%" border="0" cellspacing="0" cellpadding="0"> + <tr bgcolor="7171A5"> + <td width="81%"> + <div class="page-title-text" align="left"> + <logic:equal name="dataSourceRealmForm" property="adminAction" value="Create"> + <bean:message key="actions.realms.create"/> + </logic:equal> + <logic:equal name="dataSourceRealmForm" property="adminAction" value="Edit"> + <bean:write name="dataSourceRealmForm" property="nodeLabel"/> + </logic:equal> + </div> + </td> + <td align="right" nowrap> + <div class="page-title-text"> + <controls:actions label="Realm Actions"> + <controls:action selected="true"> ----<bean:message key="actions.available.actions"/>---- </controls:action> + <controls:action> --------------------------------- </controls:action> + <logic:notEqual name="dataSourceRealmForm" property="adminAction" value="Create"> + <logic:notEqual name="dataSourceRealmForm" property="allowDeletion" value="false"> + <controls:action url='<%= "/DeleteRealm.do?select=" + + URLEncoder.encode(thisObjectName) %>'> + <bean:message key="actions.realms.delete"/> + </controls:action> + </logic:notEqual> + </logic:notEqual> + </controls:actions> + </div> + </td> + </tr> + </table> + <%@ include file="../buttons.jsp" %> + <br> + + <table class="back-table" border="0" cellspacing="0" cellpadding="0" width="100%"> + <tr> + <td> + <controls:table tableStyle="front-table" lineStyle="line-row"> + <controls:row header="true" + labelStyle="table-header-text" dataStyle="table-header-text"> + <controls:label><bean:message key="service.property"/></controls:label> + <controls:data><bean:message key="service.value"/></controls:data> + </controls:row> + + <controls:row labelStyle="table-label-text" dataStyle="table-normal-text" styleId="type"> + <controls:label><bean:message key="connector.type"/>:</controls:label> + <controls:data> + <logic:equal name="dataSourceRealmForm" property="adminAction" value="Create"> + <html:select property="realmType" onchange="IA_jumpMenu('self',this)" styleId="type"> + <bean:define id="realmTypeVals" name="dataSourceRealmForm" property="realmTypeVals"/> + <html:options collection="realmTypeVals" property="value" labelProperty="label"/> + </html:select> + </logic:equal> + <logic:equal name="dataSourceRealmForm" property="adminAction" value="Edit"> + <bean:write name="dataSourceRealmForm" property="realmType" scope="session"/> + </logic:equal> + </controls:data> + </controls:row> + + <controls:row labelStyle="table-label-text" dataStyle="table-normal-text" styleId="driver"> + <controls:label><bean:message key="realm.dataSourceName"/>:</controls:label> + <controls:data> + <html:text property="dataSourceName" size="30" styleId="dataSourceName"/> + </controls:data> + </controls:row> + + <controls:row labelStyle="table-label-text" dataStyle="table-normal-text" styleId="debuglevel"> + <controls:label><bean:message key="server.debuglevel"/>:</controls:label> + <controls:data> + <html:select property="debugLvl" styleId="debuglevel"> + <bean:define id="debugLvlVals" name="dataSourceRealmForm" property="debugLvlVals"/> + <html:options collection="debugLvlVals" property="value" + labelProperty="label"/> + </html:select> + </controls:data> + </controls:row> + + <controls:row labelStyle="table-label-text" dataStyle="table-normal-text" styleId="digest"> + <controls:label><bean:message key="realm.digest"/>:</controls:label> + <controls:data> + <html:text property="digest" size="30" styleId="digest"/> + </controls:data> + </controls:row> + + <controls:row labelStyle="table-label-text" dataStyle="table-normal-text" styleId="localDataSource"> + <controls:label><bean:message key="realm.localDataSource"/>:</controls:label> + <controls:data> + <html:select property="localDataSource" styleId="localDataSource"> + <bean:define id="booleanVals" name="dataSourceRealmForm" property="booleanVals"/> + <html:options collection="booleanVals" property="value" + labelProperty="label"/> + </html:select> + </controls:data> + </controls:row> + + <controls:row labelStyle="table-label-text" dataStyle="table-normal-text" styleId="roleNameCol"> + <controls:label><bean:message key="realm.roleNameCol"/>:</controls:label> + <controls:data> + <html:text property="roleNameCol" size="30" styleId="roleNameCol"/> + </controls:data> + </controls:row> + + <controls:row labelStyle="table-label-text" dataStyle="table-normal-text" styleId="userCredCol"> + <controls:label><bean:message key="realm.userCredCol"/>:</controls:label> + <controls:data> + <html:text property="userCredCol" size="30" styleId="userCredCol"/> + </controls:data> + </controls:row> + + <controls:row labelStyle="table-label-text" dataStyle="table-normal-text" styleId="userNameCol"> + <controls:label><bean:message key="realm.userNameCol"/>:</controls:label> + <controls:data> + <html:text property="userNameCol" size="30" styleId="userNameCol"/> + </controls:data> + </controls:row> + + <controls:row labelStyle="table-label-text" dataStyle="table-normal-text" styleId="userRoleTable"> + <controls:label><bean:message key="realm.userRoleTable"/>:</controls:label> + <controls:data> + <html:text property="userRoleTable" size="30" styleId="userRoleTable"/> + </controls:data> + </controls:row> + + <controls:row labelStyle="table-label-text" dataStyle="table-normal-text" styleId="userTable"> + <controls:label><bean:message key="realm.userTable"/>:</controls:label> + <controls:data> + <html:text property="userTable" size="30" styleId="userTable"/> + </controls:data> + </controls:row> + + </controls:table> + </td> + </tr> + </table> + <%@ include file="../buttons.jsp" %> + <br> + </html:form> +<p> </p> +</body> +</html:html> \ No newline at end of file Propchange: tomcat/container/branches/tc4.1.x/webapps/admin/realm/dataSourceRealm.jsp ------------------------------------------------------------------------------ svn:eol-style = native Modified: tomcat/container/branches/tc4.1.x/webapps/admin/resources/dataSources.jspf URL: http://svn.apache.org/viewcvs/tomcat/container/branches/tc4.1.x/webapps/admin/resources/dataSources.jspf?rev=365735&r1=365734&r2=365735&view=diff ============================================================================== --- tomcat/container/branches/tc4.1.x/webapps/admin/resources/dataSources.jspf (original) +++ tomcat/container/branches/tc4.1.x/webapps/admin/resources/dataSources.jspf Tue Jan 3 12:24:27 2006 @@ -28,20 +28,20 @@ <input type="checkbox" name="dataSources" value="<%= dataSource %>" styleId="dataSources"> </td> + <td><div align="left" class="table-normal-text"> + <html:link page='<%= "/resources/setUpDataSource.do?objectName=" + + URLEncoder.encode(dataSource) + "&resourcetype=" + + URLEncoder.encode(resourcetypeInfo) + "&path="+ + URLEncoder.encode(pathInfo) + "&host="+ + URLEncoder.encode(hostInfo) + "&service="+ + URLEncoder.encode(serviceInfo) %>'> + <controls:attribute name="dataSource" attribute="name"/> + </html:link> + </div></td> + <td><div align="left" class="table-normal-text"> + <controls:attribute name="dataSource" attribute="driverClassName"/> + </div></td> </logic:present> - <td><div align="left" class="table-normal-text"> - <html:link page='<%= "/resources/setUpDataSource.do?objectName=" + - URLEncoder.encode(dataSource) + "&resourcetype=" + - URLEncoder.encode(resourcetypeInfo) + "&path="+ - URLEncoder.encode(pathInfo) + "&host="+ - URLEncoder.encode(hostInfo) + "&service="+ - URLEncoder.encode(serviceInfo) %>'> - <controls:attribute name="dataSource" attribute="name"/> - </html:link> - </div></td> - <td><div align="left" class="table-normal-text"> - <controls:attribute name="dataSource" attribute="driverClassName"/> - </div></td> </tr> </logic:iterate> Modified: tomcat/container/branches/tc4.1.x/webapps/tomcat-docs/config/realm.xml URL: http://svn.apache.org/viewcvs/tomcat/container/branches/tc4.1.x/webapps/tomcat-docs/config/realm.xml?rev=365735&r1=365734&r2=365735&view=diff ============================================================================== --- tomcat/container/branches/tc4.1.x/webapps/tomcat-docs/config/realm.xml (original) +++ tomcat/container/branches/tc4.1.x/webapps/tomcat-docs/config/realm.xml Tue Jan 3 12:24:27 2006 @@ -189,6 +189,13 @@ user passwords are assumed to be stored in clear-text.</p> </attribute> + <attribute name="localDataSource" required="false"> + <p>When the realm is nested inside a Context element, this allows the + realm to use a DataSource defined for the Context rather than a global + DataSource. If not specified, the default is <code>false</code>: use a + global DataSource.</p> + </attribute> + <attribute name="roleNameCol" required="true"> <p>Name of the column, in the "user roles" table, which contains a role name assigned to the corresponding user.</p> Modified: tomcat/container/branches/tc4.1.x/webapps/tomcat-docs/realm-howto.xml URL: http://svn.apache.org/viewcvs/tomcat/container/branches/tc4.1.x/webapps/tomcat-docs/realm-howto.xml?rev=365735&r1=365734&r2=365735&view=diff ============================================================================== --- tomcat/container/branches/tc4.1.x/webapps/tomcat-docs/realm-howto.xml (original) +++ tomcat/container/branches/tc4.1.x/webapps/tomcat-docs/realm-howto.xml Tue Jan 3 12:24:27 2006 @@ -428,6 +428,13 @@ information. If not specified, passwords are stored in clear text.</p> </attribute> + <attribute name="localDataSource" required="false"> + <p>When the realm is nested inside a Context element, this allows the + realm to use a DataSource defined for the Context rather than a global + DataSource. If not specified, the default is <code>false</code>: use a + global DataSource.</p> + </attribute> + <attribute name="roleNameCol" required="true"> <p>The name of the column, in the <em>user roles</em> table, that contains the name of a role assigned to this user.</p> --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]