aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/rules/objc/Xcdatamodels.java
diff options
context:
space:
mode:
authorGravatar Han-Wen Nienhuys <hanwen@google.com>2015-02-25 16:45:20 +0100
committerGravatar Han-Wen Nienhuys <hanwen@google.com>2015-02-25 16:45:20 +0100
commitd08b27fa9701fecfdb69e1b0d1ac2459efc2129b (patch)
tree5d50963026239ca5aebfb47ea5b8db7e814e57c8 /src/main/java/com/google/devtools/build/lib/rules/objc/Xcdatamodels.java
Update from Google.
-- MOE_MIGRATED_REVID=85702957
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/rules/objc/Xcdatamodels.java')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/Xcdatamodels.java71
1 files changed, 71 insertions, 0 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/Xcdatamodels.java b/src/main/java/com/google/devtools/build/lib/rules/objc/Xcdatamodels.java
new file mode 100644
index 0000000000..32d48aa696
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/Xcdatamodels.java
@@ -0,0 +1,71 @@
+// Copyright 2014 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.devtools.build.lib.rules.objc;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.ImmutableSetMultimap;
+import com.google.common.collect.Multimap;
+import com.google.devtools.build.lib.actions.Artifact;
+import com.google.devtools.build.lib.util.FileType;
+import com.google.devtools.build.lib.vfs.PathFragment;
+
+import java.util.Collection;
+import java.util.Map;
+
+/**
+ * Utility code for getting information specific to xcdatamodels for a single rule.
+ */
+class Xcdatamodels {
+ private Xcdatamodels() {}
+
+ static final ImmutableList<FileType> CONTAINER_TYPES =
+ ImmutableList.of(FileType.of(".xcdatamodeld"), FileType.of(".xcdatamodel"));
+
+ static Iterable<Xcdatamodel> xcdatamodels(
+ IntermediateArtifacts intermediateArtifacts, Iterable<Artifact> xcdatamodels) {
+ ImmutableSet.Builder<Xcdatamodel> result = new ImmutableSet.Builder<>();
+ Multimap<PathFragment, Artifact> artifactsByContainer = byContainer(xcdatamodels);
+
+ for (Map.Entry<PathFragment, Collection<Artifact>> modelDirEntry :
+ artifactsByContainer.asMap().entrySet()) {
+ PathFragment container = modelDirEntry.getKey();
+ Artifact outputZip = intermediateArtifacts.compiledMomZipArtifact(container);
+ result.add(
+ new Xcdatamodel(outputZip, ImmutableSet.copyOf(modelDirEntry.getValue()), container));
+ }
+
+ return result.build();
+ }
+
+
+ /**
+ * Arrange a sequence of artifacts into entries of a multimap by their nearest container
+ * directory, preferring {@code .xcdatamodeld} over {@code .xcdatamodel}.
+ * If an artifact is not inside any containing directory, then it is not present in the returned
+ * map.
+ */
+ static Multimap<PathFragment, Artifact> byContainer(Iterable<Artifact> artifacts) {
+ ImmutableSetMultimap.Builder<PathFragment, Artifact> result =
+ new ImmutableSetMultimap.Builder<>();
+ for (Artifact artifact : artifacts) {
+ for (PathFragment modelDir :
+ ObjcCommon.nearestContainerMatching(CONTAINER_TYPES, artifact).asSet()) {
+ result.put(modelDir, artifact);
+ }
+ }
+ return result.build();
+ }
+}