1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- /* *******************************************************************
- * Copyright (c) 2005 IBM, Contributors.
- * All rights reserved.
- * This program and the accompanying materials are made available
- * under the terms of the Eclipse Public License v 2.0
- * which accompanies this distribution and is available at
- * https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.txt
- *
- * Contributors:
- * Andy Clement initial implementation
- * ******************************************************************/
-
- package org.aspectj.weaver;
-
- import java.io.IOException;
-
- import org.aspectj.util.FuzzyBoolean;
- import org.aspectj.weaver.patterns.PerTypeWithin;
- import org.aspectj.weaver.patterns.Pointcut;
-
- // PTWIMPL Target type munger adds the localAspectOf() method
- public class PerTypeWithinTargetTypeMunger extends ResolvedTypeMunger {
- private UnresolvedType aspectType;
- private PerTypeWithin testPointcut;
-
- public PerTypeWithinTargetTypeMunger(UnresolvedType aspectType, PerTypeWithin testPointcut) {
- super(PerTypeWithinInterface, null);
- this.aspectType = aspectType;
- this.testPointcut = testPointcut;
- }
-
- @Override
- public boolean equals(Object other) {
- if (!(other instanceof PerTypeWithinTargetTypeMunger)) {
- return false;
- }
- PerTypeWithinTargetTypeMunger o = (PerTypeWithinTargetTypeMunger) other;
- return ((o.testPointcut == null) ? (testPointcut == null) : testPointcut.equals(o.testPointcut))
- && ((o.aspectType == null) ? (aspectType == null) : aspectType.equals(o.aspectType));
- }
-
- private volatile int hashCode = 0;
-
- @Override
- public int hashCode() {
- if (hashCode == 0) {
- int result = 17;
- result = 37 * result + ((testPointcut == null) ? 0 : testPointcut.hashCode());
- result = 37 * result + ((aspectType == null) ? 0 : aspectType.hashCode());
- hashCode = result;
- }
- return hashCode;
- }
-
- @Override
- public void write(CompressingDataOutputStream s) throws IOException {
- throw new RuntimeException("shouldn't be serialized");
- }
-
- public UnresolvedType getAspectType() {
- return aspectType;
- }
-
- public Pointcut getTestPointcut() {
- return testPointcut;
- }
-
- // This is a lexical within() so if you say PerTypeWithin(Test) and matchType is an
- // inner type (e.g. Test$NestedType) then it should match successfully
- // Does not match if the target is an interface
- @Override
- public boolean matches(ResolvedType matchType, ResolvedType aspectType) {
- return isWithinType(matchType).alwaysTrue() && !matchType.isInterface() && (matchType.canBeSeenBy(aspectType) || aspectType.isPrivilegedAspect());
- }
-
- private FuzzyBoolean isWithinType(ResolvedType type) {
- while (type != null) {
- if (testPointcut.getTypePattern().matchesStatically(type)) {
- return FuzzyBoolean.YES;
- }
- type = type.getDeclaringType();
- }
- return FuzzyBoolean.NO;
- }
-
- }
|