public MavenIndex(MavenIndexerWrapper indexer, File dir, IndexListener listener) throws MavenIndexException { myIndexer = indexer; myDir = dir; myListener = listener; Properties props = new Properties(); try { FileInputStream s = new FileInputStream(new File(dir, INDEX_INFO_FILE)); try { props.load(s); } finally { s.close(); } } catch (IOException e) { throw new MavenIndexException("Cannot read " + INDEX_INFO_FILE + " file", e); } if (!CURRENT_VERSION.equals(props.getProperty(INDEX_VERSION_KEY))) { throw new MavenIndexException("Incompatible index version, needs to be updated: " + dir); } myKind = Kind.valueOf(props.getProperty(KIND_KEY)); myRepositoryId = props.getProperty(ID_KEY); myRepositoryPathOrUrl = normalizePathOrUrl(props.getProperty(PATH_OR_URL_KEY)); try { String timestamp = props.getProperty(TIMESTAMP_KEY); if (timestamp != null) myUpdateTimestamp = Long.parseLong(timestamp); } catch (Exception ignored) { } myDataDirName = props.getProperty(DATA_DIR_NAME_KEY); myFailureMessage = props.getProperty(FAILURE_MESSAGE_KEY); if (!getUpdateDir().exists()) { myUpdateTimestamp = null; } open(); }
private File getMirrorWithContentHash(File originalFile, FileAttributes originalAttributes) { File mirrorFile = null; String jarDir = getJarsDir(); try { String path = originalFile.getPath(); CacheLibraryInfo info = CacheLibraryInfo.ourCachedLibraryInfo.get(path); if (info != null && originalAttributes.length == info.myFileLength && Math.abs(originalAttributes.lastModified - info.myModificationTime) <= FS_TIME_RESOLUTION) { mirrorFile = new File(jarDir, info.mySnapshotPath); if (!mirrorDiffers(originalAttributes, FileSystemUtil.getAttributes(mirrorFile), true)) { return mirrorFile; } } MessageDigest sha1 = null; File tempJarFile = null; try { tempJarFile = FileUtil.createTempFile(new File(jarDir), originalFile.getName(), "", true, false); DataOutputStream os = new DataOutputStream(new FileOutputStream(tempJarFile)); try { FileInputStream is = new FileInputStream(originalFile); try { sha1 = MessageDigest.getInstance("SHA1"); sha1.update( String.valueOf(originalAttributes.length).getBytes(Charset.defaultCharset())); sha1.update((byte) 0); byte[] buffer = new byte[Math.min(1024 * 1024, (int) originalAttributes.length)]; long totalBytes = 0; while (true) { int read = is.read(buffer); if (read < 0) break; totalBytes += read; sha1.update(buffer, 0, read); os.write(buffer, 0, read); if (totalBytes == originalAttributes.length) break; } } finally { is.close(); } } finally { os.close(); } } catch (IOException ex) { File target = mirrorFile != null ? mirrorFile : tempJarFile != null ? tempJarFile : new File(jarDir); reportIOErrorWithJars(originalFile, target, ex); return originalFile; } catch (NoSuchAlgorithmException ex) { LOG.error(ex); return originalFile; // should never happen for sha1 } String mirrorName = getSnapshotName(originalFile.getName(), sha1.digest()); mirrorFile = new File(jarDir, mirrorName); if (mirrorDiffers(originalAttributes, FileSystemUtil.getAttributes(mirrorFile), true)) { try { FileUtil.delete(mirrorFile); FileUtil.rename(tempJarFile, mirrorFile); FileUtil.setLastModified(mirrorFile, originalAttributes.lastModified); } catch (IOException ex) { reportIOErrorWithJars(originalFile, mirrorFile, ex); return originalFile; } } else { FileUtil.delete(tempJarFile); } info = new CacheLibraryInfo( mirrorFile.getName(), originalAttributes.lastModified, originalAttributes.length); CacheLibraryInfo.ourCachedLibraryInfo.put(path, info); return mirrorFile; } catch (IOException ex) { CacheLibraryInfo.ourCachedLibraryInfo.markCorrupted(); reportIOErrorWithJars( originalFile, mirrorFile != null ? mirrorFile : new File(jarDir, originalFile.getName()), ex); return originalFile; } }