Skip to content

Commit

Permalink
Merge pull request #5 from swisspost/develop
Browse files Browse the repository at this point in the history
merge to master to trigger release
  • Loading branch information
dominik-cnx authored Jan 18, 2024
2 parents 68c1706 + 8e3ebf0 commit 97f9ed7
Show file tree
Hide file tree
Showing 10 changed files with 214 additions and 126 deletions.
47 changes: 35 additions & 12 deletions .github/workflows/maven.yml
Original file line number Diff line number Diff line change
@@ -1,23 +1,46 @@
name: Java CI

on: [push]
on:
workflow_dispatch:
push:
pull_request:
branches: [ "master", "develop" ]

jobs:
build:

runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v2
- name: Set up JDK 1.8
uses: actions/setup-java@v1
- uses: actions/checkout@v3
- name: Set up JDK 8
uses: actions/setup-java@v3
with:
java-version: 1.8
- name: Build with Maven
run: mvn -B package --file pom.xml
- name: Deploy to Github Package Registry
java-version: '8'
distribution: 'temurin'
server-id: sonatype-nexus-staging # Value of the distributionManagement/repository/id field of the pom.xml
server-username: CI_DEPLOY_USERNAME # env variable for username in deploy
server-password: CI_DEPLOY_PASSWORD # env variable for token in deploy
gpg-private-key: ${{ secrets.CI_GPG_PRIVATE_KEY }} # Value of the GPG private key to import
gpg-passphrase: CI_GPG_PASSPHRASE # env variable for GPG private key passphrase


- name: Install, unit test, integration test
run: mvn install -Dmaven.javadoc.skip=true -B -V

- name: Release to maven central
if: github.ref_name == 'master' && github.event_name != 'pull_request' && github.repository == 'swisspost/jsonschema2pojo-openenum'
run: |
curl -s get.sdkman.io | bash
source "$HOME/.sdkman/bin/sdkman-init.sh"
sdk install groovy 3.0.8
chmod +x ./maybe-release.sh
./maybe-release.sh
env:
GITHUB_USERNAME: x-access-token
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run:
mvn --settings settings.xml deploy
CI_DEPLOY_USERNAME: ${{ secrets.CI_DEPLOY_USERNAME }}
CI_DEPLOY_PASSWORD: ${{ secrets.CI_DEPLOY_PASSWORD }}
CI_GPG_PASSPHRASE: ${{ secrets.CI_GPG_PASSPHRASE }}

- name: After release
run: bash <(curl -s https://codecov.io/bash)
22 changes: 0 additions & 22 deletions .travis.yml

This file was deleted.

20 changes: 20 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,20 @@ Generate enums as relaxed type-safe enum classes supporting unknown values.
This allows backward compatibility when JSON schemas get new enum values
whereas existing code does not yet know them.

Public constant `declaredValues` allows to iterate on values known at compile time.
Instance method `isDeclaredValue` allows to detect values not yet known at compile time to an application.

The generated code looks like:

```java
package org.swisspush.jsonschema2pojo.openenum;

import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonValue;

Expand All @@ -19,6 +26,11 @@ public class Status {
private final static Map<String, Status> values = new HashMap<String, Status>();
public final static Status OPEN = Status.fromString("OPEN");
public final static Status CLOSED = Status.fromString("CLOSED");
/**
* Set containing all enum values declared at compile time.use it in your application to iterate over declared values.
*
*/
public final static Set<Status> declaredValues = Collections.unmodifiableSet(new HashSet<Status>(Arrays.asList(Status.OPEN, Status.CLOSED)));
private String value;

private Status(String value) {
Expand All @@ -37,6 +49,14 @@ public class Status {
return this.value;
}

/**
* returns true if this enum is part of the declared values. Use it in your application to detect when values coming from outside of the app are not yet part of the declared values (i.e.: there is a new version of the enum that your application is not yet aware of.
*
*/
public boolean isDeclaredValue() {
return Status.declaredValues.contains(this);
}

}
```

62 changes: 27 additions & 35 deletions maybe-release.sh
Original file line number Diff line number Diff line change
@@ -1,42 +1,34 @@
#!/bin/bash
set -ev
if [ "$TRAVIS_BRANCH" == "master" ] && [ "$TRAVIS_PULL_REQUEST" == "false" ] && [ "$TRAVIS_REPO_SLUG" == "swisspush/jsonschema2pojo-openenum" ]
git fetch
git reset --hard
groovy staging.groovy drop
rc=$?
if [ $rc -ne 0 ]
then
git reset --hard
git clean -fd
git checkout master
echo 'Master checked out'
groovy staging.groovy drop
echo 'problem when trying to drop, ignored'
fi
echo 'starting a new nexus repository ...'
OUTPUT=$(groovy staging.groovy start)
echo "repository Id: $OUTPUT"
mvn -B -Prelease jgitflow:release-start jgitflow:release-finish -DrepositoryId=${OUTPUT}
rc=$?
if [ $rc -eq 0 ]
then
groovy staging.groovy close ${OUTPUT}
groovy staging.groovy promote ${OUTPUT}
rc=$?
if [ $rc -ne 0 ]
then
echo 'problem when trying to drop, ignored'
fi
echo 'starting a new nexus repository ...'
OUTPUT=$(groovy staging.groovy start)
echo "repository Id: $OUTPUT"
mvn -B -Prelease jgitflow:release-start jgitflow:release-finish --settings settings.xml -DrepositoryId=${OUTPUT}
rc=$?
if [ $rc -eq 0 ]
then
groovy staging.groovy close ${OUTPUT}
groovy staging.groovy promote ${OUTPUT}
rc=$?
if [ $rc -ne 0 ]
then
echo 'Release failed, cannot promote stage'
exit rc
fi
echo 'Release done, will push'
git tag
git push --tags
git checkout develop
git push origin develop
exit 0
echo 'Release failed, cannot promote stage'
exit $rc
fi
echo 'Release failed'
exit rc
else
echo 'Release skipped'
exit 0
fi
echo 'Release done, will push'
git tag
git push --tags
git checkout develop
git push origin develop
exit 0
fi
echo 'Release failed'
exit $rc
14 changes: 10 additions & 4 deletions pom.xml
Original file line number Diff line number Diff line change
@@ -1,12 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>org.swisspush.jsonschema2pojo</groupId>
<artifactId>jsonschema2pojo-openenum</artifactId>
<version>0.1.3-SNAPSHOT</version>
<version>0.1.4-SNAPSHOT</version>
<name>jsonschema2pojo-openenum</name>
<description>Config Builders for Kafka. A fluent API for configuring kafka clients.</description>
<url>https://github.com/swisspush/jsonschema2pojo-openenum</url>
Expand Down Expand Up @@ -125,6 +123,10 @@
<homedir>${session.executionRootDirectory}</homedir>
<keyname>230584D7</keyname>
<!--<executable>C:\Program Files (x86)\GnuPG\bin\gpg.exe</executable>-->
<gpgArguments>
<arg>--pinentry-mode</arg>
<arg>loopback</arg>
</gpgArguments>
</configuration>
</execution>
</executions>
Expand Down Expand Up @@ -226,6 +228,10 @@
<homedir>${session.executionRootDirectory}</homedir>
<keyname>230584D7</keyname>
<!--<executable>C:\Program Files (x86)\GnuPG\bin\gpg.exe</executable>-->
<gpgArguments>
<arg>--pinentry-mode</arg>
<arg>loopback</arg>
</gpgArguments>
</configuration>
</execution>
</executions>
Expand Down
48 changes: 0 additions & 48 deletions settings.xml

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -54,10 +54,11 @@ public JType apply(String nodeName, JsonNode node, JsonNode parent, JClassContai
container.owner().ref(String.class);

JMethod factoryMethod = addFactoryMethod(_enum, backingType);
addEnumConstants(node.path("enum"), _enum, node.path("javaEnumNames"), backingType, factoryMethod);
List<JFieldVar> enumConstants = addEnumConstants(node.path("enum"), _enum, node.path("javaEnumNames"), backingType, factoryMethod);
addConstantDeclaredValues(_enum, enumConstants);
JFieldVar valueField = addValueField(_enum, backingType);
addToString(_enum, valueField);

addMethodIsDeclaredValue(_enum);
return _enum;
}

Expand Down Expand Up @@ -149,8 +150,9 @@ private boolean isString(JType type){
return type.fullName().equals(String.class.getName());
}

private void addEnumConstants(JsonNode node, JDefinedClass _enum, JsonNode customNames, JType type, JMethod factoryMethod) {
private List<JFieldVar> addEnumConstants(JsonNode node, JDefinedClass _enum, JsonNode customNames, JType type, JMethod factoryMethod) {
Collection<String> existingConstantNames = new ArrayList<>();
List<JFieldVar> enumConstants = new ArrayList<>();
for (int i = 0; i < node.size(); i++) {
JsonNode value = node.path(i);

Expand All @@ -162,8 +164,50 @@ private void addEnumConstants(JsonNode node, JDefinedClass _enum, JsonNode custo
JFieldVar constant = _enum.field(JMod.PUBLIC | JMod.STATIC | JMod.FINAL, _enum, constantName);

constant.init(_enum.staticInvoke(factoryMethod).arg(JExpr.lit(value.asText())));
enumConstants.add(constant);
}
}
return enumConstants;
}

/**
* Adds new constant declaredValues, which is a Set containing all enum value constants
* (i.e.: all enum values known at compile time).
*
* @param enumClass
* @param enumConstants
*/
private void addConstantDeclaredValues(JDefinedClass enumClass, List<JFieldVar> enumConstants) {
JClass fieldType = enumClass.owner().ref(Set.class).narrow(enumClass);
JFieldVar field = enumClass.field(JMod.PUBLIC | JMod.STATIC | JMod.FINAL, fieldType, "declaredValues");
JClass fieldConcreteType = enumClass.owner().ref(HashSet.class).narrow(enumClass);

JInvocation arraysAsListInvocation = enumClass.owner().ref(Arrays.class).staticInvoke("asList");
// Add enum constants to the asListInvocation
for (JFieldVar constant : enumConstants) {
arraysAsListInvocation.arg(enumClass.staticRef(constant));
}

// construct HashSet using Arrays.asList()
JInvocation hashSetConstructorInvocation = JExpr._new(fieldConcreteType).arg(arraysAsListInvocation);

// wrap HashSet into UnmodifiableSet
JInvocation unmodifiableSetInvocation = enumClass.owner().ref(Collections.class).staticInvoke("unmodifiableSet").arg(hashSetConstructorInvocation);

// Initialize the field to unmodifiable set
field.init(unmodifiableSetInvocation);

field.javadoc().add("Set containing all enum values declared at compile time.");
field.javadoc().add(" Use it in your application to iterate over declared values.");
}

private void addMethodIsDeclaredValue(JDefinedClass _enum) {
JMethod method = _enum.method(JMod.PUBLIC, boolean.class, "isDeclaredValue");
JExpression toReturn = _enum.staticRef("declaredValues").invoke("contains").arg(JExpr._this());
method.body()._return(toReturn);

method.javadoc().add("returns true if this enum is part of the declared values.");
method.javadoc().add(" Use it in your application to detect when values coming from outside of the app are not yet part of the declared values (i.e.: there is a new version of the enum that your application is not yet aware of.");
}

private String getEnumName(String nodeName, JsonNode node, JClassContainer container) {
Expand Down
Loading

0 comments on commit 97f9ed7

Please sign in to comment.