Skip to content

Commit

Permalink
Implement Thread.interrupt() support.
Browse files Browse the repository at this point in the history
  • Loading branch information
lincolnthree committed May 5, 2014
1 parent c049161 commit 5ea7ba8
Show file tree
Hide file tree
Showing 28 changed files with 154 additions and 26 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
/*
* Copyright 2014 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Eclipse Public License version 1.0, available at
* http://www.eclipse.org/legal/epl-v10.html
*/
package org.jboss.forge.classloader.mock;

/**
* @author <a href="mailto:lincolnbaxter@gmail.com">Lincoln Baxter, III</a>
*
*/
public class MockSimpleCountService
{
private int count = 0;

/**
* Return's the number of times this services has been previously called.
*/
public int execute()
{
return count++;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
* Licensed under the Eclipse Public License version 1.0, available at
* http://www.eclipse.org/legal/epl-v10.html
*/
package org.jboss.forge.classloader;
package org.jboss.forge.furnace.proxy.classloader;

import java.lang.reflect.Method;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
* http://www.eclipse.org/legal/epl-v10.html
*/

package org.jboss.forge.classloader;
package org.jboss.forge.furnace.proxy.classloader;

import java.util.ArrayList;
import java.util.List;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
* Licensed under the Eclipse Public License version 1.0, available at
* http://www.eclipse.org/legal/epl-v10.html
*/
package org.jboss.forge.classloader;
package org.jboss.forge.furnace.proxy.classloader;

import org.jboss.forge.classloader.mock.MockParentInterface1;
import org.jboss.forge.classloader.mock.MockService2;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
* http://www.eclipse.org/legal/epl-v10.html
*/

package org.jboss.forge.classloader;
package org.jboss.forge.furnace.proxy.classloader;

import org.jboss.arquillian.container.test.api.Deployment;
import org.jboss.arquillian.junit.Arquillian;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
* http://www.eclipse.org/legal/epl-v10.html
*/

package org.jboss.forge.classloader;
package org.jboss.forge.furnace.proxy.classloader;

import org.jboss.arquillian.container.test.api.Deployment;
import org.jboss.arquillian.junit.Arquillian;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
* http://www.eclipse.org/legal/epl-v10.html
*/

package org.jboss.forge.classloader;
package org.jboss.forge.furnace.proxy.classloader;

import java.io.File;
import java.io.PrintStream;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
* http://www.eclipse.org/legal/epl-v10.html
*/

package org.jboss.forge.classloader;
package org.jboss.forge.furnace.proxy.classloader;

import java.io.File;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
* http://www.eclipse.org/legal/epl-v10.html
*/

package org.jboss.forge.classloader;
package org.jboss.forge.furnace.proxy.classloader;

import org.jboss.arquillian.container.test.api.Deployment;
import org.jboss.arquillian.junit.Arquillian;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
* Licensed under the Eclipse Public License version 1.0, available at
* http://www.eclipse.org/legal/epl-v10.html
*/
package org.jboss.forge.classloader;
package org.jboss.forge.furnace.proxy.classloader;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.LazyLoader;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
* http://www.eclipse.org/legal/epl-v10.html
*/

package org.jboss.forge.classloader;
package org.jboss.forge.furnace.proxy.classloader;

import org.jboss.arquillian.container.test.api.Deployment;
import org.jboss.arquillian.junit.Arquillian;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
* http://www.eclipse.org/legal/epl-v10.html
*/

package org.jboss.forge.classloader;
package org.jboss.forge.furnace.proxy.classloader;

import java.util.ArrayList;
import java.util.List;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
* http://www.eclipse.org/legal/epl-v10.html
*/

package org.jboss.forge.classloader;
package org.jboss.forge.furnace.proxy.classloader;

import org.jboss.arquillian.container.test.api.Deployment;
import org.jboss.arquillian.junit.Arquillian;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
* http://www.eclipse.org/legal/epl-v10.html
*/

package org.jboss.forge.classloader;
package org.jboss.forge.furnace.proxy.classloader;

import org.jboss.arquillian.container.test.api.Deployment;
import org.jboss.arquillian.junit.Arquillian;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
* http://www.eclipse.org/legal/epl-v10.html
*/

package org.jboss.forge.classloader;
package org.jboss.forge.furnace.proxy.classloader;

import org.jboss.arquillian.container.test.api.Deployment;
import org.jboss.arquillian.junit.Arquillian;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
* http://www.eclipse.org/legal/epl-v10.html
*/

package org.jboss.forge.classloader;
package org.jboss.forge.furnace.proxy.classloader;

import java.util.List;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
* http://www.eclipse.org/legal/epl-v10.html
*/

package org.jboss.forge.classloader.collections;
package org.jboss.forge.furnace.proxy.classloader.collections;

import org.jboss.arquillian.container.test.api.Deployment;
import org.jboss.arquillian.junit.Arquillian;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
* http://www.eclipse.org/legal/epl-v10.html
*/

package org.jboss.forge.classloader.collections;
package org.jboss.forge.furnace.proxy.classloader.collections;

import java.util.Iterator;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
* http://www.eclipse.org/legal/epl-v10.html
*/

package org.jboss.forge.classloader.whitelist;
package org.jboss.forge.furnace.proxy.classloader.whitelist;

import java.util.Arrays;
import java.util.HashSet;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
* http://www.eclipse.org/legal/epl-v10.html
*/

package org.jboss.forge.classloader.whitelist;
package org.jboss.forge.furnace.proxy.classloader.whitelist;

import java.util.Arrays;
import java.util.HashSet;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
* Licensed under the Eclipse Public License version 1.0, available at
* http://www.eclipse.org/legal/epl-v10.html
*/
package org.jboss.forge.classloader.whitelist;
package org.jboss.forge.furnace.proxy.classloader.whitelist;

import java.util.HashMap;
import java.util.Map;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
* Licensed under the Eclipse Public License version 1.0, available at
* http://www.eclipse.org/legal/epl-v10.html
*/
package org.jboss.forge.classloader.whitelist;
package org.jboss.forge.furnace.proxy.classloader.whitelist;

import org.jboss.forge.furnace.proxy.Proxies;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
* Licensed under the Eclipse Public License version 1.0, available at
* http://www.eclipse.org/legal/epl-v10.html
*/
package org.jboss.forge.classloader.whitelist;
package org.jboss.forge.furnace.proxy.classloader.whitelist;

/**
* @author <a href="mailto:lincolnbaxter@gmail.com">Lincoln Baxter, III</a>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
* Licensed under the Eclipse Public License version 1.0, available at
* http://www.eclipse.org/legal/epl-v10.html
*/
package org.jboss.forge.classloader.whitelist;
package org.jboss.forge.furnace.proxy.classloader.whitelist;

/**
* @author <a href="mailto:lincolnbaxter@gmail.com">Lincoln Baxter, III</a>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
/*
* Copyright 2012 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Eclipse Public License version 1.0, available at
* http://www.eclipse.org/legal/epl-v10.html
*/

package org.jboss.forge.furnace.proxy.thread;

import java.util.concurrent.atomic.AtomicReference;

import org.jboss.arquillian.container.test.api.Deployment;
import org.jboss.arquillian.junit.Arquillian;
import org.jboss.forge.arquillian.archive.ForgeArchive;
import org.jboss.forge.arquillian.services.LocalServices;
import org.jboss.forge.classloader.mock.MockSimpleCountService;
import org.jboss.forge.furnace.addons.AddonRegistry;
import org.jboss.forge.furnace.exception.ContainerException;
import org.jboss.forge.furnace.repositories.AddonDependencyEntry;
import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;

@RunWith(Arquillian.class)
public class ThreadProxyInterruptTest
{
@Deployment(order = 1)
public static ForgeArchive getDeployment()
{
ForgeArchive archive = ShrinkWrap.create(ForgeArchive.class)
.addAsLocalServices(ThreadProxyInterruptTest.class)
.addAsAddonDependencies(AddonDependencyEntry.create("dep"));

return archive;
}

@Deployment(name = "dep,1", testable = false, order = 0)
public static ForgeArchive getDeploymentDep1()
{
ForgeArchive archive = ShrinkWrap.create(ForgeArchive.class)
.addClasses(MockSimpleCountService.class)
.addAsLocalServices(MockSimpleCountService.class);

return archive;
}

@Test
public void testServiceProxiesCanBeInterrupted() throws Exception
{
AddonRegistry registry = LocalServices.getFurnace(getClass().getClassLoader())
.getAddonRegistry();

final MockSimpleCountService service = registry.getServices(MockSimpleCountService.class).get();
final AtomicReference<ContainerException> exception = new AtomicReference<>();
Thread t = new Thread(new Runnable()
{
@Override
public void run()
{
try
{
while (true)
{
service.execute();
}
}
catch (ContainerException e)
{
exception.set(e);
}

if (!Thread.currentThread().isInterrupted())
throw new RuntimeException("Should have been interrupted at this point.");
}
});

Assert.assertNull(exception.get());

t.start();
Thread.sleep(250);
t.interrupt();
Thread.sleep(250);

Assert.assertTrue(service.execute() > 0);
Assert.assertNotNull(exception.get());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,11 @@ public ClassLoaderAdapterCallback(Callable<Set<ClassLoader>> whitelist, ClassLoa
public Object invoke(final Object obj, final Method thisMethod, final Method proceed, final Object[] args)
throws Throwable
{
if(Thread.currentThread().isInterrupted())
{
throw new ContainerException("Thread.interrupt() requested.");
}

return ClassLoaders.executeIn(delegateLoader, new Callable<Object>()
{
@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import java.lang.reflect.Method;
import java.util.concurrent.Callable;

import org.jboss.forge.furnace.exception.ContainerException;
import org.jboss.forge.furnace.util.ClassLoaders;

/**
Expand All @@ -32,6 +33,11 @@ public ClassLoaderInterceptor(ClassLoader loader, Object delegate)
public Object invoke(final Object self, final Method thisMethod, final Method proceed, final Object[] args)
throws Throwable
{
if (Thread.currentThread().isInterrupted())
{
throw new ContainerException("Thread.interrupt() requested.");
}

Callable<Object> task = new Callable<Object>()
{
@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@

import org.jboss.forge.furnace.addons.Addon;
import org.jboss.forge.furnace.exception.ContainerException;
import org.jboss.forge.furnace.proxy.ClassLoaderInterceptor;
import org.jboss.forge.furnace.proxy.Proxies;
import org.jboss.forge.furnace.spi.ExportedInstance;

/**
Expand All @@ -16,8 +18,8 @@
*/
public class ReflectionExportedInstance<T> implements ExportedInstance<T>
{
private Class<T> type;
private Addon addon;
private final Class<T> type;
private final Addon addon;

public ReflectionExportedInstance(Addon addon, Class<T> clazz)
{
Expand All @@ -30,7 +32,10 @@ public T get()
{
try
{
return type.newInstance();
T delegate = type.newInstance();
delegate = Proxies.enhance(addon.getClassLoader(), delegate, new ClassLoaderInterceptor(
addon.getClassLoader(), delegate));
return delegate;
}
catch (Exception e)
{
Expand Down

0 comments on commit 5ea7ba8

Please sign in to comment.