Add the error reporter to the background compiler.
Dieser Commit ist enthalten in:
Ursprung
d5aa1cde51
Commit
f8af92eb5b
@ -90,13 +90,14 @@ public class ProtocolLibrary extends JavaPlugin {
|
|||||||
logger = getLoggerSafely();
|
logger = getLoggerSafely();
|
||||||
|
|
||||||
// Add global parameters
|
// Add global parameters
|
||||||
DetailedErrorReporter reporter = new DetailedErrorReporter(this);
|
DetailedErrorReporter detailedReporter = new DetailedErrorReporter(this);
|
||||||
updater = new Updater(this, logger, "protocollib", getFile(), "protocol.info");
|
updater = new Updater(this, logger, "protocollib", getFile(), "protocol.info");
|
||||||
|
reporter = detailedReporter;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
config = new ProtocolConfig(this);
|
config = new ProtocolConfig(this);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
reporter.reportWarning(this, "Cannot load configuration", e);
|
detailedReporter.reportWarning(this, "Cannot load configuration", e);
|
||||||
|
|
||||||
// Load it again
|
// Load it again
|
||||||
deleteConfig();
|
deleteConfig();
|
||||||
@ -105,18 +106,18 @@ public class ProtocolLibrary extends JavaPlugin {
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
unhookTask = new DelayedSingleTask(this);
|
unhookTask = new DelayedSingleTask(this);
|
||||||
protocolManager = new PacketFilterManager(getClassLoader(), getServer(), unhookTask, reporter);
|
protocolManager = new PacketFilterManager(getClassLoader(), getServer(), unhookTask, detailedReporter);
|
||||||
reporter.addGlobalParameter("manager", protocolManager);
|
detailedReporter.addGlobalParameter("manager", protocolManager);
|
||||||
|
|
||||||
// Initialize command handlers
|
// Initialize command handlers
|
||||||
commandProtocol = new CommandProtocol(reporter, this, updater, config);
|
commandProtocol = new CommandProtocol(detailedReporter, this, updater, config);
|
||||||
commandPacket = new CommandPacket(reporter, this, logger, protocolManager);
|
commandPacket = new CommandPacket(detailedReporter, this, logger, protocolManager);
|
||||||
|
|
||||||
// Send logging information to player listeners too
|
// Send logging information to player listeners too
|
||||||
broadcastUsers(PERMISSION_INFO);
|
broadcastUsers(PERMISSION_INFO);
|
||||||
|
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
reporter.reportDetailed(this, "Cannot load ProtocolLib.", e, protocolManager);
|
detailedReporter.reportDetailed(this, "Cannot load ProtocolLib.", e, protocolManager);
|
||||||
disablePlugin();
|
disablePlugin();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -167,8 +168,12 @@ public class ProtocolLibrary extends JavaPlugin {
|
|||||||
|
|
||||||
// Initialize background compiler
|
// Initialize background compiler
|
||||||
if (backgroundCompiler == null && config.isBackgroundCompilerEnabled()) {
|
if (backgroundCompiler == null && config.isBackgroundCompilerEnabled()) {
|
||||||
backgroundCompiler = new BackgroundCompiler(getClassLoader());
|
backgroundCompiler = new BackgroundCompiler(getClassLoader(), reporter);
|
||||||
BackgroundCompiler.setInstance(backgroundCompiler);
|
BackgroundCompiler.setInstance(backgroundCompiler);
|
||||||
|
|
||||||
|
logger.info("Started structure compiler thread.");
|
||||||
|
} else {
|
||||||
|
logger.info("Structure compiler thread has been disabled.");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set up command handlers
|
// Set up command handlers
|
||||||
|
@ -170,7 +170,7 @@ public class DetailedErrorReporter implements ErrorReporter {
|
|||||||
if (pluginReference.get() != null) {
|
if (pluginReference.get() != null) {
|
||||||
Plugin plugin = pluginReference.get();
|
Plugin plugin = pluginReference.get();
|
||||||
writer.println("Version:");
|
writer.println("Version:");
|
||||||
writer.println(addPrefix(plugin.toString() + "-" + plugin.getDescription().getVersion(), SECOND_LEVEL_PREFIX));
|
writer.println(addPrefix(plugin.toString(), SECOND_LEVEL_PREFIX));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add the server version too
|
// Add the server version too
|
||||||
|
@ -22,11 +22,16 @@ import java.util.concurrent.Callable;
|
|||||||
import java.util.concurrent.ExecutorService;
|
import java.util.concurrent.ExecutorService;
|
||||||
import java.util.concurrent.Executors;
|
import java.util.concurrent.Executors;
|
||||||
import java.util.concurrent.RejectedExecutionException;
|
import java.util.concurrent.RejectedExecutionException;
|
||||||
|
import java.util.concurrent.ThreadFactory;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
||||||
|
|
||||||
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
|
import com.comphenix.protocol.error.ErrorReporter;
|
||||||
import com.comphenix.protocol.reflect.StructureModifier;
|
import com.comphenix.protocol.reflect.StructureModifier;
|
||||||
|
import com.google.common.util.concurrent.ThreadFactoryBuilder;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Compiles structure modifiers on a background thread.
|
* Compiles structure modifiers on a background thread.
|
||||||
@ -37,6 +42,11 @@ import com.comphenix.protocol.reflect.StructureModifier;
|
|||||||
*/
|
*/
|
||||||
public class BackgroundCompiler {
|
public class BackgroundCompiler {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The default format for the name of new worker threads.
|
||||||
|
*/
|
||||||
|
public static final String THREAD_FORMAT = "ProtocolLib-StructureCompiler %s";
|
||||||
|
|
||||||
// How long to wait for a shutdown
|
// How long to wait for a shutdown
|
||||||
public static final int SHUTDOWN_DELAY_MS = 2000;
|
public static final int SHUTDOWN_DELAY_MS = 2000;
|
||||||
|
|
||||||
@ -48,6 +58,7 @@ public class BackgroundCompiler {
|
|||||||
private boolean shuttingDown;
|
private boolean shuttingDown;
|
||||||
|
|
||||||
private ExecutorService executor;
|
private ExecutorService executor;
|
||||||
|
private ErrorReporter reporter;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Retrieves the current background compiler.
|
* Retrieves the current background compiler.
|
||||||
@ -67,24 +78,38 @@ public class BackgroundCompiler {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Initialize a background compiler.
|
* Initialize a background compiler.
|
||||||
|
* <p>
|
||||||
|
* Uses the default {@link #THREAD_FORMAT} to name worker threads.
|
||||||
* @param loader - class loader from Bukkit.
|
* @param loader - class loader from Bukkit.
|
||||||
|
* @param reporter - current error reporter.
|
||||||
*/
|
*/
|
||||||
public BackgroundCompiler(ClassLoader loader) {
|
public BackgroundCompiler(ClassLoader loader, ErrorReporter reporter) {
|
||||||
this(loader, Executors.newSingleThreadExecutor());
|
ThreadFactory factory = new ThreadFactoryBuilder().
|
||||||
|
setDaemon(true).
|
||||||
|
setNameFormat(THREAD_FORMAT).
|
||||||
|
build();
|
||||||
|
initializeCompiler(loader, reporter, Executors.newSingleThreadExecutor(factory));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Initialize a background compiler utilizing the given thread pool.
|
* Initialize a background compiler utilizing the given thread pool.
|
||||||
* @param loader - class loader from Bukkit.
|
* @param loader - class loader from Bukkit.
|
||||||
|
* @param reporter - current error reporter.
|
||||||
* @param executor - thread pool we'll use.
|
* @param executor - thread pool we'll use.
|
||||||
*/
|
*/
|
||||||
public BackgroundCompiler(ClassLoader loader, ExecutorService executor) {
|
public BackgroundCompiler(ClassLoader loader, ErrorReporter reporter, ExecutorService executor) {
|
||||||
|
initializeCompiler(loader, reporter, executor);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Avoid "Constructor call must be the first statement".
|
||||||
|
private void initializeCompiler(ClassLoader loader, @Nullable ErrorReporter reporter, ExecutorService executor) {
|
||||||
if (loader == null)
|
if (loader == null)
|
||||||
throw new IllegalArgumentException("loader cannot be NULL");
|
throw new IllegalArgumentException("loader cannot be NULL");
|
||||||
if (executor == null)
|
if (executor == null)
|
||||||
throw new IllegalArgumentException("executor cannot be NULL");
|
throw new IllegalArgumentException("executor cannot be NULL");
|
||||||
|
|
||||||
this.compiler = new StructureCompiler(loader);
|
this.compiler = new StructureCompiler(loader);
|
||||||
|
this.reporter = reporter;
|
||||||
this.executor = executor;
|
this.executor = executor;
|
||||||
this.enabled = true;
|
this.enabled = true;
|
||||||
}
|
}
|
||||||
@ -129,15 +154,30 @@ public class BackgroundCompiler {
|
|||||||
executor.submit(new Callable<Object>() {
|
executor.submit(new Callable<Object>() {
|
||||||
@Override
|
@Override
|
||||||
public Object call() throws Exception {
|
public Object call() throws Exception {
|
||||||
|
|
||||||
StructureModifier<TKey> modifier = uncompiled;
|
StructureModifier<TKey> modifier = uncompiled;
|
||||||
|
|
||||||
// Do our compilation
|
// Do our compilation
|
||||||
|
try {
|
||||||
modifier = compiler.compile(modifier);
|
modifier = compiler.compile(modifier);
|
||||||
listener.onCompiled(modifier);
|
listener.onCompiled(modifier);
|
||||||
|
|
||||||
|
} catch (Throwable e) {
|
||||||
|
// Disable future compilations!
|
||||||
|
setEnabled(false);
|
||||||
|
|
||||||
|
// Inform about this error as best as we can
|
||||||
|
if (reporter != null) {
|
||||||
|
reporter.reportDetailed(BackgroundCompiler.this,
|
||||||
|
"Cannot compile structure. Disabing compiler.", e, uncompiled);
|
||||||
|
} else {
|
||||||
|
System.err.println("Exception occured in structure compiler: ");
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// We'll also return the new structure modifier
|
// We'll also return the new structure modifier
|
||||||
return modifier;
|
return modifier;
|
||||||
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
} catch (RejectedExecutionException e) {
|
} catch (RejectedExecutionException e) {
|
||||||
|
In neuem Issue referenzieren
Einen Benutzer sperren