1   /*
2    * Copyright 2017 LINE Corporation
3    *
4    * LINE Corporation licenses this file to you under the Apache License,
5    * version 2.0 (the "License"); you may not use this file except in compliance
6    * with the License. You may obtain a copy of the License at:
7    *
8    *   https://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12   * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13   * License for the specific language governing permissions and limitations
14   * under the License.
15   */
16  
17  package com.linecorp.centraldogma.server.internal.storage.repository.git;
18  
19  import static java.util.Objects.requireNonNull;
20  
21  import java.io.IOException;
22  import java.io.StringWriter;
23  
24  import com.fasterxml.jackson.core.JsonGenerator;
25  import com.fasterxml.jackson.databind.JsonNode;
26  
27  import com.linecorp.centraldogma.common.Author;
28  import com.linecorp.centraldogma.common.Commit;
29  import com.linecorp.centraldogma.common.Markup;
30  import com.linecorp.centraldogma.common.Revision;
31  import com.linecorp.centraldogma.internal.Jackson;
32  import com.linecorp.centraldogma.server.storage.StorageException;
33  
34  final class CommitUtil {
35  
36      private static final String FIELD_NAME_SUMMARY = "summary";
37      private static final String FIELD_NAME_DETAIL = "detail";
38      private static final String FIELD_NAME_MARKUP = "markup";
39      private static final String FIELD_NAME_REVISION = "revision";
40  
41      static String toJsonString(String summary, String detail, Markup markup, Revision nextRevision) {
42          try {
43              final StringWriter stringWriter = new StringWriter();
44              final JsonGenerator jsonGenerator = Jackson.createPrettyGenerator(stringWriter);
45              jsonGenerator.writeStartObject();
46              jsonGenerator.writeStringField(FIELD_NAME_SUMMARY, summary);
47              jsonGenerator.writeStringField(FIELD_NAME_DETAIL, detail);
48              jsonGenerator.writeStringField(FIELD_NAME_MARKUP, markup.nameLowercased());
49              jsonGenerator.writeStringField(FIELD_NAME_REVISION, nextRevision.text());
50              jsonGenerator.writeEndObject();
51              jsonGenerator.close();
52              return stringWriter.toString();
53          } catch (IOException e) {
54              throw new StorageException("failed to generate a JSON string", e);
55          }
56      }
57  
58      static Revision extractRevision(String jsonString) {
59          try {
60              final JsonNode jsonNode = Jackson.readTree(jsonString);
61              return new Revision(Jackson.textValue(jsonNode.get(FIELD_NAME_REVISION), ""));
62          } catch (Exception e) {
63              throw new StorageException("failed to extract revision from " + jsonString, e);
64          }
65      }
66  
67      static Commit newCommit(Author author, long when, String jsonString) {
68          requireNonNull(author, "author");
69          when = when / 1000L * 1000L; // Drop the milliseconds
70          try {
71              final JsonNode jsonNode = Jackson.readTree(jsonString);
72  
73              final String summary = Jackson.textValue(jsonNode.get(FIELD_NAME_SUMMARY), "");
74              final String detail = Jackson.textValue(jsonNode.get(FIELD_NAME_DETAIL), "");
75  
76              final Markup markup;
77              switch (Jackson.textValue(jsonNode.get(FIELD_NAME_MARKUP), "")) {
78              case "plaintext":
79                  markup = Markup.PLAINTEXT;
80                  break;
81              case "markdown":
82                  markup = Markup.MARKDOWN;
83                  break;
84              default:
85                  markup = Markup.UNKNOWN;
86              }
87  
88              final Revision revision = new Revision(Jackson.textValue(jsonNode.get(FIELD_NAME_REVISION), ""));
89  
90              return new Commit(revision, author, when, summary, detail, markup);
91          } catch (Exception e) {
92              throw new StorageException("failed to create a Commit", e);
93          }
94      }
95  
96      private CommitUtil() {}
97  }