/* ******************************************************************* * Copyright (c) 2002 Palo Alto Research Center, Incorporated (PARC). * 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://www.eclipse.org/legal/epl-v10.html * * Contributors: * PARC initial implementation * ******************************************************************/ package org.aspectj.weaver; import java.io.IOException; /** * A privileged access munger is for handling privileged access to a member. It determines the names of the getter/setter that will * be used to access a private field in some type, or the special method that provides access to a private method. * * There are two syntax styles for field access, the older style was in use up to AspectJ 1.6.9 and involves long named getters and * setters which include the requesting aspect and the target type. The short style syntax is use from AspectJ 1.6.9 onwards is * simply 'ajc$get$<fieldname>' and 'ajc$set$<fieldname>' - as the requesting aspect isn't included in the name they can be shared * across aspects. */ public class PrivilegedAccessMunger extends ResolvedTypeMunger { public boolean shortSyntax = false; public PrivilegedAccessMunger(ResolvedMember member, boolean shortSyntax) { super(PrivilegedAccess, member); this.shortSyntax = shortSyntax; } @Override public void write(CompressingDataOutputStream s) throws IOException { throw new RuntimeException("should not be serialized"); } public ResolvedMember getMember() { return getSignature(); } @Override public ResolvedMember getMatchingSyntheticMember(Member member, ResolvedType aspectType) { ResolvedMember ret; // assert if shortSyntax then aspectType.getCompilerVersion()>=169 if (getSignature().getKind() == Member.FIELD) { ret = AjcMemberMaker.privilegedAccessMethodForFieldGet(aspectType, getSignature(), shortSyntax); if (ResolvedType.matches(ret, member)) { return getSignature(); } ret = AjcMemberMaker.privilegedAccessMethodForFieldSet(aspectType, getSignature(), shortSyntax); if (ResolvedType.matches(ret, member)) { return getSignature(); } } else { // System.err.println("sig: " + getSignature()); ret = AjcMemberMaker.privilegedAccessMethodForMethod(aspectType, getSignature()); if (ResolvedType.matches(ret, member)) { return getSignature(); } } return null; } @Override public boolean equals(Object other) { if (!(other instanceof PrivilegedAccessMunger)) { return false; } PrivilegedAccessMunger o = (PrivilegedAccessMunger) other; return kind.equals(o.kind) && ((o.signature == null) ? (signature == null) : signature.equals(o.signature)) && ((o.declaredSignature == null) ? (declaredSignature == null) : declaredSignature.equals(o.declaredSignature)) && ((o.typeVariableAliases == null) ? (typeVariableAliases == null) : typeVariableAliases .equals(o.typeVariableAliases)); } @Override public int hashCode() { int result = 17; result = 37 * result + kind.hashCode(); result = 37 * result + ((signature == null) ? 0 : signature.hashCode()); result = 37 * result + ((declaredSignature == null) ? 0 : declaredSignature.hashCode()); result = 37 * result + ((typeVariableAliases == null) ? 0 : typeVariableAliases.hashCode()); return result; } @Override public boolean existsToSupportShadowMunging() { return true; } }