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.FieldDeclaration;
027: import org.apache.beehive.netui.compiler.typesystem.declaration.TypeDeclaration;
028: import org.apache.beehive.netui.compiler.typesystem.type.TypeInstance;
029: import org.w3c.dom.Element;
030:
031: /**
032: * Generates to a Struts ActionMapping object that delegates to an ActionMapping
033: * in a different module. These are used for support of inheritance for simple
034: * actions.
035: *
036: * <p>Note that there are some Controller attributes that are for actions such as
037: * loginRequired and readOnly. This implementation extends GenSimpleActionModel
038: * and overrides init() so that local Controller properties can be included in
039: * the Struts module config we generate. Then the runtime can use these values to
040: * override the values of the delegate.</p>
041: */
042: public class DelegatingSimpleActionModel extends GenSimpleActionModel {
043: public DelegatingSimpleActionModel(AnnotationInstance annotation,
044: TypeDeclaration containingType, GenStrutsApp parent,
045: ClassDeclaration jclass) {
046: super (annotation, parent, jclass);
047:
048: String modulePath = CompilerUtils
049: .inferModulePathFromType(containingType);
050: if (parent instanceof GenSharedFlowStrutsApp) {
051: // modify the module config path for a shared flow
052: modulePath = "/" + StrutsApp.STRUTS_CONFIG_SEPARATOR
053: + modulePath.substring(1);
054: }
055: addSetProperty("delegateModulePath", modulePath);
056:
057: if (parent.getFlowControllerInfo()
058: .getMergedControllerAnnotation().isInheritLocalPaths()) {
059: addSetProperty("inheritLocalPaths", "true");
060: }
061: }
062:
063: protected void init(String actionName,
064: AnnotationInstance annotation, GenStrutsApp parent,
065: ClassDeclaration jclass) {
066: setActionName(actionName);
067: setClassName(DelegatingActionModel.ACTION_MAPPING_CLASSNAME);
068: setParameter(parent.getFlowControllerClass().getQualifiedName());
069:
070: // loginRequired - Set this to override the delegating action property
071: // only if loginRequired is set on the Controller annotation.
072: AnnotationInstance controllerAnnotation = CompilerUtils
073: .getAnnotation(jclass, CONTROLLER_TAG_NAME);
074: Boolean loginRequired = CompilerUtils.getBoolean(
075: controllerAnnotation, LOGIN_REQUIRED_ATTR, true);
076: if (loginRequired != null) {
077: setLoginRequired(loginRequired);
078: }
079:
080: // check for a form bean member in the delegate --
081: // the page-flow-scoped form referenced by the action (a member variable)
082: String formMember = CompilerUtils.getString(annotation,
083: USE_FORM_BEAN_ATTR, true);
084: if (formMember != null) {
085: setFormMember(formMember);
086: FieldDeclaration field = CompilerUtils.findField(jclass,
087: formMember);
088: assert field != null; // checker should prevent this
089: setFormBeanName(addFormBean(field.getType(), parent));
090: } else {
091: // can't modify member state; mark as read-only
092: setReadonly(Boolean.valueOf(true));
093:
094: TypeInstance formBeanType = CompilerUtils.getTypeInstance(
095: annotation, USE_FORM_BEAN_TYPE_ATTR, true);
096: if (formBeanType != null) {
097: setFormBeanName(addFormBean(formBeanType, parent));
098: }
099: }
100:
101: // rolesAllowed -- avoid setting this if loginRequired is explicitly false.
102: // If it's not set on this controller, check the action annotation, then the
103: // parent controller.
104: if (loginRequired == null) {
105: loginRequired = CompilerUtils.getBoolean(annotation,
106: LOGIN_REQUIRED_ATTR, true);
107: if (loginRequired == null) {
108: loginRequired = parent.getFlowControllerInfo()
109: .getMergedControllerAnnotation()
110: .isLoginRequired();
111: }
112: }
113: if (loginRequired == null || loginRequired.booleanValue()) {
114: setRolesAllowed(annotation, jclass, parent);
115: }
116: }
117:
118: protected void addSetProperty(XmlModelWriter xw, Element element,
119: String propertyName, String propertyValue) {
120: setCustomProperty(xw, element, propertyName, propertyValue,
121: DelegatingActionModel.ACTION_MAPPING_CLASSNAME);
122: }
123: }
|