imToken v2.9.3版本的 MD5 值为:42af1a08a3f01f69d2f3782d81007b3c
以下内容为反编译后的 Dashboard.java 源代码,内容仅作参考
package com.subgraph.orchid.dashboard;
import com.subgraph.orchid.Threading;
import com.subgraph.orchid.data.IPv4Address;
import com.subgraph.orchid.misc.GuardedBy;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.Executor;
import java.util.logging.Logger;
public class Dashboard implements DashboardRenderable, DashboardRenderer {
private static final String DASHBOARD_PORT_PROPERTY = "com.subgraph.orchid.dashboard.port";
private static final int DEFAULT_FLAGS = 24;
private static final int DEFAULT_LISTENING_PORT = 12345;
private final Executor executor;
@GuardedBy("this")
private int flags = 24;
@GuardedBy("this")
private boolean isListening;
@GuardedBy("this")
private int listeningPort;
@GuardedBy("this")
private ServerSocket listeningSocket;
private final List<DashboardRenderable> renderables;
private static final Logger logger = Logger.getLogger(Dashboard.class.getName());
private static final IPv4Address LOCALHOST = IPv4Address.createFromString("127.0.0.1");
public Dashboard() {
CopyOnWriteArrayList copyOnWriteArrayList = new CopyOnWriteArrayList();
this.renderables = copyOnWriteArrayList;
copyOnWriteArrayList.add(this);
this.executor = Threading.newPool("Dashboard worker");
this.listeningPort = chooseListeningPort();
}
private static int chooseListeningPort() {
String property = System.getProperty(DASHBOARD_PORT_PROPERTY);
int parsePortProperty = parsePortProperty(property);
if (parsePortProperty > 0 && parsePortProperty <= 65535) {
return parsePortProperty;
}
if (property == null) {
return DEFAULT_LISTENING_PORT;
}
logger.warning("com.subgraph.orchid.dashboard.port was not a valid port value: " + property);
return DEFAULT_LISTENING_PORT;
}
private static int parsePortProperty(String str) {
if (str == null) {
return -1;
}
try {
return Integer.parseInt(str);
} catch (NumberFormatException unused) {
return -1;
}
}
public void addRenderables(Object... objArr) {
for (Object obj : objArr) {
if (obj instanceof DashboardRenderable) {
this.renderables.add((DashboardRenderable) obj);
}
}
}
public void addRenderable(DashboardRenderable dashboardRenderable) {
this.renderables.add(dashboardRenderable);
}
public synchronized void enableFlag(int i) {
this.flags = i | this.flags;
}
public synchronized void disableFlag(int i) {
this.flags = (~i) & this.flags;
}
public synchronized boolean isEnabled(int i) {
return (i & this.flags) != 0;
}
public synchronized void setListeningPort(int i) {
if (i != this.listeningPort) {
this.listeningPort = i;
if (this.isListening) {
stopListening();
startListening();
}
}
}
public boolean isEnabledByProperty() {
return System.getProperty(DASHBOARD_PORT_PROPERTY) != null;
}
public synchronized void startListening() {
if (this.isListening) {
return;
}
try {
this.listeningSocket = new ServerSocket(this.listeningPort, 50, LOCALHOST.toInetAddress());
this.isListening = true;
logger.info("Dashboard listening on " + LOCALHOST + ":" + this.listeningPort);
this.executor.execute(createAcceptLoopRunnable(this.listeningSocket));
} catch (IOException e) {
logger.warning("Failed to create listening Dashboard socket on port " + this.listeningPort + ": " + e);
}
}
public synchronized void stopListening() {
if (this.isListening) {
if (this.listeningSocket != null) {
closeQuietly(this.listeningSocket);
this.listeningSocket = null;
}
this.isListening = false;
}
}
public synchronized boolean isListening() {
return this.isListening;
}
private Runnable createAcceptLoopRunnable(final ServerSocket serverSocket) {
return new Runnable() {
@Override
public void run() {
Dashboard.this.acceptConnections(serverSocket);
}
};
}
public void acceptConnections(ServerSocket serverSocket) {
while (true) {
try {
this.executor.execute(new DashboardConnection(this, serverSocket.accept()));
} catch (IOException e) {
if (!serverSocket.isClosed()) {
logger.warning("IOException on dashboard server socket: " + e);
}
stopListening();
return;
}
}
}
public void renderAll(PrintWriter printWriter) throws IOException {
int i;
synchronized (this) {
i = this.flags;
}
Iterator<DashboardRenderable> it = this.renderables.iterator();
while (it.hasNext()) {
it.next().dashboardRender(this, printWriter, i);
}
}
private void closeQuietly(ServerSocket serverSocket) {
try {
serverSocket.close();
} catch (IOException unused) {
}
}
@Override
public void dashboardRender(DashboardRenderer dashboardRenderer, PrintWriter printWriter, int i) {
printWriter.println("[Dashboard]");
printWriter.println();
}
@Override
public void renderComponent(PrintWriter printWriter, int i, Object obj) throws IOException {
if (obj instanceof DashboardRenderable) {
((DashboardRenderable) obj).dashboardRender(this, printWriter, i);
}
}
}