You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

PrivilegedHandler.java 5.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. /* *******************************************************************
  2. * Copyright (c) 2002 Palo Alto Research Center, Incorporated (PARC).
  3. * All rights reserved.
  4. * This program and the accompanying materials are made available
  5. * under the terms of the Eclipse Public License v 2.0
  6. * which accompanies this distribution and is available at
  7. * https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.txt
  8. *
  9. * Contributors:
  10. * PARC initial implementation
  11. * ******************************************************************/
  12. package org.aspectj.ajdt.internal.compiler.lookup;
  13. import java.util.Collection;
  14. import java.util.HashMap;
  15. import java.util.Map;
  16. import org.aspectj.ajdt.internal.compiler.ast.AspectDeclaration;
  17. import org.aspectj.ajdt.internal.compiler.ast.AstUtil;
  18. import org.aspectj.bridge.ISourceLocation;
  19. import org.aspectj.org.eclipse.jdt.internal.compiler.ast.ASTNode;
  20. import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.FieldBinding;
  21. import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.IPrivilegedHandler;
  22. import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.MethodBinding;
  23. import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ParameterizedFieldBinding;
  24. import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ParameterizedMethodBinding;
  25. import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding;
  26. import org.aspectj.weaver.AjcMemberMaker;
  27. import org.aspectj.weaver.Lint;
  28. import org.aspectj.weaver.Member;
  29. import org.aspectj.weaver.PrivilegedAccessMunger;
  30. import org.aspectj.weaver.ResolvedMember;
  31. import org.aspectj.weaver.ResolvedMemberImpl;
  32. import org.aspectj.weaver.ResolvedType;
  33. import org.aspectj.weaver.UnresolvedType;
  34. import org.aspectj.weaver.World;
  35. public class PrivilegedHandler implements IPrivilegedHandler {
  36. private AspectDeclaration inAspect;
  37. private Map<ResolvedMember, Object> accessors = new HashMap<>();
  38. public PrivilegedHandler(AspectDeclaration inAspect) {
  39. this.inAspect = inAspect;
  40. }
  41. @Override
  42. public boolean definesPrivilegedAccessToField(FieldBinding field) {
  43. if (field instanceof ParameterizedFieldBinding) {
  44. field = ((ParameterizedFieldBinding) field).originalField;
  45. }
  46. ResolvedMember key = inAspect.factory.makeResolvedMember(field);
  47. return (accessors.containsKey(key));
  48. }
  49. @Override
  50. public FieldBinding getPrivilegedAccessField(FieldBinding baseField, ASTNode location) {
  51. if (baseField instanceof ParameterizedFieldBinding) {
  52. baseField = ((ParameterizedFieldBinding) baseField).originalField;
  53. }
  54. ResolvedMember key = inAspect.factory.makeResolvedMember(baseField);
  55. if (accessors.containsKey(key))
  56. return (FieldBinding) accessors.get(key);
  57. FieldBinding ret = new PrivilegedFieldBinding(inAspect, baseField);
  58. checkWeaveAccess(key.getDeclaringType(), location);
  59. if (!baseField.alwaysNeedsAccessMethod(true))
  60. accessors.put(key, ret);
  61. // 307120
  62. ResolvedType rt = inAspect.factory.fromEclipse(baseField.declaringClass);
  63. if (rt != null) {
  64. // ReferenceTypeDelegate rtd = ((ReferenceType) rt).getDelegate();
  65. // if (rtd instanceof EclipseSourceType) {
  66. rt.addInterTypeMunger(new EclipseTypeMunger(inAspect.factory, new PrivilegedAccessMunger(key, true), inAspect.typeX,
  67. null), true);
  68. // }
  69. }
  70. return ret;
  71. }
  72. @Override
  73. public MethodBinding getPrivilegedAccessMethod(MethodBinding baseMethod, ASTNode location) {
  74. if (baseMethod.alwaysNeedsAccessMethod())
  75. return baseMethod;
  76. ResolvedMember key = null;
  77. if (baseMethod instanceof ParameterizedMethodBinding) {
  78. key = inAspect.factory.makeResolvedMember(((ParameterizedMethodBinding) baseMethod).original());
  79. } else {
  80. key = inAspect.factory.makeResolvedMember(baseMethod);
  81. }
  82. if (accessors.containsKey(key))
  83. return (MethodBinding) accessors.get(key);
  84. MethodBinding ret;
  85. if (baseMethod.isConstructor()) {
  86. ret = new MethodBinding(baseMethod, baseMethod.declaringClass);
  87. ret.modifiers = AstUtil.makePublic(ret.modifiers);
  88. baseMethod.modifiers = ret.modifiers;
  89. } else {
  90. ret = inAspect.factory.makeMethodBinding(AjcMemberMaker.privilegedAccessMethodForMethod(inAspect.typeX, key));
  91. }
  92. checkWeaveAccess(key.getDeclaringType(), location);
  93. accessors.put(key, ret);
  94. // if (!baseMethod.isConstructor()) {
  95. // ResolvedType rt = inAspect.factory.fromEclipse(baseMethod.declaringClass);
  96. // if (rt!=null) {
  97. // ReferenceTypeDelegate rtd = ((ReferenceType)rt).getDelegate();
  98. // if (rtd instanceof EclipseSourceType) {
  99. // rt.addInterTypeMunger(new EclipseTypeMunger(inAspect.factory,new PrivilegedAccessMunger(key, true),inAspect.typeX,null),
  100. // true);
  101. // }
  102. // }
  103. // }
  104. return ret;
  105. }
  106. @Override
  107. public void notePrivilegedTypeAccess(ReferenceBinding type, ASTNode location) {
  108. ResolvedMember key = new ResolvedMemberImpl(Member.STATIC_INITIALIZATION, inAspect.factory.fromEclipse(type), 0,
  109. UnresolvedType.VOID, "", UnresolvedType.NONE);
  110. checkWeaveAccess(key.getDeclaringType(), location);
  111. accessors.put(key, key);
  112. }
  113. private void checkWeaveAccess(UnresolvedType typeX, ASTNode location) {
  114. World world = inAspect.factory.getWorld();
  115. Lint.Kind check = world.getLint().typeNotExposedToWeaver;
  116. if (check.isEnabled()) {
  117. if (!world.resolve(typeX).isExposedToWeaver()) {
  118. ISourceLocation loc = null;
  119. if (location != null) {
  120. loc = new EclipseSourceLocation(inAspect.compilationResult, location.sourceStart, location.sourceEnd);
  121. }
  122. check.signal(typeX.getName() + " (needed for privileged access)", loc);
  123. }
  124. }
  125. }
  126. public ResolvedMember[] getMembers() {
  127. Collection<ResolvedMember> m = accessors.keySet();
  128. int len = m.size();
  129. ResolvedMember[] ret = new ResolvedMember[len];
  130. int index = 0;
  131. for (ResolvedMember o : m) {
  132. ret[index++] = o;
  133. }
  134. return ret;
  135. }
  136. }