/** * 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)); } }
// --------------------------------------------------------------------------- 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); }