001: /*
002: * Licensed to the Apache Software Foundation (ASF) under one or more
003: * contributor license agreements. See the NOTICE file distributed with
004: * this work for additional information regarding copyright ownership.
005: * The ASF licenses this file to You under the Apache License, Version 2.0
006: * (the "License"); you may not use this file except in compliance with
007: * the License. You may obtain a copy of the License at
008: *
009: * http://www.apache.org/licenses/LICENSE-2.0
010: *
011: * Unless required by applicable law or agreed to in writing, software
012: * distributed under the License is distributed on an "AS IS" BASIS,
013: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014: * See the License for the specific language governing permissions and
015: * limitations under the License.
016: *
017: * $Header:$
018: */
019: package org.apache.beehive.netui.compiler.genmodel;
020:
021: import org.apache.beehive.netui.compiler.CompilerUtils;
022: import org.apache.beehive.netui.compiler.model.StrutsApp;
023: import org.apache.beehive.netui.compiler.model.XmlModelWriter;
024: import org.apache.beehive.netui.compiler.typesystem.declaration.AnnotationInstance;
025: import org.apache.beehive.netui.compiler.typesystem.declaration.ClassDeclaration;
026: import org.apache.beehive.netui.compiler.typesystem.declaration.Declaration;
027: import org.apache.beehive.netui.compiler.typesystem.declaration.TypeDeclaration;
028: import org.w3c.dom.Element;
029:
030: /**
031: * Generates to a Struts ActionMapping object that delegates to an ActionMapping
032: * in a different module. These are used for support of inheritance.
033: *
034: * <p>Note that there are some Controller attributes that are for actions such as
035: * loginRequired and readOnly. This implementation extends GenActionModel and
036: * overrides init() so that local Controller properties can be included in the
037: * Struts module config we generate. Then the runtime can use these values to
038: * override the values of the delegate.</p>
039: *
040: * <p>Also, for overloaded action methods, this class needs to know the name of
041: * any form bean used by the delegate so that the StrutsApp class can disambiguate
042: * the action path setting when it adds the action to the action mappings. Using
043: * the super class, GenActionModel, construtctor will set the form bean name.
044: */
045: public class DelegatingActionModel extends GenActionModel {
046: protected static final String ACTION_MAPPING_CLASSNAME = PAGEFLOW_PACKAGE
047: + ".config.DelegatingActionMapping";
048:
049: public DelegatingActionModel(Declaration sourceElement,
050: TypeDeclaration containingType, GenStrutsApp parent,
051: ClassDeclaration jclass) {
052: super (sourceElement, parent, jclass);
053:
054: String modulePath = CompilerUtils
055: .inferModulePathFromType(containingType);
056: if (parent instanceof GenSharedFlowStrutsApp) {
057: // modify the module config path for a shared flow
058: modulePath = "/" + StrutsApp.STRUTS_CONFIG_SEPARATOR
059: + modulePath.substring(1);
060: }
061: addSetProperty("delegateModulePath", modulePath);
062:
063: if (parent.getFlowControllerInfo()
064: .getMergedControllerAnnotation().isInheritLocalPaths()) {
065: addSetProperty("inheritLocalPaths", "true");
066: }
067: }
068:
069: protected void init(String actionName,
070: AnnotationInstance annotation, GenStrutsApp parent,
071: ClassDeclaration jclass) {
072: setActionName(actionName);
073: setClassName(ACTION_MAPPING_CLASSNAME);
074: setParameter(parent.getFlowControllerClass().getQualifiedName());
075:
076: // loginRequired - Set this to override the delegating action property
077: // only if loginRequired is set on the Controller annotation.
078: AnnotationInstance controllerAnnotation = CompilerUtils
079: .getAnnotation(jclass, CONTROLLER_TAG_NAME);
080: Boolean loginRequired = CompilerUtils.getBoolean(
081: controllerAnnotation, LOGIN_REQUIRED_ATTR, true);
082: if (loginRequired != null) {
083: setLoginRequired(loginRequired);
084: }
085:
086: // readOnly - Set this to override the delegating action property
087: // only if readOnly is set on the Controller annotation.
088: Boolean readOnly = CompilerUtils.getBoolean(
089: controllerAnnotation, READONLY_ATTR, true);
090: if (readOnly != null) {
091: setReadonly(readOnly);
092: }
093:
094: // rolesAllowed -- avoid setting this if loginRequired is explicitly false.
095: // If it's not set on this controller, check the action annotation, then the
096: // parent controller.
097: if (loginRequired == null) {
098: loginRequired = CompilerUtils.getBoolean(annotation,
099: LOGIN_REQUIRED_ATTR, true);
100: if (loginRequired == null) {
101: loginRequired = parent.getFlowControllerInfo()
102: .getMergedControllerAnnotation()
103: .isLoginRequired();
104: }
105: }
106: if (loginRequired == null || loginRequired.booleanValue()) {
107: setRolesAllowed(annotation, jclass, parent);
108: }
109:
110: // form bean member -- the page-flow-scoped form referenced by the action (a member variable)
111: setFormMember(CompilerUtils.getString(annotation,
112: USE_FORM_BEAN_ATTR, true));
113: }
114:
115: protected void addSetProperty(XmlModelWriter xw, Element element,
116: String propertyName, String propertyValue) {
117: setCustomProperty(xw, element, propertyName, propertyValue,
118: ACTION_MAPPING_CLASSNAME);
119: }
120: }
|