Skip to content

Commit

Permalink
Fix event bus extend
Browse files Browse the repository at this point in the history
  • Loading branch information
SBPrime committed May 15, 2019
1 parent 67e4adb commit 8f7abbf
Show file tree
Hide file tree
Showing 5 changed files with 45 additions and 26 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,6 @@
import com.sk89q.worldedit.math.BlockVector3;
import org.primesoft.asyncworldedit.api.taskdispatcher.ITaskDispatcher;
import org.primesoft.asyncworldedit.api.taskdispatcher.IDispatcherEntry;
import com.sk89q.worldedit.math.Vector3;
import com.sk89q.worldedit.regions.Region;
import java.util.Collection;
import java.util.HashSet;
Expand Down Expand Up @@ -83,7 +82,7 @@ public class TaskDispatcher implements Runnable, ITaskDispatcher {
* List of thred ID's used to detect if perform safe was already started on
* that thread
*/
private final HashSet<Long> m_threadMarker = new LinkedHashSet<Long>();
private final HashSet<Long> m_threadMarker = new LinkedHashSet<>();

/**
* MTA mutex
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,8 @@
import org.primesoft.asyncworldedit.worldedit.history.changeset.NullChangeSet;
import org.primesoft.asyncworldedit.worldedit.world.CancelableWorld;
import org.primesoft.asyncworldedit.worldedit.util.eventbus.EventBusWrapper;
import org.primesoft.asyncworldedit.injector.injected.util.eventbus.IDispatchableEventBus;
import org.primesoft.asyncworldedit.injector.injected.util.eventbus.IEventBus;

/**
*
Expand All @@ -120,7 +122,7 @@ public class CancelabeEditSession extends AweEditSession implements ICancelabeEd

public CancelabeEditSession(IThreadSafeEditSession parent, Mask mask, int jobId) {
this(parent, mask, jobId,
new EventBusWrapESEvent(parent.getEventBus()),
wrapEventBus(parent.getEventBus()),
new CancelableWorld(parent.getWorld(), jobId, parent.getPlayer()),
parent.getBlockChangeLimit(), parent.getBlockBag(),
parent.getEditSessionEvent());
Expand Down Expand Up @@ -173,7 +175,7 @@ private void injectExtents(IPlayerEntry playerEntry) {
return;
}
}

injectBlockBagExtent(extentList);
injectChangeSet(extentList, m_parent.getChangeSet(), playerEntry);
}
Expand Down Expand Up @@ -425,7 +427,7 @@ public IThreadSafeEditSession getParent() {
public void flushSession() {
m_blocksQueued = 0;
super.flushSession();
}
}

/**
* Force block flush when to many has been queued
Expand All @@ -442,28 +444,37 @@ private void forceFlush() {
}
}

private static EventBus wrapEventBus(EventBus eventBus) {
final IDispatchableEventBus deb = (IDispatchableEventBus) (Object)eventBus;

deb.setOverride(new EventBusWrapESEvent(deb));

return eventBus;
}

private static class EventBusWrapESEvent extends EventBusWrapper {

public EventBusWrapESEvent(EventBus target) {
public EventBusWrapESEvent(IDispatchableEventBus target) {
super(target);
}

@Override
public void post(Object event) {
if (event instanceof EditSessionEvent) {
event = new WrapEditSessionEvent((EditSessionEvent)event);
event = new WrapEditSessionEvent((EditSessionEvent) event);
}

super.post(event);
}
}

private static class WrapEditSessionEvent extends EditSessionEvent {

private final EditSessionEvent m_source;

public WrapEditSessionEvent(EditSessionEvent source) {
super(source.getWorld(), source.getActor(), source.getMaxBlocks(), source.getStage());

m_source = source;
}

Expand Down Expand Up @@ -495,6 +506,6 @@ public World getWorld() {
@Override
public void setExtent(Extent extent) {
m_source.setExtent(new SafeDelegateExtent(extent, getExtent()));
}
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -48,61 +48,61 @@
package org.primesoft.asyncworldedit.worldedit.util.eventbus;

import com.google.common.collect.Multimap;
import com.sk89q.worldedit.util.eventbus.EventBus;
import com.sk89q.worldedit.util.eventbus.EventHandler;
import java.util.Set;
import org.primesoft.asyncworldedit.injector.injected.util.eventbus.IDispatchableEventBus;
import org.primesoft.asyncworldedit.injector.injected.util.eventbus.IEventBus;
import org.primesoft.asyncworldedit.utils.ExceptionHelper;

/**
*
* @author SBPrime
*/
public class EventBusWrapper extends EventBus {
private final EventBus m_target;
public class EventBusWrapper implements IEventBus {
private final IDispatchableEventBus m_target;

public EventBusWrapper(EventBus target) {
public EventBusWrapper(IDispatchableEventBus target) {
m_target = target;
}

@Override
public void post(Object event) {
m_target.post(event);
m_target.nonwrapped_post(event);
}

@Override
public void register(Object object) {
m_target.register(object);
m_target.nonwrapped_register(object);
}

@Override
public synchronized void subscribe(Class<?> clazz, EventHandler handler) {
m_target.subscribe(clazz, handler);
m_target.nonwrapped_subscribe(clazz, handler);
}

@Override
public synchronized void subscribeAll(Multimap<Class<?>, EventHandler> handlers) {
m_target.subscribeAll(handlers);
m_target.nonwrapped_subscribeAll(handlers);
}

@Override
public void unregister(Object object) {
m_target.unregister(object);
m_target.nonwrapped_unregister(object);
}

@Override
public synchronized void unsubscribe(Class<?> clazz, EventHandler handler) {
m_target.unsubscribe(clazz, handler);
m_target.nonwrapped_unsubscribe(clazz, handler);
}

@Override
public synchronized void unsubscribeAll(Multimap<Class<?>, EventHandler> handlers) {
m_target.unsubscribeAll(handlers);
m_target.nonwrapped_unsubscribeAll(handlers);
}

@Override
protected void dispatch(Object event, EventHandler handler) {
public void dispatch(Object event, EventHandler handler) {
try {
super.dispatch(event, handler);
m_target.nonwrapped_dispatch(event, handler);
} catch (Throwable ex) {
ExceptionHelper.printException(ex, "Unable to dispatch evetn: " + event + " to handler " + handler);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,7 @@
import org.primesoft.asyncworldedit.injector.core.visitors.worldedit.command.SchematicCommandsVisitor;
import org.primesoft.asyncworldedit.injector.core.visitors.worldedit.command.ScriptingCommandsVisitor;
import org.primesoft.asyncworldedit.injector.core.visitors.worldedit.command.SnapshotUtilCommandsVisitor;
import org.primesoft.asyncworldedit.injector.core.visitors.worldedit.util.eventbus.EventBusVisitor;
import org.primesoft.asyncworldedit.utils.ExceptionHelper;

/**
Expand Down Expand Up @@ -170,6 +171,8 @@ public boolean initialize(IInjectorPlatform platform, IClassInjector classInject

log("Injecting WorldEdit classes...");
try {
modiffyClasses("com.sk89q.worldedit.util.eventbus.EventBus", c -> new EventBusVisitor(c));

modiffyClasses("com.sk89q.worldedit.math.BlockVector2", c -> new AsyncWrapperVisitor(c));
modiffyClasses("com.sk89q.worldedit.math.BlockVector3", c -> new AsyncWrapperVisitor(c));
modiffyClasses("com.sk89q.worldedit.math.Vector2", c -> new AsyncWrapperVisitor(c));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes;
import org.objectweb.asm.Type;
import org.primesoft.asyncworldedit.injector.injected.util.eventbus.IDispatchableEventBus;

/**
*
Expand Down Expand Up @@ -337,4 +338,9 @@ public EncapsulatePrimitive(String primitive, String refType,
this.opcodeLoad = opcodeLoad;
}
}

public static Stream<Method> getMethod(Class<?> cls, String methodName) {
return Stream.of(IDispatchableEventBus.class.getMethods()).
filter(i -> i.getName().equals(methodName));
}
}

0 comments on commit 8f7abbf

Please sign in to comment.