/******************************************************************************* * Copyright (c) 2005 Contributors. * All rights reserved. * This program and the accompanying materials are made available * under the terms of the Eclipse Public License v1.0 * which accompanies this distribution and is available at * http://eclipse.org/legal/epl-v10.html * * Contributors: * Alexandre Vasseur initial implementation *******************************************************************************/ package org.aspectj.weaver.loadtime.definition; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * A POJO that contains raw strings from the XML (sort of XMLBean for our simple LTW DTD) * * @author Alexandre Vasseur (alex AT gnilux DOT com) */ public class Definition { private final StringBuffer weaverOptions; private final List dumpPatterns; private boolean dumpBefore; private boolean perClassloaderDumpDir; private final List includePatterns; private final List excludePatterns; private final List aspectClassNames; private final List aspectExcludePatterns; private final List aspectIncludePatterns; private final List concreteAspects; /** * When aspects are defined, they can specify a scope type pattern and then will only apply to types matching that pattern. */ private final Map scopedAspects; /** * Some aspects (from aspect libraries) will describe a type that must be around for them to function properly */ private final Map requiredTypesForAspects; public Definition() { weaverOptions = new StringBuffer(); dumpBefore = false; perClassloaderDumpDir = false; dumpPatterns = new ArrayList<>(); includePatterns = new ArrayList<>(); excludePatterns = new ArrayList<>(); aspectClassNames = new ArrayList<>(); aspectExcludePatterns = new ArrayList<>(); aspectIncludePatterns = new ArrayList<>(); concreteAspects = new ArrayList<>(); scopedAspects = new HashMap<>(); requiredTypesForAspects = new HashMap<>(); } public String getWeaverOptions() { return weaverOptions.toString(); } public List getDumpPatterns() { return dumpPatterns; } public void setDumpBefore(boolean b) { dumpBefore = b; } public boolean shouldDumpBefore() { return dumpBefore; } public void setCreateDumpDirPerClassloader(boolean b) { perClassloaderDumpDir = b; } public boolean createDumpDirPerClassloader() { return perClassloaderDumpDir; } public List getIncludePatterns() { return includePatterns; } public List getExcludePatterns() { return excludePatterns; } public List getAspectClassNames() { return aspectClassNames; } public List getAspectExcludePatterns() { return aspectExcludePatterns; } public List getAspectIncludePatterns() { return aspectIncludePatterns; } public List getConcreteAspects() { return concreteAspects; } public static class ConcreteAspect { public final String name; public final String extend; public final String precedence; public final List pointcuts; public final List declareAnnotations; public final List pointcutsAndAdvice; public final String perclause; public List deows; public ConcreteAspect(String name, String extend) { this(name, extend, null, null); } public ConcreteAspect(String name, String extend, String precedence, String perclause) { this.name = name; // make sure extend set to null if "" if (extend == null || extend.length() == 0) { this.extend = null; if (precedence == null || precedence.length() == 0) { // if (pointcutsAndAdvice.size() == 0) { // throw new RuntimeException("Not allowed"); // } } } else { this.extend = extend; } this.precedence = precedence; this.pointcuts = new ArrayList<>(); this.declareAnnotations = new ArrayList<>(); this.pointcutsAndAdvice = new ArrayList<>(); this.deows = new ArrayList<>(); this.perclause = perclause; } } public static class Pointcut { public final String name; public final String expression; public Pointcut(String name, String expression) { this.name = name; this.expression = expression; } } public enum AdviceKind { Before, After, AfterReturning, AfterThrowing, Around; } public enum DeclareAnnotationKind { Method, Field, Type; } public static class DeclareAnnotation { public final DeclareAnnotationKind declareAnnotationKind; public final String pattern; public final String annotation; public DeclareAnnotation(DeclareAnnotationKind kind, String pattern, String annotation) { this.declareAnnotationKind = kind; this.pattern = pattern; this.annotation = annotation; } } public static class PointcutAndAdvice { public final AdviceKind adviceKind; public final String pointcut; public final String adviceClass; // com.foo.Bar public final String adviceMethod; // foo(java.lang.String,org.aspectj.lang.JoinPoint) public PointcutAndAdvice(AdviceKind adviceKind, String pointcut, String adviceClass, String adviceMethod) { this.adviceKind = adviceKind; this.pointcut = pointcut; this.adviceClass = adviceClass; this.adviceMethod = adviceMethod; } } public static class DeclareErrorOrWarning { public final boolean isError; public final String pointcut; public final String message; public DeclareErrorOrWarning(boolean isError, String pointcut, String message) { this.isError = isError; this.pointcut = pointcut; this.message = message; } } public void appendWeaverOptions(String option) { weaverOptions.append(option.trim()).append(' '); } public void addScopedAspect(String name, String scopePattern) { scopedAspects.put(name, scopePattern); } public String getScopeForAspect(String name) { return scopedAspects.get(name); } public void setAspectRequires(String name, String requiredType) { requiredTypesForAspects.put(name, requiredType); } public String getAspectRequires(String name) { return requiredTypesForAspects.get(name); } }