📄 formbeanconfig.java.svn-base
字号:
FormPropertyConfig[] props = findFormPropertyConfigs(); for (int i = 0; i < props.length; i++) { dynaClass.add(props[i].getName(), props[i].getTypeClass()); dynaBean.set(props[i].getName(), props[i].initial()); } dynaClass.setRestricted(isRestricted()); } if (form instanceof BeanValidatorForm) { ((BeanValidatorForm)form).initialize(this); } return form; } /** * <p>Create and return an <code>ActionForm</code> instance appropriate to * the information in this <code>FormBeanConfig</code>.</p> * <p><b>NOTE:</b> If the given <code>ActionContext</code> is not of type * <code>ServletActionContext</code> (or a subclass), then the form which * is returned will have a null <code>servlet</code> property. Some of * the subclasses of <code>ActionForm</code> included in Struts will later * throw a <code>NullPointerException</code> in this case. </p> <p>TODO: * Find a way to control this direct dependency on the Servlet API.</p> * * @param context The ActionContext. * @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(ActionContext context) throws IllegalAccessException, InstantiationException { ActionServlet actionServlet = null; if (context instanceof ServletActionContext) { ServletActionContext saContext = (ServletActionContext) context; actionServlet = saContext.getActionServlet(); } return createActionForm(actionServlet); } /** * <p>Checks if the given <code>ActionForm</code> instance is suitable for * use as an alternative to calling this <code>FormBeanConfig</code> * instance's <code>createActionForm</code> method.</p> * * @param form an existing form instance that may be reused. * @return true if the given form can be reused as the form for this * config. */ public boolean canReuse(ActionForm form) { if (form != null) { if (this.getDynamic()) { String className = ((DynaBean) form).getDynaClass().getName(); if (className.equals(this.getName())) { log.debug("Can reuse existing instance (dynamic)"); return (true); } } else { try { // check if the form's class is compatible with the class // we're configured for Class formClass = form.getClass(); if (form instanceof BeanValidatorForm) { BeanValidatorForm beanValidatorForm = (BeanValidatorForm) form; if (beanValidatorForm.getInstance() instanceof DynaBean) { String formName = beanValidatorForm.getStrutsConfigFormName(); if (getName().equals(formName)) { log.debug("Can reuse existing instance (BeanValidatorForm)"); return true; } else { return false; } } formClass = beanValidatorForm.getInstance().getClass(); } Class configClass = ClassUtils.getApplicationClass(this.getType()); if (configClass.isAssignableFrom(formClass)) { log.debug("Can reuse existing instance (non-dynamic)"); return (true); } } catch (Exception e) { log.debug("Error testing existing instance for reusability; just create a new instance", e); } } } return false; } /** * Add a new <code>FormPropertyConfig</code> instance to the set * associated with this module. * * @param config The new configuration instance to be added * @throws IllegalArgumentException if this property name has already been * defined */ public void addFormPropertyConfig(FormPropertyConfig config) { throwIfConfigured(); if (formProperties.containsKey(config.getName())) { throw new IllegalArgumentException("Property " + config.getName() + " already defined"); } formProperties.put(config.getName(), config); } /** * Return the form property configuration for the specified property name, * if any; otherwise return <code>null</code>. * * @param name Form property name to find a configuration for */ public FormPropertyConfig findFormPropertyConfig(String name) { return ((FormPropertyConfig) formProperties.get(name)); } /** * Return the form property configurations for this module. If there are * none, a zero-length array is returned. */ public FormPropertyConfig[] findFormPropertyConfigs() { FormPropertyConfig[] results = new FormPropertyConfig[formProperties.size()]; return ((FormPropertyConfig[]) formProperties.values().toArray(results)); } /** * Freeze the configuration of this component. */ public void freeze() { super.freeze(); FormPropertyConfig[] fpconfigs = findFormPropertyConfigs(); for (int i = 0; i < fpconfigs.length; i++) { fpconfigs[i].freeze(); } } /** * <p>Inherit values that have not been overridden from the provided * config object. Subclasses overriding this method should verify that * the given parameter is of a class that contains a property it is trying * to inherit:</p> * * <pre> * if (config instanceof MyCustomConfig) { * MyCustomConfig myConfig = * (MyCustomConfig) config; * * if (getMyCustomProp() == null) { * setMyCustomProp(myConfig.getMyCustomProp()); * } * } * </pre> * * <p>If the given <code>config</code> is extending another object, those * extensions should be resolved before it's used as a parameter to this * method.</p> * * @param config The object that this instance will be inheriting its * values from. * @see #processExtends(ModuleConfig) */ public void inheritFrom(FormBeanConfig config) throws ClassNotFoundException, IllegalAccessException, InstantiationException, InvocationTargetException { throwIfConfigured(); // Inherit values that have not been overridden if (getName() == null) { setName(config.getName()); } if (!isRestricted()) { setRestricted(config.isRestricted()); } if (getType() == null) { setType(config.getType()); } inheritFormProperties(config); inheritProperties(config); } /** * <p>Inherit configuration information from the FormBeanConfig that this * instance is extending. This method verifies that any form bean config * object that it inherits from has also had its processExtends() method * called.</p> * * @param moduleConfig The {@link ModuleConfig} that this bean is from. * @see #inheritFrom(FormBeanConfig) */ public void processExtends(ModuleConfig moduleConfig) throws ClassNotFoundException, IllegalAccessException, InstantiationException, InvocationTargetException { if (configured) { throw new IllegalStateException("Configuration is frozen"); } String ancestor = getExtends(); if ((!extensionProcessed) && (ancestor != null)) { FormBeanConfig baseConfig = moduleConfig.findFormBeanConfig(ancestor); if (baseConfig == null) { throw new NullPointerException("Unable to find " + "form bean '" + ancestor + "' to extend."); } // Check against circule inheritance and make sure the base config's // own extends have been processed already if (checkCircularInheritance(moduleConfig)) { throw new IllegalArgumentException( "Circular inheritance detected for form bean " + getName()); } // Make sure the ancestor's own extension has been processed. if (!baseConfig.isExtensionProcessed()) { baseConfig.processExtends(moduleConfig); } // Copy values from the base config inheritFrom(baseConfig); } extensionProcessed = true; } /** * Remove the specified form property configuration instance. * * @param config FormPropertyConfig instance to be removed */ public void removeFormPropertyConfig(FormPropertyConfig config) { if (configured) { throw new IllegalStateException("Configuration is frozen"); } formProperties.remove(config.getName()); } /** * Return a String representation of this object. */ public String toString() { StringBuffer sb = new StringBuffer("FormBeanConfig["); sb.append("name="); sb.append(this.name); sb.append(",type="); sb.append(this.type); sb.append(",extends="); sb.append(this.inherit); sb.append("]"); return (sb.toString()); } // ------------------------------------------------------ Protected Methods /** * Return the <code>Class</code> instance for the form bean implementation * configured by this <code>FormBeanConfig</code> instance. This method * uses the same algorithm as <code>RequestUtils.applicationClass()</code> * but is reproduced to avoid a runtime dependence. */ protected Class formBeanClass() { ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); if (classLoader == null) { classLoader = this.getClass().getClassLoader(); } try { return (classLoader.loadClass(getType())); } catch (Exception e) { return (null); } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -