diff options
author | mikaelpeltier <mikaelpeltier@google.com> | 2014-11-12 10:44:19 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2014-11-12 10:44:19 +0000 |
commit | 857eccf2866f32268038b836fd4f4c9205cb7680 (patch) | |
tree | 8cf68a7dfa978ff85bbed0ed56d0eef64cdbde15 /jack/src | |
parent | 824c2140f680c61ba846e809499450a7a85e6f0b (diff) | |
parent | 7dafd6e62e1f2062ae31c6ecbe0361de07d3170b (diff) | |
download | toolchain_jack-857eccf2866f32268038b836fd4f4c9205cb7680.zip toolchain_jack-857eccf2866f32268038b836fd4f4c9205cb7680.tar.gz toolchain_jack-857eccf2866f32268038b836fd4f4c9205cb7680.tar.bz2 |
Merge "Replace BinaryKind by FileType into library" into ub-jack
Diffstat (limited to 'jack/src')
24 files changed, 249 insertions, 259 deletions
diff --git a/jack/src/com/android/jack/Jack.java b/jack/src/com/android/jack/Jack.java index 9114675..1b5ce13 100644 --- a/jack/src/com/android/jack/Jack.java +++ b/jack/src/com/android/jack/Jack.java @@ -83,7 +83,7 @@ import com.android.jack.ir.formatter.TypePackageAndMethodFormatter; import com.android.jack.ir.formatter.UserFriendlyFormatter; import com.android.jack.ir.sourceinfo.SourceInfoCreation; import com.android.jack.jayce.JaycePackageLoader; -import com.android.jack.library.BinaryKind; +import com.android.jack.library.FileType; import com.android.jack.library.InputJackLibrary; import com.android.jack.library.JackLibraryFactory; import com.android.jack.library.LibraryReadingException; @@ -541,7 +541,7 @@ public abstract class Jack { if (options.out != null || options.outZip != null) { request.addProduction(IntermediateDexProduct.class); request.addProduction(DexFileProduct.class); - session.addGeneratedBinaryKind(BinaryKind.DEX); + session.addGeneratedFileType(FileType.DEX); } else { assert options.jayceOutDir != null || options.jayceOutZip != null; request.addProduction(JayceFormatProduct.class); diff --git a/jack/src/com/android/jack/backend/dex/DexFileWriter.java b/jack/src/com/android/jack/backend/dex/DexFileWriter.java index e2776cf..decf0c9 100644 --- a/jack/src/com/android/jack/backend/dex/DexFileWriter.java +++ b/jack/src/com/android/jack/backend/dex/DexFileWriter.java @@ -19,7 +19,7 @@ package com.android.jack.backend.dex; import com.android.jack.JackAbortException; import com.android.jack.Options; import com.android.jack.ir.ast.JSession; -import com.android.jack.library.BinaryKind; +import com.android.jack.library.FileType; import com.android.jack.reporting.Reporter.Severity; import com.android.jack.scheduling.marker.ClassDefItemMarker; import com.android.sched.item.Description; @@ -51,7 +51,7 @@ public class DexFileWriter extends DexWriter implements RunnableSchedulable<JSes static final String DEX_PREFIX = "classes"; @Nonnull - public static final String DEX_FILENAME = DEX_PREFIX + BinaryKind.DEX.getFileExtension(); + public static final String DEX_FILENAME = DEX_PREFIX + FileType.DEX.getFileExtension(); @Nonnull public static final diff --git a/jack/src/com/android/jack/backend/dex/DexWriter.java b/jack/src/com/android/jack/backend/dex/DexWriter.java index 67fbcaf..5c7d71d 100644 --- a/jack/src/com/android/jack/backend/dex/DexWriter.java +++ b/jack/src/com/android/jack/backend/dex/DexWriter.java @@ -18,7 +18,7 @@ package com.android.jack.backend.dex; import com.android.jack.ir.ast.JDefinedClassOrInterface; import com.android.jack.ir.formatter.BinaryQualifiedNameFormatter; -import com.android.jack.library.BinaryKind; +import com.android.jack.library.FileType; import com.android.sched.vfs.VPath; import javax.annotation.Nonnull; @@ -31,6 +31,6 @@ public abstract class DexWriter { @Nonnull static VPath getFilePath(@Nonnull JDefinedClassOrInterface type) { return new VPath(BinaryQualifiedNameFormatter.getFormatter().getName(type) - + BinaryKind.DEX.getFileExtension(), '/'); + + FileType.DEX.getFileExtension(), '/'); } } diff --git a/jack/src/com/android/jack/backend/dex/DexWritingTool.java b/jack/src/com/android/jack/backend/dex/DexWritingTool.java index fffbe25..0f7042c 100644 --- a/jack/src/com/android/jack/backend/dex/DexWritingTool.java +++ b/jack/src/com/android/jack/backend/dex/DexWritingTool.java @@ -24,8 +24,8 @@ import com.android.jack.dx.dex.file.DexFile; import com.android.jack.dx.io.DexBuffer; import com.android.jack.ir.ast.JDefinedClassOrInterface; import com.android.jack.ir.formatter.BinaryQualifiedNameFormatter; -import com.android.jack.library.BinaryDoesNotExistException; -import com.android.jack.library.BinaryKind; +import com.android.jack.library.FileType; +import com.android.jack.library.FileTypeDoesNotExistException; import com.android.jack.library.InputLibrary; import com.android.jack.library.LibraryFormatException; import com.android.jack.library.TypeInInputLibraryLocation; @@ -113,7 +113,7 @@ public abstract class DexWritingTool { if (dexCount == 1) { dexName = DexFileWriter.DEX_FILENAME; } else { - dexName = DexFileWriter.DEX_PREFIX + dexCount + BinaryKind.DEX.getFileExtension(); + dexName = DexFileWriter.DEX_PREFIX + dexCount + FileType.DEX.getFileExtension(); } try { return outputVDir.createOutputVFile(new VPath(dexName, '/')); @@ -131,12 +131,11 @@ public abstract class DexWritingTool { if (loc instanceof TypeInInputLibraryLocation) { InputLibrary inputLibrary = ((TypeInInputLibraryLocation) loc).getInputLibraryLocation().getInputLibrary(); - if (inputLibrary.hasBinary(BinaryKind.DEX)) { + if (inputLibrary.containsFileType(FileType.DEX)) { try { - inputVFile = inputLibrary.getBinary( - new VPath(BinaryQualifiedNameFormatter.getFormatter().getName(type), '/'), - BinaryKind.DEX); - } catch (BinaryDoesNotExistException e) { + inputVFile = inputLibrary.getFile(FileType.DEX, + new VPath(BinaryQualifiedNameFormatter.getFormatter().getName(type), '/')); + } catch (FileTypeDoesNotExistException e) { logger.log(Level.SEVERE, "Library " + inputLibrary.getLocation().getDescription() + " is invalid", e); diff --git a/jack/src/com/android/jack/backend/dex/IntermediateDexPerTypeWriter.java b/jack/src/com/android/jack/backend/dex/IntermediateDexPerTypeWriter.java index 0312a94..1a9690e 100644 --- a/jack/src/com/android/jack/backend/dex/IntermediateDexPerTypeWriter.java +++ b/jack/src/com/android/jack/backend/dex/IntermediateDexPerTypeWriter.java @@ -25,7 +25,7 @@ import com.android.jack.dx.dex.file.DexFile; import com.android.jack.experimental.incremental.JackIncremental; import com.android.jack.ir.ast.JDefinedClassOrInterface; import com.android.jack.ir.formatter.BinaryQualifiedNameFormatter; -import com.android.jack.library.BinaryKind; +import com.android.jack.library.FileType; import com.android.jack.library.OutputLibrary; import com.android.jack.library.TypeInInputLibraryLocation; import com.android.jack.scheduling.marker.ClassDefItemMarker; @@ -71,8 +71,8 @@ public class IntermediateDexPerTypeWriter extends DexWriter implements @Override public void run(@Nonnull JDefinedClassOrInterface type) throws Exception { assert !(type.getLocation() instanceof TypeInInputLibraryLocation - && !((TypeInInputLibraryLocation) type.getLocation()).getInputLibraryLocation() - .getInputLibrary().getBinaryKinds().isEmpty()); + && ((TypeInInputLibraryLocation) type.getLocation()).getInputLibraryLocation() + .getInputLibrary().containsFileType(FileType.DEX)); ClassDefItemMarker cdiMarker = type.getMarker(ClassDefItemMarker.class); assert cdiMarker != null; @@ -91,9 +91,8 @@ public class IntermediateDexPerTypeWriter extends DexWriter implements // incremental support will be updated and Intermediate_dex_dir usage was cleaned. if (outputLibrary != null && !isIncrementalMode && intermediateDexDir == null) { assert generateDexFile || intermediateDexDir == null; - vFile = outputLibrary.getBinaryOutputVFile( - new VPath(BinaryQualifiedNameFormatter.getFormatter().getName(type), '/'), - BinaryKind.DEX); + vFile = outputLibrary.createFile(FileType.DEX, + new VPath(BinaryQualifiedNameFormatter.getFormatter().getName(type), '/')); } else { assert intermediateDexDir != null; vFile = intermediateDexDir.createOutputVFile(getFilePath(type)); diff --git a/jack/src/com/android/jack/backend/dex/SingleDexWritingTool.java b/jack/src/com/android/jack/backend/dex/SingleDexWritingTool.java index 20af242..5652c05 100644 --- a/jack/src/com/android/jack/backend/dex/SingleDexWritingTool.java +++ b/jack/src/com/android/jack/backend/dex/SingleDexWritingTool.java @@ -16,9 +16,11 @@ package com.android.jack.backend.dex; +import com.google.common.collect.Iterators; + import com.android.jack.Jack; import com.android.jack.ir.ast.JDefinedClassOrInterface; -import com.android.jack.library.BinaryKind; +import com.android.jack.library.FileType; import com.android.jack.library.InputLibrary; import com.android.jack.library.TypeInInputLibraryLocation; import com.android.jack.tools.merger.JackMerger; @@ -33,6 +35,7 @@ import com.android.sched.vfs.OutputVDir; import com.android.sched.vfs.OutputVFile; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import javax.annotation.Nonnull; @@ -51,11 +54,10 @@ public class SingleDexWritingTool extends DexWritingTool { OutputVFile outputDex = getOutputDex(outputVDir); List<InputVFile> dexList = new ArrayList<InputVFile>(); getAllDexFilesFromDir(getIntermediateDexDir(), dexList); - getAllDexFilesFromLib(dexList); - - for (InputVFile currentDex : dexList) { + Iterator<InputVFile> inputVFileIt = getAllDexFilesFromLib(dexList.iterator()); + while (inputVFileIt.hasNext()) { try { - mergeDex(merger, currentDex); + mergeDex(merger, inputVFileIt.next()); } catch (MergingOverflowException e) { throw new DexWritingException(new SingleDexOverflowException(e)); } @@ -63,7 +65,8 @@ public class SingleDexWritingTool extends DexWritingTool { finishMerge(merger, outputDex); } - private void getAllDexFilesFromLib(@Nonnull List<InputVFile> dexFiles) { + private Iterator<InputVFile> getAllDexFilesFromLib(@Nonnull Iterator<InputVFile> inputVFileIt) { + Iterator<InputVFile> newInputVFileIt = inputVFileIt; List<InputLibrary> librariesDone = new ArrayList<InputLibrary>(); for (JDefinedClassOrInterface jdcoi : Jack.getSession().getTypesToEmit()) { Location loc = jdcoi.getLocation(); @@ -71,13 +74,15 @@ public class SingleDexWritingTool extends DexWritingTool { InputLibrary inputLibrary = ((TypeInInputLibraryLocation) loc).getInputLibraryLocation().getInputLibrary(); if (!librariesDone.contains(inputLibrary)) { - if (inputLibrary.hasBinary(BinaryKind.DEX)) { - dexFiles.addAll(inputLibrary.getBinaries(BinaryKind.DEX)); + if (inputLibrary.containsFileType(FileType.DEX)) { + newInputVFileIt = + Iterators.concat(newInputVFileIt, inputLibrary.iterator(FileType.DEX)); } librariesDone.add(inputLibrary); } } } + return (newInputVFileIt); } private void getAllDexFilesFromDir(@Nonnull InputVDir dexFileVDir, @@ -85,7 +90,7 @@ public class SingleDexWritingTool extends DexWritingTool { for (InputVElement subFile : dexFileVDir.list()) { if (subFile.isVDir()) { getAllDexFilesFromDir((InputVDir) subFile, dexFiles); - } else if (BinaryKind.DEX.isBinaryFile((InputVFile) subFile)) { + } else if (FileType.DEX.isOfType((InputVFile) subFile)) { dexFiles.add((InputOutputVFile) subFile); } } diff --git a/jack/src/com/android/jack/backend/jayce/JayceFileImporter.java b/jack/src/com/android/jack/backend/jayce/JayceFileImporter.java index 0581fba..698bdd4 100644 --- a/jack/src/com/android/jack/backend/jayce/JayceFileImporter.java +++ b/jack/src/com/android/jack/backend/jayce/JayceFileImporter.java @@ -24,7 +24,7 @@ import com.android.jack.ir.ast.JPackageLookupException; import com.android.jack.ir.ast.JSession; import com.android.jack.ir.ast.JTypeLookupException; import com.android.jack.ir.ast.Resource; -import com.android.jack.library.BinaryKind; +import com.android.jack.library.FileType; import com.android.jack.library.InputJackLibrary; import com.android.jack.library.InputLibrary; import com.android.jack.library.JackLibrary; @@ -191,7 +191,7 @@ public class JayceFileImporter { VPath path = new VPath(currentPath, VPATH_SEPARATOR); // library.properties and dex files are not resources if (path.equals(JackLibrary.LIBRARY_PROPERTIES_VPATH) || - currentPath.endsWith(BinaryKind.DEX.getFileExtension())) { + currentPath.endsWith(FileType.DEX.getFileExtension())) { return; } Resource newResource = new Resource(path, file); diff --git a/jack/src/com/android/jack/backend/jayce/JayceSingleTypeWriter.java b/jack/src/com/android/jack/backend/jayce/JayceSingleTypeWriter.java index 108ce65..998245b 100644 --- a/jack/src/com/android/jack/backend/jayce/JayceSingleTypeWriter.java +++ b/jack/src/com/android/jack/backend/jayce/JayceSingleTypeWriter.java @@ -24,6 +24,7 @@ import com.android.jack.ir.NonJackFormatIr; import com.android.jack.ir.ast.JDefinedClassOrInterface; import com.android.jack.ir.formatter.BinaryQualifiedNameFormatter; import com.android.jack.jayce.JayceWriterFactory; +import com.android.jack.library.FileType; import com.android.jack.library.LibraryIOException; import com.android.jack.library.OutputJackLibrary; import com.android.jack.scheduling.feature.JayceFileOutput; @@ -71,7 +72,7 @@ public class JayceSingleTypeWriter implements RunnableSchedulable<JDefinedClassO @Override public void run(@Nonnull JDefinedClassOrInterface type) throws Exception { - OutputVFile vFile = outputJackLibrary.getJayceOutputVFile( + OutputVFile vFile = outputJackLibrary.createFile(FileType.JAYCE, new VPath(BinaryQualifiedNameFormatter.getFormatter().getName(type), '/')); try { diff --git a/jack/src/com/android/jack/experimental/incremental/JackIncremental.java b/jack/src/com/android/jack/experimental/incremental/JackIncremental.java index 74dd299..75b13ea 100644 --- a/jack/src/com/android/jack/experimental/incremental/JackIncremental.java +++ b/jack/src/com/android/jack/experimental/incremental/JackIncremental.java @@ -31,7 +31,7 @@ import com.android.jack.frontend.FrontendCompilationException; import com.android.jack.ir.ast.JSession; import com.android.jack.ir.formatter.BinaryQualifiedNameFormatter; import com.android.jack.ir.formatter.TypeFormatter; -import com.android.jack.library.BinaryKind; +import com.android.jack.library.FileType; import com.android.jack.load.JackLoadingException; import com.android.jack.scheduling.marker.ClassDefItemMarker; import com.android.jack.util.TextUtils; @@ -569,7 +569,7 @@ public class JackIncremental extends CommandLine { @Nonnull protected static File getDexFile(@Nonnull String typeName) { - return new File(dexFilesFolder, new VPath(typeName + BinaryKind.DEX.getFileExtension(), + return new File(dexFilesFolder, new VPath(typeName + FileType.DEX.getFileExtension(), fileSeparator).getPathAsString(File.separatorChar)); } } diff --git a/jack/src/com/android/jack/ir/ast/JSession.java b/jack/src/com/android/jack/ir/ast/JSession.java index 20118d0..db6976f 100644 --- a/jack/src/com/android/jack/ir/ast/JSession.java +++ b/jack/src/com/android/jack/ir/ast/JSession.java @@ -23,7 +23,7 @@ import com.android.jack.ir.JNodeInternalError; import com.android.jack.ir.ast.JPrimitiveType.JPrimitiveTypeEnum; import com.android.jack.ir.sourceinfo.SourceInfo; import com.android.jack.ir.sourceinfo.SourceInfoFactory; -import com.android.jack.library.BinaryKind; +import com.android.jack.library.FileType; import com.android.jack.library.OutputJackLibrary; import com.android.jack.lookup.JNodeLookup; import com.android.jack.lookup.JPhantomLookup; @@ -86,7 +86,7 @@ public class JSession extends JNode { private final Reporter reporter = ThreadConfig.get(Reporter.REPORTER); @Nonnull - private final List<BinaryKind> generatedBinaryKinds = new ArrayList<BinaryKind>(1); + private final List<FileType> generatedBinaryKinds = new ArrayList<FileType>(2); @CheckForNull private OutputJackLibrary jackOutputLibrary; @@ -210,12 +210,12 @@ public class JSession extends JNode { } @Nonnull - public List<BinaryKind> getGeneratedBinaryKinds() { + public List<FileType> getGeneratedFileTypes() { return generatedBinaryKinds; } - public void addGeneratedBinaryKind(@Nonnull BinaryKind binaryKind) { - generatedBinaryKinds.add(binaryKind); + public void addGeneratedFileType(@Nonnull FileType fileType) { + generatedBinaryKinds.add(fileType); } public void addImportSource(@Nonnull InputRootVDir source) { diff --git a/jack/src/com/android/jack/library/BinaryKind.java b/jack/src/com/android/jack/library/BinaryKind.java deleted file mode 100644 index 7356a55..0000000 --- a/jack/src/com/android/jack/library/BinaryKind.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright (C) 2014 The Android Open Source Project - * - * 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.android.jack.library; - -import com.android.sched.vfs.InputVFile; - -import javax.annotation.Nonnull; - - -/** - * Binary kind supported by jack library. - */ -public enum BinaryKind { - DEX(".dex") { - @Override - public String toString() { - return "dex"; - } - }; - - @Nonnull - private final String extension; - - private BinaryKind(@Nonnull String extension) { - this.extension = extension; - } - - public boolean isBinaryFile(@Nonnull InputVFile v){ - return (v.getName().endsWith(getFileExtension())); - } - - @Nonnull - public String getFileExtension() { - return extension; - } - - @Nonnull - public static BinaryKind getBinaryKind(@Nonnull InputVFile v) throws NotBinaryException { - for (BinaryKind kind : BinaryKind.values()) { - if (kind.isBinaryFile(v)) { - return kind; - } - } - - throw new NotBinaryException(v); - } -} diff --git a/jack/src/com/android/jack/library/CommonJackLibrary.java b/jack/src/com/android/jack/library/CommonJackLibrary.java index c910e68..1fb6151 100644 --- a/jack/src/com/android/jack/library/CommonJackLibrary.java +++ b/jack/src/com/android/jack/library/CommonJackLibrary.java @@ -39,6 +39,12 @@ public abstract class CommonJackLibrary implements JackLibrary { this.libraryProperties = libraryProperties; } + @Override + @Nonnull + public boolean containsProperty(@Nonnull String key) { + return libraryProperties.containsKey(key); + } + @Nonnull @Override public String getProperty(@Nonnull String key) throws LibraryFormatException { diff --git a/jack/src/com/android/jack/library/FileType.java b/jack/src/com/android/jack/library/FileType.java new file mode 100644 index 0000000..748cc15 --- /dev/null +++ b/jack/src/com/android/jack/library/FileType.java @@ -0,0 +1,95 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * 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.android.jack.library; + +import com.android.jack.backend.dex.DexProperties; +import com.android.jack.jayce.JayceProperties; +import com.android.sched.vfs.InputVFile; + +import javax.annotation.Nonnull; + + +/** + * File types supported by jack library. + */ +public enum FileType { + DEX("dex", ".dex") { + @Override + public String toString() { + return "dex"; + } + @Override + public void check() throws LibraryFormatException { + } + @Override + public String getPropertyName() { + return DexProperties.KEY_DEX; + } + }, + JAYCE("jayce", ".jayce") { + @Override + public String toString() { + return "jayce"; + } + @Override + public void check() throws LibraryFormatException { + } + @Override + public String getPropertyName() { + return JayceProperties.KEY_JAYCE; + } + }; + + @Nonnull + private final String extension; + + @Nonnull + private final String prefix; + + private FileType(@Nonnull String prefix, @Nonnull String extension) { + this.prefix = prefix; + this.extension = extension; + } + + public abstract void check() throws LibraryFormatException; + + /** + * Get the name of a boolean property that specify if a library contains this file type. + * @return The property name. + */ + public abstract String getPropertyName(); + + public boolean isOfType(@Nonnull InputVFile v){ + return (v.getName().endsWith(getFileExtension())); + } + + @Nonnull + public String getFileExtension() { + return extension; + } + + @Nonnull + public static FileType getFileType(@Nonnull InputVFile v) throws UnsupportedFileTypeException { + for (FileType fileType : FileType.values()) { + if (fileType.isOfType(v)) { + return fileType; + } + } + + throw new UnsupportedFileTypeException(v); + } +} diff --git a/jack/src/com/android/jack/library/BinaryDoesNotExistException.java b/jack/src/com/android/jack/library/FileTypeDoesNotExistException.java index 0c2f54a..4c0dab3 100644 --- a/jack/src/com/android/jack/library/BinaryDoesNotExistException.java +++ b/jack/src/com/android/jack/library/FileTypeDoesNotExistException.java @@ -22,11 +22,10 @@ import com.android.sched.vfs.VPath; import javax.annotation.Nonnull; /** - * Exception specifying that the binary of type {@link BinaryKind} for a - * {@link VPath} representing a type does not exist at {@link Location}. + * Exception specifying that a {@link FileType} for a {@link VPath} representing a type does not + * exist at {@link Location}. */ -public class BinaryDoesNotExistException extends Exception { - +public class FileTypeDoesNotExistException extends Exception { private static final long serialVersionUID = 1L; @Nonnull @@ -36,18 +35,18 @@ public class BinaryDoesNotExistException extends Exception { private final VPath typePath; @Nonnull - private final BinaryKind binaryKind; + private final FileType fileType; - public BinaryDoesNotExistException(@Nonnull Location location, - @Nonnull VPath typePath, @Nonnull BinaryKind binaryKind) { + public FileTypeDoesNotExistException(@Nonnull Location location, + @Nonnull VPath typePath, @Nonnull FileType fileType) { this.location = location; this.typePath = typePath; - this.binaryKind = binaryKind; + this.fileType = fileType; } @Override public String getMessage() { - return binaryKind + " binary does not exist for " + return fileType + " does not exist for " + typePath.getPathAsString('.') + " in " + location.getDescription(); } diff --git a/jack/src/com/android/jack/library/InputJackLibrary.java b/jack/src/com/android/jack/library/InputJackLibrary.java index 2ce1313..176ea74 100644 --- a/jack/src/com/android/jack/library/InputJackLibrary.java +++ b/jack/src/com/android/jack/library/InputJackLibrary.java @@ -18,7 +18,10 @@ package com.android.jack.library; import com.android.jack.Jack; +import java.util.Collection; +import java.util.HashSet; import java.util.Properties; +import java.util.Set; import java.util.logging.Level; import javax.annotation.Nonnull; @@ -29,10 +32,37 @@ import javax.annotation.Nonnull; */ public abstract class InputJackLibrary extends CommonJackLibrary implements InputLibrary { + @Nonnull + private final Set<FileType> fileTypes = new HashSet<FileType>(2); + public InputJackLibrary(@Nonnull Properties libraryProperties) { super(libraryProperties); } + @Override + @Nonnull + public Collection<FileType> getFileTypes() { + return Jack.getUnmodifiableCollections().getUnmodifiableCollection(fileTypes); + } + + @Override + public boolean containsFileType(@Nonnull FileType fileType) { + return fileTypes.contains(fileType); + } + + protected void fillFileTypes() { + for (FileType ft : FileType.values()) { + try { + String propertyName = ft.getPropertyName(); + if (containsProperty(propertyName) && Boolean.parseBoolean(getProperty(propertyName))) { + fileTypes.add(ft); + } + } catch (LibraryFormatException e) { + throw new AssertionError(); + } + } + } + protected void check() throws LibraryVersionException, LibraryFormatException { getProperty(JackLibrary.KEY_LIB_EMITTER); getProperty(JackLibrary.KEY_LIB_EMITTER_VERSION); @@ -60,6 +90,10 @@ public abstract class InputJackLibrary extends CommonJackLibrary implements Inp Integer.valueOf(majorVersion), Integer.valueOf(minorVersion), Integer.valueOf(majorVersion), Integer.valueOf(supportedMinor)}); } + + for (FileType ft : getFileTypes()) { + ft.check(); + } } public abstract int getSupportedMinor(); diff --git a/jack/src/com/android/jack/library/InputLibrary.java b/jack/src/com/android/jack/library/InputLibrary.java index 23738f1..a21f5dc 100644 --- a/jack/src/com/android/jack/library/InputLibrary.java +++ b/jack/src/com/android/jack/library/InputLibrary.java @@ -21,7 +21,7 @@ import com.android.sched.vfs.InputVFile; import com.android.sched.vfs.VPath; import java.util.Collection; -import java.util.List; +import java.util.Iterator; import javax.annotation.Nonnull; @@ -34,16 +34,16 @@ public interface InputLibrary extends Library { public InputRootVDir getInputVDir(); @Nonnull - public Collection<BinaryKind> getBinaryKinds(); + public Collection<FileType> getFileTypes(); - public boolean hasBinary(@Nonnull BinaryKind binaryKind); + public boolean containsFileType(@Nonnull FileType fileType); @Nonnull - public List<InputVFile> getBinaries(@Nonnull BinaryKind binaryKind); + public InputVFile getFile(@Nonnull FileType fileType, @Nonnull VPath typePath) + throws FileTypeDoesNotExistException; @Nonnull - public InputVFile getBinary(@Nonnull VPath typePath, @Nonnull BinaryKind binaryKind) - throws BinaryDoesNotExistException; + public Iterator<InputVFile> iterator(@Nonnull FileType fileType); @Override @Nonnull diff --git a/jack/src/com/android/jack/library/JackLibrary.java b/jack/src/com/android/jack/library/JackLibrary.java index b85a8a1..3f98f4d 100644 --- a/jack/src/com/android/jack/library/JackLibrary.java +++ b/jack/src/com/android/jack/library/JackLibrary.java @@ -46,4 +46,7 @@ public interface JackLibrary extends Library { @Nonnull public String getProperty(@Nonnull String key) throws LibraryFormatException; + + @Nonnull + public boolean containsProperty(@Nonnull String key); } diff --git a/jack/src/com/android/jack/library/OutputLibrary.java b/jack/src/com/android/jack/library/OutputLibrary.java index 0bc4592..84b9c0a 100644 --- a/jack/src/com/android/jack/library/OutputLibrary.java +++ b/jack/src/com/android/jack/library/OutputLibrary.java @@ -29,11 +29,7 @@ public interface OutputLibrary extends Library { public boolean needsSequentialWriting(); - @Nonnull - public OutputVFile getJayceOutputVFile(@Nonnull VPath typePath) throws CannotCreateFileException; - - @Nonnull - public OutputVFile getBinaryOutputVFile(@Nonnull VPath typePath, @Nonnull BinaryKind binaryKind) + public OutputVFile createFile(@Nonnull FileType fileType, @Nonnull VPath typePath) throws CannotCreateFileException; public void close() throws LibraryIOException; diff --git a/jack/src/com/android/jack/library/NotBinaryException.java b/jack/src/com/android/jack/library/UnsupportedFileTypeException.java index 9c1cbaa..1a7a13d 100644 --- a/jack/src/com/android/jack/library/NotBinaryException.java +++ b/jack/src/com/android/jack/library/UnsupportedFileTypeException.java @@ -21,21 +21,21 @@ import com.android.sched.vfs.InputVFile; import javax.annotation.Nonnull; /** - * Exception specifying that an {@link InputVFile} is not a binary. + * Exception specifying that an {@link InputVFile} is not supported by the library */ -public class NotBinaryException extends Exception { +public class UnsupportedFileTypeException extends Exception { private static final long serialVersionUID = 1L; @Nonnull private final InputVFile vFile; - public NotBinaryException(@Nonnull InputVFile vFile) { + public UnsupportedFileTypeException(@Nonnull InputVFile vFile) { this.vFile = vFile; } @Override public String getMessage() { - return vFile + " is not a binary"; + return vFile + " is not supported by the library"; } } diff --git a/jack/src/com/android/jack/library/v0000/InputJackLibraryImpl.java b/jack/src/com/android/jack/library/v0000/InputJackLibraryImpl.java index fd56c1d..a98ce61 100644 --- a/jack/src/com/android/jack/library/v0000/InputJackLibraryImpl.java +++ b/jack/src/com/android/jack/library/v0000/InputJackLibraryImpl.java @@ -16,15 +16,13 @@ package com.android.jack.library.v0000; -import com.android.jack.Jack; -import com.android.jack.library.BinaryDoesNotExistException; -import com.android.jack.library.BinaryKind; +import com.android.jack.library.FileType; +import com.android.jack.library.FileTypeDoesNotExistException; import com.android.jack.library.InputJackLibrary; import com.android.jack.library.InputLibrary; import com.android.jack.library.InputLibraryLocation; import com.android.jack.library.LibraryFormatException; import com.android.jack.library.LibraryVersionException; -import com.android.jack.library.NotBinaryException; import com.android.sched.util.file.NotFileOrDirectoryException; import com.android.sched.util.log.LoggerFactory; import com.android.sched.vfs.InputRootVDir; @@ -34,11 +32,9 @@ import com.android.sched.vfs.InputVFile; import com.android.sched.vfs.VPath; import java.util.ArrayList; -import java.util.Collection; -import java.util.HashSet; +import java.util.Iterator; import java.util.List; import java.util.Properties; -import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; @@ -82,16 +78,13 @@ public class InputJackLibraryImpl extends InputJackLibrary { } }; - @Nonnull - private final Set<BinaryKind> binaryKinds = new HashSet<BinaryKind>(1); - public InputJackLibraryImpl(@Nonnull InputRootVDir libraryVDir, @Nonnull Properties libraryProperties) throws LibraryVersionException, LibraryFormatException { super(libraryProperties); this.libraryVDir = libraryVDir; check(); - fillBinaryKinds(libraryVDir); + fillFileTypes(); } @Override @@ -102,63 +95,38 @@ public class InputJackLibraryImpl extends InputJackLibrary { @Override @Nonnull - public Collection<BinaryKind> getBinaryKinds() { - return Jack.getUnmodifiableCollections().getUnmodifiableCollection(binaryKinds); - } - - @Override - public boolean hasBinary(@Nonnull BinaryKind binaryKind) { - return binaryKinds.contains(binaryKind); - } - - @Override - @Nonnull - public List<InputVFile> getBinaries(@Nonnull BinaryKind binaryKind) { - List<InputVFile> binaries = new ArrayList<InputVFile>(); - fillBinaries(libraryVDir, binaryKind, binaries); - return binaries; - } - - @Override - @Nonnull - public InputVFile getBinary(@Nonnull VPath typePath, @Nonnull BinaryKind binaryKind) - throws BinaryDoesNotExistException { + public InputVFile getFile(@Nonnull FileType fileType, @Nonnull VPath typePath) + throws FileTypeDoesNotExistException { try { return libraryVDir.getInputVFile( - new VPath(typePath.getPathAsString('/') + BinaryKind.DEX.getFileExtension(), '/')); + new VPath(typePath.getPathAsString('/') + fileType.getFileExtension(), '/')); } catch (NotFileOrDirectoryException e) { - throw new BinaryDoesNotExistException(getLocation(), typePath, binaryKind); + throw new FileTypeDoesNotExistException(getLocation(), typePath, fileType); } } @Override @Nonnull - public InputRootVDir getInputVDir() { - return libraryVDir; + public Iterator<InputVFile> iterator(@Nonnull FileType fileType) { + List<InputVFile> inputVFiles = new ArrayList<InputVFile>(); + fillFiles(libraryVDir, fileType, inputVFiles); + return inputVFiles.iterator(); } - private void fillBinaryKinds(@Nonnull InputVDir vDir) { - for (InputVElement subFile : vDir.list()) { - if (subFile.isVDir()) { - fillBinaryKinds((InputVDir) subFile); - } else { - try { - binaryKinds.add(BinaryKind.getBinaryKind((InputVFile) subFile)); - } catch (NotBinaryException e) { - // Ok, nothing to do - } - } - } + @Override + @Nonnull + public InputRootVDir getInputVDir() { + return libraryVDir; } - private void fillBinaries(@Nonnull InputVDir vDir, @Nonnull BinaryKind binaryKind, + private void fillFiles(@Nonnull InputVDir vDir, @Nonnull FileType fileType, @Nonnull List<InputVFile> binaries) { for (InputVElement subFile : vDir.list()) { if (subFile.isVDir()) { - fillBinaries((InputVDir) subFile, binaryKind, binaries); + fillFiles((InputVDir) subFile, fileType, binaries); } else { InputVFile vFile = (InputVFile) subFile; - if (binaryKind.isBinaryFile(vFile)) { + if (fileType.isOfType(vFile)) { binaries.add(vFile); } } diff --git a/jack/src/com/android/jack/library/v0000/OutputJackLibraryImpl.java b/jack/src/com/android/jack/library/v0000/OutputJackLibraryImpl.java index 8666964..84752bd 100644 --- a/jack/src/com/android/jack/library/v0000/OutputJackLibraryImpl.java +++ b/jack/src/com/android/jack/library/v0000/OutputJackLibraryImpl.java @@ -16,9 +16,7 @@ package com.android.jack.library.v0000; -import com.android.jack.backend.dex.DexProperties; -import com.android.jack.backend.jayce.JayceFileImporter; -import com.android.jack.library.BinaryKind; +import com.android.jack.library.FileType; import com.android.jack.library.LibraryIOException; import com.android.jack.library.OutputJackLibrary; import com.android.jack.library.OutputLibrary; @@ -80,9 +78,11 @@ public class OutputJackLibraryImpl extends OutputJackLibrary { @Override @Nonnull - public OutputVFile getJayceOutputVFile(@Nonnull VPath typePath) throws CannotCreateFileException { + public OutputVFile createFile(@Nonnull FileType fileType, @Nonnull VPath typePath) + throws CannotCreateFileException { + putProperty(fileType.getPropertyName(), String.valueOf(true)); return outputVDir.createOutputVFile( - new VPath(typePath.getPathAsString('/') + JayceFileImporter.JAYCE_FILE_EXTENSION, '/')); + new VPath(typePath.getPathAsString('/') + fileType.getFileExtension(), '/')); } @Override @@ -92,17 +92,6 @@ public class OutputJackLibraryImpl extends OutputJackLibrary { @Override @Nonnull - public OutputVFile getBinaryOutputVFile(@Nonnull VPath typePath, @Nonnull BinaryKind binaryKind) - throws CannotCreateFileException { - if (binaryKind == BinaryKind.DEX) { - putProperty(DexProperties.KEY_DEX, String.valueOf(true)); - } - return outputVDir.createOutputVFile( - new VPath(typePath.getPathAsString('/') + binaryKind.getFileExtension(), '/')); - } - - @Override - @Nonnull public OutputLibraryLocation getLocation() { return location; } diff --git a/jack/src/com/android/jack/library/v0001/InputJackLibraryImpl.java b/jack/src/com/android/jack/library/v0001/InputJackLibraryImpl.java index 5d3bc99..8222359 100644 --- a/jack/src/com/android/jack/library/v0001/InputJackLibraryImpl.java +++ b/jack/src/com/android/jack/library/v0001/InputJackLibraryImpl.java @@ -16,15 +16,13 @@ package com.android.jack.library.v0001; -import com.android.jack.Jack; -import com.android.jack.library.BinaryDoesNotExistException; -import com.android.jack.library.BinaryKind; +import com.android.jack.library.FileType; +import com.android.jack.library.FileTypeDoesNotExistException; import com.android.jack.library.InputJackLibrary; import com.android.jack.library.InputLibrary; import com.android.jack.library.InputLibraryLocation; import com.android.jack.library.LibraryFormatException; import com.android.jack.library.LibraryVersionException; -import com.android.jack.library.NotBinaryException; import com.android.sched.util.file.NotFileOrDirectoryException; import com.android.sched.util.log.LoggerFactory; import com.android.sched.vfs.InputRootVDir; @@ -34,11 +32,9 @@ import com.android.sched.vfs.InputVFile; import com.android.sched.vfs.VPath; import java.util.ArrayList; -import java.util.Collection; -import java.util.HashSet; +import java.util.Iterator; import java.util.List; import java.util.Properties; -import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; @@ -82,16 +78,13 @@ public class InputJackLibraryImpl extends InputJackLibrary { } }; - @Nonnull - private final Set<BinaryKind> binaryKinds = new HashSet<BinaryKind>(1); - public InputJackLibraryImpl(@Nonnull InputRootVDir libraryVDir, @Nonnull Properties libraryProperties) throws LibraryVersionException, LibraryFormatException { super(libraryProperties); this.libraryVDir = libraryVDir; check(); - fillBinaryKinds(libraryVDir); + fillFileTypes(); } @Override @@ -102,63 +95,39 @@ public class InputJackLibraryImpl extends InputJackLibrary { @Override @Nonnull - public Collection<BinaryKind> getBinaryKinds() { - return Jack.getUnmodifiableCollections().getUnmodifiableCollection(binaryKinds); - } - - @Override - public boolean hasBinary(@Nonnull BinaryKind binaryKind) { - return binaryKinds.contains(binaryKind); - } - - @Override - @Nonnull - public List<InputVFile> getBinaries(@Nonnull BinaryKind binaryKind) { - List<InputVFile> binaries = new ArrayList<InputVFile>(); - fillBinaries(libraryVDir, binaryKind, binaries); - return binaries; - } - - @Override - @Nonnull - public InputVFile getBinary(@Nonnull VPath typePath, @Nonnull BinaryKind binaryKind) - throws BinaryDoesNotExistException { + public InputVFile getFile(@Nonnull FileType fileType, @Nonnull VPath typePath) + throws FileTypeDoesNotExistException { try { return libraryVDir.getInputVFile( - new VPath(typePath.getPathAsString('/') + BinaryKind.DEX.getFileExtension(), '/')); + new VPath(typePath.getPathAsString('/') + fileType.getFileExtension(), '/')); } catch (NotFileOrDirectoryException e) { - throw new BinaryDoesNotExistException(getLocation(), typePath, binaryKind); + throw new FileTypeDoesNotExistException(getLocation(), typePath, fileType); } } @Override @Nonnull + public Iterator<InputVFile> iterator(@Nonnull FileType fileType) { + List<InputVFile> inputVFiles = new ArrayList<InputVFile>(); + fillFiles(libraryVDir, fileType, inputVFiles); + return inputVFiles.listIterator(); + } + + @Override + @Nonnull public InputRootVDir getInputVDir() { return libraryVDir; } - private void fillBinaryKinds(@Nonnull InputVDir vDir) { - for (InputVElement subFile : vDir.list()) { - if (subFile.isVDir()) { - fillBinaryKinds((InputVDir) subFile); - } else { - try { - binaryKinds.add(BinaryKind.getBinaryKind((InputVFile) subFile)); - } catch (NotBinaryException e) { - // Ok, nothing to do - } - } - } - } - private void fillBinaries(@Nonnull InputVDir vDir, @Nonnull BinaryKind binaryKind, + private void fillFiles(@Nonnull InputVDir vDir, @Nonnull FileType fileType, @Nonnull List<InputVFile> binaries) { for (InputVElement subFile : vDir.list()) { if (subFile.isVDir()) { - fillBinaries((InputVDir) subFile, binaryKind, binaries); + fillFiles((InputVDir) subFile, fileType, binaries); } else { InputVFile vFile = (InputVFile) subFile; - if (binaryKind.isBinaryFile(vFile)) { + if (fileType.isOfType(vFile)) { binaries.add(vFile); } } diff --git a/jack/src/com/android/jack/library/v0001/OutputJackLibraryImpl.java b/jack/src/com/android/jack/library/v0001/OutputJackLibraryImpl.java index e8ea371..e1a548f 100644 --- a/jack/src/com/android/jack/library/v0001/OutputJackLibraryImpl.java +++ b/jack/src/com/android/jack/library/v0001/OutputJackLibraryImpl.java @@ -16,9 +16,7 @@ package com.android.jack.library.v0001; -import com.android.jack.backend.dex.DexProperties; -import com.android.jack.backend.jayce.JayceFileImporter; -import com.android.jack.library.BinaryKind; +import com.android.jack.library.FileType; import com.android.jack.library.LibraryIOException; import com.android.jack.library.OutputJackLibrary; import com.android.jack.library.OutputLibrary; @@ -81,11 +79,12 @@ public class OutputJackLibraryImpl extends OutputJackLibrary { @Override @Nonnull - public OutputVFile getJayceOutputVFile(@Nonnull VPath typePath) throws CannotCreateFileException { + public OutputVFile createFile(@Nonnull FileType fileType, @Nonnull VPath typePath) + throws CannotCreateFileException { + putProperty(fileType.getPropertyName(), String.valueOf(true)); return outputVDir.createOutputVFile( - new VPath(typePath.getPathAsString('/') + JayceFileImporter.JAYCE_FILE_EXTENSION, '/')); + new VPath(typePath.getPathAsString('/') + fileType.getFileExtension(), '/')); } - @Override public boolean needsSequentialWriting() { return outputVDir instanceof SequentialOutputVDir; @@ -93,17 +92,6 @@ public class OutputJackLibraryImpl extends OutputJackLibrary { @Override @Nonnull - public OutputVFile getBinaryOutputVFile(@Nonnull VPath typePath, @Nonnull BinaryKind binaryKind) - throws CannotCreateFileException { - if (binaryKind == BinaryKind.DEX) { - putProperty(DexProperties.KEY_DEX, String.valueOf(true)); - } - return outputVDir.createOutputVFile( - new VPath(typePath.getPathAsString('/') + binaryKind.getFileExtension(), '/')); - } - - @Override - @Nonnull public OutputLibraryLocation getLocation() { return location; } diff --git a/jack/src/com/android/jack/scheduling/adapter/ExcludeTypeFromLibWithBinaryAdapter.java b/jack/src/com/android/jack/scheduling/adapter/ExcludeTypeFromLibWithBinaryAdapter.java index 1dbc375..51f004c 100644 --- a/jack/src/com/android/jack/scheduling/adapter/ExcludeTypeFromLibWithBinaryAdapter.java +++ b/jack/src/com/android/jack/scheduling/adapter/ExcludeTypeFromLibWithBinaryAdapter.java @@ -60,7 +60,7 @@ public class ExcludeTypeFromLibWithBinaryAdapter if (location instanceof TypeInInputLibraryLocation) { InputLibrary inputLibrary = ((TypeInInputLibraryLocation) location) .getInputLibraryLocation().getInputLibrary(); - if (inputLibrary.getBinaryKinds().containsAll(session.getGeneratedBinaryKinds())) { + if (inputLibrary.getFileTypes().containsAll(session.getGeneratedFileTypes())) { return false; } } |