/*
* 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;
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.TypeDeclaration;
import org.apache.beehive.netui.compiler.typesystem.type.ClassType;
import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Iterator;
public class MergedControllerAnnotation
implements JpfLanguageConstants
{
private String _strutsMerge;
private String _validatorVersion;
private String _validatorMerge;
private List _tilesDefsConfigs;
private boolean _nested;
private boolean _longLived;
private List _rolesAllowed;
private List _customValidatorConfigs;
private Boolean _loginRequired = null;
private boolean _readOnly;
private LinkedHashMap _forwards = new LinkedHashMap();
private LinkedHashMap _sharedFlowRefs = new LinkedHashMap();
private LinkedHashMap _catches = new LinkedHashMap();
private LinkedHashMap _simpleActions = new LinkedHashMap();
private LinkedHashMap _validatableBeans = new LinkedHashMap();
private LinkedHashMap _messageResources = new LinkedHashMap();
private LinkedHashMap _messageBundles = new LinkedHashMap();
private String _multipartHandler;
public MergedControllerAnnotation( TypeDeclaration jclass )
{
mergeControllerAnnotations( jclass );
}
public void mergeAnnotation( AnnotationInstance controllerAnnotation )
{
String strutsMerge = CompilerUtils.getString( controllerAnnotation, STRUTSMERGE_ATTR, true );
if ( strutsMerge != null ) _strutsMerge = strutsMerge;
String validatorVersion = CompilerUtils.getEnumFieldName( controllerAnnotation, VALIDATOR_VERSION_ATTR, true );
if ( validatorVersion != null ) _validatorVersion = validatorVersion;
String validatorMerge = CompilerUtils.getString( controllerAnnotation, VALIDATOR_MERGE_ATTR, true );
if ( validatorMerge != null ) _validatorMerge = validatorMerge;
Boolean nested = CompilerUtils.getBoolean( controllerAnnotation, NESTED_ATTR, true );
if ( nested != null ) _nested = nested.booleanValue();
Boolean longLived = CompilerUtils.getBoolean( controllerAnnotation, LONGLIVED_ATTR, true );
if ( longLived != null ) _longLived = longLived.booleanValue();
Boolean loginRequired = CompilerUtils.getBoolean( controllerAnnotation, LOGIN_REQUIRED_ATTR, true );
if ( loginRequired != null ) _loginRequired = loginRequired;
Boolean readOnly = CompilerUtils.getBoolean( controllerAnnotation, READONLY_ATTR, true );
if ( readOnly != null ) _readOnly = readOnly.booleanValue();
_rolesAllowed = mergeStringArray( _rolesAllowed, controllerAnnotation, ROLES_ALLOWED_ATTR );
_customValidatorConfigs =
mergeStringArray( _customValidatorConfigs, controllerAnnotation, CUSTOM_VALIDATOR_CONFIGS_ATTR );
_tilesDefsConfigs = mergeStringArray( _tilesDefsConfigs, controllerAnnotation, TILES_DEFINITIONS_CONFIGS_ATTR );
mergeAnnotationArray( _forwards, controllerAnnotation, FORWARDS_ATTR, NAME_ATTR );
mergeAnnotationArray( _sharedFlowRefs, controllerAnnotation, SHARED_FLOW_REFS_ATTR, NAME_ATTR );
mergeAnnotationArray( _catches, controllerAnnotation, CATCHES_ATTR, TYPE_ATTR );
mergeAnnotationArray( _simpleActions, controllerAnnotation, SIMPLE_ACTIONS_ATTR, NAME_ATTR );
mergeAnnotationArray( _validatableBeans, controllerAnnotation, VALIDATABLE_BEANS_ATTR, TYPE_ATTR );
mergeAnnotationArray( _messageBundles, controllerAnnotation, MESSAGE_BUNDLES_ATTR, BUNDLE_PATH_ATTR );
String multipartHandler = CompilerUtils.getEnumFieldName( controllerAnnotation, MULTIPART_HANDLER_ATTR, true );
if ( multipartHandler != null ) _multipartHandler = multipartHandler;
}
private static List mergeStringArray( List memberList, AnnotationInstance parentAnnotation,
String attr )
{
List newList = CompilerUtils.getStringArray( parentAnnotation, attr, true );
if ( newList != null )
{
if ( memberList == null ) return newList;
memberList.addAll( newList );
}
return memberList;
}
private static void mergeAnnotationArray( LinkedHashMap keyedList,
AnnotationInstance parentAnnotation, String attr, String keyAttr )
{
List annotations = CompilerUtils.getAnnotationArray( parentAnnotation, attr, true );
if ( annotations != null )
{
for ( Iterator ii = annotations.iterator(); ii.hasNext(); )
{
AnnotationInstance ann = ( AnnotationInstance ) ii.next();
Object key = CompilerUtils.getAnnotationValue( ann, keyAttr, true );
if ( key != null ) keyedList.put( key.toString(), ann );
}
}
}
public String getStrutsMerge()
{
return _strutsMerge;
}
public String getValidatorVersion()
{
return _validatorVersion;
}
public String getValidatorMerge()
{
return _validatorMerge;
}
public List getTilesDefinitionsConfigs()
{
return _tilesDefsConfigs;
}
public boolean isNested()
{
return _nested;
}
public boolean isLongLived()
{
return _longLived;
}
public List getRolesAllowed()
{
return _rolesAllowed;
}
public List getCustomValidatorConfigs()
{
return _customValidatorConfigs;
}
public Boolean isLoginRequired()
{
return _loginRequired;
}
public boolean isReadOnly()
{
return _readOnly;
}
public Collection getForwards()
{
return _forwards.values();
}
public Collection getSharedFlowRefs()
{
return _sharedFlowRefs.values();
}
public Collection getCatches()
{
return _catches.values();
}
public Collection getSimpleActions()
{
return _simpleActions.values();
}
public Collection getValidatableBeans()
{
return _validatableBeans.values();
}
public Collection getMessageResources()
{
return _messageResources.values();
}
public Collection getMessageBundles()
{
return _messageBundles.values();
}
public String getMultipartHandler()
{
return _multipartHandler;
}
private void mergeControllerAnnotations( TypeDeclaration jclass )
{
//
// Merge in all the controller annotations, starting with the most remote superclass first.
//
if ( jclass != null && jclass instanceof ClassDeclaration )
{
ClassType superClass = ( ( ClassDeclaration ) jclass ).getSuperclass();
if ( superClass != null ) mergeControllerAnnotations( superClass.getDeclaration() );
AnnotationInstance controllerAnnotation = CompilerUtils.getAnnotation( jclass, CONTROLLER_TAG_NAME );
if ( controllerAnnotation != null ) mergeAnnotation( controllerAnnotation );
}
}
}