// --------------------------------------------------------------------------- private void writeCache() { try { Debug.print("Writing cache"); FileOutputStream fos = new FileOutputStream(m_cacheFile); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeObject(m_depCache); oos.writeInt(m_newModificationCache.size()); Iterator<String> it = m_newModificationCache.keySet().iterator(); while (it.hasNext()) { String key = it.next(); oos.writeUTF(key); oos.writeLong(m_newModificationCache.get(key)); } oos.close(); } catch (Exception e) { Debug.print(e.getMessage()); StringWriter sw = new StringWriter(); e.printStackTrace(new PrintWriter(sw)); Debug.print(sw.toString()); } }
private void writeObject(ObjectOutputStream out) throws IOException { synchronized (cache) { synchronized (commands) { out.writeObject(name); // cache and commands are never null out.writeLong(System.currentTimeMillis()); out.writeObject(myContribution); out.writeInt(cache.size()); Iterator i = cache.values().iterator(); while (i.hasNext()) out.writeObject(i.next()); out.writeInt(commands.size()); i = commands.entrySet().iterator(); while (i.hasNext()) { Map.Entry e = (Map.Entry) i.next(); long time = ((Long) e.getValue()).longValue(); out.writeObject(e.getKey()); out.writeLong(time); } } } }
/** * 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); }