Javolution 6.0.0 java
AbstractContext.java
Go to the documentation of this file.
1 /*
2  * Javolution - Java(TM) Solution for Real-Time and Embedded Systems
3  * Copyright (C) 2012 - Javolution (http://javolution.org/)
4  * All rights reserved.
5  *
6  * Permission to use, copy, modify, and distribute this software is
7  * freely granted, provided that this notice is preserved.
8  */
9 package javolution.context;
10 
13 import javolution.lang.Realtime;
14 
38 @Realtime
39 @Parallelizable(comment = "Sequential configuration, parallel use")
40 public abstract class AbstractContext {
41 
45  private static final ThreadLocal<AbstractContext> CURRENT = new ThreadLocal<AbstractContext>();
46 
51 
55  protected AbstractContext() {}
56 
61  public static AbstractContext current() {
62  return AbstractContext.CURRENT.get();
63  }
64 
68  @SuppressWarnings("unchecked")
69  protected static <T extends AbstractContext> T current(Class<T> type) {
71  while (ctx != null) {
72  if (type.isInstance(ctx))
73  return (T) ctx;
74  ctx = ctx.outer;
75  }
76  return null;
77  }
78 
100  @SuppressWarnings("unchecked")
101  public static <T extends AbstractContext> T enter(Class<T> custom) {
102  SecurityContext.check(new Permission<T>(custom, "enter"));
103  try {
104  return (T) custom.newInstance().enterInner();
105  } catch (InstantiationException e) {
106  throw new IllegalArgumentException(
107  "Cannot instantiate instance of " + custom, e);
108  } catch (IllegalAccessException e) {
109  throw new IllegalArgumentException("Cannot access " + custom, e);
110  }
111  }
112 
131  public static void inherit(AbstractContext ctx) {
132  CURRENT.set(ctx);
133  }
134 
142  AbstractContext inner = inner();
143  inner.outer = AbstractContext.CURRENT.get();
144  AbstractContext.CURRENT.set(inner);
145  return inner;
146  }
147 
155  public void exit() {
156  if (this != AbstractContext.CURRENT.get())
157  throw new IllegalStateException(
158  "This context is not the current context");
159  AbstractContext.CURRENT.set(outer);
160  outer = null;
161  }
162 
167  protected AbstractContext getOuter() {
168  return outer;
169  }
170 
176  protected abstract AbstractContext inner();
177 
178 }
javolution.context.AbstractContext.getOuter
AbstractContext getOuter()
Definition: AbstractContext.java:167
javolution.lang.Parallelizable
Definition: Parallelizable.java:55
javolution
javolution.context
Definition: AbstractContext.java:9
javolution.context.AbstractContext.exit
void exit()
Definition: AbstractContext.java:155
javolution.context.AbstractContext.CURRENT
static final ThreadLocal< AbstractContext > CURRENT
Definition: AbstractContext.java:45
javolution.context.AbstractContext.inner
abstract AbstractContext inner()
javolution.context.SecurityContext.check
static void check(Permission<?> permission)
Definition: SecurityContext.java:195
javolution.lang
Definition: Configurable.java:9
javolution.context.AbstractContext
Definition: AbstractContext.java:40
javolution.context.AbstractContext.outer
AbstractContext outer
Definition: AbstractContext.java:50
javolution.context.AbstractContext.current
static AbstractContext current()
Definition: AbstractContext.java:61
javolution.context.SecurityContext
Definition: SecurityContext.java:34
javolution.context.AbstractContext.inherit
static void inherit(AbstractContext ctx)
Definition: AbstractContext.java:131
javolution.lang.Realtime
Definition: Realtime.java:59
javolution.context.AbstractContext.enterInner
AbstractContext enterInner()
Definition: AbstractContext.java:141
javolution.context.SecurityContext.Permission
Definition: SecurityContext.java:48
javolution.context.AbstractContext.AbstractContext
AbstractContext()
Definition: AbstractContext.java:55