Skip to content

Commit e047deb

Browse files
authored
Merge pull request #36 from clockify/develop
Updating the SDK and the annotation processor
2 parents df3f4cf + c9f358a commit e047deb

13 files changed

Lines changed: 842 additions & 55 deletions

File tree

addon-sdk/pom.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
1515

1616
<javax.servlet-api.version>4.0.1</javax.servlet-api.version>
17-
<jetty.version>11.0.16</jetty.version>
17+
<jetty.version>11.0.22</jetty.version>
1818
<gson.version>2.10.1</gson.version>
1919
<jsonwebtoken.version>0.11.5</jsonwebtoken.version>
2020
</properties>
@@ -24,7 +24,7 @@
2424
<dependency>
2525
<groupId>com.cake.clockify</groupId>
2626
<artifactId>addon-sdk-annotation-processor</artifactId>
27-
<version>1.0.6</version>
27+
<version>1.0.7</version>
2828
</dependency>
2929

3030
<dependency>
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package com.cake.clockify.addonsdk.clockify;
2+
3+
import io.jsonwebtoken.JwtParser;
4+
import io.jsonwebtoken.Jwts;
5+
6+
import java.security.interfaces.RSAPublicKey;
7+
import java.util.Map;
8+
9+
public class ClockifySignatureParser {
10+
public static final String CLAIM_TYPE = "type";
11+
public static final String CLAIM_BACKEND_URL = "backendUrl";
12+
public static final String CLAIM_PTO_URL = "ptoUrl";
13+
public static final String CLAIM_REPORTS_URL = "reportsUrl";
14+
public static final String CLAIM_WORKSPACE_ID = "workspaceId";
15+
public static final String CLAIM_ADDON_ID = "addonId";
16+
public static final String CLAIM_USER_ID = "user";
17+
public static final String CLAIM_WORKSPACE_ROLE = "workspaceRole";
18+
19+
public static final String ISSUER = "clockify";
20+
public static final String ADDON = "addon";
21+
private final JwtParser parser;
22+
23+
/**
24+
* @param addonKey the key declared inside the addon manifest
25+
* @param publicKey the RSA256 public key
26+
*/
27+
public ClockifySignatureParser(String addonKey, RSAPublicKey publicKey) {
28+
this.parser = Jwts.parserBuilder()
29+
.requireIssuer(ISSUER)
30+
.requireSubject(addonKey)
31+
.require(CLAIM_TYPE, ADDON)
32+
.setSigningKey(publicKey)
33+
.build();
34+
}
35+
36+
public Map<String, Object> parseClaims(String token) {
37+
return parser.parseClaimsJws(token).getBody();
38+
}
39+
}

addon-sdk/src/main/java/com/cake/clockify/addonsdk/shared/utils/JwtUtils.java

Lines changed: 0 additions & 28 deletions
This file was deleted.

annotation-processor/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
<groupId>com.cake.clockify</groupId>
88
<artifactId>addon-sdk-annotation-processor</artifactId>
9-
<version>1.0.6</version>
9+
<version>1.0.8</version>
1010

1111
<properties>
1212
<maven.compiler.source>17</maven.compiler.source>

annotation-processor/src/main/java/com/cake/clockify/annotationprocessor/Constants.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,15 @@
55

66
@NoArgsConstructor(access = AccessLevel.PRIVATE)
77
public class Constants {
8-
public static final String MANIFEST_FILE = "clockify-manifest-v1.2.json";
98
public static final String DELIMITER_NAME_PARTS = "_";
109

1110
public static final String REGEX_METHOD_NAME_SPLIT = "[.\\-_]";
1211
public static final String REGEX_UPPER_CASE_SPLIT = "(?=\\p{Upper})";
1312

13+
public static final String CLOCKIFY_MODEL_PACKAGE = "com.cake.clockify.addonsdk.clockify.model";
14+
public static final String CLOCKIFY_MANIFESTS_DIR = "clockify-manifests";
15+
1416
public static final String CLOCKIFY_PREFIX = "Clockify";
17+
public static final String CLOCKIFY_MANIFEST_INTERFACE = "ClockifyManifest";
18+
public static final String CLOCKIFY_PATH_INTERFACE = "ClockifyResource";
1519
}

annotation-processor/src/main/java/com/cake/clockify/annotationprocessor/ManifestExtensionProcessor.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -44,11 +44,13 @@ private void processAnnotation(TypeElement annotation, RoundEnvironment roundEnv
4444
for (Element element : elements) {
4545
DeclaredType type = (DeclaredType) element.asType();
4646

47-
try {
48-
files.addAll(new ClockifyManifestProcessor(type).process());
49-
} catch (Exception e) {
50-
e.printStackTrace();
51-
throw new RuntimeException(e);
47+
for (String manifestPath: Utils.getClockifyManifestPaths()) {
48+
try {
49+
files.addAll(new ClockifyManifestProcessor(type, manifestPath).process());
50+
} catch (Exception e) {
51+
e.printStackTrace();
52+
throw new RuntimeException(e);
53+
}
5254
}
5355
}
5456

annotation-processor/src/main/java/com/cake/clockify/annotationprocessor/Utils.java

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,18 @@
1010

1111
import javax.lang.model.type.DeclaredType;
1212
import java.io.InputStream;
13+
import java.net.URL;
14+
import java.nio.file.Files;
15+
import java.nio.file.Path;
16+
import java.nio.file.Paths;
1317
import java.util.Iterator;
1418
import java.util.LinkedList;
1519
import java.util.List;
1620
import java.util.Locale;
1721
import java.util.Map;
1822

1923
import static com.cake.clockify.annotationprocessor.Constants.CLOCKIFY_PREFIX;
20-
import static com.cake.clockify.annotationprocessor.Constants.MANIFEST_FILE;
24+
import static com.cake.clockify.annotationprocessor.Constants.CLOCKIFY_MANIFESTS_DIR;
2125
import static com.cake.clockify.annotationprocessor.Constants.REGEX_METHOD_NAME_SPLIT;
2226
import static com.cake.clockify.annotationprocessor.Constants.REGEX_UPPER_CASE_SPLIT;
2327
import static java.util.Collections.emptyList;
@@ -31,8 +35,19 @@ public class Utils {
3135
);
3236

3337
@SneakyThrows
34-
public static JsonNode readManifestDefinition(ObjectMapper mapper) {
35-
InputStream is = Utils.class.getClassLoader().getResourceAsStream(MANIFEST_FILE);
38+
public static List<String> getClockifyManifestPaths() {
39+
URL url = Utils.class.getClassLoader().getResource(CLOCKIFY_MANIFESTS_DIR);
40+
Path path = Paths.get(url.toURI());
41+
try (var files = Files.walk(path, 1)) {
42+
return files.filter(p -> p.toFile().isFile())
43+
.map(p -> CLOCKIFY_MANIFESTS_DIR + "/" + p.getFileName().toString())
44+
.toList();
45+
}
46+
}
47+
48+
@SneakyThrows
49+
public static JsonNode readManifestDefinition(ObjectMapper mapper, String manifestPath) {
50+
InputStream is = Utils.class.getClassLoader().getResourceAsStream(manifestPath);
3651
return mapper.readTree(is);
3752
}
3853

@@ -174,4 +189,11 @@ public static String getPropertyDescription(JsonNode node) {
174189
}
175190
return "";
176191
}
192+
193+
public static String getVersionedPackageName(JsonNode manifest, String packageName) {
194+
String version = manifest.get("version").asText();
195+
String versionSubpackage = "v" + version.replace(".", "_");
196+
197+
return packageName + "." + versionSubpackage;
198+
}
177199
}

annotation-processor/src/main/java/com/cake/clockify/annotationprocessor/clockify/ClockifyManifestProcessor.java

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import com.cake.clockify.annotationprocessor.Utils;
55
import com.fasterxml.jackson.databind.JsonNode;
66
import com.fasterxml.jackson.databind.ObjectMapper;
7+
import com.fasterxml.jackson.databind.node.ArrayNode;
78
import com.squareup.javapoet.JavaFile;
89

910
import javax.lang.model.type.DeclaredType;
@@ -17,8 +18,8 @@ public class ClockifyManifestProcessor {
1718
private final String packageName;
1819
private final String className;
1920

20-
public ClockifyManifestProcessor(DeclaredType type) {
21-
this.manifest = Utils.readManifestDefinition(new ObjectMapper());
21+
public ClockifyManifestProcessor(DeclaredType type, String manifestPath) {
22+
this.manifest = Utils.readManifestDefinition(new ObjectMapper(), manifestPath);
2223

2324
String[] qualifiedNames = Utils.getPackageAndClassNames(type);
2425
this.packageName = qualifiedNames[0];
@@ -39,11 +40,17 @@ private List<JavaFile> getObjectDefinitions() {
3940
if (isObjectDefinition(node)) {
4041
DefinitionProcessor processor = new DefinitionProcessor(
4142
manifest,
42-
packageName,
4343
Utils.getDefinitionSimpleClassName(definition),
4444
definition
4545
);
4646

47+
javaFiles.addAll(processor.process());
48+
} else if (isEnumDefinition(node)) {
49+
EnumConstantsProcessor processor = new EnumConstantsProcessor(
50+
manifest,
51+
definition
52+
);
53+
4754
javaFiles.addAll(processor.process());
4855
}
4956
});
@@ -52,10 +59,15 @@ private List<JavaFile> getObjectDefinitions() {
5259
}
5360

5461
private List<JavaFile> getManifestDefinition() {
55-
return new DefinitionProcessor(manifest, packageName, className, null).process();
62+
return new DefinitionProcessor(manifest, className, null).process();
5663
}
5764

5865
private boolean isObjectDefinition(JsonNode node) {
5966
return NodeConstants.OBJECT.equals(Utils.getNodeType(node, manifest.get(NodeConstants.DEFINITIONS)));
6067
}
68+
69+
private boolean isEnumDefinition(JsonNode node) {
70+
String type = Utils.getNodeType(node, manifest.get(NodeConstants.DEFINITIONS));
71+
return NodeConstants.STRING.equals(type) && node.get(NodeConstants.ENUM) instanceof ArrayNode;
72+
}
6173
}

0 commit comments

Comments
 (0)