Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * Copyright 2014-2015 the original author or authors.
   *
   * 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.
  */
 package org.lastaflute.di.core.factory.defbuilder.impl;
 
 import java.util.Map;
 

Author(s):
modified by jflute (originated in Seasar)
 
 public class MetaAnnotationAspectDefBuilder extends AbstractAspectDefBuilder {

    
メタアノテーションの型
 
     protected Class<? extends AnnotationmetaAnnotationType;

    
インターセプタの名前空間
 
     protected String interceptorNamespace;

    
インターセプタの接尾辞
 
     protected String interceptorSuffix;

    
インスタンスを構築します。
 
     public MetaAnnotationAspectDefBuilder() {
     }

    
インスタンスを構築します。

Parameters:
metaAnnotationType メタアノテーションの型
interceptorSuffix インターセプタの接尾辞
 
     public MetaAnnotationAspectDefBuilder(final Class<? extends AnnotationmetaAnnotationTypefinal String interceptorSuffix) {
         this. = metaAnnotationType;
         this. = null;
         this. = interceptorSuffix;
     }

    
インスタンスを構築します。

Parameters:
metaAnnotationType メタアノテーションの型
interceptorNamespace インターセプタの名前空間
interceptorSuffix インターセプタの接尾辞
 
     public MetaAnnotationAspectDefBuilder(final Class<? extends AnnotationmetaAnnotationTypefinal String interceptorNamespace,
             final String interceptorSuffix) {
         this. = metaAnnotationType;
         this. = interceptorNamespace;
         this. = interceptorSuffix;
     }

    
メタアノテーションの型を返します。

Returns:
メタアノテーションの型
 
     public Class<? extends AnnotationgetMetaAnnotationType() {
         return ;
     }

    
メタアノテーションの型を設定します。

Parameters:
metaAnnotationType メタアノテーションの型
    public void setMetaAnnotationType(final Class<? extends AnnotationmetaAnnotationType) {
        this. = metaAnnotationType;
    }

    
インターセプタの名前空間を返します。

Returns:
インターセプタの名前空間
    public String getInterceptorNamespace() {
        return ;
    }

    
インターセプタの名前空間を設定します。

Parameters:
interceptorNamespace インターセプタの名前空間
    public void setInterceptorNamespace(final String interceptorNamespace) {
        this. = interceptorNamespace;
    }

    
インターセプタの接尾辞を返します。

Returns:
インターセプタの接尾辞
    public String getInterceptorSuffix() {
        return ;
    }

    
インターセプタの接尾辞を設定します。

Parameters:
interceptorSuffix インターセプタの接尾辞
    public void setInterceptorSuffix(final String interceptorSuffix) {
        this. = interceptorSuffix;
    }
    public void appendAspectDef(final AnnotationHandler annotationHandlerfinal ComponentDef componentDef) {
        final Class<?> componentClass = componentDef.getComponentClass();
        if (componentClass == null) {
            return;
        }
        processClass(componentDefcomponentClass);
        processMethod(componentDefcomponentClass);
    }

    
クラスに付けられたメタアノテーションで注釈されたアノテーションを読み取りアスペクト定義を作成してコンポーネント定義に追加します。

Parameters:
componentDef コンポーネント定義
componentClass コンポーネントの型
    protected void processClass(final ComponentDef componentDeffinal Class<?> componentClass) {
        for (final Annotation annotation : componentClass.getAnnotations()) {
            final Class<? extends AnnotationannotationType = annotation.annotationType();
            final Annotation metaAnnotation = annotationType.getAnnotation(getMetaAnnotationType());
            if (metaAnnotation == null) {
                continue;
            }
            final String pointcut = getPointcut(annotation);
            final AspectDef aspectDef = new AspectDefImpl();
            if (!LdiStringUtil.isEmpty(pointcut)) {
                aspectDef.setPointcut(AspectDefFactory.createPointcut(pointcut));
            }
            aspectDef.setExpression(new MetaAnnotationExpression(annotation));
            componentDef.addAspectDef(aspectDef);
        }
    }

    
メソッドに付けられたメタアノテーションで注釈されたアノテーションを読み取りアスペクト定義を作成してコンポーネント定義に追加します。

Parameters:
componentDef コンポーネント定義
componentClass コンポーネントの型
    protected void processMethod(final ComponentDef componentDeffinal Class<?> componentClass) {
        for (final Method method : componentClass.getMethods()) {
            if (method.isBridge() || method.isSynthetic()) {
                continue;
            }
            final int modifiers = method.getModifiers();
            if (!Modifier.isPublic(modifiers) || Modifier.isStatic(modifiers) || Modifier.isFinal(modifiers)) {
                continue;
            }
            for (final Annotation annotation : method.getAnnotations()) {
                final Class<? extends AnnotationannotationType = annotation.annotationType();
                final Annotation metaAnnotation = annotationType.getAnnotation(getMetaAnnotationType());
                if (metaAnnotation == null) {
                    continue;
                }
                final AspectDef aspectDef = new AspectDefImpl(new PointcutImpl(method));
                aspectDef.setExpression(new MetaAnnotationExpression(annotation));
                componentDef.addAspectDef(aspectDef);
            }
        }
    }

    
アノテーションに指定されているポイントカットを返します。

Parameters:
annotation アノテーション
Returns:
アノテーションに指定されているポイントカット
    protected String getPointcut(final Annotation annotation) {
        for (final Method method : annotation.getClass().getMethods()) {
            if (method.isBridge() || method.isSynthetic()) {
                continue;
            }
            if ("pointcut".equals(method.getName()) && method.getReturnType() == String.class) {
                return String.class.cast(LdiMethodUtil.invoke(methodannotationnull));
            }
        }
        return null;
    }

    
アノテーションに指定されているインターセプタのコンポーネント名を返します。

Parameters:
annotation アノテーション
Returns:
インターセプタのコンポーネント名
    protected String getInterceptorName(final Annotation annotation) {
        final Class<? extends AnnotationannotationType = annotation.annotationType();
        final Interceptor interceptor = annotationType.getAnnotation(Interceptor.class);
        final String value = interceptor.value();
        if (!LdiStringUtil.isEmpty(value)) {
            return value;
        }
        final String namespace = getInterceptorNamespace();
        final String interceptorName = LdiStringUtil.decapitalize(annotationType.getSimpleName());
        final String suffix = getInterceptorSuffix();
        if (namespace != null) {
            return namespace + "." + interceptorName + suffix;
        }
        return interceptorName + suffix;
    }

    

Author(s):
modified by jflute (originated in Seasar)
    public class MetaAnnotationExpression implements Expression {
        protected final Annotation annotation;
        public MetaAnnotationExpression(Annotation annotation) {
            this. = annotation;
        }
        @Override
        public Object evaluate(Map<String, ? extends ObjectcontextLaContainer containerClass<?> conversionType) {
            final MethodInterceptor interceptor = MethodInterceptor.class.cast(container.getComponent(getInterceptorName()));
            final BeanDesc beanDesc = BeanDescFactory.getBeanDesc(interceptor.getClass());
            for (final Method method : .annotationType().getMethods()) {
                if (method.isBridge() || method.isSynthetic()) {
                    continue;
                }
                final String propertyName = method.getName();
                if ("pointcut".equals(propertyName) || !beanDesc.hasPropertyDesc(propertyName)) {
                    continue;
                }
                final PropertyDesc propertyDesc = beanDesc.getPropertyDesc(propertyName);
                if (!propertyDesc.isWritable()) {
                    continue;
                }
                propertyDesc.setValue(interceptor, LdiMethodUtil.invoke(methodnull));
            }
            return interceptor;
        }
    }
New to GrepCode? Check out our FAQ X