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.

Options.java 6.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. /**************************************************************************************
  2. * Copyright (c) Jonas Bonér, Alexandre Vasseur. All rights reserved. *
  3. * http://aspectwerkz.codehaus.org *
  4. * ---------------------------------------------------------------------------------- *
  5. * The software in this package is published under the terms of the LGPL license *
  6. * a copy of which has been included with this distribution in the license.txt file. *
  7. **************************************************************************************/
  8. package org.aspectj.weaver.loadtime;
  9. import org.aspectj.bridge.AbortException;
  10. import org.aspectj.bridge.IMessage;
  11. import org.aspectj.bridge.IMessageHandler;
  12. import org.aspectj.bridge.Message;
  13. import org.aspectj.util.LangUtil;
  14. import java.util.Collections;
  15. import java.util.Iterator;
  16. import java.util.List;
  17. /**
  18. * A class that hanldes LTW options.
  19. * Note: AV - I choosed to not reuse AjCompilerOptions and alike since those implies too many dependancies on
  20. * jdt and ajdt modules.
  21. *
  22. * @author <a href="mailto:alex AT gnilux DOT com">Alexandre Vasseur</a>
  23. */
  24. public class Options {
  25. private static class DefaultMessageHandler implements IMessageHandler {
  26. boolean isVerbose = false;
  27. boolean showWeaveInfo = false;
  28. boolean showWarn = true;
  29. public boolean handleMessage(IMessage message) throws AbortException {
  30. return SYSTEM_OUT.handleMessage(message);
  31. }
  32. public boolean isIgnoring(IMessage.Kind kind) {
  33. if (kind.equals(IMessage.WEAVEINFO)) {
  34. return !showWeaveInfo;
  35. }
  36. if (kind.isSameOrLessThan(IMessage.INFO)) {
  37. return !isVerbose;
  38. }
  39. return !showWarn;
  40. }
  41. public void dontIgnore(IMessage.Kind kind) {
  42. if (kind.equals(IMessage.WEAVEINFO)) {
  43. showWeaveInfo = true;
  44. } else if (kind.equals(IMessage.DEBUG)) {
  45. isVerbose = true;
  46. } else if (kind.equals(IMessage.WARNING)) {
  47. showWarn = false;
  48. }
  49. }
  50. }
  51. private final static String OPTION_15 = "-1.5";
  52. private final static String OPTION_lazyTjp = "-XlazyTjp";
  53. private final static String OPTION_noWarn = "-nowarn";
  54. private final static String OPTION_noWarnNone = "-warn:none";
  55. private final static String OPTION_proceedOnError = "-proceedOnError";
  56. private final static String OPTION_verbose = "-verbose";
  57. private final static String OPTION_reweavable = "-Xreweavable";
  58. private final static String OPTION_noinline = "-Xnoinline";
  59. private final static String OPTION_showWeaveInfo = "-showWeaveInfo";
  60. private final static String OPTIONVALUED_messageHolder = "-XmessageHolderClass:";//TODO rename to Handler
  61. //FIXME dump option - dump what - dump before/after ?
  62. public static WeaverOption parse(String options, ClassLoader laoder) {
  63. // the first option wins
  64. List flags = LangUtil.anySplit(options, " ");
  65. Collections.reverse(flags);
  66. WeaverOption weaverOption = new WeaverOption();
  67. weaverOption.messageHandler = new DefaultMessageHandler();//default
  68. // do a first round on the message handler since it will report the options themselves
  69. for (Iterator iterator = flags.iterator(); iterator.hasNext();) {
  70. String arg = (String) iterator.next();
  71. if (arg.startsWith(OPTIONVALUED_messageHolder)) {
  72. if (arg.length() > OPTIONVALUED_messageHolder.length()) {
  73. String handlerClass = arg.substring(OPTIONVALUED_messageHolder.length()).trim();
  74. try {
  75. Class handler = Class.forName(handlerClass, false, laoder);
  76. weaverOption.messageHandler = ((IMessageHandler) handler.newInstance());
  77. } catch (Throwable t) {
  78. weaverOption.messageHandler.handleMessage(
  79. new Message(
  80. "Cannot instantiate message handler " + handlerClass,
  81. IMessage.ERROR,
  82. t,
  83. null
  84. )
  85. );
  86. }
  87. }
  88. }
  89. }
  90. // configure the other options
  91. for (Iterator iterator = flags.iterator(); iterator.hasNext();) {
  92. String arg = (String) iterator.next();
  93. if (arg.equals(OPTION_15)) {
  94. weaverOption.java5 = true;
  95. } else if (arg.equalsIgnoreCase(OPTION_lazyTjp)) {
  96. weaverOption.lazyTjp = true;
  97. } else if (arg.equalsIgnoreCase(OPTION_noinline)) {
  98. weaverOption.noInline = true;
  99. } else if (arg.equalsIgnoreCase(OPTION_noWarn) || arg.equalsIgnoreCase(OPTION_noWarnNone)) {
  100. weaverOption.noWarn = true;
  101. } else if (arg.equalsIgnoreCase(OPTION_proceedOnError)) {
  102. weaverOption.proceedOnError = true;
  103. } else if (arg.equalsIgnoreCase(OPTION_reweavable)) {
  104. weaverOption.reWeavable = true;
  105. } else if (arg.equalsIgnoreCase(OPTION_showWeaveInfo)) {
  106. weaverOption.showWeaveInfo = true;
  107. } else if (arg.equalsIgnoreCase(OPTION_verbose)) {
  108. weaverOption.verbose = true;
  109. } else {
  110. weaverOption.messageHandler.handleMessage(
  111. new Message(
  112. "Cannot configure weaver with option " + arg + ": unknown option",
  113. IMessage.WARNING,
  114. null,
  115. null
  116. )
  117. );
  118. }
  119. }
  120. // refine message handler configuration
  121. if (weaverOption.noWarn) {
  122. weaverOption.messageHandler.dontIgnore(IMessage.WARNING);
  123. }
  124. if (weaverOption.verbose) {
  125. weaverOption.messageHandler.dontIgnore(IMessage.DEBUG);
  126. }
  127. if (weaverOption.showWeaveInfo) {
  128. weaverOption.messageHandler.dontIgnore(IMessage.WEAVEINFO);
  129. }
  130. return weaverOption;
  131. }
  132. public static class WeaverOption {
  133. boolean java5;
  134. boolean lazyTjp;
  135. boolean noWarn;
  136. boolean proceedOnError;
  137. boolean verbose;
  138. boolean reWeavable;
  139. boolean noInline;
  140. boolean showWeaveInfo;
  141. IMessageHandler messageHandler;
  142. }
  143. }