// Copyright (c) 2011 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. package org.chromium.sdk.internal.wip.tools.protocolgenerator; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.StringWriter; import java.io.Writer; /** * A class that makes accurate java source file update. If only header * (with source file revision and other comments) changed, the file is left intact. * <p>User first writes all the content into a {@link Writer} provided and then * calls {@link #update()}. */ class JavaFileUpdater { private final File file; private final StringWriter writer; JavaFileUpdater(File file) { this.file = file; this.writer = new StringWriter(); } Writer getWriter() { return writer; } void update() throws IOException { writer.close(); String newContent = writer.getBuffer().toString(); if (file.isFile()) { String oldContent = StreamUtil.readStringFromStream(new FileInputStream(file), StreamUtil.UTF8_CHARSET); if (stripHeader(oldContent).equals(stripHeader(newContent))) { return; } } else { File dir = file.getParentFile(); boolean dirCreated = dir.mkdirs(); if (!dirCreated && !dir.isDirectory()) { throw new RuntimeException("Failed to create directory " + dir.getPath()); } } OutputStream outputStream = new FileOutputStream(file); Writer fileWriter = new OutputStreamWriter(outputStream, StreamUtil.UTF8_CHARSET); fileWriter.write(newContent); fileWriter.close(); outputStream.close(); } private static String stripHeader(String content) { int pos = content.indexOf("\npackage "); if (pos == -1) { return content; } return content.substring(pos); } }