Convert ChangeInfoMapper to a pure function

There is no need to specify the list of options; these were already
passed to whatever method produced the ChangeJson.ChangeInfos. Just
copy all present fields.

Change-Id: I27b842720a7ea8ef201d30fab5857783d6beab77
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/ChangeApiImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/ChangeApiImpl.java
index 8d4a0c9..5c5c569 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/ChangeApiImpl.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/ChangeApiImpl.java
@@ -164,7 +164,7 @@
   public ChangeInfo get(EnumSet<ListChangesOption> s)
       throws RestApiException {
     try {
-      return new ChangeInfoMapper(s).map(
+      return ChangeInfoMapper.INSTANCE.apply(
           changeJson.addOptions(s).format(change));
     } catch (OrmException e) {
       throw new RestApiException("Cannot retrieve change", e);
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/ChangeInfoMapper.java b/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/ChangeInfoMapper.java
index 6aab89c..8e6c20b 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/ChangeInfoMapper.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/ChangeInfoMapper.java
@@ -14,13 +14,7 @@
 
 package com.google.gerrit.server.api.changes;
 
-import static com.google.gerrit.extensions.common.ListChangesOption.ALL_REVISIONS;
-import static com.google.gerrit.extensions.common.ListChangesOption.CURRENT_ACTIONS;
-import static com.google.gerrit.extensions.common.ListChangesOption.CURRENT_REVISION;
-import static com.google.gerrit.extensions.common.ListChangesOption.DETAILED_LABELS;
-import static com.google.gerrit.extensions.common.ListChangesOption.LABELS;
-import static com.google.gerrit.extensions.common.ListChangesOption.MESSAGES;
-
+import com.google.common.base.Function;
 import com.google.common.collect.EnumBiMap;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
@@ -29,48 +23,46 @@
 import com.google.gerrit.extensions.common.ChangeMessageInfo;
 import com.google.gerrit.extensions.common.ChangeStatus;
 import com.google.gerrit.extensions.common.LabelInfo;
-import com.google.gerrit.extensions.common.ListChangesOption;
 import com.google.gerrit.reviewdb.client.Change;
 import com.google.gerrit.reviewdb.client.Change.Status;
 import com.google.gerrit.server.api.accounts.AccountInfoMapper;
 import com.google.gerrit.server.change.ChangeJson;
 
-import java.util.EnumSet;
 import java.util.List;
 import java.util.Map;
 
-public class ChangeInfoMapper {
-  private final static EnumBiMap<Change.Status, ChangeStatus> MAP =
+public class ChangeInfoMapper
+    implements Function<ChangeJson.ChangeInfo, ChangeInfo> {
+  public static final ChangeInfoMapper INSTANCE = new ChangeInfoMapper();
+
+  private final static EnumBiMap<Change.Status, ChangeStatus> STATUS_MAP =
       EnumBiMap.create(Change.Status.class, ChangeStatus.class);
   static {
-    MAP.put(Status.DRAFT, ChangeStatus.DRAFT);
-    MAP.put(Status.NEW, ChangeStatus.NEW);
-    MAP.put(Status.SUBMITTED, ChangeStatus.SUBMITTED);
-    MAP.put(Status.MERGED, ChangeStatus.MERGED);
-    MAP.put(Status.ABANDONED, ChangeStatus.ABANDONED);
+    STATUS_MAP.put(Status.DRAFT, ChangeStatus.DRAFT);
+    STATUS_MAP.put(Status.NEW, ChangeStatus.NEW);
+    STATUS_MAP.put(Status.SUBMITTED, ChangeStatus.SUBMITTED);
+    STATUS_MAP.put(Status.MERGED, ChangeStatus.MERGED);
+    STATUS_MAP.put(Status.ABANDONED, ChangeStatus.ABANDONED);
   }
 
-  private final EnumSet<ListChangesOption> s;
-
-  ChangeInfoMapper(EnumSet<ListChangesOption> s) {
-    this.s = s;
+  public static Status changeStatus2Status(ChangeStatus status) {
+    if (status != null) {
+      return STATUS_MAP.inverse().get(status);
+    }
+    return Change.Status.NEW;
   }
 
-  ChangeInfo map(ChangeJson.ChangeInfo i) {
+  private ChangeInfoMapper() {
+  }
+
+  @Override
+  public ChangeInfo apply(ChangeJson.ChangeInfo i) {
     ChangeInfo o = new ChangeInfo();
     mapCommon(i, o);
-    if (has(LABELS) || has(DETAILED_LABELS)) {
-      mapLabels(i, o);
-    }
-    if (has(MESSAGES)) {
-      mapMessages(i, o);
-    }
-    if (has(ALL_REVISIONS) || has(CURRENT_REVISION)) {
-      o.revisions = i.revisions;
-    }
-    if (has(CURRENT_ACTIONS)) {
-      o.actions = i.actions;
-    }
+    mapLabels(i, o);
+    mapMessages(i, o);
+    o.revisions = i.revisions;
+    o.actions = i.actions;
     return o;
   }
 
@@ -81,7 +73,7 @@
     o.topic = i.topic;
     o.changeId = i.changeId;
     o.subject = i.subject;
-    o.status = MAP.get(i.status);
+    o.status = STATUS_MAP.get(i.status);
     o.created = i.created;
     o.updated = i.updated;
     o.starred = i.starred;
@@ -95,6 +87,9 @@
   }
 
   private void mapMessages(ChangeJson.ChangeInfo i, ChangeInfo o) {
+    if (i.messages == null) {
+      return;
+    }
     List<ChangeMessageInfo> r =
         Lists.newArrayListWithCapacity(i.messages.size());
     for (ChangeJson.ChangeMessageInfo m : i.messages) {
@@ -110,6 +105,9 @@
   }
 
   private void mapLabels(ChangeJson.ChangeInfo i, ChangeInfo o) {
+    if (i.labels == null) {
+      return;
+    }
     Map<String, LabelInfo> r = Maps.newLinkedHashMap();
     for (Map.Entry<String, ChangeJson.LabelInfo> e : i.labels.entrySet()) {
       ChangeJson.LabelInfo li = e.getValue();
@@ -134,17 +132,6 @@
     o.labels = r;
   }
 
-  private boolean has(ListChangesOption o) {
-    return s.contains(o);
-  }
-
-  public static Status changeStatus2Status(ChangeStatus status) {
-    if (status != null) {
-      return MAP.inverse().get(status);
-    }
-    return Change.Status.NEW;
-  }
-
   private static ApprovalInfo fromApprovalInfo(ChangeJson.ApprovalInfo ai) {
     ApprovalInfo ao = new ApprovalInfo();
     ao.value = ai.value;