Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: add projectconfig #228

Merged
merged 13 commits into from
Oct 27, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/docker-publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ jobs:
if: github.event_name != 'pull_request'
uses: sigstore/cosign-installer@7bca8b41164994a7dc93749d266e2f1db492f8a2
with:
cosign-release: 'v1.9.0'
cosign-release: 'v1.13.1'
# Build Quarkus
- name: Build
run: cd ./github-bot/ && gradle assemble
Expand Down
1 change: 0 additions & 1 deletion buildSrc/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -21,5 +21,4 @@ repositories {
implementation "org.kordamp.gradle:jandex-gradle-plugin:0.13.2"
implementation "net.ltgt.gradle:gradle-errorprone-plugin:3.0.1"
implementation 'io.smallrye:jandex:3.0.1'
testImplementation group: 'org.assertj', name: 'assertj-core', version: '3.23.1'
}
Original file line number Diff line number Diff line change
Expand Up @@ -44,14 +44,12 @@ public class QodanaAnalyzer {
private String qodanaImageName;
private String resultPathString;
private String sourceFileRoot;
private Optional<String> qodanaCache;

private QodanaAnalyzer(Builder builder) {
this.resultFolder = builder.resultFolder;
this.qodanaImageName = builder.qodanaImageName;
this.resultPathString = builder.resultPathString;
this.sourceFileRoot = builder.sourceFileRoot;
this.qodanaCache = builder.cacheFolder;
}

public List<AnalyzerResult> runQodana(Path sourceRoot) {
Expand Down Expand Up @@ -272,7 +270,8 @@ public static class Builder {
private String qodanaImageName = "jetbrains/qodana";
private String resultPathString = resultFolder + "/qodana.sarif.json";
private String sourceFileRoot = "./src/main/java";
private Optional<String> cacheFolder = Optional.empty();
private Optional<String> cacheFolder = Optional.of("data/cache");
private String subFolder;

public Builder withResultFolder(String resultFolder) {
this.resultFolder = resultFolder;
Expand All @@ -297,8 +296,9 @@ public Builder withSourceFileRoot(String sourceFileRoot) {
return this;
}

public Builder withCacheVolume(String volumeName) {
public Builder withCacheVolume(String volumeName, String subFolder) {
this.cacheFolder = Optional.of(volumeName);
this.subFolder = subFolder;
return this;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ public void refactor(ChangeListener listener, CtType<?> type) {
}
for (CtInvocation<?> toStringInvocation :
filterMatches(PositionScanner.findLineOnly(type, result.position()))) {
logger.atInfo().log("found %s", toStringInvocation);
CtInvocation<?> oldInvocation = toStringInvocation.clone().setParent(null);
toStringInvocation.replace(toStringInvocation.getTarget().clone());
listener.setChanged(
Expand Down
39 changes: 9 additions & 30 deletions frontend/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

16 changes: 16 additions & 0 deletions frontend/src/ProjectData.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -72,3 +72,19 @@ export function filterDuplicateBadSmells(params: BadSmell[]) {
return filtered;
}

export const fetchProjectConfigQuery = gql`
query getProjectConfig($projectUrl: String!) {
getProjectConfig(projectUrl: $projectUrl) {
projectUrl
sourceFolder
}
}
`;
export const addProjectConfigQuery = gql`
mutation addProjectConfig($projectConfig: ProjectConfig!) {
addProjectConfig(projectConfig: $projectConfig) {
projectUrl
sourceFolder
}
}
`;
4 changes: 4 additions & 0 deletions frontend/src/data/ProjectConfig.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
export type ProjectConfig = {
projectUrl: string,
sourceFolder: string
}
5 changes: 5 additions & 0 deletions frontend/src/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import { ThemeProvider, createTheme, ThemeOptions } from '@mui/material/styles';
import { CssBaseline } from '@mui/material';
import { AddProjectView } from './pages/AddProjectView';
import { RefactorView } from './pages/RefactorView';
import { ProjectConfigview } from './pages/ProjectConfigView';
const root = ReactDOM.createRoot(
document.getElementById('root') as HTMLElement
);
Expand All @@ -30,6 +31,10 @@ const router = createBrowserRouter([
path: "/mutation/refactor/:name/:hash",
element: <RefactorView />,
},
{
path: "/mutation/projectconfig/:projectUrl",
element: <ProjectConfigview />,
},
{
path: "/resultview",
element: <DashBoard />,
Expand Down
41 changes: 41 additions & 0 deletions frontend/src/pages/ProjectConfigView.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
import { useQuery } from '@apollo/client';
import { Alert, Box, Button, TextField, Typography } from '@mui/material';
import React, { useState } from 'react';
import { useParams } from 'react-router';
import Headline from '../component/Headline';
import { fetchProjectConfigQuery } from '../ProjectData';

export function ProjectConfigview() {
const { projectUrl } = useParams();
const encodedProjectUrl = toBase64(projectUrl);
const [sourceFolder, setSourceFolder] = useState("")
const { loading, error} = useQuery(fetchProjectConfigQuery, {
variables: { projectUrl: encodedProjectUrl },
onCompleted: (data) => {
setSourceFolder(data.getProjectConfig.sourceFolder)
}
});
return (
<div>
<Headline />
<Box padding={5}>
<br />
<Typography variant='h4'>Project Config </Typography>
<br />
{loading && <p>Loading...</p>}
{error && <Alert severity="error">Can not fetch data. Are you logged in?</Alert>}
<TextField label="SourceFolder" value={sourceFolder} onChange={(e) => setSourceFolder(e.target.value)} />
<Button variant="contained" onClick={
(e) => {
console.log(sourceFolder);
}}>Save</Button>
</Box>
</div>
);
}
function toBase64(str: string | undefined): string {
if (undefined === str) {
return "";
}
return atob(str);
}
11 changes: 9 additions & 2 deletions frontend/src/pages/Resultview.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ import { Project } from "../data/Project";
import { useQuery } from "@apollo/client";
import BadSmellList from "../component/BadSmellList";


function Resultview() {

let params = useParams();
Expand Down Expand Up @@ -40,7 +39,9 @@ function Resultview() {
<br />
<Divider />
<BadSmellList {...projectWithSingleHash(project, params.hash)} />
<Button variant="contained" href={"/mutation/refactor/" + project.projectName+"/"+params.hash}>toRefactor</Button>
<Divider />
<Button variant="contained" href={"/mutation/refactor/" + project.projectName + "/" + params.hash}>toRefactor</Button>
<Button variant="contained" href={generateProjectConfigLink(project)}>toProjectConfig</Button>
</div>
);
}
Expand All @@ -62,4 +63,10 @@ function addHashIfPresent(hash: string | undefined) : string {
return hash;
}
return "";
}
function toBase64(str: string) {
return btoa(str);
}
function generateProjectConfigLink(project: Project) {
return "/mutation/projectconfig/" + toBase64(project.projectUrl);
}
62 changes: 0 additions & 62 deletions github-bot/README.md

This file was deleted.

2 changes: 2 additions & 0 deletions github-bot/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@ dependencies {
implementation 'io.quarkiverse.quinoa:quarkus-quinoa:1.2.2'
implementation("io.quarkus:quarkus-oidc")
implementation("io.quarkus:quarkus-keycloak-authorization")
testImplementation group: 'org.assertj', name: 'assertj-core', version: '3.23.1'
implementation 'io.vertx:vertx-junit5:+'
}

group 'io.github.martinwitt'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,17 @@
import static com.mongodb.client.model.Sorts.ascending;

import com.google.common.flogger.FluentLogger;
import io.github.martinwitt.laughing_train.data.FindProjectConfigRequest;
import io.github.martinwitt.laughing_train.data.FindProjectConfigResult;
import io.github.martinwitt.laughing_train.persistence.BadSmell;
import io.github.martinwitt.laughing_train.persistence.Project;
import io.github.martinwitt.laughing_train.persistence.ProjectConfig;
import io.github.martinwitt.laughing_train.services.ProjectConfigService;
import io.quarkus.security.Authenticated;
import java.util.ArrayList;
import java.util.List;
import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
import org.bson.BsonDocument;
import org.bson.conversions.Bson;
import org.eclipse.microprofile.graphql.DefaultValue;
Expand All @@ -27,6 +32,9 @@ public class ProjectGraphQL {

private static final FluentLogger logger = FluentLogger.forEnclosingClass();

@Inject
ProjectConfigService projectConfigService;

@Query("getProjects")
@Description("Gets all projects from the database")
public List<Project> getAllProjects() {
Expand Down Expand Up @@ -58,6 +66,9 @@ public List<String> getHashesForProject(String projectName) {
@Description("Adds a project to the database")
public Project addProject(String projectUrl, String projectName) {
Project project = new Project(projectName, projectUrl);
if (ProjectConfig.findByProjectUrl(projectUrl).isEmpty()) {
ProjectConfig.ofProjectUrl(projectUrl).persistOrUpdate();
}
project.persistOrUpdate();
return project;
}
Expand All @@ -77,4 +88,30 @@ public List<Project> removeProjectByName(String projectName) {
public String login(@DefaultValue("defaultValue") String notNeeded) {
return "login successful";
}

@Query("getProjectConfig")
@Description("Gets the project config for a project")
public ProjectConfig getProjectConfig(String projectUrl) {
var result = projectConfigService.getConfig(new FindProjectConfigRequest.ByProjectUrl(projectUrl));
if (result instanceof FindProjectConfigResult.SingleResult singleResult) {
return singleResult.projectConfig();
} else {
return ProjectConfig.ofProjectUrl(projectUrl);
}
}

@Mutation
@Authenticated
@Description("Sets the project config for a project")
public ProjectConfig setProjectConfig(ProjectConfig projectConfig) {
var result = projectConfigService.getConfig(
new FindProjectConfigRequest.ByProjectUrl(projectConfig.getProjectUrl()));
if (result instanceof FindProjectConfigResult.SingleResult singleResult) {
singleResult.projectConfig().update(projectConfig);
return singleResult.projectConfig();
} else {
projectConfig.persist();
return projectConfig;
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package io.github.martinwitt.laughing_train.data;

import java.io.Serializable;

public sealed interface FindProjectConfigRequest extends Serializable {
record ByProjectUrl(String projectUrl) implements FindProjectConfigRequest, Serializable {}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package io.github.martinwitt.laughing_train.data;

import io.github.martinwitt.laughing_train.persistence.ProjectConfig;
import java.io.Serializable;
import java.util.List;

public sealed interface FindProjectConfigResult extends Serializable {
record SingleResult(ProjectConfig projectConfig) implements FindProjectConfigResult {}

record MultipleResults(List<? super ProjectConfig> projectConfigs) implements FindProjectConfigResult {}

record NotFound() implements FindProjectConfigResult {}
}
Loading