예제 #1
0
  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();
        }
      }
    }
  }
예제 #3
0
  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);
  }
예제 #4
0
  /**
   * @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();
      }
    }
  }
예제 #7
0
 public static void start() {
   if (sTimer == null) {
     sTimer = new TimerHandler(getInstance());
     sTimer.setName("Updates");
     sTimer.start();
   }
   JConfig.registerListener(getInstance());
 }
예제 #8
0
  /**
   * @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.");
    }
  }
예제 #9
0
 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();
   }
 }
예제 #10
0
  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();
      }
    }
  }
예제 #13
0
  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!");
    }
  }
예제 #14
0
 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);
 }