Package org.apache.beehive.netui.compiler.genmodel

Source Code of org.apache.beehive.netui.compiler.genmodel.GenForwardModel

/*
* Copyright 2004 The Apache Software Foundation.
*
* Licensed 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.
*
* $Header:$
*/
package org.apache.beehive.netui.compiler.genmodel;

import org.apache.beehive.netui.compiler.model.ForwardModel;
import org.apache.beehive.netui.compiler.model.ForwardContainer;
import org.apache.beehive.netui.compiler.CompilerUtils;
import org.apache.beehive.netui.compiler.JpfLanguageConstants;
import org.apache.beehive.netui.compiler.typesystem.declaration.AnnotationInstance;
import org.apache.beehive.netui.compiler.typesystem.declaration.ClassDeclaration;
import org.apache.beehive.netui.compiler.typesystem.declaration.FieldDeclaration;
import org.apache.beehive.netui.compiler.typesystem.type.DeclaredType;

import java.util.List;
import java.util.Collection;
import java.util.Iterator;

public class GenForwardModel
        extends ForwardModel
        implements JpfLanguageConstants
{
    public GenForwardModel( GenStrutsApp parent, AnnotationInstance annotation, ClassDeclaration jclass,
                            String commentSuffix )
    {
        super( parent );
       
        setName( CompilerUtils.getString( annotation, NAME_ATTR, true ) );
        setRedirect( CompilerUtils.getBoolean( annotation, REDIRECT_ATTR, false ).booleanValue() );
        if ( CompilerUtils.getBoolean( annotation, EXTERNAL_REDIRECT_ATTR, false ).booleanValue() ) {
            setExternalRedirect( true );
        }
       
        //
        // outputFormBean/outputFormBeanType
        //
        DeclaredType outputFormType = CompilerUtils.getDeclaredType( annotation, OUTPUT_FORM_BEAN_TYPE_ATTR, true );
        String outputFormMember = CompilerUtils.getString( annotation, OUTPUT_FORM_BEAN_ATTR, true );
        if ( outputFormMember != null )
        {
            FieldDeclaration field = CompilerUtils.getClassField( jclass, outputFormMember, null );
            assert outputFormType == null// checker should catch this
            assert field != null;           // checker should catch this
            assert field.getType() instanceof DeclaredType : field.getType().getClass().getName(); // checker enforces
            outputFormType = ( DeclaredType ) field.getType();
        }
        setOutputFormBeanMember( outputFormMember );
        setOutputFormBeanType( outputFormType != null ? CompilerUtils.getLoadableName( outputFormType ) : null );
       
        //
        // path, tilesDefinition, navigateTo, returnAction (mutually exclusive)
        //
        String returnAction = CompilerUtils.getString( annotation, RETURN_ACTION_ATTR, true );
        String navigateTo = CompilerUtils.getEnumFieldName( annotation, NAVIGATE_TO_ATTR, true );
        String tilesDefinition = CompilerUtils.getString( annotation, TILES_DEFINITION_ATTR, true );
        String path = CompilerUtils.getString( annotation, PATH_ATTR, true );
        String action = CompilerUtils.getString( annotation, ACTION_ATTR, true );
       
        if ( action != null )
        {
            assert path == null// checker should enforce this
            path = action + ACTION_EXTENSION_DOT;
        }
       
        if ( returnAction != null )
        {
            assert navigateTo == null;
            assert tilesDefinition == null;
            assert path == null;
            setIsNestedReturn( true );
            setPath( returnAction );    // set the returnAction as the path -- the runtime expects it there
        }
        else if ( navigateTo != null )
        {
            assert tilesDefinition == null;
            assert path == null;
           
            if ( navigateTo.equals( NAVIGATE_TO_PAGE_LEGACY_STR )
                 || navigateTo.equals( NAVIGATE_TO_CURRENT_PAGE_STR )
                 || navigateTo.equals( NAVIGATE_TO_PREVIOUS_PAGE_STR ) )
            {
                setReturnToPage( true );
            }
            else if ( navigateTo.equals( NAVIGATE_TO_PREVIOUS_ACTION_STR ) )
            {
                setReturnToAction( true );
            }
            else
            {
                assert false : "unknown value for navigateTo: \"" + navigateTo + '"';
            }

            boolean restore = CompilerUtils.getBoolean( annotation, RESTORE_QUERY_STRING_ATTR, false ).booleanValue();
            setRestoreQueryString( restore );
            setPath( navigateTo );    // set the actual navigateTo value as the path -- the runtime expects it there
        }
        else if ( tilesDefinition != null )
        {
            assert path == null;
            setPath( tilesDefinition );    // set the tilesDefinition as the path -- the runtime expects it there
        }
        else
        {
            assert path != null;      // checker should enforce this
           
            //
            // Translate our relative-path convention (normal) to the Struts convention, which adds a '/'
            // to any module-relative path.
            //
            boolean contextRelative = true;
            if ( ! path.startsWith( "/" ) )
            {
                contextRelative = false;
               
                //
                // If it's an absolute URL, then the path shouldn't have a slash inserted in front of it.
                //
                if ( ! CompilerUtils.isAbsoluteURL( path ) ) path = '/' + path;
            }
           
            setPath( path );
            setContextRelative( contextRelative );
        }

        addActionOutputs( annotation, jclass );
       
        if ( commentSuffix != null )
        {
            setComment( "forward \"" + getName() + '"' + commentSuffix )// @TODO I18N the comment
        }       
    }
   
    static void addForwards( AnnotationInstance annotation, ForwardContainer container, ClassDeclaration jclass,
                             GenStrutsApp strutsApp, String commentSuffix )
    {
        List forwards = CompilerUtils.getAnnotationArray( annotation, FORWARDS_ATTR, true );
        addForwards( forwards, container, jclass, strutsApp, commentSuffix );
    }
   
    static void addForwards( Collection forwards, ForwardContainer container,
                             ClassDeclaration jclass, GenStrutsApp strutsApp, String commentSuffix )
    {
        if ( forwards != null )
        {
            for ( Iterator ii = forwards.iterator(); ii.hasNext();
            {
                AnnotationInstance ann = ( AnnotationInstance ) ii.next();
                container.addForward( new GenForwardModel( strutsApp, ann, jclass, commentSuffix ) );
            }
        }
    }
       
    protected void addActionOutputs( AnnotationInstance annotation, ClassDeclaration jclass )
    {
        List actionOutputs =
                CompilerUtils.getAnnotationArray( annotation, ACTION_OUTPUTS_ATTR, true );
       
        if ( actionOutputs != null )
        {
            for ( Iterator ii = actionOutputs.iterator(); ii.hasNext();
            {
                AnnotationInstance ann = ( AnnotationInstance ) ii.next();
                addActionOutput( new GenActionOutputModel( ann, jclass ) );
            }
        }
    }
}
TOP

Related Classes of org.apache.beehive.netui.compiler.genmodel.GenForwardModel

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.