diff --git a/symmetric-assemble/asciidoc.gradle b/symmetric-assemble/asciidoc.gradle index c5d471222e..dfd99c4bd2 100644 --- a/symmetric-assemble/asciidoc.gradle +++ b/symmetric-assemble/asciidoc.gradle @@ -63,7 +63,8 @@ task generateReleaseNotes { symAssembleDir + '/build/docJars/pro-' + latestPreviousVersion + "/symmetric-console-default.properties", symAssembleDir + '/build/docJars/pro-' + latestPreviousVersion + "/console-schema.xml", symAssembleDir + '/src/asciidoc/generated/release-notes.ad', - 'https://status.symmetricds.org/api/get-issues.php?version=' + version.substring(0, version.lastIndexOf(".")) + '&secret=' + restAPISecret + version.substring(0, version.lastIndexOf(".")), + "https://jumpmind.atlassian.net" ] } } diff --git a/symmetric-assemble/gradle.properties b/symmetric-assemble/gradle.properties index 456ebd49c8..997e02f676 100644 --- a/symmetric-assemble/gradle.properties +++ b/symmetric-assemble/gradle.properties @@ -18,6 +18,5 @@ vaadinPluginVersion=24.9.3 org.gradle.daemon=false org.gradle.jvmargs=-Xmx4096M latestPreviousVersion=3.15.19 -restAPISecret=? dockerUser=? -dockerPassword=? +dockerPassword=? \ No newline at end of file diff --git a/symmetric-db/build.gradle b/symmetric-db/build.gradle index 21167af846..780cc86283 100644 --- a/symmetric-db/build.gradle +++ b/symmetric-db/build.gradle @@ -9,6 +9,7 @@ apply from: symAssembleDir + '/common.gradle' exclude group: "commons-collections" exclude group: 'commons-logging' } + implementation("org.springframework:spring-web:$springVersion") compileOnly ("com.datastax.cassandra:cassandra-driver-core:3.11.1") { exclude group: 'org.slf4j' diff --git a/symmetric-db/src/main/java/org/jumpmind/db/io/Issue.java b/symmetric-db/src/main/java/org/jumpmind/db/io/Issue.java index ea7bfcacb0..b62a126396 100644 --- a/symmetric-db/src/main/java/org/jumpmind/db/io/Issue.java +++ b/symmetric-db/src/main/java/org/jumpmind/db/io/Issue.java @@ -55,12 +55,13 @@ public void setProject(String project) { public int getPriorityAsInt() { if (priority != null) { - if (priority.equalsIgnoreCase("low")) + if (priority.equalsIgnoreCase("low")) { return 1; - else if (priority.equalsIgnoreCase("medium")) + } else if (priority.equalsIgnoreCase("medium")) { return 2; - else if (priority.equalsIgnoreCase("high")) + } else if (priority.equalsIgnoreCase("high")) { return 3; + } } return -1; } @@ -96,4 +97,17 @@ public String getTag() { public void setTag(String tag) { this.tag = tag; } + + @Override + public String toString() { + return "Issue{" + + "id='" + id + '\'' + + ", version='" + version + '\'' + + ", project='" + project + '\'' + + ", priority='" + priority + '\'' + + ", summary='" + summary + '\'' + + ", category='" + category + '\'' + + ", tag='" + tag + '\'' + + '}'; + } } diff --git a/symmetric-db/src/main/java/org/jumpmind/db/io/ReleaseNotesConstants.java b/symmetric-db/src/main/java/org/jumpmind/db/io/ReleaseNotesConstants.java index 292184853e..376825c647 100644 --- a/symmetric-db/src/main/java/org/jumpmind/db/io/ReleaseNotesConstants.java +++ b/symmetric-db/src/main/java/org/jumpmind/db/io/ReleaseNotesConstants.java @@ -30,7 +30,7 @@ public class ReleaseNotesConstants { public static final String PRO_PROPERTIES_DIR = "../../symmetric-pro/symmetric-pro/src/main/resources/symmetric-console-default.properties"; public static final String SCHEMA_DIR = "../symmetric-core/src/main/resources/symmetric-schema.xml"; public static final String PRO_SCHEMA_DIR = "../../symmetric-pro/symmetric-pro/src/main/resources/console-schema.xml"; - public static final String ISSUE_URL = "https://www.symmetricds.org/issues/view.php?id=%s[%s]"; + public static final String ISSUE_URL = "https://jumpmind.atlassian.net/browse/%s[%s]"; public static final String PROPERTIES_OLD_LOCATION = "build/"; public static final String NOTES_HEADER = "= Release Notes"; public static final String OVERVIEW_HEADER = "== Overview"; @@ -103,4 +103,6 @@ public class ReleaseNotesConstants { public static final String ISSUES_VERSION_HEADER_PRO = "*%s (Pro)*"; public static final String ISSUES_VERSION_HEADER = "*%s*"; public static final String ISSUES_FORMAT = "%s - %s"; + public static final String SYMMETRIC_DS_PROJECT = "symmetric-ds"; + public static final String SYMMETRIC_PRO_PROJECT = "symmetric-pro"; } diff --git a/symmetric-db/src/main/java/org/jumpmind/db/io/ReleaseNotesGenerator.java b/symmetric-db/src/main/java/org/jumpmind/db/io/ReleaseNotesGenerator.java index 9ffc1a9cf2..33071dfd42 100644 --- a/symmetric-db/src/main/java/org/jumpmind/db/io/ReleaseNotesGenerator.java +++ b/symmetric-db/src/main/java/org/jumpmind/db/io/ReleaseNotesGenerator.java @@ -20,11 +20,14 @@ */ package org.jumpmind.db.io; +import static org.jumpmind.db.io.ReleaseNotesConstants.*; + import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; +import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; @@ -55,8 +58,12 @@ import org.jumpmind.db.model.Table; import org.jumpmind.properties.DefaultParameterParser; import org.jumpmind.properties.DefaultParameterParser.ParameterMetaData; +import org.springframework.web.util.UriComponentsBuilder; import com.google.gson.Gson; +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; public class ReleaseNotesGenerator { private static int features = 0; @@ -77,11 +84,11 @@ public static void main(String[] args) throws Exception { String issuesFile = directory + "issues.ad"; String tablesFile = directory + "tables.ad"; String parametersFile = directory + "parameters.ad"; - if (args.length < 6) { + if (args.length < 7) { System.err.println("wrong usage"); System.exit(-1); } - List issues = buildIssuesFromRestAPI(args[5]); + List issues = buildIssuesFromJira(args[6], args[5]); String properties = args[0]; String schema = args[1]; String proProperties = args[2]; @@ -103,58 +110,184 @@ public static void main(String[] args) throws Exception { parametersSec.close(); } - protected static List buildIssuesFromRestAPI(String url) throws Exception { - URL apiURL = new URL(url); - HttpURLConnection conn = (HttpURLConnection) apiURL.openConnection(); - if (conn.getResponseCode() != 200) { - throw new RuntimeException("Failed : HTTP Error code : " + conn.getResponseCode()); - } - InputStreamReader in = new InputStreamReader(conn.getInputStream()); - BufferedReader br = new BufferedReader(in); - StringBuilder buffer = new StringBuilder(); - buffer.append("["); - String output; - while ((output = br.readLine()) != null) { - buffer.append(output); - } - buffer.append("]"); - String json = buffer.toString(); - json = json.replaceAll("\\}\\{", "},{"); - conn.disconnect(); - List issues = new ArrayList(); - @SuppressWarnings("unchecked") - List> root = new Gson().fromJson(json, List.class); - for (Map map : root) { - Issue issue = new Issue(); - issue.setId(map.get("id")); - issue.setCategory(map.get("category")); - issue.setProject(map.get("project")); - issue.setPriority(map.get("priority")); - issue.setSummary(map.get("summary")); - issue.setTag(map.get("tag")); - issue.setVersion(map.get("version")); - issues.add(issue); + /** + * Builds a complete list of issues from a JIRA API that returns paginated results. + */ + private static List buildIssuesFromJira(String url, String majorMinorVersion) throws Exception { + List issues = new ArrayList<>(); + String nextPageToken = null; + do { + PageResult issuesPage = fetchIssuesPage(url, majorMinorVersion, nextPageToken); + issues.addAll(issuesPage.getIssues()); + nextPageToken = issuesPage.getNextPageToken(); + if (nextPageToken != null) { + System.out.println("INFO: There are more issues to fetch. Calling the API again for the next page of results."); + } + } while (nextPageToken != null); + return issues; + } + + /** + * Fetches a single page of issues. + */ + private static PageResult fetchIssuesPage(String url, String majorMinorVersion, String pageToken) throws Exception { + HttpURLConnection conn = null; + try { + conn = buildJiraConnection(url, majorMinorVersion, pageToken); + if (conn.getResponseCode() != 200) { + throw new RuntimeException("Failed : HTTP Error code : " + conn.getResponseCode()); + } + return parsePageResult(readResponse(conn)); + } finally { + if (conn != null) { + conn.disconnect(); + } + } + } + + private static HttpURLConnection buildJiraConnection(String url, String majorMinorVersion, String nextPageToken) + throws IOException { + UriComponentsBuilder uriBuilder = UriComponentsBuilder.fromUriString(url) + .path("/rest/api/3/search/jql") + .queryParam("jql", "project=SYM AND status = Closed AND fixVersion ~ \"" + majorMinorVersion + ".*\"") + .queryParam("fields", "key,issuetype,priority,summary,fixVersions,components") + .queryParam("maxResults", 100); + if (nextPageToken != null) { + uriBuilder.queryParam("nextPageToken", nextPageToken); + } + URL jiraApi = new URL(uriBuilder.build().toUriString()); + HttpURLConnection connection = (HttpURLConnection) jiraApi.openConnection(); + connection.setRequestProperty("Accept", "application/json"); + connection.setRequestProperty("Content-Type", "application/json"); + return connection; + } + + /** + * Reads the successful response from the connection. + */ + private static String readResponse(HttpURLConnection conn) throws Exception { + try (BufferedReader br = new BufferedReader( + new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8))) { + StringBuilder buffer = new StringBuilder(); + String output; + while ((output = br.readLine()) != null) { + buffer.append(output); + } + return buffer.toString(); + } + } + + /** + * Parses a page result containing issues and pagination info. + */ + private static PageResult parsePageResult(String json) { + JsonObject rootObject = new Gson().fromJson(json, JsonObject.class); + List issues = parseIssues(rootObject); + String nextPageToken = null; + JsonElement nextPageTokenElement = rootObject.get("nextPageToken"); + if (nextPageTokenElement != null && !nextPageTokenElement.isJsonNull()) { + nextPageToken = nextPageTokenElement.getAsString(); + } + return new PageResult(issues, nextPageToken); + } + + /** + * Parses and extracts issues from the root JSON object. + */ + private static List parseIssues(JsonObject root) { + List issues = new ArrayList<>(); + JsonArray issuesArray = root.getAsJsonArray("issues"); + if (issuesArray == null || issuesArray.size() == 0) { + System.out.println("WARNING: No issues found in response"); + return issues; + } + for (JsonElement issueElement : issuesArray) { + issues.add(parseIssue(issueElement.getAsJsonObject())); } return issues; } + /** + * Parses a single issue from JSON. + */ + private static Issue parseIssue(JsonObject issueObj) { + Issue issue = new Issue(); + issue.setId(getStringValue(issueObj, "key")); + JsonObject fields = issueObj.getAsJsonObject("fields"); + if (fields == null) { + throw new IllegalArgumentException("Issue is missing JSON fields object."); + } + issue.setSummary(getStringValue(fields, "summary")); + issue.setCategory(getNestedStringValue(fields, "issuetype", "name")); + issue.setPriority(getNestedStringValue(fields, "priority", "name")); + JsonArray fixVersions = fields.getAsJsonArray("fixVersions"); + if (fixVersions != null && fixVersions.size() > 0) { + JsonObject firstVersion = fixVersions.get(0).getAsJsonObject(); + issue.setVersion(getStringValue(firstVersion, "name")); + } + parseComponents(fields, issue); + return issue; + } + + /** + * Parses components from JsonObject and sets the project and tag on the issue. + */ + private static void parseComponents(JsonObject fields, Issue issue) { + JsonArray components = fields.getAsJsonArray("components"); + for (JsonElement componentElement : components) { + JsonObject componentObj = componentElement.getAsJsonObject(); + String componentName = getStringValue(componentObj, "name"); + if (componentName == null) { + continue; + } else if ("pro".equalsIgnoreCase(componentName)) { + issue.setProject(SYMMETRIC_PRO_PROJECT); + } else if (Arrays.asList(tags).contains(componentName)) { + issue.setTag(componentName); + } + } + if (issue.getProject() == null) { + issue.setProject(SYMMETRIC_DS_PROJECT); + } + } + + /** + * Safely extracts a nested string value from a JsonObject. + */ + private static String getNestedStringValue(JsonObject obj, String parentKey, String childKey) { + if (obj == null || !obj.has(parentKey) || obj.get(parentKey).isJsonNull()) { + return null; + } + JsonObject parent = obj.getAsJsonObject(parentKey); + return getStringValue(parent, childKey); + } + + /** + * Safely extracts a string value from a JsonObject. + */ + private static String getStringValue(JsonObject obj, String key) { + if (obj == null || !obj.has(key) || obj.get(key).isJsonNull()) { + return null; + } + return obj.get(key).getAsString(); + } + protected static void writeFinalNotes(PrintWriter writer, String[] sections) { - writer.println(ReleaseNotesConstants.NOTES_HEADER); + writer.println(NOTES_HEADER); writer.println(); - writer.println(ReleaseNotesConstants.OVERVIEW_HEADER); + writer.println(OVERVIEW_HEADER); writer.println(); - writer.println(ReleaseNotesConstants.PRO_TOKEN_START); - writer.println(String.format(ReleaseNotesConstants.OVERVIEW_PRO_DESC, features, improvements, fixes)); - writer.println(ReleaseNotesConstants.PRO_TOKEN_END); - writer.println(ReleaseNotesConstants.OS_TOKEN_START); - writer.println(String.format(ReleaseNotesConstants.OVERVIEW_DESC, osFeatures, osImprovements, osFixes)); - writer.println(ReleaseNotesConstants.OS_TOKEN_END); + writer.println(PRO_TOKEN_START); + writer.println(String.format(OVERVIEW_PRO_DESC, features, improvements, fixes)); + writer.println(PRO_TOKEN_END); + writer.println(OS_TOKEN_START); + writer.println(String.format(OVERVIEW_DESC, osFeatures, osImprovements, osFixes)); + writer.println(OS_TOKEN_END); writer.println(); for (String section : sections) { if (Arrays.asList(writtenSections).contains(section)) { - writer.println(String.format(ReleaseNotesConstants.INCLUDE_FORMAT_WRITTEN, "{includedir}", section)); + writer.println(String.format(INCLUDE_FORMAT_WRITTEN, "{includedir}", section)); } else { - writer.println(String.format(ReleaseNotesConstants.INCLUDE_FORMAT_GENERATED, "{includedir}/generated", section)); + writer.println(String.format(INCLUDE_FORMAT_GENERATED, "{includedir}/generated", section)); } } } @@ -163,13 +296,13 @@ protected static void writeParametersSection(PrintWriter writer, String properti throws Exception { DefaultParameterParser parser = new DefaultParameterParser(new FileInputStream(propertiesLoc)); Map previousParamMap = parser.parse(); - parser = new DefaultParameterParser(new FileInputStream(ReleaseNotesConstants.PROPERTIES_DIR)); + parser = new DefaultParameterParser(new FileInputStream(PROPERTIES_DIR)); Map currentParamMap = parser.parse(); parser = new DefaultParameterParser(new FileInputStream(proPropertiesLoc)); Map previousProParamMap = parser.parse(); Map currentProParamMap = new HashMap(); try { - parser = new DefaultParameterParser(new FileInputStream(ReleaseNotesConstants.PRO_PROPERTIES_DIR)); + parser = new DefaultParameterParser(new FileInputStream(PRO_PROPERTIES_DIR)); currentProParamMap = parser.parse(); } catch (FileNotFoundException e) { } @@ -212,46 +345,46 @@ protected static void writeParametersSection(PrintWriter writer, String properti if (currentProParams.containsAll(inCurrentNotPrevious) && currentProParams.containsAll(modifiedSincePrevious) && previousProParams.containsAll(inPreviousNotCurrent)) { - writer.println(ReleaseNotesConstants.PRO_TOKEN_START); + writer.println(PRO_TOKEN_START); } - writer.println(ReleaseNotesConstants.PARAMETER_SEC_HEADER); - writer.println(ReleaseNotesConstants.PARAMETER_SEC_DESC); + writer.println(PARAMETER_SEC_HEADER); + writer.println(PARAMETER_SEC_DESC); writer.println(); if (currentProParams.containsAll(inCurrentNotPrevious) && currentProParams.containsAll(modifiedSincePrevious) && previousProParams.containsAll(inPreviousNotCurrent)) { - writer.println(ReleaseNotesConstants.PRO_TOKEN_END); + writer.println(PRO_TOKEN_END); } } if (inCurrentNotPrevious.size() > 0) { if (currentProParams.containsAll(inCurrentNotPrevious)) { - writer.println(ReleaseNotesConstants.PRO_TOKEN_START); + writer.println(PRO_TOKEN_START); } - writer.println(ReleaseNotesConstants.PARAMETER_NEW_HEADER); + writer.println(PARAMETER_NEW_HEADER); writer.println(); if (currentProParams.containsAll(inCurrentNotPrevious)) { - writer.println(ReleaseNotesConstants.PRO_TOKEN_END); + writer.println(PRO_TOKEN_END); } List parameters = new ArrayList(inCurrentNotPrevious); parameters.sort(new StringComparator()); for (String parameter : parameters) { ParameterMetaData metaData = currentProParamMap.get(parameter); if (metaData != null) { - writer.println(ReleaseNotesConstants.PRO_TOKEN_START); - writer.println(String.format(ReleaseNotesConstants.PARAMETER_PRO_FORMAT, parameter)); + writer.println(PRO_TOKEN_START); + writer.println(String.format(PARAMETER_PRO_FORMAT, parameter)); writer.println(); writer.println(metaData.getDescription() != null - ? String.format(ReleaseNotesConstants.PARAMETER_DESC_FORMAT, + ? String.format(PARAMETER_DESC_FORMAT, metaData.getDescription().trim(), metaData.getDefaultValue()) : ""); - writer.println(ReleaseNotesConstants.PRO_TOKEN_END); + writer.println(PRO_TOKEN_END); } else { metaData = currentParamMap.get(parameter); - writer.println(String.format(ReleaseNotesConstants.PARAMETER_FORMAT, parameter)); + writer.println(String.format(PARAMETER_FORMAT, parameter)); writer.println(); writer.println(metaData.getDescription() != null - ? String.format(ReleaseNotesConstants.PARAMETER_DESC_FORMAT, + ? String.format(PARAMETER_DESC_FORMAT, metaData.getDescription().trim(), metaData.getDefaultValue()) : ""); @@ -262,35 +395,35 @@ protected static void writeParametersSection(PrintWriter writer, String properti if (modifiedSincePrevious.size() > 0 || inPreviousNotCurrent.size() > 0) { if (currentProParams.containsAll(modifiedSincePrevious) && previousProParams.containsAll(inPreviousNotCurrent)) { - writer.println(ReleaseNotesConstants.PRO_TOKEN_START); + writer.println(PRO_TOKEN_START); } - writer.println(ReleaseNotesConstants.PARAMETER_MOD_HEADER); + writer.println(PARAMETER_MOD_HEADER); writer.println(); if (currentProParams.containsAll(modifiedSincePrevious) && previousProParams.containsAll(inPreviousNotCurrent)) { - writer.println(ReleaseNotesConstants.PRO_TOKEN_END); + writer.println(PRO_TOKEN_END); } List parameters = new ArrayList(modifiedSincePrevious); parameters.sort(new StringComparator()); for (String parameter : parameters) { ParameterMetaData metaData = currentProParamMap.get(parameter); if (metaData != null) { - writer.println(ReleaseNotesConstants.PRO_TOKEN_START); - writer.println(String.format(ReleaseNotesConstants.PARAMETER_PRO_FORMAT, parameter)); + writer.println(PRO_TOKEN_START); + writer.println(String.format(PARAMETER_PRO_FORMAT, parameter)); writer.println(); writer.println(metaData.getDescription() != null - ? String.format(ReleaseNotesConstants.PARAMETER_DESC_MOD_FORMAT, + ? String.format(PARAMETER_DESC_MOD_FORMAT, metaData.getDescription().trim(), previousProParamMap.get(parameter).getDefaultValue(), metaData.getDefaultValue()) : ""); - writer.println(ReleaseNotesConstants.PRO_TOKEN_END); + writer.println(PRO_TOKEN_END); } else { metaData = currentParamMap.get(parameter); - writer.println(String.format(ReleaseNotesConstants.PARAMETER_FORMAT, parameter)); + writer.println(String.format(PARAMETER_FORMAT, parameter)); writer.println(); writer.println(metaData.getDescription() != null - ? String.format(ReleaseNotesConstants.PARAMETER_DESC_MOD_FORMAT, + ? String.format(PARAMETER_DESC_MOD_FORMAT, metaData.getDescription().trim(), previousParamMap.get(parameter).getDefaultValue(), metaData.getDefaultValue()) @@ -302,15 +435,15 @@ protected static void writeParametersSection(PrintWriter writer, String properti parameters.sort(new StringComparator()); for (String parameter : inPreviousNotCurrent) { if (previousProParamMap.containsKey(parameter)) { - writer.println(ReleaseNotesConstants.PRO_TOKEN_START); - writer.println(String.format(ReleaseNotesConstants.PARAMETER_PRO_FORMAT, parameter)); + writer.println(PRO_TOKEN_START); + writer.println(String.format(PARAMETER_PRO_FORMAT, parameter)); writer.println(); - writer.println(ReleaseNotesConstants.PARAMETER_DESC_REMOVED); - writer.println(ReleaseNotesConstants.PRO_TOKEN_END); + writer.println(PARAMETER_DESC_REMOVED); + writer.println(PRO_TOKEN_END); } else { - writer.println(String.format(ReleaseNotesConstants.PARAMETER_FORMAT, parameter)); + writer.println(String.format(PARAMETER_FORMAT, parameter)); writer.println(); - writer.println(ReleaseNotesConstants.PARAMETER_DESC_REMOVED); + writer.println(PARAMETER_DESC_REMOVED); } writer.println(); } @@ -324,14 +457,14 @@ public static Predicate distinctByKey(Function keyExtractor protected static void writeTablesSection(PrintWriter writer, String schemaLoc, String proSchemaLoc) { Database dbOld = DatabaseXmlUtil.read(new File(schemaLoc)); - Database dbCurrent = DatabaseXmlUtil.read(new File(ReleaseNotesConstants.SCHEMA_DIR)); + Database dbCurrent = DatabaseXmlUtil.read(new File(SCHEMA_DIR)); Database dbProOld = new Database(); File proSchemaFile = new File(proSchemaLoc); if (proSchemaFile.canRead()) { dbProOld = DatabaseXmlUtil.read(proSchemaFile); } Database dbProCurrent = new Database(); - File dbProCurrentFile = new File(ReleaseNotesConstants.PRO_SCHEMA_DIR); + File dbProCurrentFile = new File(PRO_SCHEMA_DIR); if (dbProCurrentFile.canRead()) { dbProCurrent = DatabaseXmlUtil.read(dbProCurrentFile); } @@ -376,15 +509,15 @@ protected static void writeTablesSection(PrintWriter writer, String schemaLoc, S for (ForeignKey foreignKey : allFKeys) { if (foreignKeys.contains(foreignKey) && !oldForeignKeys.contains(foreignKey)) { changeList.add( - String.format(ReleaseNotesConstants.TABLES_ADD_FKEY_FORMAT, foreignKey.getName(), - String.join(ReleaseNotesConstants.VALUE_SEPARATOR, + String.format(TABLES_ADD_FKEY_FORMAT, foreignKey.getName(), + String.join(VALUE_SEPARATOR, Arrays.asList(foreignKey.getReferences()).stream() .map(e -> e.getLocalColumnName()) .collect(Collectors.toList())))); } else if (!foreignKeys.contains(foreignKey) && oldForeignKeys.contains(foreignKey)) { changeList.add( - String.format(ReleaseNotesConstants.TABLES_DEL_FKEY_FORMAT, foreignKey.getName(), - String.join(ReleaseNotesConstants.VALUE_SEPARATOR, + String.format(TABLES_DEL_FKEY_FORMAT, foreignKey.getName(), + String.join(VALUE_SEPARATOR, Arrays.asList(foreignKey.getReferences()).stream() .map(e -> e.getLocalColumnName()) .collect(Collectors.toList())))); @@ -399,18 +532,18 @@ protected static void writeTablesSection(PrintWriter writer, String schemaLoc, S Set newReferencesSet = new HashSet<>(Arrays.asList(newFKey.getReferences())); if (oldFKey.isAutoIndexPresent() != newFKey.isAutoIndexPresent()) { changeList.add(String.format( - ReleaseNotesConstants.MODIFIED_CONSTANT_FKEY + " " - + ReleaseNotesConstants.TABLES_MOD_COLUMN_FORMAT, - foreignKey.getName(), ReleaseNotesConstants.MODIFIED_CONSTANT_IS_AUTOIDX, + MODIFIED_CONSTANT_FKEY + " " + + TABLES_MOD_COLUMN_FORMAT, + foreignKey.getName(), MODIFIED_CONSTANT_IS_AUTOIDX, oldFKey.isAutoIndexPresent(), newFKey.isAutoIndexPresent())); } if (!oldReferencesSet.equals(newReferencesSet)) { - changeList.add(String.format(ReleaseNotesConstants.TABLES_MOD_FKEY_FORMAT, + changeList.add(String.format(TABLES_MOD_FKEY_FORMAT, foreignKey.getName(), - String.join(ReleaseNotesConstants.VALUE_SEPARATOR, + String.join(VALUE_SEPARATOR, oldReferencesSet.stream().map(e -> e.getForeignColumnName()) .collect(Collectors.toList())), - String.join(ReleaseNotesConstants.VALUE_SEPARATOR, newReferencesSet.stream() + String.join(VALUE_SEPARATOR, newReferencesSet.stream() .map(e -> e.getForeignColumnName()).collect(Collectors.toList())))); } } @@ -422,33 +555,33 @@ protected static void writeTablesSection(PrintWriter writer, String schemaLoc, S boolean removedAny = false; for (String primaryKey : allPKeys) { if (primaryKeys.contains(primaryKey) && !oldPrimaryKeys.contains(primaryKey)) { - added.append(primaryKey + ReleaseNotesConstants.VALUE_SEPARATOR); + added.append(primaryKey + VALUE_SEPARATOR); addedAny = true; } else if (!primaryKeys.contains(primaryKey) && oldPrimaryKeys.contains(primaryKey)) { - removed.append(primaryKey + ReleaseNotesConstants.VALUE_SEPARATOR); + removed.append(primaryKey + VALUE_SEPARATOR); removedAny = true; } } if (addedAny) { - added.delete(added.length() - ReleaseNotesConstants.VALUE_SEPARATOR.length(), added.length()); - changeList.add(String.format(ReleaseNotesConstants.TABLES_ADD_PKEY_FORMAT, added.toString())); + added.delete(added.length() - VALUE_SEPARATOR.length(), added.length()); + changeList.add(String.format(TABLES_ADD_PKEY_FORMAT, added.toString())); } if (removedAny) { - removed.delete(removed.length() - ReleaseNotesConstants.VALUE_SEPARATOR.length(), + removed.delete(removed.length() - VALUE_SEPARATOR.length(), removed.length()); - changeList.add(String.format(ReleaseNotesConstants.TABLES_DEL_PKEY_FORMAT, removed.toString())); + changeList.add(String.format(TABLES_DEL_PKEY_FORMAT, removed.toString())); } // Indices for (IIndex index : allIndices) { if (indices.stream().anyMatch(e -> e.getName().equals(index.getName())) && !oldIndices.stream().anyMatch(e -> e.getName().equals(index.getName()))) { - changeList.add(String.format(ReleaseNotesConstants.TABLES_ADD_INDEX_FORMAT, index.getName(), - String.join(ReleaseNotesConstants.VALUE_SEPARATOR, Arrays.asList(index.getColumns()) + changeList.add(String.format(TABLES_ADD_INDEX_FORMAT, index.getName(), + String.join(VALUE_SEPARATOR, Arrays.asList(index.getColumns()) .stream().map(e -> e.getName()).collect(Collectors.toList())))); } else if (!indices.stream().anyMatch(e -> e.getName().equals(index.getName())) && oldIndices.stream().anyMatch(e -> e.getName().equals(index.getName()))) { - changeList.add(String.format(ReleaseNotesConstants.TABLES_DEL_INDEX_FORMAT, index.getName(), - String.join(ReleaseNotesConstants.VALUE_SEPARATOR, Arrays.asList(index.getColumns()) + changeList.add(String.format(TABLES_DEL_INDEX_FORMAT, index.getName(), + String.join(VALUE_SEPARATOR, Arrays.asList(index.getColumns()) .stream().map(e -> e.getName()).collect(Collectors.toList())))); } else { IIndex oldIndex = oldIndices.stream() @@ -460,18 +593,18 @@ protected static void writeTablesSection(PrintWriter writer, String schemaLoc, S Set oldReferencesSet = new HashSet<>(Arrays.asList(oldIndex.getColumns())); Set newReferencesSet = new HashSet<>(Arrays.asList(newIndex.getColumns())); if (oldIndex.isUnique() != newIndex.isUnique()) { - changeList.add(ReleaseNotesConstants.MODIFIED_CONSTANT_INDEX + " " - + String.format(ReleaseNotesConstants.TABLES_MOD_COLUMN_FORMAT, index.getName(), - ReleaseNotesConstants.MODIFIED_CONSTANT_IS_UNQ, oldIndex.isUnique(), + changeList.add(MODIFIED_CONSTANT_INDEX + " " + + String.format(TABLES_MOD_COLUMN_FORMAT, index.getName(), + MODIFIED_CONSTANT_IS_UNQ, oldIndex.isUnique(), newIndex.isUnique())); } if (!oldReferencesSet.equals(newReferencesSet)) { changeList.add( - String.format(ReleaseNotesConstants.TABLES_MOD_INDEX_FORMAT, index.getName(), - String.join(ReleaseNotesConstants.VALUE_SEPARATOR, + String.format(TABLES_MOD_INDEX_FORMAT, index.getName(), + String.join(VALUE_SEPARATOR, oldReferencesSet.stream().map(e -> e.getName()) .collect(Collectors.toList())), - String.join(ReleaseNotesConstants.VALUE_SEPARATOR, newReferencesSet + String.join(VALUE_SEPARATOR, newReferencesSet .stream().map(e -> e.getName()).collect(Collectors.toList())))); } } @@ -488,75 +621,77 @@ protected static void writeTablesSection(PrintWriter writer, String schemaLoc, S mapList.add(column); } } - if (mapList.size() > 0) + if (mapList.size() > 0) { tableColMap.put(table, mapList); + } } for (Column column : ColsNew) { try { Column oldColumn = ColsOld.stream().filter(o -> o.getName().equals(column.getName())) .findFirst().get(); if (oldColumn.isTimestampWithTimezone() != column.isTimestampWithTimezone()) { - changeList.add(String.format(ReleaseNotesConstants.TABLES_MOD_COLUMN_FORMAT, - column.getName(), ReleaseNotesConstants.MODIFIED_CONSTANT_IS_TIMEZONE, + changeList.add(String.format(TABLES_MOD_COLUMN_FORMAT, + column.getName(), MODIFIED_CONSTANT_IS_TIMEZONE, oldColumn.isTimestampWithTimezone(), column.isTimestampWithTimezone())); } if (oldColumn.isDistributionKey() != column.isDistributionKey()) { - changeList.add(String.format(ReleaseNotesConstants.TABLES_MOD_COLUMN_FORMAT, - column.getName(), ReleaseNotesConstants.MODIFIED_CONSTANT_IS_DIST, + changeList.add(String.format(TABLES_MOD_COLUMN_FORMAT, + column.getName(), MODIFIED_CONSTANT_IS_DIST, oldColumn.isDistributionKey(), column.isDistributionKey())); } if (oldColumn.isAutoIncrement() != column.isAutoIncrement()) { - changeList.add(String.format(ReleaseNotesConstants.TABLES_MOD_COLUMN_FORMAT, - column.getName(), ReleaseNotesConstants.MODIFIED_CONSTANT_IS_AUTOINC, + changeList.add(String.format(TABLES_MOD_COLUMN_FORMAT, + column.getName(), MODIFIED_CONSTANT_IS_AUTOINC, oldColumn.isAutoIncrement(), column.isAutoIncrement())); } if (oldColumn.isUnique() != column.isUnique()) { - changeList.add(String.format(ReleaseNotesConstants.TABLES_MOD_COLUMN_FORMAT, - column.getName(), ReleaseNotesConstants.MODIFIED_CONSTANT_IS_UNQ, + changeList.add(String.format(TABLES_MOD_COLUMN_FORMAT, + column.getName(), MODIFIED_CONSTANT_IS_UNQ, oldColumn.isUnique(), column.isUnique())); } if (oldColumn.getPrecisionRadix() != column.getPrecisionRadix()) { - changeList.add(String.format(ReleaseNotesConstants.TABLES_MOD_COLUMN_FORMAT, - column.getName(), ReleaseNotesConstants.MODIFIED_CONSTANT_RADIX, + changeList.add(String.format(TABLES_MOD_COLUMN_FORMAT, + column.getName(), MODIFIED_CONSTANT_RADIX, oldColumn.getPrecisionRadix(), column.getPrecisionRadix())); } if (isChanged(oldColumn.getDefaultValue(), column.getDefaultValue())) { - changeList.add(String.format(ReleaseNotesConstants.TABLES_MOD_COLUMN_FORMAT, - column.getName(), ReleaseNotesConstants.MODIFIED_CONSTANT_DEF_VAL, - oldColumn.getDefaultValue() == null ? ReleaseNotesConstants.NULL + changeList.add(String.format(TABLES_MOD_COLUMN_FORMAT, + column.getName(), MODIFIED_CONSTANT_DEF_VAL, + oldColumn.getDefaultValue() == null ? NULL : (isVarcharOrChar(column.getMappedTypeCode()) ? "\"" + column.getDefaultValue() + "\"" : column.getDefaultValue()), - column.getDefaultValue() == null ? ReleaseNotesConstants.NULL + column.getDefaultValue() == null ? NULL : (isVarcharOrChar(column.getMappedTypeCode()) ? "\"" + column.getDefaultValue() + "\"" : column.getDefaultValue()))); } if (isChanged(oldColumn.getMappedType(), column.getMappedType())) { - changeList.add(String.format(ReleaseNotesConstants.TABLES_MOD_COLUMN_FORMAT, - column.getName(), ReleaseNotesConstants.MODIFIED_CONSTANT_TYPE, - oldColumn.getMappedType() == null ? ReleaseNotesConstants.NULL + changeList.add(String.format(TABLES_MOD_COLUMN_FORMAT, + column.getName(), MODIFIED_CONSTANT_TYPE, + oldColumn.getMappedType() == null ? NULL : oldColumn.getMappedType(), - column.getMappedType() == null ? ReleaseNotesConstants.NULL + column.getMappedType() == null ? NULL : column.getMappedType())); } if (isChanged(oldColumn.getSize(), column.getSize())) { - changeList.add(String.format(ReleaseNotesConstants.TABLES_MOD_COLUMN_FORMAT, - column.getName(), ReleaseNotesConstants.MODIFIED_CONSTANT_SIZE, - oldColumn.getSize() == null ? ReleaseNotesConstants.NULL : oldColumn.getSize(), - column.getSize() == null ? ReleaseNotesConstants.NULL : column.getSize())); + changeList.add(String.format(TABLES_MOD_COLUMN_FORMAT, + column.getName(), MODIFIED_CONSTANT_SIZE, + oldColumn.getSize() == null ? NULL : oldColumn.getSize(), + column.getSize() == null ? NULL : column.getSize())); } if (oldColumn.isRequired() != column.isRequired()) { - changeList.add(String.format(ReleaseNotesConstants.TABLES_MOD_COLUMN_FORMAT, - column.getName(), ReleaseNotesConstants.MODIFIED_CONSTANT_IS_REQ, + changeList.add(String.format(TABLES_MOD_COLUMN_FORMAT, + column.getName(), MODIFIED_CONSTANT_IS_REQ, oldColumn.isRequired(), column.isRequired())); } } catch (NoSuchElementException e) { System.out.println("No match found for column \"" + column.getName() + "\", assuming new"); } } - if (changeList.size() > 0) + if (changeList.size() > 0) { tableChangeMap.put(table, changeList); + } } } if (isNewTable) { @@ -566,86 +701,86 @@ protected static void writeTablesSection(PrintWriter writer, String schemaLoc, S if (newTables.size() > 0 || tableColMap.size() > 0 || tableChangeMap.size() > 0) { if (tablesProCurrent.containsAll(newTables) && tablesProCurrent.containsAll(tableColMap.keySet()) && tablesProCurrent.containsAll(tableChangeMap.keySet())) { - writer.println(ReleaseNotesConstants.PRO_TOKEN_START); + writer.println(PRO_TOKEN_START); } - writer.println(ReleaseNotesConstants.TABLES_SEC_HEADER); - writer.println(ReleaseNotesConstants.TABLES_SEC_DESC); + writer.println(TABLES_SEC_HEADER); + writer.println(TABLES_SEC_DESC); writer.println(); if (tablesProCurrent.containsAll(newTables) && tablesProCurrent.containsAll(tableColMap.keySet()) && tablesProCurrent.containsAll(tableChangeMap.keySet())) { - writer.println(ReleaseNotesConstants.PRO_TOKEN_END); + writer.println(PRO_TOKEN_END); } if (newTables.size() > 0) { if (tablesProCurrent.containsAll(newTables)) { - writer.println(ReleaseNotesConstants.PRO_TOKEN_START); + writer.println(PRO_TOKEN_START); } - writer.println(ReleaseNotesConstants.TABLES_NEW_HEADER); + writer.println(TABLES_NEW_HEADER); writer.println(); - writer.println(ReleaseNotesConstants.TABLES_TABLE_HEADER); + writer.println(TABLES_TABLE_HEADER); writer.println(); for (Table table : newTables) { String desc = table.getDescription(); String name = table.getNameLowerCase(); if (tablesProCurrent.contains(table)) { - writer.println(ReleaseNotesConstants.PRO_TOKEN_START); - writer.println(String.format(ReleaseNotesConstants.TABLES_TABLE_ELEMENT_PRO, name, desc)); - writer.println(ReleaseNotesConstants.PRO_TOKEN_END); + writer.println(PRO_TOKEN_START); + writer.println(String.format(TABLES_TABLE_ELEMENT_PRO, name, desc)); + writer.println(PRO_TOKEN_END); writer.println(); } else { - writer.println(String.format(ReleaseNotesConstants.TABLES_TABLE_ELEMENT, name, desc)); + writer.println(String.format(TABLES_TABLE_ELEMENT, name, desc)); writer.println(); } } - writer.println(ReleaseNotesConstants.TABLES_TABLE_FOOTER); + writer.println(TABLES_TABLE_FOOTER); if (tablesProCurrent.containsAll(newTables)) { - writer.println(ReleaseNotesConstants.PRO_TOKEN_END); + writer.println(PRO_TOKEN_END); } } if (tableColMap.size() > 0) { - writer.println(ReleaseNotesConstants.TABLES_NEW_COL_HEADER); + writer.println(TABLES_NEW_COL_HEADER); writer.println(); List tables = new ArrayList
(tableColMap.keySet()); tables.sort(new TableComparator()); for (Table table : tables) { if (tablesProCurrent.contains(table)) { - writer.println(ReleaseNotesConstants.PRO_TOKEN_START); - writer.println(String.format(ReleaseNotesConstants.TABLES_COL_HEADER_PRO, table.getName().toUpperCase())); + writer.println(PRO_TOKEN_START); + writer.println(String.format(TABLES_COL_HEADER_PRO, table.getName().toUpperCase())); writer.println(); } else { - writer.println(String.format(ReleaseNotesConstants.TABLES_COL_HEADER, table.getName().toUpperCase())); + writer.println(String.format(TABLES_COL_HEADER, table.getName().toUpperCase())); writer.println(); } for (Column column : tableColMap.get(table)) { - writer.println(String.format(ReleaseNotesConstants.TABLES_COLUMN_ELEMENT, column.getName(), + writer.println(String.format(TABLES_COLUMN_ELEMENT, column.getName(), column.getDescription())); writer.println(); } - writer.println(ReleaseNotesConstants.TABLES_TABLE_FOOTER); + writer.println(TABLES_TABLE_FOOTER); if (tablesProCurrent.contains(table)) { - writer.println(ReleaseNotesConstants.PRO_TOKEN_END); + writer.println(PRO_TOKEN_END); } writer.println(); } } writer.println(); if (tableChangeMap.size() > 0) { - writer.println(ReleaseNotesConstants.TABLES_MODIFIED_HEADER); + writer.println(TABLES_MODIFIED_HEADER); writer.println(); List
tables = new ArrayList
(tableChangeMap.keySet()); tables.sort(new TableComparator()); for (Table table : tables) { if (tablesProCurrent.contains(table)) { - writer.println(ReleaseNotesConstants.PRO_TOKEN_START); + writer.println(PRO_TOKEN_START); writer.println( - String.format(ReleaseNotesConstants.TABLES_MODIFIED_CAPTION_PRO, table.getName().toUpperCase())); + String.format(TABLES_MODIFIED_CAPTION_PRO, table.getName().toUpperCase())); } else { - writer.println(String.format(ReleaseNotesConstants.TABLES_MODIFIED_CAPTION, table.getName().toUpperCase())); + writer.println(String.format(TABLES_MODIFIED_CAPTION, table.getName().toUpperCase())); } for (String change : tableChangeMap.get(table)) { - writer.println(String.format(ReleaseNotesConstants.TABLES_MODIFIED_ELEMENT, change)); + writer.println(String.format(TABLES_MODIFIED_ELEMENT, change)); } if (tablesProCurrent.contains(table)) { - writer.println(ReleaseNotesConstants.PRO_TOKEN_END); + writer.println(PRO_TOKEN_END); } writer.println(); } @@ -683,37 +818,37 @@ private static int writeMinorVersionIssues(PrintWriter writer, List issue String category) { int issuesWritten = 0; if (issues.stream().anyMatch(e -> e.getVersion().equalsIgnoreCase(version) - && e.getProject().equalsIgnoreCase("symmetric-pro") && e.getCategory().equalsIgnoreCase(category))) { - writer.println(ReleaseNotesConstants.PRO_TOKEN_START); - writer.println(ReleaseNotesConstants.ISSUES_SEC_SEPARATOR); - writer.println(ReleaseNotesConstants.ISSUES_HARDBREAKS); - writer.println(String.format(ReleaseNotesConstants.ISSUES_VERSION_HEADER_PRO, version)); + && e.getProject().equalsIgnoreCase(SYMMETRIC_PRO_PROJECT) && e.getCategory().equalsIgnoreCase(category))) { + writer.println(PRO_TOKEN_START); + writer.println(ISSUES_SEC_SEPARATOR); + writer.println(ISSUES_HARDBREAKS); + writer.println(String.format(ISSUES_VERSION_HEADER_PRO, version)); for (Issue issue : issues) { - if (issue.getProject().equalsIgnoreCase("symmetric-pro") && issue.getVersion().equalsIgnoreCase(version) + if (issue.getProject().equalsIgnoreCase(SYMMETRIC_PRO_PROJECT) && issue.getVersion().equalsIgnoreCase(version) && issue.getCategory().equalsIgnoreCase(category)) { - String idWithLink = (String.format(ReleaseNotesConstants.ISSUE_URL, issue.getId(), issue.getId())); - writer.println(String.format(ReleaseNotesConstants.ISSUES_FORMAT, idWithLink, issue.getSummary())); + String idWithLink = (String.format(ISSUE_URL, issue.getId(), issue.getId())); + writer.println(String.format(ISSUES_FORMAT, idWithLink, issue.getSummary())); issuesWritten++; } } - writer.println(ReleaseNotesConstants.ISSUES_SEC_SEPARATOR); - writer.println(ReleaseNotesConstants.PRO_TOKEN_END); + writer.println(ISSUES_SEC_SEPARATOR); + writer.println(PRO_TOKEN_END); } if (issues.stream().anyMatch(e -> e.getVersion().equalsIgnoreCase(version) - && !e.getProject().equalsIgnoreCase("symmetric-pro") && e.getCategory().equalsIgnoreCase(category))) { - writer.println(ReleaseNotesConstants.ISSUES_SEC_SEPARATOR); - writer.println(ReleaseNotesConstants.ISSUES_HARDBREAKS); - writer.println(String.format(ReleaseNotesConstants.ISSUES_VERSION_HEADER, version)); + && !e.getProject().equalsIgnoreCase(SYMMETRIC_PRO_PROJECT) && e.getCategory().equalsIgnoreCase(category))) { + writer.println(ISSUES_SEC_SEPARATOR); + writer.println(ISSUES_HARDBREAKS); + writer.println(String.format(ISSUES_VERSION_HEADER, version)); for (Issue issue : issues) { - if (!issue.getProject().equalsIgnoreCase("symmetric-pro") + if (!issue.getProject().equalsIgnoreCase(SYMMETRIC_PRO_PROJECT) && issue.getVersion().equalsIgnoreCase(version) && issue.getCategory().equalsIgnoreCase(category)) { - String idWithLink = (String.format(ReleaseNotesConstants.ISSUE_URL, issue.getId(), issue.getId())); - writer.println(String.format(ReleaseNotesConstants.ISSUES_FORMAT, idWithLink, issue.getSummary())); + String idWithLink = (String.format(ISSUE_URL, issue.getId(), issue.getId())); + writer.println(String.format(ISSUES_FORMAT, idWithLink, issue.getSummary())); issuesWritten++; } } - writer.println(ReleaseNotesConstants.ISSUES_SEC_SEPARATOR); + writer.println(ISSUES_SEC_SEPARATOR); } return issuesWritten; } @@ -723,9 +858,9 @@ protected static void writeIssuesSection(PrintWriter writer, List issues) Map categoryHeaders = new HashMap<>(); Map trackers = new HashMap<>(); Map proTrackers = new HashMap<>(); - categoryHeaders.put(categories[0], ReleaseNotesConstants.ISSUES_FEATURES_HEADER); - categoryHeaders.put(categories[1], ReleaseNotesConstants.ISSUES_IMPROVEMENTS_HEADER); - categoryHeaders.put(categories[2], ReleaseNotesConstants.ISSUES_BUG_FIXES_HEADER); + categoryHeaders.put(categories[0], ISSUES_FEATURES_HEADER); + categoryHeaders.put(categories[1], ISSUES_IMPROVEMENTS_HEADER); + categoryHeaders.put(categories[2], ISSUES_BUG_FIXES_HEADER); for (Issue issue : issues) { if (!versions.contains(issue.getVersion().toLowerCase())) { versions.add(issue.getVersion().toLowerCase()); @@ -740,20 +875,20 @@ protected static void writeIssuesSection(PrintWriter writer, List issues) fixes = issues.stream().filter(e -> e.getCategory().equalsIgnoreCase(categories[2])) .collect(Collectors.toList()).size(); osFeatures = issues.stream().filter(e -> e.getCategory().equalsIgnoreCase(categories[0]) - && !e.getProject().equalsIgnoreCase("symmetric-pro")).collect(Collectors.toList()).size(); + && !e.getProject().equalsIgnoreCase(SYMMETRIC_PRO_PROJECT)).collect(Collectors.toList()).size(); osImprovements = issues.stream().filter(e -> e.getCategory().equalsIgnoreCase(categories[1]) - && !e.getProject().equalsIgnoreCase("symmetric-pro")).collect(Collectors.toList()).size(); + && !e.getProject().equalsIgnoreCase(SYMMETRIC_PRO_PROJECT)).collect(Collectors.toList()).size(); osFixes = issues.stream().filter(e -> e.getCategory().equalsIgnoreCase(categories[2]) - && !e.getProject().equalsIgnoreCase("symmetric-pro")).collect(Collectors.toList()).size(); + && !e.getProject().equalsIgnoreCase(SYMMETRIC_PRO_PROJECT)).collect(Collectors.toList()).size(); trackers.put(categories[0], features); trackers.put(categories[1], improvements); trackers.put(categories[2], fixes); int proFeatures = issues.stream().filter(e -> e.getCategory().equalsIgnoreCase(categories[0]) - && e.getProject().equalsIgnoreCase("symmetric-pro")).collect(Collectors.toList()).size(); + && e.getProject().equalsIgnoreCase(SYMMETRIC_PRO_PROJECT)).collect(Collectors.toList()).size(); int proImprovements = issues.stream().filter(e -> e.getCategory().equalsIgnoreCase(categories[1]) - && e.getProject().equalsIgnoreCase("symmetric-pro")).collect(Collectors.toList()).size(); + && e.getProject().equalsIgnoreCase(SYMMETRIC_PRO_PROJECT)).collect(Collectors.toList()).size(); int proFixes = issues.stream().filter(e -> e.getCategory().equalsIgnoreCase(categories[2]) - && e.getProject().equalsIgnoreCase("symmetric-pro")).collect(Collectors.toList()).size(); + && e.getProject().equalsIgnoreCase(SYMMETRIC_PRO_PROJECT)).collect(Collectors.toList()).size(); proTrackers.put(categories[0], proFeatures); proTrackers.put(categories[1], proImprovements); proTrackers.put(categories[2], proFixes); @@ -765,24 +900,24 @@ protected static void writeIssuesSection(PrintWriter writer, List issues) } if (features > 0 || improvements > 0 || fixes > 0) { if (allSymProIssues) { - writer.println(ReleaseNotesConstants.PRO_TOKEN_START); + writer.println(PRO_TOKEN_START); } - writer.println(ReleaseNotesConstants.ISSUES_SEC_HEADER); + writer.println(ISSUES_SEC_HEADER); if (allSymProIssues) { - writer.println(ReleaseNotesConstants.PRO_TOKEN_END); + writer.println(PRO_TOKEN_END); } } for (String category : categories) { if (trackers.get(category) > 0) { if (trackers.get(category).equals(proTrackers.get(category))) { - writer.println(ReleaseNotesConstants.PRO_TOKEN_START); + writer.println(PRO_TOKEN_START); } writer.println(categoryHeaders.get(category)); for (String version : versions) { writeMinorVersionIssues(writer, issues, version, category); } if (trackers.get(category).equals(proTrackers.get(category))) { - writer.println(ReleaseNotesConstants.PRO_TOKEN_END); + writer.println(PRO_TOKEN_END); } } } @@ -791,9 +926,9 @@ protected static void writeIssuesSection(PrintWriter writer, List issues) protected static void writeFixesSection(PrintWriter writer, List issues) { int osSecurityFixes = issues.stream().filter(e -> e.getTag() != null && e.getTag().equalsIgnoreCase(tags[0]) - && !e.getProject().equalsIgnoreCase("symmetric-pro")).collect(Collectors.toList()).size(); + && !e.getProject().equalsIgnoreCase(SYMMETRIC_PRO_PROJECT)).collect(Collectors.toList()).size(); int osPerformanceFixes = issues.stream().filter(e -> e.getTag() != null && e.getTag().equalsIgnoreCase(tags[1]) - && !e.getProject().equalsIgnoreCase("symmetric-pro")).collect(Collectors.toList()).size(); + && !e.getProject().equalsIgnoreCase(SYMMETRIC_PRO_PROJECT)).collect(Collectors.toList()).size(); int allSecurityFixes = issues.stream().filter(e -> e.getTag() != null && e.getTag().equalsIgnoreCase(tags[0])) .collect(Collectors.toList()).size(); int allPerformanceFixes = issues.stream() @@ -801,64 +936,64 @@ protected static void writeFixesSection(PrintWriter writer, List issues) .size(); if (allSecurityFixes > 0) { if (osSecurityFixes == 0) { - writer.println(ReleaseNotesConstants.PRO_TOKEN_START); + writer.println(PRO_TOKEN_START); } - writer.println(ReleaseNotesConstants.FIXES_SECURITY_HEADER); + writer.println(FIXES_SECURITY_HEADER); writer.println(); - writer.println(ReleaseNotesConstants.FIXES_TABLE_HEADER); + writer.println(FIXES_TABLE_HEADER); writer.println(); issues.sort(new IssueComparator()); for (Issue issue : issues) { if (issue.getTag() != null && issue.getTag().equalsIgnoreCase(tags[0])) { - String idWithLink = (String.format(ReleaseNotesConstants.ISSUE_URL, issue.getId(), issue.getId())); - if (issue.getProject().equalsIgnoreCase("symmetric-pro")) { - writer.println(ReleaseNotesConstants.PRO_TOKEN_START); - writer.println(String.format(ReleaseNotesConstants.FIXES_TABLE_ELEMENT_PRO, idWithLink, + String idWithLink = (String.format(ISSUE_URL, issue.getId(), issue.getId())); + if (issue.getProject().equalsIgnoreCase(SYMMETRIC_PRO_PROJECT)) { + writer.println(PRO_TOKEN_START); + writer.println(String.format(FIXES_TABLE_ELEMENT_PRO, idWithLink, issue.getSummary(), issue.getPriority().substring(0, 1).toUpperCase() + issue.getPriority().substring(1))); - writer.println(ReleaseNotesConstants.PRO_TOKEN_END); + writer.println(PRO_TOKEN_END); } else { - writer.println(String.format(ReleaseNotesConstants.FIXES_TABLE_ELEMENT, idWithLink, + writer.println(String.format(FIXES_TABLE_ELEMENT, idWithLink, issue.getSummary(), issue.getPriority().substring(0, 1).toUpperCase() + issue.getPriority().substring(1))); } writer.println(); } } - writer.println(ReleaseNotesConstants.FIXES_TABLE_FOOTER); + writer.println(FIXES_TABLE_FOOTER); if (osSecurityFixes == 0) { - writer.println(ReleaseNotesConstants.PRO_TOKEN_END); + writer.println(PRO_TOKEN_END); } } writer.println(); if (allPerformanceFixes > 0) { if (osPerformanceFixes == 0) { - writer.println(ReleaseNotesConstants.PRO_TOKEN_START); + writer.println(PRO_TOKEN_START); } - writer.println(ReleaseNotesConstants.FIXES_PERFORMANCE_HEADER); + writer.println(FIXES_PERFORMANCE_HEADER); writer.println(); - writer.println(ReleaseNotesConstants.FIXES_TABLE_HEADER); + writer.println(FIXES_TABLE_HEADER); writer.println(); for (Issue issue : issues) { if (issue.getTag() != null && issue.getTag().equalsIgnoreCase(tags[1])) { - String idWithLink = (String.format(ReleaseNotesConstants.ISSUE_URL, issue.getId(), issue.getId())); - if (issue.getProject().equalsIgnoreCase("symmetric-pro")) { - writer.println(ReleaseNotesConstants.PRO_TOKEN_START); - writer.println(String.format(ReleaseNotesConstants.FIXES_TABLE_ELEMENT_PRO, idWithLink, + String idWithLink = (String.format(ISSUE_URL, issue.getId(), issue.getId())); + if (issue.getProject().equalsIgnoreCase(SYMMETRIC_PRO_PROJECT)) { + writer.println(PRO_TOKEN_START); + writer.println(String.format(FIXES_TABLE_ELEMENT_PRO, idWithLink, issue.getSummary(), issue.getPriority().substring(0, 1).toUpperCase() + issue.getPriority().substring(1))); - writer.println(ReleaseNotesConstants.PRO_TOKEN_END); + writer.println(PRO_TOKEN_END); } else { - writer.println(String.format(ReleaseNotesConstants.FIXES_TABLE_ELEMENT, idWithLink, + writer.println(String.format(FIXES_TABLE_ELEMENT, idWithLink, issue.getSummary(), issue.getPriority().substring(0, 1).toUpperCase() + issue.getPriority().substring(1))); } writer.println(); } } - writer.println(ReleaseNotesConstants.FIXES_TABLE_FOOTER); + writer.println(FIXES_TABLE_FOOTER); if (osPerformanceFixes == 0) { - writer.println(ReleaseNotesConstants.PRO_TOKEN_END); + writer.println(PRO_TOKEN_END); } } } @@ -906,4 +1041,25 @@ public int compare(Issue i1, Issue i2) { return i1.getId().compareTo(i2.getId()); } } + + /** + * Helper class to encapsulate a page of issues with pagination info. + */ + private static class PageResult { + private final List issues; + private final String nextPageToken; + + public PageResult(List issues, String nextPageToken) { + this.issues = issues; + this.nextPageToken = nextPageToken; + } + + public List getIssues() { + return issues; + } + + public String getNextPageToken() { + return nextPageToken; + } + } } diff --git a/symmetric-server/build.gradle b/symmetric-server/build.gradle index 95469ad73f..fe90232be3 100644 --- a/symmetric-server/build.gradle +++ b/symmetric-server/build.gradle @@ -163,8 +163,7 @@ apply from: symAssembleDir + '/asciidoc.gradle' } } - - serverDistZip.dependsOn { ':symmetric-server:jar' } + serverDistZip.dependsOn { ':symmetric-server:jar' } serverDistZip.dependsOn { ':symmetric-server:generateDocs' } generateAppendixes.dependsOn(project(':symmetric-server').jar) generateAppendixes.dependsOn(project(':symmetric-util').jar)