📄 formbeanconfig.java
字号:
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 + -