/**
   * 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);
  }
Esempio n. 2
0
 public void run() {
   Server.preRunOperations(this);
   while (true) {
     try {
       String type = in.readUTF();
       if (type.equals("newObject")) {
         Object object = in.readObject();
         if (object instanceof String) {
           // Adding player..
           this.player = new Player((String) object, Entity.BLUE);
           boolean addPlayer = true;
           for (int i = 0; i < Server.players.size(); i++) {
             if (this.player.name.equals(Server.players.get(i).name)) {
               // Set to online!
               if (Server.players.get(i).online) {
                 System.out.println(
                     "Player " + player.name + " is already connected! " + (userID + 1));
                 this.player = null;
                 addPlayer = false;
               } else {
                 this.player = Server.players.get(i);
                 System.out.println("Returning User: "******", " + (userID + 1));
                 this.player.online = true;
                 addPlayer = false;
               }
               break;
             }
           }
           if (addPlayer) {
             System.out.println("New User: "******", " + (userID + 1));
             Server.players.add(this.player);
           }
         }
       } else if (type.equals(
           "MoveUnit")) { // this needs to require the player to be the owner of the unit
         short unit = in.readShort();
         double cX = in.readDouble();
         double cY = in.readDouble();
         double x = in.readDouble();
         double y = in.readDouble();
         boolean stacked = in.readBoolean();
         // Pretty simple: (If the unit doesn't "exist", game will take care of that.) [Keep in
         // mind, this currently could easily let the player control enemy units]
         new PathFind(
             unit, cX, cY, x, y,
             stacked); // All commands take the liberty of adding themselves to the game stack.
       } else if (type.equals(
           "SetTarget")) { // this needs to require the player to be the owner of the unit
         short unit = in.readShort();
         short enemy = in.readShort();
         boolean stacked = in.readBoolean();
         // Pretty simple:
         new SetTarget(unit, enemy, stacked);
       } else if (type.equals("AddOrder")) {
         short unit = in.readShort();
         byte order = in.readByte();
         double atX = in.readDouble();
         double atY = in.readDouble();
         boolean stacked = in.readBoolean();
         new AddOrder(unit, order, atX, atY, stacked);
       } else if (type.equals("Uber")) {
         short unit = in.readShort();
         boolean stacked = in.readBoolean();
         new Uber(unit, stacked);
       } else if (type.equals("Exiting")) {
         disconnect();
         return;
       }
     } catch (IOException e) {
       disconnect();
       return;
     } catch (Exception e) {
       System.out.println("Alternate error.");
       e.printStackTrace();
     }
   }
 }