예제 #1
0
  /**
   * Not only deserialises the object, also performs adjustments on the timestamps to bring them in
   * alignment with the local time. Reads the current time on the peer node first. If the timestamp
   * of any items in the cache or commands are newer throws and IOException, because that means the
   * object is corrupted. Sets the timestamp of the contribution of the peer (if any) to the current
   * local time.
   */
  private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {

    name = (String) in.readObject();

    cache = new Hashtable();
    commands = new Hashtable();

    final long max = in.readLong(); // the timestamp that should be maximal
    final long diff = System.currentTimeMillis() - max;
    myContribution = (ContributionBox) in.readObject();
    if (myContribution != null) myContribution.timeStamp = max + diff;

    int cachesize = in.readInt();
    for (int i = 0; i < cachesize; ++i) {
      ContributionBox cb = (ContributionBox) in.readObject();
      if (cb.timeStamp > max)
        throw new IOException("corrupted timestamp in cache: " + cb.timeStamp + " " + max);
      cb.timeStamp += diff;
      cache.put(cb.contributor.name, cb);
    }

    int commandssize = in.readInt();
    for (int i = 0; i < commandssize; ++i) {
      Object comm = in.readObject();
      long time = in.readLong();
      if (time > max) throw new IOException("corrupted timestamp in commands: " + time + " " + max);
      time += diff;
      commands.put(comm, new Long(time));
    }
  }
예제 #2
0
  // ---------------------------------------------------------------------------
  private void readCache() {
    Debug.print("Cache file %s", m_cacheFile);
    File cacheFile = new File(m_cacheFile);
    m_depCache = null;
    m_modificationCache = null;

    if (cacheFile.exists()) {
      try {
        Debug.print("Reading cache");
        FileInputStream cacheIs = new FileInputStream(cacheFile);
        ObjectInputStream ois = new ObjectInputStream(cacheIs);

        m_depCache = (DependencyCache) ois.readObject();

        Map<String, Long> modCache = new HashMap<String, Long>();
        int modCacheSize = ois.readInt();
        for (int I = 0; I < modCacheSize; I++) {
          String file = ois.readUTF();
          Debug.print("  Read %s", file);
          long ts = ois.readLong();

          modCache.put(file, ts);
        }

        m_modificationCache = modCache;
        ois.close();
      } catch (Exception e) {
        Debug.print(e.getMessage());
        StringWriter sw = new StringWriter();
        e.printStackTrace(new PrintWriter(sw));
        Debug.print(sw.toString());
      }
    }

    if ((m_depCache == null) || (m_modificationCache == null)) {
      m_depCache = new DependencyCache();
      m_modificationCache = new HashMap<String, Long>();
    }
  }
  /**
   * Creates source for sources with two orders: firstly in RIC, secondly in time.
   *
   * @param filePath complete filename and path containing prices.
   * @param symbols set of symbols present into the file.
   * @param lineProcessor strategy to part each line.
   * @throws IOException if one symbol (at least) cannot be found.
   */
  public MultipleSymbolScanner(
      final String filePath,
      final String[] symbols,
      final LineParser lineParser,
      final SpreadTradesMgr[] spreadTradesMgr)
      throws IOException {
    this.lineParser = lineParser;
    this.spreadTradesMgr = spreadTradesMgr;
    this.filePath = filePath;
    this.symbols = symbols;
    this.mainReader = new RandomAccessFile(filePath, "r");
    this.partReader = new RandomAccessFile[symbols.length];
    this.nextMilliseconds = new long[symbols.length];
    this.nextLine = new String[symbols.length];

    boolean optimisticJumps = true;

    final ErrorControl errorControl = this.lineParser.getErrorControl();
    this.lineParser.setErrorControl(LineParser.nullErrorControl);

    final String cacheFilePath = filePath + ".cachejump";

    if (new File(cacheFilePath).exists()) {
      final ObjectInputStream cacheJumpsFileIn =
          new ObjectInputStream(new FileInputStream(cacheFilePath));

      log.info("Using stored cached jumps in file " + cacheFilePath);
      try {
        try {
          for (; ; ) {
            final String s = cacheJumpsFileIn.readUTF();
            final long pos = cacheJumpsFileIn.readLong();

            for (int i = 0; i < symbols.length; i++) {
              if (symbols[i].equals(s)) {
                partReader[i] = new RandomAccessFile(filePath, "r");
                partReader[i].seek(pos);
                log.info("Using cached information: position " + pos + " for " + s);
                break;
              }
            }
          }
        } catch (IOException ioe) {
          cacheJumpsFileIn.close();
        }
        for (int i = 0; i < partReader.length; i++) {
          if (partReader[i] == null) {
            throw new IOException("Symbol " + symbols[i] + " not placed");
          }
        }
      } catch (IOException ioe) {
        log.log(Level.SEVERE, ioe.toString(), ioe);
        log.severe("Error reading file " + cacheFilePath + ". Removing");
        new File(cacheFilePath).delete();
      }
    } else {
      final ObjectOutputStream cacheJumpsFileOut =
          new ObjectOutputStream(new FileOutputStream(cacheFilePath));
      log.fine("Caching jumps for future uses in file " + cacheFilePath);

      log.info("Scannig file to place reading pointers");

      for (int i = 0; i < symbols.length; i++) {
        long lastPosition = this.mainReader.getFilePointer();
        long foundPosition;
        log.fine("Starting to search symbol " + symbols[i] + " from position " + lastPosition);
        for (; ; ) {
          foundPosition = this.mainReader.getFilePointer();
          final String line = readNextLineCycling(lastPosition);
          if (line == null) {
            // All file's been read without finding desired symbol.
            throw new IOException(
                "Cannot find symbol '" + symbols[i] + "' in file '" + filePath + "'");
          }
          if (this.lineParser.isValid(line)
              && symbols[i].equals(this.lineParser.getSymbol(line, 0))) {
            break;
          }
        }
        log.info("Located place for reader on " + symbols[i] + ":" + foundPosition);
        cacheJumpsFileOut.writeUTF(symbols[i]);
        cacheJumpsFileOut.writeLong(foundPosition);
        partReader[i] = new RandomAccessFile(filePath, "r");
        partReader[i].seek(foundPosition);
        final int optimisticJump = (int) (2 * (foundPosition - lastPosition) / 3);
        this.mainReader.skipBytes(optimisticJump);
      }
      cacheJumpsFileOut.flush();
      cacheJumpsFileOut.close();
    }

    log.info("File scanned. Placing reading pointers");

    // Boot up
    for (int i = 0; i < symbols.length; i++) {
      for (; ; ) {
        try {
          String line = partReader[i].readLine();
          while (line != null && !this.lineParser.isValid(line)) {
            line = partReader[i].readLine();
          }

          if (!symbols[i].equals(this.lineParser.parse(line).getSymbol(0))) {
            this.nextLine[i] = null;
          } else {
            this.nextLine[i] = line;
            this.nextMilliseconds[i] =
                this.lineParser.parse(line).getUTCTimestampCopy().getTimeInMillis();
            break;
          }
        } catch (Exception e) {
          log.log(
              Level.SEVERE, "Exception reading first line " + "of file '" + this.filePath + "'", e);
          log.severe("Maybe cache file is not correct?");
        }
      }
    }
    log.info("Readers placed correctly. Source started");
    this.lineParser.setErrorControl(errorControl);
  }