aboutsummaryrefslogtreecommitdiff
path: root/generator/src/main/java/com/google/archivepatcher/generator/bsdiff/RandomAccessObjectFactory.java
diff options
context:
space:
mode:
Diffstat (limited to 'generator/src/main/java/com/google/archivepatcher/generator/bsdiff/RandomAccessObjectFactory.java')
-rw-r--r--generator/src/main/java/com/google/archivepatcher/generator/bsdiff/RandomAccessObjectFactory.java109
1 files changed, 109 insertions, 0 deletions
diff --git a/generator/src/main/java/com/google/archivepatcher/generator/bsdiff/RandomAccessObjectFactory.java b/generator/src/main/java/com/google/archivepatcher/generator/bsdiff/RandomAccessObjectFactory.java
new file mode 100644
index 0000000..24369fa
--- /dev/null
+++ b/generator/src/main/java/com/google/archivepatcher/generator/bsdiff/RandomAccessObjectFactory.java
@@ -0,0 +1,109 @@
+// Copyright 2016 Google Inc. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.archivepatcher.generator.bsdiff;
+
+import com.google.archivepatcher.generator.bsdiff.RandomAccessObject.RandomAccessByteArrayObject;
+import com.google.archivepatcher.generator.bsdiff.RandomAccessObject.RandomAccessFileObject;
+import com.google.archivepatcher.generator.bsdiff.RandomAccessObject.RandomAccessMmapObject;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.RandomAccessFile;
+
+/**
+ * A factory for creating instances of {@link RandomAccessObject}. BsDiff needs to store some
+ * ancillary data of size proportional to the binary to be patched. This allows abstraction of the
+ * allocation so that BsDiff can run either entirely in-memory (faster) or with file-backed swap
+ * (handles bigger inputs without consuming inordinate amounts of memory).
+ */
+public interface RandomAccessObjectFactory {
+ public RandomAccessObject create(int size) throws IOException;
+
+ /**
+ * A factory that produces {@link RandomAccessFileObject} instances backed by temp files.
+ */
+ // TODO(hartmanng): rethink the handling of these temp files. It's confusing and shouldn't
+ // really be the responsibility of RandomAccessObject.
+ public static final class RandomAccessFileObjectFactory implements RandomAccessObjectFactory {
+ private static final String FILE_NAME_PREFIX = "wavsprafof";
+ private final String mMode;
+
+ /**
+ * Factory for a RandomAccessFileObject.
+ * @param mode the file mode string ("r", "w", "rw", etc - see documentation for
+ * {@link RandomAccessFile})
+ */
+ public RandomAccessFileObjectFactory(String mode) {
+ mMode = mode;
+ }
+
+ /**
+ * Creates a temp file, and returns a {@link RandomAccessFile} wrapped in a
+ * {@link RandomAccessFileObject} representing the new temp file. The temp file does not need to
+ * explicitly be managed (deleted) by the caller, as long as the caller ensures
+ * {@link RandomAccessObject#close()} is called when the object is no longer needed.
+ */
+ // TODO(hartmanng): rethink the handling of these temp files. It's confusing and shouldn't
+ // really be the responsibility of RandomAccessObject.
+ @Override
+ public RandomAccessObject create(int size) throws IOException {
+ return new RandomAccessObject.RandomAccessFileObject(
+ File.createTempFile(FILE_NAME_PREFIX, "temp"), mMode, true);
+ }
+ }
+
+ /**
+ * A factory that produces {@link RandomAccessByteArrayObject} instances backed by memory.
+ */
+ public static final class RandomAccessByteArrayObjectFactory
+ implements RandomAccessObjectFactory {
+ @Override
+ public RandomAccessObject create(int size) {
+ return new RandomAccessObject.RandomAccessByteArrayObject(size);
+ }
+ }
+
+ /**
+ * A factory that produces {@link RandomAccessMmapObject} instances backed by temp files..
+ */
+ // TODO(hartmanng): rethink the handling of these temp files. It's confusing and shouldn't
+ // really be the responsibility of RandomAccessObject.
+ public static final class RandomAccessMmapObjectFactory implements RandomAccessObjectFactory {
+ private static final String FILE_NAME_PREFIX = "wavsprafof";
+ private String mMode;
+
+ /**
+ * Factory for a RandomAccessMmapObject.
+ * @param mode the file mode string ("r", "w", "rw", etc - see documentation for
+ * {@link RandomAccessFile})
+ */
+ public RandomAccessMmapObjectFactory(String mode) {
+ mMode = mode;
+ }
+
+ /**
+ * Creates a temp file, and returns a {@link RandomAccessFile} wrapped in a
+ * {@link RandomAccessMmapObject} representing the new temp file. The temp file does not need to
+ * explicitly be managed (deleted) by the caller, as long as the caller ensures
+ * {@link RandomAccessObject#close()} is called when the object is no longer needed.
+ */
+ // TODO(hartmanng): rethink the handling of these temp files. It's confusing and shouldn't
+ // really be the responsibility of RandomAccessObject.
+ @Override
+ public RandomAccessObject create(int size) throws IOException {
+ return new RandomAccessObject.RandomAccessMmapObject(FILE_NAME_PREFIX, mMode, size);
+ }
+ }
+}