Skip to content

Commit

Permalink
Implement #56
Browse files Browse the repository at this point in the history
  • Loading branch information
Fabio Tudone committed Apr 26, 2016
1 parent cf3c203 commit 2b8c010
Show file tree
Hide file tree
Showing 2 changed files with 77 additions and 28 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@
import co.paralleluniverse.common.util.Pair;
import co.paralleluniverse.comsat.webactors.WebActor;
import co.paralleluniverse.comsat.webactors.WebMessage;
import co.paralleluniverse.fibers.Suspendable;
import io.netty.handler.codec.http.FullHttpRequest;
import io.netty.handler.codec.http.cookie.Cookie;
import io.netty.util.internal.logging.InternalLogger;
Expand All @@ -43,45 +42,63 @@ public class AutoWebActorHandler extends WebActorHandler {
private static final Object[] EMPTY_OBJECT_ARRAY = new Object[0];

public AutoWebActorHandler() {
this(null, null, null);
this(null, null, null, null);
}

public AutoWebActorHandler(List<String> packagePrefixes) {
this(null, null, packagePrefixes, null);
}

public AutoWebActorHandler(String httpResponseEncoderName, List<String> packagePrefixes) {
this(httpResponseEncoderName, null, packagePrefixes, null);
}

public AutoWebActorHandler(String httpResponseEncoderName) {
this(httpResponseEncoderName, null, null);
this(httpResponseEncoderName, null, null, null);
}

public AutoWebActorHandler(String httpResponseEncoderName, ClassLoader userClassLoader) {
this(httpResponseEncoderName, userClassLoader, null);
this(httpResponseEncoderName, userClassLoader, null, null);
}

public AutoWebActorHandler(String httpResponseEncoderName, ClassLoader userClassLoader, List<String> packagePrefixes) {
this(httpResponseEncoderName, userClassLoader, packagePrefixes, null);
}

public AutoWebActorHandler(String httpResponseEncoderName, Map<Class<?>, Object[]> actorParams) {
this(httpResponseEncoderName, null, actorParams);
this(httpResponseEncoderName, null, null, actorParams);
}

public AutoWebActorHandler(String httpResponseEncoderName, List<String> packagePrefixes, Map<Class<?>, Object[]> actorParams) {
this(httpResponseEncoderName, null, packagePrefixes, actorParams);
}

public AutoWebActorHandler(final String httpResponseEncoderName, final ClassLoader userClassLoader, final Map<Class<?>, Object[]> actorParams) {
public AutoWebActorHandler(String httpResponseEncoderName, ClassLoader userClassLoader, List<String> packagePrefixes, Map<Class<?>, Object[]> actorParams) {
super(null, httpResponseEncoderName);
super.contextProvider = newContextProvider(userClassLoader, actorParams);
super.contextProvider = newContextProvider(userClassLoader != null ? userClassLoader : ClassLoader.getSystemClassLoader(), packagePrefixes, actorParams);
}

public AutoWebActorHandler(String httpResponseEncoderName, AutoContextProvider prov) {
super(prov, httpResponseEncoderName);
}

protected AutoContextProvider newContextProvider(ClassLoader userClassLoader, Map<Class<?>, Object[]> actorParams) {
return new AutoContextProvider(userClassLoader, actorParams);
protected AutoContextProvider newContextProvider(ClassLoader userClassLoader, List<String> packagePrefixes, Map<Class<?>, Object[]> actorParams) {
return new AutoContextProvider(userClassLoader, packagePrefixes, actorParams);
}

public static class AutoContextProvider implements WebActorContextProvider {
private final ClassLoader userClassLoader;
private final List<String> packagePrefixes;
private final Map<Class<?>, Object[]> actorParams;
private final Long defaultContextValidityMS;

public AutoContextProvider(ClassLoader userClassLoader, Map<Class<?>, Object[]> actorParams) {
this(userClassLoader, actorParams, null);
public AutoContextProvider(ClassLoader userClassLoader, List<String> packagePrefixes, Map<Class<?>, Object[]> actorParams) {
this(userClassLoader, packagePrefixes, actorParams, null);
}

public AutoContextProvider(ClassLoader userClassLoader, Map<Class<?>, Object[]> actorParams, Long defaultContextValidityMS) {
public AutoContextProvider(ClassLoader userClassLoader, List<String> packagePrefixes, Map<Class<?>, Object[]> actorParams, Long defaultContextValidityMS) {
this.userClassLoader = userClassLoader;
this.packagePrefixes = packagePrefixes;
this.actorParams = actorParams;
this.defaultContextValidityMS = defaultContextValidityMS;
}
Expand All @@ -102,7 +119,7 @@ public final Context get(final FullHttpRequest req) {
}

protected AutoContext newActorContext(FullHttpRequest req) {
final AutoContext c = new AutoContext(req, actorParams, userClassLoader);
final AutoContext c = new AutoContext(req, packagePrefixes, actorParams, userClassLoader);
if (defaultContextValidityMS != null)
c.setValidityMS(defaultContextValidityMS);
return c;
Expand All @@ -123,12 +140,14 @@ private String getSessionId(FullHttpRequest req) {
private static class AutoContext extends DefaultContextImpl {
private String id;

private final List<String> packagePrefixes;
private final Map<Class<?>, Object[]> actorParams;
private final ClassLoader userClassLoader;
private Class<? extends ActorImpl<? extends WebMessage>> actorClass;
private ActorRef<? extends WebMessage> actorRef;

public AutoContext(FullHttpRequest req, Map<Class<?>, Object[]> actorParams, ClassLoader userClassLoader) {
public AutoContext(FullHttpRequest req, List<String> packagePrefixes, Map<Class<?>, Object[]> actorParams, ClassLoader userClassLoader) {
this.packagePrefixes = packagePrefixes;
this.actorParams = actorParams;
this.userClassLoader = userClassLoader;
fillActor(req);
Expand Down Expand Up @@ -196,6 +215,17 @@ private synchronized void registerActorClasses() {
ClassLoaderUtil.accept((URLClassLoader) classLoader, new ClassLoaderUtil.Visitor() {
@Override
public final void visit(String resource, URL url, ClassLoader cl) {
if (packagePrefixes != null) {
boolean found = false;
for (final String packagePrefix : packagePrefixes) {
if (packagePrefix != null && resource.startsWith(packagePrefix.replace('.', '/'))) {
found = true;
break;
}
}
if (!found)
return;
}
if (!ClassLoaderUtil.isClassFile(resource))
return;
final String className = ClassLoaderUtil.resourceToClass(resource);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,41 +38,47 @@ public final class AutoWebActorHandler extends WebActorHandler {
private static final Object[] EMPTY_OBJECT_ARRAY = new Object[0];

public AutoWebActorHandler() {
this(null, null);
this(null, null, null);
}

public AutoWebActorHandler(ClassLoader userClassLoader) {
this(userClassLoader, null);
public AutoWebActorHandler(List<String> packagePrefixes) {
this(null, packagePrefixes, null);
}

public AutoWebActorHandler(Map<Class<?>, Object[]> actorParams) {
this(null, actorParams);
public AutoWebActorHandler(ClassLoader userClassLoader, List<String> packagePrefixes) {
this(userClassLoader, packagePrefixes, null);
}

public AutoWebActorHandler(ClassLoader userClassLoader, Map<Class<?>, Object[]> actorParams) {
public AutoWebActorHandler(List<String> packagePrefixes, Map<Class<?>, Object[]> actorParams) {
this(null, packagePrefixes, actorParams);
}

public AutoWebActorHandler(ClassLoader userClassLoader, List<String> packagePrefixes, Map<Class<?>, Object[]> actorParams) {
super(null);
super.contextProvider = newContextProvider(ClassLoader.getSystemClassLoader(), actorParams);
super.contextProvider = newContextProvider(userClassLoader != null ? userClassLoader : ClassLoader.getSystemClassLoader(), packagePrefixes, actorParams);
}

public AutoWebActorHandler(AutoContextProvider prov) {
super(prov);
}

protected AutoContextProvider newContextProvider(ClassLoader userClassLoader, Map<Class<?>, Object[]> actorParams) {
return new AutoContextProvider(userClassLoader, actorParams);
protected AutoContextProvider newContextProvider(ClassLoader userClassLoader, List<String> packagePrefixes, Map<Class<?>, Object[]> actorParams) {
return new AutoContextProvider(userClassLoader, packagePrefixes, actorParams);
}

private static class AutoContextProvider implements ContextProvider {
private final ClassLoader userClassLoader;
private final Map<Class<?>, Object[]> actorParams;
private final Long defaultContextValidityMS;
private final List<String> packagePrefixes;

public AutoContextProvider(ClassLoader userClassLoader, Map<Class<?>, Object[]> actorParams) {
this(userClassLoader, actorParams, null);
public AutoContextProvider(ClassLoader userClassLoader, List<String> packagePrefixes, Map<Class<?>, Object[]> actorParams) {
this(userClassLoader, packagePrefixes, actorParams, null);
}

public AutoContextProvider(ClassLoader userClassLoader, Map<Class<?>, Object[]> actorParams, Long defaultContextValidityMS) {
public AutoContextProvider(ClassLoader userClassLoader, List<String> packagePrefixes, Map<Class<?>, Object[]> actorParams, Long defaultContextValidityMS) {
this.userClassLoader = userClassLoader;
this.packagePrefixes = packagePrefixes;
this.actorParams = actorParams;
this.defaultContextValidityMS = defaultContextValidityMS;
}
Expand All @@ -98,7 +104,7 @@ public final Context get(final HttpServerExchange xch) {
}

private Context newContext(final HttpServerExchange xch) {
final AutoActorContext c = new AutoActorContext(xch, actorParams, userClassLoader);
final AutoActorContext c = new AutoActorContext(xch, packagePrefixes, actorParams, userClassLoader);
if (defaultContextValidityMS != null)
c.setValidityMS(defaultContextValidityMS);
return c;
Expand All @@ -108,12 +114,14 @@ private Context newContext(final HttpServerExchange xch) {
private static final class AutoActorContext extends DefaultContextImpl {
private String id;

private final List<String> packagePrefixes;
private final Map<Class<?>, Object[]> actorParams;
private final ClassLoader userClassLoader;
private Class<? extends ActorImpl<? extends WebMessage>> actorClass;
private ActorRef<? extends WebMessage> actorRef;

public AutoActorContext(HttpServerExchange xch, Map<Class<?>, Object[]> actorParams, ClassLoader userClassLoader) {
public AutoActorContext(HttpServerExchange xch, List<String> packagePrefixes, Map<Class<?>, Object[]> actorParams, ClassLoader userClassLoader) {
this.packagePrefixes = packagePrefixes;
this.actorParams = actorParams;
this.userClassLoader = userClassLoader;
fillActor(xch);
Expand Down Expand Up @@ -182,6 +190,17 @@ private synchronized void registerActorClasses() {
ClassLoaderUtil.accept((URLClassLoader) classLoader, new ClassLoaderUtil.Visitor() {
@Override
public final void visit(String resource, URL url, ClassLoader cl) {
if (packagePrefixes != null) {
boolean found = false;
for (final String packagePrefix : packagePrefixes) {
if (packagePrefix != null && resource.startsWith(packagePrefix.replace('.', '/'))) {
found = true;
break;
}
}
if (!found)
return;
}
if (!ClassLoaderUtil.isClassFile(resource))
return;
final String className = ClassLoaderUtil.resourceToClass(resource);
Expand Down

0 comments on commit 2b8c010

Please sign in to comment.