Skip to content

Commit

Permalink
Ported to protocol V1 (#19)
Browse files Browse the repository at this point in the history
  • Loading branch information
bgaidioz authored Feb 18, 2025
1 parent 8e3ed84 commit f85def6
Show file tree
Hide file tree
Showing 71 changed files with 1,744 additions and 997 deletions.
26 changes: 5 additions & 21 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,29 +1,13 @@
# DAS Jira
[![License](https://img.shields.io/:license-BSL%201.1-blue.svg)](/licenses/BSL.txt)

## How to use

First you need to build the project:
```bash
$ docker build -t das-jira:latest .
```

This will create a docker image with the name `das-jira`.

Then you can run the image with the following command:
```bash
$ docker run -p 50051:50051 das-jira:latest
```

You can find the image id by looking at the sbt output or by running:
```bash
$ docker images
```
[Data Access Service](https://github.com/raw-labs/protocol-das) for [Jira](https://www.atlassian.com/software/jira).

## Options

| Name | Description | Default | Required |
|-------------------------|--------------------------------------------------------------------|---------|----------|
| `base_url` | Jira base url | | Yes |
| `personal_access_token` | API PAT for self hosted Jira instances | | Yes |
| `base_url` | Jira base URL | | Yes |
| `personal_access_token` | API PAT for self hosted Jira instances | | No |
| `token` | API token for user's Atlassian account. | | Yes |
| `uesrname` | Email address of agent user who have permission to access the API. | | Yes |
| `username` | Email address of agent user who have permission to access the API. | | Yes |
33 changes: 23 additions & 10 deletions das-jira-connector/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,11 @@
<!-- Specify the main class from the dependency -->
<transformer
implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.rawlabs.das.server.DASServerMain</mainClass>
<mainClass>com.rawlabs.das.server.DASServer</mainClass>
</transformer>
<!-- Append the reference.conf files into one -->
<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>reference.conf</resource>
</transformer>
</transformers>
</configuration>
Expand All @@ -56,11 +60,6 @@

<dependencies>
<!-- RAW Labs Dependencies -->
<dependency>
<groupId>com.raw-labs</groupId>
<artifactId>das-sdk-java</artifactId>
<version>${das-java-sdk-version}</version>
</dependency>
<dependency>
<groupId>com.raw-labs</groupId>
<artifactId>das-server-scala_${scala-version}</artifactId>
Expand Down Expand Up @@ -107,6 +106,17 @@
<version>${junit-jupiter-version}</version>
<scope>test</scope>
</dependency>
<!-- Utils dependencies -->
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>${joda-time.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-joda</artifactId>
<version>${jackson.version}</version>
</dependency>

</dependencies>

Expand All @@ -122,13 +132,16 @@
<maven-shade-plugin-version>3.4.1</maven-shade-plugin-version>

<!-- RAW Labs Dependencies -->
<das-java-sdk-version>0.1.3</das-java-sdk-version>
<das-server-scala-version>0.2.0</das-server-scala-version>
<das-server-scala-version>0.3.0</das-server-scala-version>
<jira-rest-client-version>1.0-SNAPSHOT</jira-rest-client-version>
<protocol-das.version>0.1.4</protocol-das.version>
<protocol-das.version>1.0.0</protocol-das.version>

<!-- Other Dependencies -->
<jackson.version>2.15.2</jackson.version>
<joda-time.version>2.13.0</joda-time.version>

<!-- Scala Version -->
<scala-version>2.12</scala-version>
<scala-version>2.13</scala-version>
</properties>

</project>
26 changes: 11 additions & 15 deletions das-jira-connector/src/main/java/com/rawlabs/das/jira/DASJira.java
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
package com.rawlabs.das.jira;

import com.rawlabs.das.jira.initializer.DASJiraInitializer;
import com.rawlabs.das.jira.tables.*;
import com.rawlabs.das.sdk.java.DASFunction;
import com.rawlabs.das.sdk.java.DASSdk;
import com.rawlabs.das.sdk.java.DASTable;
import com.rawlabs.protocol.das.FunctionDefinition;
import com.rawlabs.protocol.das.TableDefinition;

import com.rawlabs.das.jira.tables.DASJiraTableManager;
import com.rawlabs.das.sdk.DASFunction;
import com.rawlabs.das.sdk.DASSdk;
import com.rawlabs.das.sdk.DASTable;
import com.rawlabs.protocol.das.v1.functions.FunctionDefinition;
import com.rawlabs.protocol.das.v1.tables.TableDefinition;
import java.util.List;
import java.util.Map;
import java.util.Optional;

public class DASJira implements DASSdk {

Expand All @@ -23,23 +23,19 @@ protected DASJira(Map<String, String> options) {
this.options = options;
}

@Override
public List<TableDefinition> getTableDefinitions() {
return tableManager.getTableDefinitions();
}

@Override
public List<FunctionDefinition> getFunctionDefinitions() {
return List.of();
}

@Override
public DASTable getTable(String name) {
return tableManager.getTable(name);
public Optional<DASTable> getTable(String name) {
return tableManager.getTable(name).map(table -> (DASTable) table);
}

@Override
public DASFunction getFunction(String name) {
return null;
public Optional<DASFunction> getFunction(String name) {
return Optional.empty();
}
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
package com.rawlabs.das.jira;

import com.rawlabs.das.sdk.java.DASSdk;
import com.rawlabs.das.sdk.java.DASSdkBuilder;
import com.rawlabs.utils.core.RawSettings;

import com.rawlabs.das.sdk.DASSdk;
import com.rawlabs.das.sdk.DASSdkBuilder;
import com.rawlabs.das.sdk.DASSettings;
import java.util.Map;

public class DASJiraBuilder implements DASSdkBuilder {
Expand All @@ -13,8 +12,7 @@ public String getDasType() {
return "jira";
}

@Override
public DASSdk build(Map<String, String> options, RawSettings rawSettings) {
public DASSdk build(Map<String, String> options, DASSettings rawSettings) {
return new DASJira(options);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,12 @@

import com.rawlabs.das.jira.initializer.auth.DASJiraAuthStrategy;
import com.rawlabs.das.jira.initializer.auth.DASJiraAuthStrategyFactory;
import com.rawlabs.das.jira.rest.platform.ApiClient;

import java.util.Map;

public class DASJiraInitializer {

public static com.rawlabs.das.jira.rest.platform.ApiClient initializePlatform(Map<String, String> options) {
public static com.rawlabs.das.jira.rest.platform.ApiClient initializePlatform(
Map<String, String> options) {
if (options.get("base_url") == null) {
throw new IllegalArgumentException("base_url is required");
}
Expand All @@ -20,16 +19,16 @@ public static com.rawlabs.das.jira.rest.platform.ApiClient initializePlatform(Ma
return apiClient;
}

public static com.rawlabs.das.jira.rest.software.ApiClient initializeSoftware(Map<String, String> options) {
public static com.rawlabs.das.jira.rest.software.ApiClient initializeSoftware(
Map<String, String> options) {
if (options.get("base_url") == null) {
throw new IllegalArgumentException("base_url is required");
}
com.rawlabs.das.jira.rest.software.ApiClient apiClient =
new com.rawlabs.das.jira.rest.software.ApiClient();
new com.rawlabs.das.jira.rest.software.ApiClient();
apiClient.setBasePath(options.get("base_url"));
DASJiraAuthStrategy auth = DASJiraAuthStrategyFactory.createAuthStrategy(options);
auth.setupSoftwareAuthentication(apiClient, options);
return apiClient;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@
import java.util.Map;

public interface DASJiraAuthStrategy {
void setupPlatformAuthentication(com.rawlabs.das.jira.rest.platform.ApiClient apiClient, Map<String, String> options);
void setupSoftwareAuthentication(com.rawlabs.das.jira.rest.software.ApiClient apiClient, Map<String, String> options);
void setupPlatformAuthentication(
com.rawlabs.das.jira.rest.platform.ApiClient apiClient, Map<String, String> options);

void setupSoftwareAuthentication(
com.rawlabs.das.jira.rest.software.ApiClient apiClient, Map<String, String> options);
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,6 @@
package com.rawlabs.das.jira.initializer.auth;

import com.rawlabs.das.jira.rest.platform.ApiClient;
import com.rawlabs.das.jira.rest.platform.Configuration;
import com.rawlabs.das.jira.rest.platform.auth.OAuth;

import java.util.Map;

public class DASJiraOAuth2AuthStrategy implements DASJiraAuthStrategy {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,6 @@
package com.rawlabs.das.jira.initializer.auth;

import com.rawlabs.das.jira.rest.platform.ApiClient;
import com.rawlabs.das.jira.rest.platform.Configuration;
import com.rawlabs.das.jira.rest.platform.auth.HttpBasicAuth;

import java.util.Base64;
import java.util.Map;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
package com.rawlabs.das.jira.tables;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.rawlabs.das.sdk.java.exceptions.DASSdkApiException;
import com.rawlabs.protocol.das.Row;

import com.rawlabs.das.sdk.DASSdkException;
import com.rawlabs.protocol.das.v1.tables.Row;
import java.util.*;

@SuppressWarnings("unchecked")
Expand Down Expand Up @@ -84,7 +83,7 @@ protected void processFields(
// 'description' is an object, so we need to serialize it. It's then sent as 'any'.
addToRow("description", rowBuilder, objectMapper.writeValueAsString(description), columns);
} catch (JsonProcessingException e) {
throw new DASSdkApiException("error processing 'description'", e);
throw new DASSdkException("error processing 'description'", e);
}

addToRow(
Expand Down Expand Up @@ -148,7 +147,7 @@ protected void processFields(
try {
addToRow("fields", rowBuilder, objectMapper.writeValueAsString(fields), columns);
} catch (JsonProcessingException e) {
throw new DASSdkApiException(e.getMessage());
throw new DASSdkException(e.getMessage());
}

addToRow(
Expand All @@ -174,7 +173,7 @@ protected void processFields(
try {
addToRow("tags", rowBuilder, objectMapper.writeValueAsString(tags), columns);
} catch (JsonProcessingException e) {
throw new DASSdkApiException(e.getMessage());
throw new DASSdkException(e.getMessage());
}
}
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
package com.rawlabs.das.jira.tables;

import com.rawlabs.das.sdk.java.utils.factory.value.DefaultExtractValueFactory;
import com.rawlabs.das.sdk.java.utils.factory.value.ExtractValueFactory;
import com.rawlabs.protocol.das.Operator;
import com.rawlabs.protocol.das.Qual;
import com.rawlabs.protocol.raw.Value;

import com.rawlabs.das.jira.utils.factory.value.DefaultExtractValueFactory;
import com.rawlabs.das.jira.utils.factory.value.ExtractValueFactory;
import com.rawlabs.protocol.das.v1.query.Operator;
import com.rawlabs.protocol.das.v1.query.Qual;
import com.rawlabs.protocol.das.v1.types.Value;
import java.time.OffsetDateTime;
import java.time.OffsetTime;
import java.time.format.DateTimeFormatter;
Expand All @@ -20,29 +19,30 @@ public class DASJiraJqlQueryBuilder {

static String mapOperator(Operator operator) {
return switch (operator) {
case Operator op when op.hasEquals() -> "=";
case Operator op when op.hasNotEquals() -> "!=";
case Operator op when op.hasGreaterThan() -> ">";
case Operator op when op.hasGreaterThanOrEqual() -> ">=";
case Operator op when op.hasLessThan() -> "<";
case Operator op when op.hasLessThanOrEqual() -> "<=";
case Operator.EQUALS -> "=";
case Operator.NOT_EQUALS -> "!=";
case Operator.GREATER_THAN -> ">";
case Operator.GREATER_THAN_OR_EQUAL -> ">=";
case Operator.LESS_THAN -> "<";
case Operator.LESS_THAN_OR_EQUAL -> "<=";
default -> throw new IllegalArgumentException("Unexpected operator: " + operator);
};
}

static String mapValue(Value value) {
String s = switch (value) {
case Value v when v.hasString() -> v.getString().getV();
case Value v when v.hasTime() -> {
OffsetTime time = (OffsetTime) extractValueFactory.extractValue(value);
yield time.format(formatter);
}
case Value v when (v.hasTimestamp() || v.hasDate()) -> {
OffsetDateTime time = (OffsetDateTime) extractValueFactory.extractValue(value);
yield time.format(formatter);
}
default -> throw new IllegalArgumentException("Unexpected value: " + value);
};
String s =
switch (value) {
case Value v when v.hasString() -> v.getString().getV();
case Value v when v.hasTime() -> {
OffsetTime time = (OffsetTime) extractValueFactory.extractValue(value);
yield time.format(formatter);
}
case Value v when (v.hasTimestamp() || v.hasDate()) -> {
OffsetDateTime time = (OffsetDateTime) extractValueFactory.extractValue(value);
yield time.format(formatter);
}
default -> throw new IllegalArgumentException("Unexpected value: " + value);
};
return "\"" + s + "\"";
}

Expand Down Expand Up @@ -72,7 +72,7 @@ public static String buildJqlQuery(List<Qual> quals) {
.filter(Qual::hasSimpleQual)
.forEach(
q -> {
String column = getIssueJqlKey(q.getFieldName());
String column = getIssueJqlKey(q.getName());
String operator = mapOperator(q.getSimpleQual().getOperator());
String value = mapValue(q.getSimpleQual().getValue());
joiner.add(column + " " + operator + " " + value);
Expand Down
Loading

0 comments on commit f85def6

Please sign in to comment.