aboutsummaryrefslogtreecommitdiffstats
path: root/docs/sandbox/inoculated/src/RuntimeWrites.java
diff options
context:
space:
mode:
Diffstat (limited to 'docs/sandbox/inoculated/src/RuntimeWrites.java')
-rw-r--r--docs/sandbox/inoculated/src/RuntimeWrites.java145
1 files changed, 145 insertions, 0 deletions
diff --git a/docs/sandbox/inoculated/src/RuntimeWrites.java b/docs/sandbox/inoculated/src/RuntimeWrites.java
new file mode 100644
index 000000000..0f49247cb
--- /dev/null
+++ b/docs/sandbox/inoculated/src/RuntimeWrites.java
@@ -0,0 +1,145 @@
+/*
+ * Copyright (c) 1998-2002 PARC Inc. All rights reserved.
+ *
+ * Use and copying of this software and preparation of derivative works based
+ * upon this software are permitted. Any distribution of this software or
+ * derivative works must comply with all applicable United States export
+ * control laws.
+ *
+ * This software is made available AS IS, and PARC Inc. makes no
+ * warranty about the software, its performance or its conformity to any
+ * specification.
+ */
+
+import org.aspectj.lang.*;
+
+/** test cases for controlling field writes */
+public class RuntimeWrites {
+
+ public static void main(String[] args) {
+ System.err.println("---- setup: valid write");
+ final SubPrinterStream me = new SubPrinterStream();
+
+ System.err.println("---- setup: invalid write, outside initialization - nonstatic");
+ me.setOne(1);
+
+ System.err.println("---- setup: invalid write, outside initialization - static");
+ me.one = 0;
+
+ System.err.println("---- setup: invalid write, caller is not same as target");
+ PrinterStream other = new PrinterStream(me);
+ }
+}
+
+
+/**
+ * Control field writes.
+ * This implementation restricts writes to the same object during initialization.
+ * This is like having field values be final, except that
+ * they may be set set outside the constructor.
+ * @author Wes Isberg
+ */
+aspect ControlFieldWrites {
+ public static boolean throwError;
+
+ // article page 42 - field writes
+
+ // START-SAMPLE testing-inoculated-permitWritesDuringConstruction Constructor execution
+ /** execution of any constructor for PrinterStream */
+ pointcut init() : execution(PrinterStream+.new(..));
+ // END-SAMPLE testing-inoculated-permitWritesDuringConstruction
+
+ // START-SAMPLE testing-inoculated-prohibitWritesExceptWhenConstructing Prohibit field writes after construction
+ /** any write to a non-static field in PrinterStream itself */
+ pointcut fieldWrites() : set(!static * PrinterStream.*);
+
+
+ /**
+ * Handle any situation where fields are written
+ * outside of the control flow of initialization
+ */
+ before() : fieldWrites() && !cflow(init()) {
+ handle("field set outside of init", thisJoinPointStaticPart);
+ }
+ // END-SAMPLE testing-inoculated-prohibitWritesExceptWhenConstructing
+
+ // START-SAMPLE testing-inoculated-prohibitWritesByOthers Prohibit field writes by other instances
+ /**
+ * Handle any situation where fields are written
+ * by another object.
+ */
+ before(Object caller, PrinterStream targ) : this(caller)
+ && target(targ) && fieldWrites() {
+ if (caller != targ) {
+ String err = "variation 1: caller (" + caller
+ + ") setting fields in targ (" + targ + ")";
+ handle(err, thisJoinPointStaticPart);
+ }
+ }
+ // END-SAMPLE testing-inoculated-prohibitWritesByOthers
+
+ //---- variations to pick out subclasses as well
+ // START-SAMPLE testing-inoculated-prohibitWritesEvenBySubclasses Prohibit writes by subclasses
+ /** any write to a non-static field in PrinterStream or any subclasses */
+ //pointcut fieldWrites() : set(!static * PrinterStream+.*);
+
+ /** execution of any constructor for PrinterStream or any subclasses */
+ //pointcut init() : execution(PrinterStream+.new(..));
+ // END-SAMPLE testing-inoculated-prohibitWritesEvenBySubclasses
+
+ //---- variation to pick out static callers as well
+ // START-SAMPLE testing-inoculated-prohibitWritesEvenByStaticOthers Prohibit writes by other instances and static methods
+ /**
+ * Handle any situation where fields are written
+ * other than by the same object.
+ */
+ before(PrinterStream targ) : target(targ) && fieldWrites() {
+ Object caller = thisJoinPoint.getThis();
+ if (targ != caller) {
+ String err = "variation 2: caller (" + caller
+ + ") setting fields in targ (" + targ + ")";
+ handle(err, thisJoinPointStaticPart);
+ }
+ }
+ // END-SAMPLE testing-inoculated-prohibitWritesEvenByStaticOthers
+
+ //-------------- utility method
+ void handle(String error, JoinPoint.StaticPart jpsp) {
+ error += " - " + jpsp;
+ if (throwError) {
+ throw new Error(error);
+ } else {
+ System.err.println(error);
+ }
+ }
+}
+
+
+class PrinterStream {
+ int one;
+ private int another;
+
+ PrinterStream() { setOne(1); }
+
+ PrinterStream(PrinterStream other) {
+ other.another = 3;
+ }
+
+ public void setOne(int i) {
+ one = i;
+ }
+}
+
+class SubPrinterStream extends PrinterStream {
+ private int two;
+
+ SubPrinterStream() {
+ setOne(2);
+ setTwo();
+ }
+
+ public void setTwo() {
+ two = 2;
+ }
+}
+