📄 formbeanconfig.java.svn-base
字号:
/* * $Id$ * * 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.struts.config;import org.apache.commons.beanutils.BeanUtils;import org.apache.commons.beanutils.DynaBean;import org.apache.commons.beanutils.MutableDynaClass;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;import org.apache.struts.action.ActionForm;import org.apache.struts.action.ActionServlet;import org.apache.struts.action.DynaActionForm;import org.apache.struts.action.DynaActionFormClass;import org.apache.struts.chain.commands.util.ClassUtils;import org.apache.struts.chain.contexts.ActionContext;import org.apache.struts.chain.contexts.ServletActionContext;import org.apache.struts.util.RequestUtils;import org.apache.struts.validator.BeanValidatorForm;import java.lang.reflect.InvocationTargetException;import java.util.HashMap;/** * <p>A JavaBean representing the configuration information of a * <code><form-bean></code> element in a Struts configuration file.<p> * * @version $Rev$ $Date: 2006-01-17 07:26:20 -0500 (Tue, 17 Jan 2006) * $ * @since Struts 1.1 */public class FormBeanConfig extends BaseConfig { private static final Log log = LogFactory.getLog(FormBeanConfig.class); // ----------------------------------------------------- Instance Variables /** * The set of FormProperty elements defining dynamic form properties for * this form bean, keyed by property name. */ protected HashMap formProperties = new HashMap(); /** * <p>The lockable object we can synchronize on when creating * DynaActionFormClass.</p> */ protected String lock = ""; // ------------------------------------------------------------- Properties /** * The DynaActionFormClass associated with a DynaActionForm. */ protected transient DynaActionFormClass dynaActionFormClass; /** * Is the form bean class an instance of DynaActionForm with dynamic * properties? */ protected boolean dynamic = false; /** * The name of the FormBeanConfig that this config inherits configuration * information from. */ protected String inherit = null; /** * Have the inheritance values for this class been applied? */ protected boolean extensionProcessed = false; /** * The unique identifier of this form bean, which is used to reference * this bean in <code>ActionMapping</code> instances as well as for the * name of the request or session attribute under which the corresponding * form bean instance is created or accessed. */ protected String name = null; /** * The fully qualified Java class name of the implementation class to be * used or generated. */ protected String type = null; /** * Is this DynaClass currently restricted (for DynaBeans with a * MutableDynaClass). */ protected boolean restricted = false; /** * <p>Return the DynaActionFormClass associated with a * DynaActionForm.</p> * * @throws IllegalArgumentException if the ActionForm is not dynamic */ public DynaActionFormClass getDynaActionFormClass() { if (dynamic == false) { throw new IllegalArgumentException("ActionForm is not dynamic"); } synchronized (lock) { if (dynaActionFormClass == null) { dynaActionFormClass = new DynaActionFormClass(this); } } return dynaActionFormClass; } public boolean getDynamic() { return (this.dynamic); } public String getExtends() { return (this.inherit); } public void setExtends(String extend) { throwIfConfigured(); this.inherit = extend; } public boolean isExtensionProcessed() { return extensionProcessed; } public String getName() { return (this.name); } public void setName(String name) { throwIfConfigured(); this.name = name; } public String getType() { return (this.type); } public void setType(String type) { throwIfConfigured(); this.type = type; Class dynaBeanClass = DynaActionForm.class; Class formBeanClass = formBeanClass(); if (formBeanClass != null) { if (dynaBeanClass.isAssignableFrom(formBeanClass)) { this.dynamic = true; } else { this.dynamic = false; } } else { this.dynamic = false; } } /** * <p>Indicates whether a MutableDynaClass is currently restricted.</p> * <p>If so, no changes to the existing registration of property names, * data types, readability, or writeability are allowed.</p> */ public boolean isRestricted() { return restricted; } /** * <p>Set whether a MutableDynaClass is currently restricted.</p> <p>If * so, no changes to the existing registration of property names, data * types, readability, or writeability are allowed.</p> */ public void setRestricted(boolean restricted) { this.restricted = restricted; } // ------------------------------------------------------ Protected Methods /** * <p>Traces the hierarchy of this object to check if any of the ancestors * is extending this instance.</p> * * @param moduleConfig The configuration for the module being configured. * @return true if circular inheritance was detected. */ protected boolean checkCircularInheritance(ModuleConfig moduleConfig) { String ancestorName = getExtends(); while (ancestorName != null) { // check if we have the same name as an ancestor if (getName().equals(ancestorName)) { return true; } // get our ancestor's ancestor FormBeanConfig ancestor = moduleConfig.findFormBeanConfig(ancestorName); ancestorName = ancestor.getExtends(); } return false; } /** * <p>Compare the form properties of this bean with that of the given and * copy those that are not present.</p> * * @param config The form bean config to copy properties from. * @see #inheritFrom(FormBeanConfig) */ protected void inheritFormProperties(FormBeanConfig config) throws ClassNotFoundException, IllegalAccessException, InstantiationException, InvocationTargetException { throwIfConfigured(); // Inherit form property configs FormPropertyConfig[] baseFpcs = config.findFormPropertyConfigs(); for (int i = 0; i < baseFpcs.length; i++) { FormPropertyConfig baseFpc = baseFpcs[i]; // Do we have this prop? FormPropertyConfig prop = this.findFormPropertyConfig(baseFpc.getName()); if (prop == null) { // We don't have this, so let's copy it prop = (FormPropertyConfig) RequestUtils.applicationInstance(baseFpc.getClass() .getName()); BeanUtils.copyProperties(prop, baseFpc); this.addFormPropertyConfig(prop); prop.setProperties(baseFpc.copyProperties()); } } } // --------------------------------------------------------- Public Methods /** * <p>Create and return an <code>ActionForm</code> instance appropriate to * the information in this <code>FormBeanConfig</code>.</p> * * <p>Although this method is not formally deprecated yet, where possible, * the form which accepts an <code>ActionContext</code> as an argument is * preferred, to help sever direct dependencies on the Servlet API. As * the ActionContext becomes more familiar in Struts, this method will * almost certainly be deprecated.</p> * * @param servlet The action servlet * @return ActionForm instance * @throws IllegalAccessException if the Class or the appropriate * constructor is not accessible * @throws InstantiationException if this Class represents an abstract * class, an array class, a primitive type, * or void; or if instantiation fails for * some other reason */ public ActionForm createActionForm(ActionServlet servlet) throws IllegalAccessException, InstantiationException { Object obj = null; // Create a new form bean instance if (getDynamic()) { obj = getDynaActionFormClass().newInstance(); } else { obj = formBeanClass().newInstance(); } ActionForm form = null; if (obj instanceof ActionForm) { form = (ActionForm) obj; } else { form = new BeanValidatorForm(obj); } form.setServlet(servlet); if (form instanceof DynaBean && ((DynaBean) form).getDynaClass() instanceof MutableDynaClass) { DynaBean dynaBean = (DynaBean) form; MutableDynaClass dynaClass = (MutableDynaClass) dynaBean.getDynaClass(); // Add properties dynaClass.setRestricted(false);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -