package gw.lang.reflect; import gw.lang.reflect.gs.IGosuMethodInfo; import gw.lang.reflect.gs.IGosuPropertyInfo; import gw.lang.reflect.gs.IGosuConstructorInfo; import gw.lang.reflect.gs.IGosuClassTypeInfo; import gw.lang.reflect.gs.IGosuMethodParamInfo; import gw.lang.Throws; import gw.lang.Returns; import gw.lang.Scriptable; import gw.lang.Param; import gw.lang.parser.ScriptabilityModifiers; import gw.lang.annotation.ScriptabilityModifier; import java.util.List; import java.util.ArrayList; /** * This class will be removed by the end of Diamond * * Copyright 2010 Guidewire Software, Inc. */ @Deprecated public class AnnotationReflectUtil { public static String evalDeprecationReason( IAnnotatedFeatureInfo featureInfo ) { if( isGosuFeature( featureInfo ) ) { String deprecatedReason = ""; List<IAnnotationInfo> annotation = featureInfo.getAnnotationsOfType( TypeSystem.get( gw.lang.Deprecated.class ) ); if( annotation.size() > 0 ) { try { gw.lang.Deprecated deprecated = (gw.lang.Deprecated)ReflectUtil.evaluateAnnotation( annotation.get( 0 ) ); if( deprecated != null ) { deprecatedReason = deprecated.value(); } } catch( Exception e ) { //ignore } } return deprecatedReason; } else { return featureInfo.getDeprecatedReason(); } } public static List<IExceptionInfo> evalThrowsInfos( IAnnotatedFeatureInfo typeInfo ) { ArrayList<IExceptionInfo> lst = new ArrayList<IExceptionInfo>(); for( Throws aThrows : evalThrows( typeInfo ) ) { lst.add( new SyntheticExceptionInfo( typeInfo, aThrows.getExceptionType().getName(), aThrows.getExceptionDescription() ) ); } return lst; } public static List<Throws> evalThrows( IAnnotatedFeatureInfo typeInfo ) { List<Throws> throwsLst = new ArrayList<Throws>(); try { for( IAnnotationInfo annotationInfo : typeInfo.getAnnotationsOfType( TypeSystem.get( Throws.class ) ) ) { Throws aThrows = (Throws)(isGosuFeature( typeInfo ) ? ReflectUtil.evaluateAnnotation( annotationInfo ) : annotationInfo.getInstance()); if( aThrows != null ) { throwsLst.add( aThrows ); } } } catch( Exception e ) { //ignore } return throwsLst; } public static String evalReturnDescription( IMethodInfo method ) { if( method instanceof IGosuMethodInfo ) { List<IAnnotationInfo> annotation = method.getAnnotationsOfType( TypeSystem.getByFullName( "gw.lang.Returns" ) ); if( annotation.size() > 0 ) { if( isGosuFeature( method ) ) { return ((Returns)ReflectUtil.evaluateAnnotation( annotation.get( 0 ) )).value(); } else { return ((Returns)annotation.get( 0 ).getInstance()).value(); } } } else { return method.getReturnDescription(); } return ""; } public static boolean evalVisibleForWebservice( IMethodInfo method ) { // equivelent to method.isVisible( ScriptabilityModifiers.SCRIPTABLE_WEBSERVICE) List<IAnnotationInfo> annotation = method.getAnnotationsOfType( TypeSystem.get( Scriptable.class ) ); if( annotation == null || annotation.size() == 0 ) { return !evalIsHidden( method.getOwnersType().getTypeInfo() ); } for( IAnnotationInfo annotationInfo : annotation ) { Scriptable o = (Scriptable)ReflectUtil.evaluateAnnotation( annotationInfo ); for( ScriptabilityModifier scriptabilityModifier : o.value() ) { if( scriptabilityModifier.isVisible( ScriptabilityModifiers.SCRIPTABLE_WEBSERVICE ) ) { return true; } } } return false; } public static boolean evalIsHidden( IAnnotatedFeatureInfo featureInfo ) { // equivelent to method.isVisible( ScriptabilityModifiers.SCRIPTABLE_WEBSERVICE) for( IAnnotationInfo annotationInfo : featureInfo.getAnnotationsOfType( TypeSystem.get( Scriptable.class ) ) ) { Scriptable o = (Scriptable)ReflectUtil.evaluateAnnotation( annotationInfo ); for( ScriptabilityModifier scriptabilityModifier : o.value() ) { if( scriptabilityModifier.equals( ScriptabilityModifier.HIDDEN ) ) { return true; } } } return false; } public static String evalParameterDecription( IParameterInfo parameterData ) { // replicates logic in gw.internal.gosu.parser.GosuMethodParamInfo._description if( parameterData instanceof IGosuMethodParamInfo ) { IFeatureInfo featureInfo = parameterData.getContainer(); IAttributedFeatureInfo annotatedFI = (IAttributedFeatureInfo)featureInfo; List<IAnnotationInfo> annotation = annotatedFI.getAnnotationsOfType( TypeSystem.get( Param.class ) ); for( IAnnotationInfo annotationInfo : annotation ) { Param o = (Param)ReflectUtil.evaluateAnnotation( annotationInfo ); if( o != null && o.getFieldName().equals( parameterData.getName() ) ) { return o.getFieldDescription(); } } return ""; } else { return parameterData.getDescription(); } } private static boolean isGosuFeature( IAnnotatedFeatureInfo featureInfo ) { return featureInfo instanceof IGosuMethodInfo || featureInfo instanceof IGosuPropertyInfo || featureInfo instanceof IGosuConstructorInfo || featureInfo instanceof IGosuClassTypeInfo; } public static class SyntheticExceptionInfo implements IExceptionInfo { private IFeatureInfo _container; private String _exceptionName; private String _exceptionDescription; public SyntheticExceptionInfo( IFeatureInfo container, String exceptionName, String exceptionDescription ) { _container = container; _exceptionName = exceptionName; _exceptionDescription = exceptionDescription; } public IFeatureInfo getContainer() { return _container; } public IType getOwnersType() { return _container.getOwnersType(); } public String getName() { return _exceptionName; } public String getDisplayName() { return _exceptionName; } public String getDescription() { return _exceptionDescription; } public IType getExceptionType() { return TypeSystem.getByFullNameIfValid( getName() ); } } }