1
/*******************************************************************************
2
* Copyright (c) 2011 Contributors.
4
* This program and the accompanying materials are made available
5
* under the terms of the Eclipse Public License v1.0
6
* which accompanies this distribution and is available at
7
* http://eclipse.org/legal/epl-v10.html
10
* Abraham Nevado - Lucierna initial implementation
11
* Just a slight variation of current DocumentParser.java from Alexandre Vasseur.
12
*******************************************************************************/
13
package org.aspectj.weaver.loadtime.definition;
15
import java.io.InputStream;
16
import java.io.InputStreamReader;
18
import java.util.ArrayList;
21
import org.aspectj.util.LangUtil;
24
* This class has been created to avoid deadlocks when instrumenting SAXParser.
25
* So it is used as a wrapper for the ligthweigh XML parser LightXMLParser.
29
public class SimpleAOPParser {
31
private final static String ASPECTJ_ELEMENT = "aspectj";
32
private final static String WEAVER_ELEMENT = "weaver";
33
private final static String DUMP_ELEMENT = "dump";
34
private final static String DUMP_BEFOREANDAFTER_ATTRIBUTE = "beforeandafter";
35
private final static String DUMP_PERCLASSLOADERDIR_ATTRIBUTE = "perclassloaderdumpdir";
36
private final static String INCLUDE_ELEMENT = "include";
37
private final static String EXCLUDE_ELEMENT = "exclude";
38
private final static String OPTIONS_ATTRIBUTE = "options";
39
private final static String ASPECTS_ELEMENT = "aspects";
40
private final static String ASPECT_ELEMENT = "aspect";
41
private final static String CONCRETE_ASPECT_ELEMENT = "concrete-aspect";
42
private final static String NAME_ATTRIBUTE = "name";
43
private final static String SCOPE_ATTRIBUTE = "scope";
44
private final static String REQUIRES_ATTRIBUTE = "requires";
45
private final static String EXTEND_ATTRIBUTE = "extends";
46
private final static String PRECEDENCE_ATTRIBUTE = "precedence";
47
private final static String PERCLAUSE_ATTRIBUTE = "perclause";
48
private final static String POINTCUT_ELEMENT = "pointcut";
49
private final static String WITHIN_ATTRIBUTE = "within";
50
private final static String EXPRESSION_ATTRIBUTE = "expression";
51
private final Definition m_definition;
52
private boolean m_inAspectJ;
53
private boolean m_inWeaver;
54
private boolean m_inAspects;
56
private Definition.ConcreteAspect m_lastConcreteAspect;
58
private SimpleAOPParser() {
59
m_definition = new Definition();
62
public static Definition parse(final URL url) throws Exception {
63
// FileReader freader = new FileReader("/tmp/aop.xml");
64
InputStream in = url.openStream();
65
LightXMLParser xml = new LightXMLParser();
66
xml.parseFromReader(new InputStreamReader(in));
67
SimpleAOPParser sap = new SimpleAOPParser();
69
return sap.m_definition;
72
private void startElement(String qName, Map attrMap) throws Exception {
73
if (ASPECT_ELEMENT.equals(qName)) {
74
String name = (String) attrMap.get(NAME_ATTRIBUTE);
75
String scopePattern = replaceXmlAnd((String) attrMap
76
.get(SCOPE_ATTRIBUTE));
77
String requiredType = (String) attrMap.get(REQUIRES_ATTRIBUTE);
79
m_definition.getAspectClassNames().add(name);
80
if (scopePattern != null) {
81
m_definition.addScopedAspect(name, scopePattern);
83
if (requiredType != null) {
84
m_definition.setAspectRequires(name, requiredType);
87
} else if (WEAVER_ELEMENT.equals(qName)) {
88
String options = (String) attrMap.get(OPTIONS_ATTRIBUTE);
89
if (!isNull(options)) {
90
m_definition.appendWeaverOptions(options);
93
} else if (CONCRETE_ASPECT_ELEMENT.equals(qName)) {
94
String name = (String) attrMap.get(NAME_ATTRIBUTE);
95
String extend = (String) attrMap.get(EXTEND_ATTRIBUTE);
96
String precedence = (String) attrMap.get(PRECEDENCE_ATTRIBUTE);
97
String perclause = (String) attrMap.get(PERCLAUSE_ATTRIBUTE);
99
m_lastConcreteAspect = new Definition.ConcreteAspect(name,
100
extend, precedence, perclause);
101
m_definition.getConcreteAspects().add(m_lastConcreteAspect);
103
} else if (POINTCUT_ELEMENT.equals(qName)
104
&& m_lastConcreteAspect != null) {
105
String name = (String) attrMap.get(NAME_ATTRIBUTE);
106
String expression = (String) attrMap.get(EXPRESSION_ATTRIBUTE);
107
if (!isNull(name) && !isNull(expression)) {
108
m_lastConcreteAspect.pointcuts.add(new Definition.Pointcut(
109
name, replaceXmlAnd(expression)));
111
} else if (ASPECTJ_ELEMENT.equals(qName)) {
113
throw new Exception("Found nested <aspectj> element");
116
} else if (ASPECTS_ELEMENT.equals(qName)) {
118
} else if (INCLUDE_ELEMENT.equals(qName) && m_inWeaver) {
119
String typePattern = getWithinAttribute(attrMap);
120
if (!isNull(typePattern)) {
121
m_definition.getIncludePatterns().add(typePattern);
123
} else if (EXCLUDE_ELEMENT.equals(qName) && m_inWeaver) {
124
String typePattern = getWithinAttribute(attrMap);
125
if (!isNull(typePattern)) {
126
m_definition.getExcludePatterns().add(typePattern);
128
} else if (DUMP_ELEMENT.equals(qName) && m_inWeaver) {
129
String typePattern = getWithinAttribute(attrMap);
130
if (!isNull(typePattern)) {
131
m_definition.getDumpPatterns().add(typePattern);
133
String beforeAndAfter = (String) attrMap
134
.get(DUMP_BEFOREANDAFTER_ATTRIBUTE);
135
if (isTrue(beforeAndAfter)) {
136
m_definition.setDumpBefore(true);
138
String perWeaverDumpDir = (String) attrMap
139
.get(DUMP_PERCLASSLOADERDIR_ATTRIBUTE);
140
if (isTrue(perWeaverDumpDir)) {
141
m_definition.setCreateDumpDirPerClassloader(true);
143
} else if (EXCLUDE_ELEMENT.equals(qName) && m_inAspects) {
144
String typePattern = getWithinAttribute(attrMap);
145
if (!isNull(typePattern)) {
146
m_definition.getAspectExcludePatterns().add(typePattern);
148
} else if (INCLUDE_ELEMENT.equals(qName) && m_inAspects) {
149
String typePattern = getWithinAttribute(attrMap);
150
if (!isNull(typePattern)) {
151
m_definition.getAspectIncludePatterns().add(typePattern);
155
"Unknown element while parsing <aspectj> element: " + qName);
159
private void endElement(String qName) throws Exception {
160
if (CONCRETE_ASPECT_ELEMENT.equals(qName)) {
161
m_lastConcreteAspect = null;
162
} else if (ASPECTJ_ELEMENT.equals(qName)) {
164
} else if (WEAVER_ELEMENT.equals(qName)) {
166
} else if (ASPECTS_ELEMENT.equals(qName)) {
171
private String getWithinAttribute(Map attributes) {
172
return replaceXmlAnd((String) attributes.get(WITHIN_ATTRIBUTE));
175
private static String replaceXmlAnd(String expression) {
176
// TODO AV do we need to handle "..)AND" or "AND(.." ?
177
return LangUtil.replace(expression, " AND ", " && ");
180
private boolean isNull(String s) {
181
return (s == null || s.length() <= 0);
184
private boolean isTrue(String s) {
185
return (s != null && s.equals("true"));
188
private static void traverse(SimpleAOPParser sap, LightXMLParser xml)
190
sap.startElement(xml.getName(), xml.getAttributes());
191
ArrayList childrens = xml.getChildrens();
192
for (int i = 0; i < childrens.size(); i++) {
193
LightXMLParser child = (LightXMLParser) childrens.get(i);
194
traverse(sap, child);
196
sap.endElement(xml.getName());