public int loadAuctionsFromDatabase() { int totalCount = AuctionInfo.count(); int activeCount = AuctionEntry.activeCount(); MQFactory.getConcrete("splash").enqueue("WIDTH " + activeCount); MQFactory.getConcrete("splash").enqueue("SET 0"); AuctionServer newServer = AuctionServerManager.getInstance().getServer(); AuctionServerManager.setEntryManager(this); if (totalCount == 0) { if (JConfig.queryConfiguration("stats.auctions") == null) JConfig.setConfiguration("stats.auctions", "0"); return totalCount; } AuctionServerManager.getInstance().loadAuctionsFromDB(newServer); AuctionStats as = AuctionServerManager.getInstance().getStats(); // TODO -- Do something more valuable than just notify, when the auction counts are off. int savedCount = Integer.parseInt(JConfig.queryConfiguration("last.auctioncount", "-1")); if (as != null) { if (as.getCount() != activeCount || (savedCount != -1 && as.getCount() != savedCount)) { MQFactory.getConcrete("Swing").enqueue("NOTIFY Failed to load all auctions."); } } return activeCount; }
private void initLog() { if (mPaused) return; if (mLogWriter != null) return; String sep = System.getProperty("file.separator"); String home = JConfig.getHomeDirectory(); String doLogging = JConfig.queryConfiguration("logging", "true"); if (doLogging.equals("true")) { if (mLogWriter == null) { try { File fp; String increment = ""; int stepper = 1; do { fp = new File(home + sep + "errors" + increment + ".log"); increment = "." + stepper++; } while (fp.exists()); mFP = fp; mLogWriter = new PrintWriter(new FileOutputStream(fp)); } catch (IOException ioe) { System.err.println("FAILED TO OPEN AN ERROR LOG."); ioe.printStackTrace(); } } } }
private static String makeBackupFilename(String filename, String toInsert) { int lastSlash = filename.lastIndexOf(System.getProperty("file.separator")); if (lastSlash == -1) { JConfig.log().logDebug("Filename has no separators: " + filename); lastSlash = 0; } int firstDot = filename.indexOf('.', lastSlash); if (firstDot == -1) { JConfig.log().logDebug("Filename has no dot/extension: " + filename); firstDot = filename.length(); } return filename.substring(0, firstDot) + '-' + toInsert + filename.substring(firstDot); }
/** * @brief Save auctions out to the savefile, in XML format. * <p>Similar to the loadAuctions code, this would be nice if it were abstracted to write to * any outputstream, allowing us to write to a remote node to update it with our auctions and * snipes. * @return - true if it successfully saved, false if an error occurred. */ public boolean saveAuctions() { XMLElement auctionsData = AuctionServerManager.getInstance().toXML(); String oldSave = JConfig.queryConfiguration("savefile", "auctions.xml"); String saveFilename = JConfig.getCanonicalFile( JConfig.queryConfiguration("savefile", "auctions.xml"), "jbidwatcher", false); String newSave = saveFilename; // If there's no data to save, then pretend we did it. if (auctionsData == null) return true; ensureDirectories(saveFilename); boolean swapFiles = needSwapSaves(saveFilename); if (!saveFilename.equals(oldSave)) { JConfig.setConfiguration("savefile", saveFilename); } // If we already have a save file, preserve its name, and write // the new one to '.temp'. if (swapFiles) { newSave = saveFilename + ".temp"; File newSaveFile = new File(newSave); if (newSaveFile.exists()) newSaveFile.delete(); } StringBuffer buf = buildSaveBuffer(auctionsData, null); boolean saveDone = true; // Dump the save file out! try { PrintStream ps = new PrintStream(new FileOutputStream(newSave)); ps.println(buf); ps.close(); } catch (IOException e) { JConfig.log().handleException("Failed to save auctions.", e); saveDone = false; } // If the save was complete, and we have to swap old/new files, // then [remove prior '.old' file if necessary], save current XML // as '.old', and move most recent save file to be just a normal // save file. if (saveDone && swapFiles) { preserveFiles(saveFilename); } return saveDone; }
public void logFile(String msgtop, StringBuffer dumpsb) { initLog(); String doLogging = JConfig.queryConfiguration("logging", "true"); if (doLogging.equals("true")) { if (JConfig.debugging) { if (mLogWriter != null) { mLogWriter.println("+------------------------------"); mLogWriter.println("| " + msgtop); mLogWriter.println("+------------------------------"); if (dumpsb != null) { mLogWriter.println(dumpsb); } else { mLogWriter.println("(null)"); } mLogWriter.println("+------------end---------------"); mLogWriter.flush(); } for (ErrorHandler handler : sHandlers) { handler.addLog("..."); } logMessage("File contents logged with message: " + msgtop); for (ErrorHandler handler : sHandlers) { handler.addLog("..."); } } } }
public void handleException(String sError, Throwable e) { initLog(); Date log_time = new Date(); if (sError == null || sError.length() == 0) { System.err.println("[" + log_time + "]"); } else { System.err.println(log_time + ": " + sError); } e.printStackTrace(); String doLogging = JConfig.queryConfiguration("logging", "true"); String logMsg; if (sError == null || sError.length() == 0) { logMsg = "[" + log_time + "]"; } else { logMsg = log_time + ": " + sError; } String trace = getStackTrace(e); for (ErrorHandler handler : sHandlers) { handler.exception(logMsg, e.getMessage(), trace); } if (doLogging.equals("true")) { if (mLogWriter != null) { mLogWriter.println(logMsg); if (e.getMessage() != null) mLogWriter.println(e.getMessage()); e.printStackTrace(mLogWriter); mLogWriter.flush(); } } }
public static void start() { if (sTimer == null) { sTimer = new TimerHandler(getInstance()); sTimer.setName("Updates"); sTimer.start(); } JConfig.registerListener(getInstance()); }
/** * @brief Load auctions from a save file, with a pretty splash screen and everything, if * necessary. * <p>I'd like to abstract this, and make it work with arbitrary streams, so that we could * send an XML file of auctions over a network to sync between JBidwatcher instances. */ public void loadAuctions() { XMLElement xmlFile = new XMLElement(true); String loadFile = JConfig.queryConfiguration("savefile", "auctions.xml"); String oldLoad = loadFile; loadFile = JConfig.getCanonicalFile(loadFile, "jbidwatcher", true); if (!loadFile.equals(oldLoad)) { JConfig.setConfiguration("savefile", loadFile); } File toLoad = new File(loadFile); if (toLoad.exists() && toLoad.length() != 0) { try { loadXMLFromFile(loadFile, xmlFile); } catch (IOException ioe) { JConfig.log() .handleException("A serious problem occurred trying to load from auctions.xml.", ioe); MQFactory.getConcrete("Swing") .enqueue( "ERROR Failure to load your saved auctions. Some or all items may be missing."); } catch (XMLParseException xme) { JConfig.log().handleException("Trying to load from auctions.xml.", xme); MQFactory.getConcrete("Swing") .enqueue( "ERROR Failure to load your saved auctions. Some or all items may be missing."); } } else { // This is a common thing, and we don't want to frighten new // users, who are most likely to see it. JConfig.log() .logDebug( "JBW: Failed to load saved auctions, the auctions file is probably not there yet."); JConfig.log().logDebug("JBW: This is not an error, unless you're constantly getting it."); } }
private static void backupByDate(String filename, File oldest) { SimpleDateFormat justDateFmt = new SimpleDateFormat("ddMMMyy"); String justDate = justDateFmt.format(new Date()); String oldBackup = makeBackupFilename(filename, justDate); File oldDateBackup = new File(oldBackup); if (oldDateBackup.exists()) { oldDateBackup.delete(); File newDateBackup = new File(oldBackup); oldest.renameTo(newDateBackup); } else { oldest.renameTo(oldDateBackup); String oldestByDate = JConfig.queryConfiguration("save.bydate.4", ""); for (int i = 4; i > 0; i--) { JConfig.setConfiguration( "save.bydate." + i, JConfig.queryConfiguration("save.bydate." + (i - 1), "")); } JConfig.setConfiguration("save.bydate.0", oldBackup); File deleteMe = new File(oldestByDate); deleteMe.delete(); } }
private void loadXMLFromFile(String loadFile, XMLElement xmlFile) throws IOException { InputStreamReader isr = new InputStreamReader(new FileInputStream(loadFile)); MQFactory.getConcrete("splash").enqueue("WIDTH " + MAX_PERCENT); MQFactory.getConcrete("splash").enqueue("SET " + MAX_PERCENT / 2); xmlFile.parseFromReader(isr); MQFactory.getConcrete("splash").enqueue("SET " + MAX_PERCENT); String formatVersion = xmlFile.getProperty("FORMAT", "0101"); XMLElement auctionsXML = xmlFile.getChild("auctions"); JConfig.setConfiguration("savefile.format", formatVersion); // set the width of the splash progress bar based on the number // of auctions that will be loaded! if (auctionsXML == null) { throw new XMLParseException( xmlFile.getTagName(), "AuctionsManager requires an <auctions> tag!"); } String auctionQuantity = auctionsXML.getProperty("COUNT", null); int auctionTotal = 0; if (auctionQuantity != null) { auctionTotal = Integer.parseInt(auctionQuantity); MQFactory.getConcrete("splash").enqueue("SET 0"); MQFactory.getConcrete("splash").enqueue("WIDTH " + auctionTotal); } AuctionServerManager.setEntryManager(this); AuctionServerManager.getInstance().fromXML(auctionsXML); AuctionStats as = AuctionServerManager.getInstance().getStats(); // TODO -- Do something more valuable than just notify, when the auction counts are off. int savedCount = Integer.parseInt(JConfig.queryConfiguration("last.auctioncount", "-1")); if (as != null) { if (as.getCount() != auctionTotal || (savedCount != -1 && as.getCount() != savedCount)) { MQFactory.getConcrete("Swing").enqueue("NOTIFY Failed to load all auctions."); } } }
/** * @param fname - The filename to output to. * @param sb - The StringBuffer to dump out. * @brief Debugging function to dump a string buffer out to a file. * <p>This is used for 'emergency' debugging efforts. */ public void dump2File(String fname, StringBuffer sb) { if (JConfig.queryConfiguration("debug.filedump", "false").equals("false")) return; FileWriter fw = null; try { fw = new FileWriter(fname); fw.write(sb.toString()); } catch (IOException ioe) { handleException("Threw exception in dump2File!", ioe); } finally { if (fw != null) try { fw.close(); } catch (IOException ignored) { /* I don't care about exceptions on close. */ } } }
public void logMessage(String msg) { initLog(); Date log_time = new Date(); System.err.println(log_time + ": " + msg); String logMsg = log_time + ": "; // This should stop the annoying time duplication in log messages. if (msg.startsWith(logMsg)) logMsg = msg; else logMsg += msg; for (ErrorHandler handler : sHandlers) { handler.addLog(logMsg); } String doLogging = JConfig.queryConfiguration("logging", "true"); if (doLogging.equals("true")) { if (mLogWriter != null) { mLogWriter.println(logMsg); mLogWriter.flush(); } } }
private static void preserveFiles(String filename) { File oldFile = new File(filename); File saveFile = new File(filename + ".temp"); SimpleDateFormat sdf = new SimpleDateFormat("ddMMMyy_HHmm"); String nowStr = sdf.format(new Date()); String retainFilename = makeBackupFilename(filename, nowStr); File retainFile = new File(retainFilename); if (retainFile.exists()) retainFile.delete(); String oldestSave = JConfig.queryConfiguration("save.file.4", ""); if (oldestSave.length() != 0) { File oldest = new File(oldestSave); if (oldest.exists()) { backupByDate(filename, oldest); } } for (int i = 4; i > 0; i--) { JConfig.setConfiguration( "save.file." + i, JConfig.queryConfiguration("save.file." + (i - 1), "")); } File keepFile = new File(retainFilename); if (!oldFile.renameTo(keepFile)) { JConfig.log() .logDebug( "Renaming the old file (" + oldFile + ") to the retain file (" + keepFile + ") failed!"); } JConfig.setConfiguration("save.file.0", retainFilename); File standard = new File(filename); if (!saveFile.renameTo(standard)) { JConfig.log() .logDebug( "Renaming the new file (" + saveFile + ") to the standard filename (" + standard + ") failed!"); } }
public void updateConfiguration() { String newSnipeTime = JConfig.queryConfiguration("snipemilliseconds"); if (newSnipeTime != null) { AuctionEntry.setDefaultSnipeTime(Long.parseLong(newSnipeTime)); } }
public void logVerboseDebug(String msg) { if (JConfig.queryConfiguration("debug.uber", "false").equals("true")) logMessage(msg); }