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.

AbstractTrace.java 5.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. /*******************************************************************************
  2. * Copyright (c) 2006 IBM Corporation and others.
  3. * All rights reserved. This program and the accompanying materials
  4. * are made available under the terms of the Eclipse Public License v 2.0
  5. * which accompanies this distribution, and is available at
  6. * https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.txt
  7. *
  8. * Contributors:
  9. * Matthew Webster - initial implementation
  10. *******************************************************************************/
  11. package org.aspectj.weaver.tools;
  12. import java.io.File;
  13. import java.lang.reflect.Array;
  14. import java.net.URL;
  15. import java.text.SimpleDateFormat;
  16. import java.util.Collection;
  17. import java.util.Date;
  18. import java.util.regex.Pattern;
  19. import org.aspectj.bridge.IMessage.Kind;
  20. public abstract class AbstractTrace implements Trace {
  21. private static final Pattern packagePrefixPattern = Pattern.compile("([^.])[^.]*(\\.)");
  22. protected Class<?> tracedClass;
  23. private static SimpleDateFormat timeFormat;
  24. protected AbstractTrace (Class clazz) {
  25. this.tracedClass = clazz;
  26. }
  27. @Override
  28. public abstract void enter (String methodName, Object thiz, Object[] args);
  29. @Override
  30. public abstract void enter(String methodName, Object thiz);
  31. @Override
  32. public abstract void exit(String methodName, Object ret);
  33. @Override
  34. public abstract void exit(String methodName, Throwable th);
  35. /*
  36. * Convenience methods
  37. */
  38. public void enter (String methodName) {
  39. enter(methodName,null,null);
  40. }
  41. @Override
  42. public void enter (String methodName, Object thiz, Object arg) {
  43. enter(methodName,thiz,new Object[] { arg });
  44. }
  45. @Override
  46. public void enter (String methodName, Object thiz, boolean z) {
  47. enter(methodName,thiz,Boolean.valueOf(z));
  48. }
  49. @Override
  50. public void exit (String methodName, boolean b) {
  51. exit(methodName,Boolean.valueOf(b));
  52. }
  53. @Override
  54. public void exit (String methodName, int i) {
  55. exit(methodName, Integer.valueOf(i));
  56. }
  57. @Override
  58. public void event (String methodName, Object thiz, Object arg) {
  59. event(methodName,thiz,new Object[] { arg });
  60. }
  61. @Override
  62. public void warn(String message) {
  63. warn(message,null);
  64. }
  65. @Override
  66. public void error(String message) {
  67. error(message,null);
  68. }
  69. @Override
  70. public void fatal (String message) {
  71. fatal(message,null);
  72. }
  73. /*
  74. * Formatting
  75. */
  76. protected String formatMessage(String kind, String className, String methodName, Object thiz, Object[] args) {
  77. StringBuilder message = new StringBuilder();
  78. Date now = new Date();
  79. message.append(formatDate(now)).append(" ");
  80. message.append(Thread.currentThread().getName()).append(" ");
  81. message.append(kind).append(" ");
  82. message.append(formatClassName(className));
  83. message.append(".").append(methodName);
  84. if (thiz != null) message.append(" ").append(formatObj(thiz));
  85. if (args != null) message.append(" ").append(formatArgs(args));
  86. return message.toString();
  87. }
  88. /**
  89. * @param className full dotted class name
  90. * @return short version of class name with package collapse to initials
  91. */
  92. private String formatClassName(String className) {
  93. return packagePrefixPattern.matcher(className).replaceAll("$1.");
  94. }
  95. protected String formatMessage(String kind, String text, Throwable th) {
  96. StringBuilder message = new StringBuilder();
  97. Date now = new Date();
  98. message.append(formatDate(now)).append(" ");
  99. message.append(Thread.currentThread().getName()).append(" ");
  100. message.append(kind).append(" ");
  101. message.append(text);
  102. if (th != null) message.append(" ").append(formatObj(th));
  103. return message.toString();
  104. }
  105. private static String formatDate (Date date) {
  106. if (timeFormat == null) {
  107. timeFormat = new SimpleDateFormat("HH:mm:ss.SSS");
  108. }
  109. return timeFormat.format(date);
  110. }
  111. /**
  112. * Format objects safely avoiding toString which can cause recursion,
  113. * NullPointerExceptions or highly verbose results.
  114. *
  115. * @param obj parameter to be formatted
  116. * @return the formatted parameter
  117. */
  118. protected Object formatObj(Object obj) {
  119. /* These classes have a safe implementation of toString() */
  120. if (obj == null
  121. || obj instanceof String
  122. || obj instanceof Number
  123. || obj instanceof Boolean
  124. || obj instanceof Exception
  125. || obj instanceof Character
  126. || obj instanceof Class
  127. || obj instanceof File
  128. || obj instanceof StringBuffer
  129. || obj instanceof URL
  130. || obj instanceof Kind
  131. ) return obj;
  132. else if (obj.getClass().isArray()) {
  133. return formatArray(obj);
  134. }
  135. else if (obj instanceof Collection) {
  136. return formatCollection((Collection)obj);
  137. }
  138. else try {
  139. // Classes can provide an alternative implementation of toString()
  140. if (obj instanceof Traceable) {
  141. return ((Traceable)obj).toTraceString();
  142. }
  143. // classname@hashcode
  144. else return formatClassName(obj.getClass().getName()) + "@" + Integer.toHexString(System.identityHashCode(obj));
  145. /* Object.hashCode() can be override and may thow an exception */
  146. } catch (Exception ex) {
  147. return obj.getClass().getName() + "@FFFFFFFF";
  148. }
  149. }
  150. protected String formatArray(Object obj) {
  151. return obj.getClass().getComponentType().getName() + "[" + Array.getLength(obj) + "]";
  152. }
  153. protected String formatCollection(Collection<?> c) {
  154. return c.getClass().getName() + "(" + c.size() + ")";
  155. }
  156. /**
  157. * Format arguments into a comma separated list
  158. *
  159. * @param args array of arguments
  160. * @return the formated list
  161. */
  162. protected String formatArgs(Object[] args) {
  163. StringBuilder sb = new StringBuilder();
  164. for (int i = 0; i < args.length; i++) {
  165. sb.append(formatObj(args[i]));
  166. if (i < args.length-1) sb.append(", ");
  167. }
  168. return sb.toString();
  169. }
  170. protected Object[] formatObjects(Object[] args) {
  171. for (int i = 0; i < args.length; i++) {
  172. args[i] = formatObj(args[i]);
  173. }
  174. return args;
  175. }
  176. }