link start!
This commit is contained in:
@@ -0,0 +1,56 @@
|
||||
/*
|
||||
* Decompiled with CFR 0.152.
|
||||
*/
|
||||
package com.tridium.sys.station;
|
||||
|
||||
import com.tridium.sys.station.Station;
|
||||
import javax.baja.job.BSimpleJob;
|
||||
import javax.baja.sys.BIcon;
|
||||
import javax.baja.sys.Context;
|
||||
import javax.baja.sys.Sys;
|
||||
import javax.baja.sys.Type;
|
||||
|
||||
/*
|
||||
* Illegal identifiers - consider using --renameillegalidents true
|
||||
*/
|
||||
public class BStationSaveJob
|
||||
extends BSimpleJob {
|
||||
public static final Type TYPE;
|
||||
private static final BIcon icon;
|
||||
static /* synthetic */ Class class$com$tridium$sys$station$BStationSaveJob;
|
||||
|
||||
public Type getType() {
|
||||
return TYPE;
|
||||
}
|
||||
|
||||
public void run(Context context) throws Exception {
|
||||
Station.saveSync(this);
|
||||
}
|
||||
|
||||
public BIcon getIcon() {
|
||||
return icon;
|
||||
}
|
||||
|
||||
static /* synthetic */ Class class(String string, boolean bl) {
|
||||
try {
|
||||
Class<?> clazz = Class.forName(string);
|
||||
if (!bl) {
|
||||
clazz = clazz.getComponentType();
|
||||
}
|
||||
return clazz;
|
||||
}
|
||||
catch (ClassNotFoundException classNotFoundException) {
|
||||
throw new NoClassDefFoundError(classNotFoundException.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
static {
|
||||
Class clazz = class$com$tridium$sys$station$BStationSaveJob;
|
||||
if (clazz == null) {
|
||||
clazz = class$com$tridium$sys$station$BStationSaveJob = BStationSaveJob.class("[Lcom.tridium.sys.station.BStationSaveJob;", false);
|
||||
}
|
||||
TYPE = Sys.loadType(clazz);
|
||||
icon = BIcon.std("save.png");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,96 @@
|
||||
/*
|
||||
* Decompiled with CFR 0.152.
|
||||
*/
|
||||
package com.tridium.sys.station;
|
||||
|
||||
import javax.baja.naming.OrdQuery;
|
||||
import javax.baja.naming.OrdQueryList;
|
||||
import javax.baja.naming.OrdTarget;
|
||||
import javax.baja.space.BComponentSpace;
|
||||
import javax.baja.space.BSpace;
|
||||
import javax.baja.space.BSpaceScheme;
|
||||
import javax.baja.sys.Sys;
|
||||
import javax.baja.sys.Type;
|
||||
|
||||
/*
|
||||
* Illegal identifiers - consider using --renameillegalidents true
|
||||
*/
|
||||
public class BStationScheme
|
||||
extends BSpaceScheme {
|
||||
static final StationQuery QUERY = new StationQuery();
|
||||
public static final BStationScheme INSTANCE = new BStationScheme("station");
|
||||
public static final Type TYPE;
|
||||
static /* synthetic */ Class class$com$tridium$sys$station$BStationScheme;
|
||||
|
||||
public OrdQuery parse(String string) {
|
||||
return QUERY;
|
||||
}
|
||||
|
||||
public Type getSpaceType() {
|
||||
return BComponentSpace.TYPE;
|
||||
}
|
||||
|
||||
public OrdTarget resolve(OrdTarget ordTarget, OrdQuery ordQuery, BSpace bSpace) {
|
||||
return new OrdTarget(ordTarget, (BComponentSpace)bSpace);
|
||||
}
|
||||
|
||||
public Type getType() {
|
||||
return TYPE;
|
||||
}
|
||||
|
||||
static /* synthetic */ Class class(String string, boolean bl) {
|
||||
try {
|
||||
Class<?> clazz = Class.forName(string);
|
||||
if (!bl) {
|
||||
clazz = clazz.getComponentType();
|
||||
}
|
||||
return clazz;
|
||||
}
|
||||
catch (ClassNotFoundException classNotFoundException) {
|
||||
throw new NoClassDefFoundError(classNotFoundException.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
private BStationScheme(String string) {
|
||||
super(string);
|
||||
}
|
||||
|
||||
static {
|
||||
Class clazz = class$com$tridium$sys$station$BStationScheme;
|
||||
if (clazz == null) {
|
||||
clazz = class$com$tridium$sys$station$BStationScheme = BStationScheme.class("[Lcom.tridium.sys.station.BStationScheme;", false);
|
||||
}
|
||||
TYPE = Sys.loadType(clazz);
|
||||
}
|
||||
|
||||
static class StationQuery
|
||||
implements OrdQuery {
|
||||
public boolean isHost() {
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean isSession() {
|
||||
return false;
|
||||
}
|
||||
|
||||
public void normalize(OrdQueryList ordQueryList, int n) {
|
||||
ordQueryList.shiftToSession(n);
|
||||
}
|
||||
|
||||
public String getScheme() {
|
||||
return "station";
|
||||
}
|
||||
|
||||
public String getBody() {
|
||||
return "";
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
return "station:";
|
||||
}
|
||||
|
||||
StationQuery() {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,883 @@
|
||||
/*
|
||||
* Decompiled with CFR 0.152.
|
||||
*
|
||||
* Could not load the following classes:
|
||||
* com.tridium.nre.util.FileLock
|
||||
* com.tridium.nre.util.FileLockException
|
||||
* javax.baja.nre.util.Array
|
||||
*/
|
||||
package com.tridium.sys.station;
|
||||
|
||||
import com.tridium.dataRecovery.BDataRecoveryComponentRecorder;
|
||||
import com.tridium.nre.util.FileLock;
|
||||
import com.tridium.nre.util.FileLockException;
|
||||
import com.tridium.sys.Console;
|
||||
import com.tridium.sys.Nre;
|
||||
import com.tridium.sys.station.BStationSaveJob;
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.DataInputStream;
|
||||
import java.io.DataOutputStream;
|
||||
import java.io.File;
|
||||
import java.io.FilenameFilter;
|
||||
import java.io.IOException;
|
||||
import javax.baja.agent.AgentFilter;
|
||||
import javax.baja.category.BCategoryMask;
|
||||
import javax.baja.dataRecovery.BIDataRecoveryService;
|
||||
import javax.baja.dataRecovery.DataRecoveryServiceInFaultException;
|
||||
import javax.baja.file.FileUtil;
|
||||
import javax.baja.io.ValueDocDecoder;
|
||||
import javax.baja.io.ValueDocEncoder;
|
||||
import javax.baja.job.BJob;
|
||||
import javax.baja.job.JobCancelException;
|
||||
import javax.baja.license.Feature;
|
||||
import javax.baja.license.LicenseException;
|
||||
import javax.baja.log.Log;
|
||||
import javax.baja.naming.BLocalHost;
|
||||
import javax.baja.naming.BOrd;
|
||||
import javax.baja.naming.SlotPath;
|
||||
import javax.baja.nre.util.Array;
|
||||
import javax.baja.space.BComponentSpace;
|
||||
import javax.baja.sys.BAbsTime;
|
||||
import javax.baja.sys.BComponent;
|
||||
import javax.baja.sys.BObject;
|
||||
import javax.baja.sys.BRelTime;
|
||||
import javax.baja.sys.BStation;
|
||||
import javax.baja.sys.BString;
|
||||
import javax.baja.sys.BValue;
|
||||
import javax.baja.sys.Clock;
|
||||
import javax.baja.sys.Context;
|
||||
import javax.baja.sys.ModuleNotFoundException;
|
||||
import javax.baja.sys.ServiceNotFoundException;
|
||||
import javax.baja.sys.Sys;
|
||||
import javax.baja.sys.Type;
|
||||
import javax.baja.util.LexiconText;
|
||||
import javax.baja.util.Version;
|
||||
|
||||
/*
|
||||
* Illegal identifiers - consider using --renameillegalidents true
|
||||
*/
|
||||
public final class Station {
|
||||
static byte[] noPayload = new byte[0];
|
||||
public static final int ERROR = -1;
|
||||
public static final int ERROR_INVALID_USAGE = -2;
|
||||
public static final int ERROR_INVALID_LICENSE = -3;
|
||||
public static final int ERROR_BOG_NOT_FOUND = -4;
|
||||
public static final int ERROR_CANNOT_LOAD_BOG = -5;
|
||||
public static final String FAULT_LOW_HEAP = "stationFault.lowHeap";
|
||||
public static final String FAULT_LOW_MEMORY = "stationFault.lowSystemMemory";
|
||||
public static final String FAULT_RAM_DISK_SPACE = "stationFault.ramDiskSpace";
|
||||
public static final String FAULT_DISK_SPACE = "stationFault.diskSpace";
|
||||
public static final String FAULT_FD_USAGE = "stationFault.fdUsage";
|
||||
public static final String FAULT_FILE_USAGE = "stationFault.fileUsage";
|
||||
public static final String FAULT_RESOURCE_LIMIT = "stationFault.resourceLimit";
|
||||
public static final String FAULT_DEMO_ONLY = "stationFault.demoOnly";
|
||||
public static final String FAULT_DATA_RECOVERY_SAVE = "stationFault.dataRecoverySave";
|
||||
public static final String FAULT_FACTORY_DEFAULT_CREDENTIALS = "stationFault.factoryDefaultCredentials";
|
||||
public static final Log log = Log.getLog("sys");
|
||||
public static BComponentSpace space;
|
||||
public static BStation station;
|
||||
public static File bootFile;
|
||||
public static Console console;
|
||||
public static BAbsTime lastSuccessfulSaveTime;
|
||||
public static long lastSuccessfulSaveTicks;
|
||||
public static long lastSaveAttemptTicks;
|
||||
public static long lastSaveSpan;
|
||||
public static boolean inSave;
|
||||
public static File lastSaveFile;
|
||||
public static boolean atSteadyState;
|
||||
public static FileLock bootFileLock;
|
||||
public static final Object saveLock;
|
||||
public static boolean stationStarted;
|
||||
static Array saveListeners;
|
||||
static Array remoteListeners;
|
||||
static String stationFault;
|
||||
static boolean demoOnly;
|
||||
static final Object restoreLock;
|
||||
static boolean restoreComplete;
|
||||
static boolean saveAfterRestore;
|
||||
static /* synthetic */ Class class$com$tridium$sys$station$Station$SaveListener;
|
||||
static /* synthetic */ Class class$com$tridium$sys$station$Station$RemoteListener;
|
||||
static /* synthetic */ Class class$javax$baja$sys$Type;
|
||||
|
||||
/*
|
||||
* WARNING - Removed try catching itself - possible behaviour change.
|
||||
* Enabled aggressive block sorting
|
||||
* Enabled unnecessary exception pruning
|
||||
* Enabled aggressive exception aggregation
|
||||
*/
|
||||
static final void bootStation(File file) throws Exception {
|
||||
console = new Console();
|
||||
console.start();
|
||||
bootFileLock = FileLock.lock((File)file);
|
||||
Nre.engineManager.suspend();
|
||||
atSteadyState = false;
|
||||
Station.loadStation(file);
|
||||
Nre.loadPlatform();
|
||||
Station.checkLicense();
|
||||
Station.initDataRecoveryService();
|
||||
Station.initServices();
|
||||
space.fw(105, Boolean.FALSE, null, null, null);
|
||||
Station.startStation();
|
||||
Object object = restoreLock;
|
||||
synchronized (object) {
|
||||
restoreComplete = true;
|
||||
}
|
||||
System.gc();
|
||||
Nre.engineManager.resume();
|
||||
console.ready();
|
||||
if (saveAfterRestore) {
|
||||
Station.saveAsync(null);
|
||||
}
|
||||
Station.waitForSteadyState();
|
||||
Nre.stationManager.start();
|
||||
Nre.resourceManager.start();
|
||||
Nre.metricsRecount.start();
|
||||
}
|
||||
|
||||
static final void loadStation(File file) throws Exception {
|
||||
try {
|
||||
String string;
|
||||
long l = Clock.ticks();
|
||||
log.message("Loading \"" + file + "\"...");
|
||||
if (!file.exists()) {
|
||||
throw new Exception(file.getPath() + " file does not exist, can not load station");
|
||||
}
|
||||
if (file.length() == 0L) {
|
||||
throw new Exception(file.getPath() + " file is empty, can not load station");
|
||||
}
|
||||
ValueDocDecoder valueDocDecoder = new ValueDocDecoder(file);
|
||||
valueDocDecoder.setTypeResolver(Nre.registryManager.typeResolver);
|
||||
BValue bValue = valueDocDecoder.decodeDocument();
|
||||
if (!(bValue instanceof BStation)) {
|
||||
throw new Exception("The config.bog contains " + bValue.getType() + ", not baja:Station");
|
||||
}
|
||||
station = (BStation)bValue;
|
||||
if (valueDocDecoder.getWarningCount() > 0) {
|
||||
System.out.println("###########################################################################");
|
||||
System.out.println("#");
|
||||
System.out.println("# WARNING: \"config.bog\" contains " + valueDocDecoder.getWarningCount() + " warnings");
|
||||
System.out.println("#");
|
||||
System.out.println("###########################################################################");
|
||||
}
|
||||
if (!SlotPath.isValidName(string = Nre.stationHome.getName())) {
|
||||
throw new Exception("Invalid station name \"" + string + '\"');
|
||||
}
|
||||
station.setStationName(string);
|
||||
if (station.getCategoryMask().isNull()) {
|
||||
station.setCategoryMask(BCategoryMask.make("1"), null);
|
||||
}
|
||||
space = new BComponentSpace("station", LexiconText.make("baja", "nav.station"), BOrd.make("station:"));
|
||||
space.fw(105, Boolean.TRUE, null, null, null);
|
||||
BLocalHost.INSTANCE.addNavChild(space);
|
||||
space.setRootComponent(station);
|
||||
long l2 = Clock.ticks();
|
||||
log.message("Loaded (" + (l2 - l) + "ms)");
|
||||
}
|
||||
catch (Throwable throwable) {
|
||||
log.error("Cannot load station", throwable);
|
||||
System.exit(-5);
|
||||
}
|
||||
}
|
||||
|
||||
static final void checkLicense() throws Exception {
|
||||
try {
|
||||
Feature feature = Sys.getLicenseManager().checkFeature("tridium", "station");
|
||||
Nre.resourceManager.checkLicense(feature);
|
||||
demoOnly = feature.getb("demoOnly", false);
|
||||
if (demoOnly) {
|
||||
stationFault = FAULT_DEMO_ONLY;
|
||||
}
|
||||
}
|
||||
catch (LicenseException licenseException) {
|
||||
log.error("Not licensed: " + licenseException);
|
||||
Nre.licenseManager.dump();
|
||||
System.out.println();
|
||||
System.out.println("########################################");
|
||||
System.out.println("# FATAL: Not licensed to run a station #");
|
||||
System.out.println("########################################");
|
||||
System.exit(-3);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* WARNING - Removed back jump from a try to a catch block - possible behaviour change.
|
||||
* Enabled aggressive block sorting
|
||||
* Enabled unnecessary exception pruning
|
||||
* Enabled aggressive exception aggregation
|
||||
*/
|
||||
static final void initDataRecoveryService() throws Exception {
|
||||
long l;
|
||||
block11: {
|
||||
l = Clock.ticks();
|
||||
BIDataRecoveryService bIDataRecoveryService = null;
|
||||
try {
|
||||
bIDataRecoveryService = (BIDataRecoveryService)((Object)Nre.serviceManager.getService("baja:IDataRecoveryService"));
|
||||
if (!bIDataRecoveryService.isEnabled()) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
catch (ServiceNotFoundException serviceNotFoundException) {
|
||||
return;
|
||||
}
|
||||
if (bIDataRecoveryService == null) return;
|
||||
BDataRecoveryComponentRecorder bDataRecoveryComponentRecorder = (BDataRecoveryComponentRecorder)((BObject)((Object)bIDataRecoveryService)).getAgents().filter(AgentFilter.is(BDataRecoveryComponentRecorder.TYPE)).getDefault().getInstance();
|
||||
bDataRecoveryComponentRecorder.setDataRecoveryService(bIDataRecoveryService);
|
||||
space.fw(1002, bDataRecoveryComponentRecorder, null, null, null);
|
||||
boolean bl = false;
|
||||
try {
|
||||
Nre.serviceManager.initDataRecoverySourceServices(bIDataRecoveryService);
|
||||
bl = true;
|
||||
try {
|
||||
bIDataRecoveryService = Nre.serviceManager.startDataRecoveryService();
|
||||
bDataRecoveryComponentRecorder.setDataRecoveryService(bIDataRecoveryService);
|
||||
boolean bl2 = false;
|
||||
if (saveAfterRestore || bIDataRecoveryService.hasRecoveryData()) {
|
||||
bl2 = true;
|
||||
}
|
||||
saveAfterRestore = bl2;
|
||||
}
|
||||
catch (DataRecoveryServiceInFaultException dataRecoveryServiceInFaultException) {
|
||||
bl = false;
|
||||
log.warning("DataRecoveryService in fault, could not restore recovery data (if any existed). Data recovery component recording not started.", dataRecoveryServiceInFaultException);
|
||||
}
|
||||
catch (Throwable throwable) {
|
||||
log.error("Error during restoration by the DataRecoveryService. Some recovery data may not be restored for service " + bIDataRecoveryService, throwable);
|
||||
}
|
||||
}
|
||||
catch (Throwable throwable) {
|
||||
Object var6_10 = null;
|
||||
space.fw(1002, null, null, null, null);
|
||||
throw throwable;
|
||||
}
|
||||
{
|
||||
Object var6_11 = null;
|
||||
space.fw(1002, null, null, null, null);
|
||||
}
|
||||
{
|
||||
if (!bl) break block11;
|
||||
Nre.serviceManager.addDataRecoveryComponentRecorder(bIDataRecoveryService, bDataRecoveryComponentRecorder);
|
||||
}
|
||||
}
|
||||
long l2 = Clock.ticks();
|
||||
log.message("DataRecoveryService restoration check complete (" + (l2 - l) + "ms)");
|
||||
}
|
||||
|
||||
static final void initServices() throws Exception {
|
||||
long l = Clock.ticks();
|
||||
Nre.serviceManager.startAllServices();
|
||||
long l2 = Clock.ticks();
|
||||
log.message("Services Initialized (" + (l2 - l) + "ms)");
|
||||
}
|
||||
|
||||
static final void startStation() throws Exception {
|
||||
long l = Clock.ticks();
|
||||
station.start();
|
||||
stationStarted = true;
|
||||
try {
|
||||
Nre.getPlatform().stationStarted();
|
||||
}
|
||||
catch (Throwable throwable) {
|
||||
throwable.printStackTrace();
|
||||
}
|
||||
Nre.engineManager.stationStarted(station);
|
||||
long l2 = Clock.ticks();
|
||||
log.message("Niagara Runtime Environment: " + Sys.getBajaModule().getVendorVersion());
|
||||
log.message("*** Station Started (" + (l2 - l) + "ms) [" + (System.currentTimeMillis() - Nre.bootTime) + "ms total] ***");
|
||||
}
|
||||
|
||||
static final void waitForSteadyState() throws Exception {
|
||||
int n = Integer.getInteger("niagara.steadystate", 10000);
|
||||
Thread.sleep(n);
|
||||
atSteadyState = true;
|
||||
log.trace("At Steady State (" + n + "ms)");
|
||||
Nre.engineManager.atSteadyState(station);
|
||||
}
|
||||
|
||||
public static final void shutdown(boolean bl) throws Exception {
|
||||
Station.saveSync();
|
||||
try {
|
||||
BIDataRecoveryService bIDataRecoveryService = Nre.serviceManager.getActiveDataRecoveryService();
|
||||
if (bIDataRecoveryService != null) {
|
||||
bIDataRecoveryService.shutdownStarted();
|
||||
}
|
||||
}
|
||||
catch (Throwable throwable) {
|
||||
log.warning("Could not notify DataRecoveryService of pending station shutdown", throwable);
|
||||
}
|
||||
Nre.stationManager.kill();
|
||||
Station.stopStation();
|
||||
Station.stopServices();
|
||||
bootFileLock.unlock();
|
||||
log.message("*** Station shutdown ***");
|
||||
System.out.flush();
|
||||
if (bl) {
|
||||
System.exit(0);
|
||||
}
|
||||
}
|
||||
|
||||
static final void stopStation() throws Exception {
|
||||
station.stop();
|
||||
log.message("Station stopped");
|
||||
}
|
||||
|
||||
static final void stopServices() throws Exception {
|
||||
Nre.serviceManager.stopAllServices();
|
||||
log.message("Services stopped");
|
||||
}
|
||||
|
||||
public static final String getStationFault() {
|
||||
return stationFault;
|
||||
}
|
||||
|
||||
public static final void setStationFault(String string) {
|
||||
if (BString.equals(stationFault, string)) {
|
||||
return;
|
||||
}
|
||||
stationFault = demoOnly && string == null ? FAULT_DEMO_ONLY : string;
|
||||
Station.broadcastStationFault();
|
||||
}
|
||||
|
||||
public static final void broadcastStationFault() {
|
||||
byte[] byArray = stationFault == null ? new byte[]{} : stationFault.getBytes();
|
||||
Station.fireRemoteEvent(new Message("stationFault", byArray));
|
||||
}
|
||||
|
||||
public static final File[] getBackups() {
|
||||
try {
|
||||
return FileUtil.getBackups(Sys.getStationHome(), "config");
|
||||
}
|
||||
catch (Throwable throwable) {
|
||||
throwable.printStackTrace();
|
||||
return new File[0];
|
||||
}
|
||||
}
|
||||
|
||||
public static final File renameToBackup(File file) {
|
||||
try {
|
||||
return FileUtil.renameToBackup(file, Nre.getPlatform().getStationSaveBackupCount());
|
||||
}
|
||||
catch (Throwable throwable) {
|
||||
throwable.printStackTrace();
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* WARNING - Removed try catching itself - possible behaviour change.
|
||||
* Enabled aggressive block sorting
|
||||
* Enabled unnecessary exception pruning
|
||||
* Enabled aggressive exception aggregation
|
||||
*/
|
||||
public static final void saveAsync(Context context) throws Exception {
|
||||
if (station == null) {
|
||||
throw new IllegalStateException("System not booted as station");
|
||||
}
|
||||
if (inSave) {
|
||||
return;
|
||||
}
|
||||
Object object = restoreLock;
|
||||
synchronized (object) {
|
||||
if (!restoreComplete) {
|
||||
saveAfterRestore = true;
|
||||
return;
|
||||
}
|
||||
}
|
||||
try {
|
||||
new BStationSaveJob().submit(context);
|
||||
return;
|
||||
}
|
||||
catch (ServiceNotFoundException serviceNotFoundException) {
|
||||
log.error("Missing JobService");
|
||||
Station.saveSync();
|
||||
}
|
||||
}
|
||||
|
||||
public static final void saveSync() throws Exception {
|
||||
Station.saveSync(new BStationSaveJob());
|
||||
}
|
||||
|
||||
public static final void saveSync(BJob bJob) throws Exception {
|
||||
Station.saveSync(bJob, 100);
|
||||
}
|
||||
|
||||
/*
|
||||
* WARNING - Removed try catching itself - possible behaviour change.
|
||||
* WARNING - Removed back jump from a try to a catch block - possible behaviour change.
|
||||
* Unable to fully structure code
|
||||
* Enabled aggressive block sorting
|
||||
* Enabled unnecessary exception pruning
|
||||
* Enabled aggressive exception aggregation
|
||||
*/
|
||||
public static final void saveSync(BJob var0, int var1_1) throws Exception {
|
||||
var2_2 = var0.log();
|
||||
var3_3 = null;
|
||||
var4_4 = new SaveListener[]{};
|
||||
Station.log.message("Saving station...");
|
||||
var2_2.start("Saving station...");
|
||||
var5_5 = Station.saveLock;
|
||||
synchronized (var5_5) {
|
||||
Station.inSave = true;
|
||||
try {
|
||||
block18: {
|
||||
try {
|
||||
block17: {
|
||||
try {
|
||||
var3_3 = Nre.serviceManager.getServices("baja:IDataRecoveryService");
|
||||
}
|
||||
catch (ServiceNotFoundException var9_6) {
|
||||
var3_3 = null;
|
||||
}
|
||||
if (var3_3 != null) {
|
||||
var9_7 = 0;
|
||||
while (var9_7 < var3_3.length) {
|
||||
((BIDataRecoveryService)var3_3[var9_7]).saveStarted();
|
||||
++var9_7;
|
||||
}
|
||||
}
|
||||
var9_8 = new File(Nre.stationHome, "config.bog");
|
||||
var10_10 = new File(var9_8 + ".working");
|
||||
Station.lastSaveAttemptTicks = var11_12 = Clock.ticks();
|
||||
var2_2.start("Write working to " + var10_10);
|
||||
var13_13 = new StationEncoder(var10_10, var0, var1_1);
|
||||
var13_13.setZipped(true);
|
||||
var13_13.encodeDocument(Station.station);
|
||||
var13_13.close();
|
||||
var2_2.endSuccess();
|
||||
var2_2.start("Make backup");
|
||||
var14_14 = Station.renameToBackup(var9_8);
|
||||
var2_2.endSuccess("" + var14_14);
|
||||
var2_2.start("Rename working to " + var9_8);
|
||||
var10_10.renameTo(var9_8);
|
||||
var2_2.endSuccess();
|
||||
var4_4 = Station.getSaveListeners();
|
||||
var15_15 = 0;
|
||||
while (true) {
|
||||
if (var15_15 >= var4_4.length) {
|
||||
System.gc();
|
||||
Station.saveOk(var4_4);
|
||||
if (var3_3 != null) {
|
||||
var15_15 = 0;
|
||||
break;
|
||||
}
|
||||
break block17;
|
||||
}
|
||||
var16_17 = var4_4[var15_15];
|
||||
var2_2.start("Save " + var16_17);
|
||||
var16_17.stationSave();
|
||||
var2_2.endSuccess();
|
||||
++var15_15;
|
||||
}
|
||||
while (var15_15 < var3_3.length) {
|
||||
((BIDataRecoveryService)var3_3[var15_15]).saveFinished();
|
||||
++var15_15;
|
||||
}
|
||||
}
|
||||
var15_16 = Clock.ticks();
|
||||
Station.lastSaveFile = var9_8;
|
||||
Station.lastSuccessfulSaveTicks = var15_16;
|
||||
Station.lastSaveSpan = var15_16 - var11_12;
|
||||
Station.lastSuccessfulSaveTime = Clock.time();
|
||||
Station.log.message("Saved " + var9_8 + " (" + Station.lastSaveSpan + "ms)");
|
||||
var2_2.success("Saved " + Station.lastSaveSpan + "ms");
|
||||
var0.progress(var1_1);
|
||||
** GOTO lbl-1000
|
||||
}
|
||||
catch (Exception var9_9) {
|
||||
Station.log.error("Save failed", var9_9);
|
||||
Station.saveFail(var4_4, var9_9.toString());
|
||||
if (var3_3 == null) break block18;
|
||||
var10_11 = 0;
|
||||
}
|
||||
while (var10_11 < var3_3.length) {
|
||||
((BIDataRecoveryService)var3_3[var10_11]).saveFailed(var9_9);
|
||||
++var10_11;
|
||||
}
|
||||
}
|
||||
throw var9_9;
|
||||
}
|
||||
catch (Throwable var7_18) {
|
||||
var8_19 = null;
|
||||
Station.inSave = false;
|
||||
throw var7_18;
|
||||
}
|
||||
lbl-1000:
|
||||
// 1 sources
|
||||
|
||||
{
|
||||
var8_20 = null;
|
||||
Station.inSave = false;
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
private static final void saveOk(SaveListener[] saveListenerArray) {
|
||||
if (saveListenerArray == null) {
|
||||
return;
|
||||
}
|
||||
int n = 0;
|
||||
while (n < saveListenerArray.length) {
|
||||
try {
|
||||
saveListenerArray[n].stationSaveOk();
|
||||
}
|
||||
catch (Throwable throwable) {
|
||||
throwable.printStackTrace();
|
||||
}
|
||||
++n;
|
||||
}
|
||||
}
|
||||
|
||||
private static final void saveFail(SaveListener[] saveListenerArray, String string) {
|
||||
if (saveListenerArray == null) {
|
||||
return;
|
||||
}
|
||||
int n = 0;
|
||||
while (n < saveListenerArray.length) {
|
||||
try {
|
||||
saveListenerArray[n].stationSaveFail(string);
|
||||
}
|
||||
catch (Throwable throwable) {
|
||||
throwable.printStackTrace();
|
||||
}
|
||||
++n;
|
||||
}
|
||||
}
|
||||
|
||||
public static final String getLastSaveDurationString() {
|
||||
long l = lastSuccessfulSaveTicks;
|
||||
if (l == 0L) {
|
||||
return "null";
|
||||
}
|
||||
return BRelTime.toString(Clock.ticks() - l) + " ago";
|
||||
}
|
||||
|
||||
private static final void checkForWorkingFile(File file) throws IOException {
|
||||
if (file.exists()) {
|
||||
return;
|
||||
}
|
||||
File file2 = new File(file.getCanonicalPath() + ".working");
|
||||
if (file2.exists()) {
|
||||
file2.renameTo(file);
|
||||
}
|
||||
}
|
||||
|
||||
public static final void broadcastStationMixIns() {
|
||||
try {
|
||||
Type[] typeArray = space.getEnabledMixIns();
|
||||
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
|
||||
DataOutputStream dataOutputStream = new DataOutputStream(byteArrayOutputStream);
|
||||
dataOutputStream.writeInt(0);
|
||||
dataOutputStream.writeInt(typeArray.length);
|
||||
int n = 0;
|
||||
while (n < typeArray.length) {
|
||||
dataOutputStream.writeUTF(typeArray[n].toString());
|
||||
++n;
|
||||
}
|
||||
Station.fireRemoteEvent(new Message("mixIns", byteArrayOutputStream.toByteArray()));
|
||||
}
|
||||
catch (Throwable throwable) {
|
||||
throwable.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
public static final Type[] decodeMixIns(byte[] byArray) throws Exception {
|
||||
Class clazz = class$javax$baja$sys$Type;
|
||||
if (clazz == null) {
|
||||
clazz = class$javax$baja$sys$Type = Station.class("[Ljavax.baja.sys.Type;", false);
|
||||
}
|
||||
Array array = new Array(clazz);
|
||||
DataInputStream dataInputStream = new DataInputStream(new ByteArrayInputStream(byArray));
|
||||
int n = dataInputStream.readInt();
|
||||
int n2 = dataInputStream.readInt();
|
||||
int n3 = 0;
|
||||
while (n3 < n2) {
|
||||
String string = dataInputStream.readUTF();
|
||||
try {
|
||||
array.add((Object)Sys.getType(string));
|
||||
}
|
||||
catch (Exception exception) {
|
||||
System.out.println("WARNING: No local type for MixIn " + string);
|
||||
System.out.println(" " + exception);
|
||||
}
|
||||
++n3;
|
||||
}
|
||||
return (Type[])array.trim();
|
||||
}
|
||||
|
||||
public static final void fireRemoteEvent(Message message) {
|
||||
RemoteListener[] remoteListenerArray = Station.getRemoteListeners();
|
||||
int n = 0;
|
||||
while (n < remoteListenerArray.length) {
|
||||
try {
|
||||
remoteListenerArray[n].stationEvent(message);
|
||||
}
|
||||
catch (Exception exception) {
|
||||
exception.printStackTrace();
|
||||
}
|
||||
++n;
|
||||
}
|
||||
}
|
||||
|
||||
public static final Message remoteCall(Message message) throws Exception {
|
||||
String string = message.id;
|
||||
if (string.equals("resource.update")) {
|
||||
Nre.resourceManager.update();
|
||||
return null;
|
||||
}
|
||||
if (string.equals("resource.report")) {
|
||||
return Nre.resourceManager.report(message);
|
||||
}
|
||||
if (string.equals("module.version")) {
|
||||
try {
|
||||
return new Message(message.id, Sys.getRegistry().getModule(new String(message.payload)).getVendorVersion().toString().getBytes());
|
||||
}
|
||||
catch (ModuleNotFoundException moduleNotFoundException) {
|
||||
return new Message(message.id, Version.NULL.toString().getBytes());
|
||||
}
|
||||
}
|
||||
throw new Exception("Unknown call: " + string);
|
||||
}
|
||||
|
||||
/*
|
||||
* WARNING - Removed try catching itself - possible behaviour change.
|
||||
* Enabled aggressive block sorting
|
||||
* Enabled unnecessary exception pruning
|
||||
* Enabled aggressive exception aggregation
|
||||
*/
|
||||
public static final RemoteListener[] getRemoteListeners() {
|
||||
Array array = remoteListeners;
|
||||
synchronized (array) {
|
||||
return (RemoteListener[])remoteListeners.trim();
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* WARNING - Removed try catching itself - possible behaviour change.
|
||||
* Enabled aggressive block sorting
|
||||
* Enabled unnecessary exception pruning
|
||||
* Enabled aggressive exception aggregation
|
||||
*/
|
||||
public static final void addRemoteListener(RemoteListener remoteListener) {
|
||||
Array array = remoteListeners;
|
||||
synchronized (array) {
|
||||
remoteListeners.add((Object)remoteListener);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* WARNING - Removed try catching itself - possible behaviour change.
|
||||
* Enabled aggressive block sorting
|
||||
* Enabled unnecessary exception pruning
|
||||
* Enabled aggressive exception aggregation
|
||||
*/
|
||||
public static final void removeRemoteListener(RemoteListener remoteListener) {
|
||||
Array array = remoteListeners;
|
||||
synchronized (array) {
|
||||
remoteListeners.remove((Object)remoteListener);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* WARNING - Removed try catching itself - possible behaviour change.
|
||||
* Enabled aggressive block sorting
|
||||
* Enabled unnecessary exception pruning
|
||||
* Enabled aggressive exception aggregation
|
||||
*/
|
||||
public static final SaveListener[] getSaveListeners() {
|
||||
Array array = saveListeners;
|
||||
synchronized (array) {
|
||||
return (SaveListener[])saveListeners.trim();
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* WARNING - Removed try catching itself - possible behaviour change.
|
||||
* Enabled aggressive block sorting
|
||||
* Enabled unnecessary exception pruning
|
||||
* Enabled aggressive exception aggregation
|
||||
*/
|
||||
public static final void addSaveListener(SaveListener saveListener) {
|
||||
Array array = saveListeners;
|
||||
synchronized (array) {
|
||||
saveListeners.add((Object)saveListener);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* WARNING - Removed try catching itself - possible behaviour change.
|
||||
* Enabled aggressive block sorting
|
||||
* Enabled unnecessary exception pruning
|
||||
* Enabled aggressive exception aggregation
|
||||
*/
|
||||
public static final void removeSaveListener(SaveListener saveListener) {
|
||||
Array array = saveListeners;
|
||||
synchronized (array) {
|
||||
saveListeners.remove((Object)saveListener);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
public static final void usage() {
|
||||
Station.println("");
|
||||
Station.println("usage:");
|
||||
Station.println(" station [nreOptions] <project> [stationOptions]");
|
||||
Station.println("parameters:");
|
||||
Station.println(" project station database containing 'config.xxx'");
|
||||
Station.println("nreOptions:");
|
||||
Station.println(" -locale:<x> set the default locale (en_US)");
|
||||
Station.println("stationOptions:");
|
||||
Station.println(" -bootFile:<x> use the specified file in project dir to boot station");
|
||||
}
|
||||
|
||||
static final void println(String string) {
|
||||
System.out.println(string);
|
||||
}
|
||||
|
||||
public static final void main(String[] stringArray) throws Exception {
|
||||
CharSequence charSequence;
|
||||
if (stringArray.length < 1) {
|
||||
Station.usage();
|
||||
System.exit(-2);
|
||||
}
|
||||
if (!Nre.stationHome.exists() || !Nre.stationHome.isDirectory()) {
|
||||
log.error("FATAL: Station directory not found: " + Nre.stationHome);
|
||||
System.exit(-4);
|
||||
}
|
||||
final String string = Nre.args.parameters[1];
|
||||
File[] fileArray = Nre.stationHome.getParentFile().listFiles(new FilenameFilter(){
|
||||
|
||||
public final boolean accept(File file, String string2) {
|
||||
return string2.equalsIgnoreCase(string);
|
||||
}
|
||||
});
|
||||
if (1 == fileArray.length && !fileArray[0].getName().equals(string)) {
|
||||
charSequence = new StringBuffer().append("\n###########################################################################\n").append("# Could not find an exact match for given station name: ").append(string).append("\n").append("# Using station '").append(fileArray[0].getName()).append("' since it is a case insensitive match.").append("\n###########################################################################\n");
|
||||
log.warning(((StringBuffer)charSequence).toString());
|
||||
Nre.stationHome = fileArray[0];
|
||||
}
|
||||
if ((charSequence = Nre.args.getOption("bootFile")) != null) {
|
||||
bootFile = new File(Nre.stationHome, (String)charSequence);
|
||||
Station.checkForWorkingFile(bootFile);
|
||||
if (!bootFile.exists()) {
|
||||
log.error("FATAL: Station database not found: " + bootFile);
|
||||
System.exit(-4);
|
||||
}
|
||||
} else {
|
||||
File file = new File(Nre.stationHome, "config.bog");
|
||||
Station.checkForWorkingFile(file);
|
||||
if (!file.exists()) {
|
||||
log.error("FATAL: Station database not found: " + file);
|
||||
System.exit(-4);
|
||||
}
|
||||
bootFile = file;
|
||||
}
|
||||
try {
|
||||
Station.bootStation(bootFile);
|
||||
}
|
||||
catch (FileLockException fileLockException) {
|
||||
log.error("FATAL: Station " + Nre.stationHome.getName() + " failed, could not obtain lock on station bootfile \"" + bootFile.getName() + "\":\n", fileLockException);
|
||||
System.exit(-1);
|
||||
}
|
||||
catch (Exception exception) {
|
||||
log.error("FATAL: Station " + Nre.stationHome.getName() + " failed to boot", exception);
|
||||
System.exit(-1);
|
||||
}
|
||||
}
|
||||
|
||||
static /* synthetic */ Class class(String string, boolean bl) {
|
||||
try {
|
||||
Class<?> clazz = Class.forName(string);
|
||||
if (!bl) {
|
||||
clazz = clazz.getComponentType();
|
||||
}
|
||||
return clazz;
|
||||
}
|
||||
catch (ClassNotFoundException classNotFoundException) {
|
||||
throw new NoClassDefFoundError(classNotFoundException.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
static {
|
||||
lastSuccessfulSaveTime = BAbsTime.NULL;
|
||||
lastSuccessfulSaveTicks = Clock.ticks();
|
||||
lastSaveAttemptTicks = Clock.ticks();
|
||||
atSteadyState = true;
|
||||
saveLock = new Object();
|
||||
stationStarted = false;
|
||||
Class clazz = class$com$tridium$sys$station$Station$SaveListener;
|
||||
if (clazz == null) {
|
||||
clazz = class$com$tridium$sys$station$Station$SaveListener = Station.class("[Lcom.tridium.sys.station.Station$SaveListener;", false);
|
||||
}
|
||||
saveListeners = new Array(clazz);
|
||||
Class clazz2 = class$com$tridium$sys$station$Station$RemoteListener;
|
||||
if (clazz2 == null) {
|
||||
clazz2 = class$com$tridium$sys$station$Station$RemoteListener = Station.class("[Lcom.tridium.sys.station.Station$RemoteListener;", false);
|
||||
}
|
||||
remoteListeners = new Array(clazz2);
|
||||
stationFault = null;
|
||||
demoOnly = false;
|
||||
restoreLock = new Object();
|
||||
restoreComplete = false;
|
||||
saveAfterRestore = false;
|
||||
}
|
||||
|
||||
public static class Message {
|
||||
public final String id;
|
||||
public final byte[] payload;
|
||||
|
||||
public Message(String string, byte[] byArray) {
|
||||
if (byArray == null) {
|
||||
byArray = noPayload;
|
||||
}
|
||||
this.id = string;
|
||||
this.payload = byArray;
|
||||
}
|
||||
}
|
||||
|
||||
public static interface SaveListener {
|
||||
public void stationSave() throws Exception;
|
||||
|
||||
public void stationSaveOk() throws Exception;
|
||||
|
||||
public void stationSaveFail(String var1) throws Exception;
|
||||
}
|
||||
|
||||
static class StationEncoder
|
||||
extends ValueDocEncoder {
|
||||
BJob job;
|
||||
int total;
|
||||
int count;
|
||||
double totalProgress;
|
||||
|
||||
protected void encodingComponent(BComponent bComponent) throws IOException {
|
||||
super.encodingComponent(bComponent);
|
||||
if (this.job == null) {
|
||||
return;
|
||||
}
|
||||
if (!this.job.isAlive() && this.job.isMounted()) {
|
||||
throw new JobCancelException();
|
||||
}
|
||||
++this.count;
|
||||
if (this.count % 10 == 0) {
|
||||
this.job.heartbeat();
|
||||
this.job.progress((int)((double)this.count / (double)this.total * this.totalProgress));
|
||||
}
|
||||
}
|
||||
|
||||
StationEncoder(File file, BJob bJob, int n) throws Exception {
|
||||
super(file, Context.encrypt);
|
||||
this.job = bJob;
|
||||
this.totalProgress = n;
|
||||
this.total = station.getComponentSpace().getComponentCount();
|
||||
}
|
||||
}
|
||||
|
||||
public static interface RemoteListener {
|
||||
public void stationEvent(Message var1) throws Exception;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,145 @@
|
||||
/*
|
||||
* Decompiled with CFR 0.152.
|
||||
*/
|
||||
package com.tridium.sys.station;
|
||||
|
||||
import com.tridium.sys.BIPlatform;
|
||||
import com.tridium.sys.Nre;
|
||||
import com.tridium.sys.station.Station;
|
||||
import java.io.File;
|
||||
import javax.baja.spy.Spy;
|
||||
import javax.baja.spy.SpyDir;
|
||||
import javax.baja.spy.SpyWriter;
|
||||
import javax.baja.sys.BAbsTime;
|
||||
import javax.baja.sys.BRelTime;
|
||||
import javax.baja.sys.BStation;
|
||||
import javax.baja.sys.Clock;
|
||||
import javax.baja.sys.Sys;
|
||||
|
||||
/*
|
||||
* Illegal identifiers - consider using --renameillegalidents true
|
||||
*/
|
||||
public class StationManager
|
||||
extends Thread {
|
||||
boolean isAlive;
|
||||
|
||||
public void kill() {
|
||||
this.isAlive = false;
|
||||
this.interrupt();
|
||||
}
|
||||
|
||||
public void run() {
|
||||
while (this.isAlive) {
|
||||
try {
|
||||
Thread.sleep(60000L);
|
||||
BIPlatform bIPlatform = Nre.getPlatform();
|
||||
if (!bIPlatform.isStationAutoSaveEnabled()) continue;
|
||||
long l = bIPlatform.getStationAutoSaveFrequency();
|
||||
long l2 = Clock.ticks() - Station.lastSaveAttemptTicks;
|
||||
if (l2 <= l) continue;
|
||||
Sys.getStation().save();
|
||||
}
|
||||
catch (InterruptedException interruptedException) {
|
||||
}
|
||||
catch (Throwable throwable) {
|
||||
throwable.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void postInit() {
|
||||
IndexPage indexPage = new IndexPage();
|
||||
Nre.spySysManagers.add("stationManager", indexPage);
|
||||
indexPage.add("backups", new BackupPage());
|
||||
}
|
||||
|
||||
private final /* synthetic */ void this() {
|
||||
this.isAlive = true;
|
||||
}
|
||||
|
||||
public StationManager() {
|
||||
super("Nre:Station");
|
||||
this.this();
|
||||
}
|
||||
|
||||
/*
|
||||
* Illegal identifiers - consider using --renameillegalidents true
|
||||
*/
|
||||
public class IndexPage
|
||||
extends SpyDir {
|
||||
public void write(SpyWriter spyWriter) throws Exception {
|
||||
Object object;
|
||||
BStation bStation = Station.station;
|
||||
BIPlatform bIPlatform = Nre.getPlatform();
|
||||
if (bStation == null) {
|
||||
spyWriter.print("VM is not a station");
|
||||
return;
|
||||
}
|
||||
spyWriter.startProps("StationManager");
|
||||
spyWriter.prop((Object)"stationName", bStation.getStationName());
|
||||
spyWriter.prop((Object)"atSteadyState", Sys.atSteadyState());
|
||||
spyWriter.trTitle("Platform", 2);
|
||||
spyWriter.prop((Object)"type", bIPlatform.getType());
|
||||
spyWriter.prop((Object)"isFlashFileSystem", bIPlatform.isFlashFileSystem());
|
||||
spyWriter.prop((Object)"autoSaveEnabled", bIPlatform.isStationAutoSaveEnabled());
|
||||
spyWriter.prop((Object)"autoSaveFreq", bIPlatform.getStationAutoSaveFrequency() / 1000L + "sec");
|
||||
spyWriter.prop((Object)"saveBackupCount", bIPlatform.getStationSaveBackupCount());
|
||||
spyWriter.trTitle("Console", 2);
|
||||
spyWriter.prop((Object)"isAlive", Station.console.isAlive());
|
||||
spyWriter.prop((Object)"threadName", Station.console.getName());
|
||||
spyWriter.trTitle("Boot Debug", 2);
|
||||
spyWriter.prop((Object)"commandLine", Nre.commandLine);
|
||||
spyWriter.prop((Object)"bootFile", Station.bootFile);
|
||||
spyWriter.prop((Object)"bootTime", BAbsTime.make(Nre.bootTime));
|
||||
spyWriter.prop((Object)"bootFileLock", Station.bootFileLock);
|
||||
spyWriter.trTitle("Save Debug", 2);
|
||||
spyWriter.prop((Object)"lastSaveDuration", Station.getLastSaveDurationString());
|
||||
spyWriter.prop((Object)"lastSuccessfulSaveTime", Station.lastSuccessfulSaveTime);
|
||||
spyWriter.prop((Object)"lastSaveSpan", BRelTime.toString(Station.lastSaveSpan));
|
||||
spyWriter.prop((Object)"lastSaveFile", Station.lastSaveFile);
|
||||
spyWriter.prop((Object)"inSave", Station.inSave);
|
||||
spyWriter.trTitle("Backups", 2);
|
||||
spyWriter.prop((Object)"backups", "<a href='backups'>List Backups</a>");
|
||||
spyWriter.trTitle("SaveListeners", 2);
|
||||
int n = 0;
|
||||
while (n < Station.saveListeners.size()) {
|
||||
object = Station.saveListeners.get(n);
|
||||
spyWriter.prop((Object)object.getClass().getName(), object);
|
||||
++n;
|
||||
}
|
||||
spyWriter.trTitle("RemoteListeners", 2);
|
||||
n = 0;
|
||||
while (n < Station.remoteListeners.size()) {
|
||||
object = Station.remoteListeners.get(n);
|
||||
spyWriter.prop((Object)object.getClass().getName(), object);
|
||||
++n;
|
||||
}
|
||||
spyWriter.endProps();
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Illegal identifiers - consider using --renameillegalidents true
|
||||
*/
|
||||
public class BackupPage
|
||||
extends Spy {
|
||||
public void write(SpyWriter spyWriter) throws Exception {
|
||||
File[] fileArray = Station.getBackups();
|
||||
if (fileArray.length == 0) {
|
||||
spyWriter.w("No backup files available");
|
||||
return;
|
||||
}
|
||||
spyWriter.startTable(true);
|
||||
spyWriter.trTitle("Station Backups", 4);
|
||||
spyWriter.w("<tr>").th("Age").th("Name").th("Timestamp").th("Size").w("</tr>\n");
|
||||
int n = 0;
|
||||
while (n < fileArray.length) {
|
||||
File file = fileArray[n];
|
||||
spyWriter.tr("" + n, file.getName(), BAbsTime.make(file.lastModified()), file.length() / 1024L + "kb");
|
||||
++n;
|
||||
}
|
||||
spyWriter.endTable();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user