Skip to content

Commit

Permalink
Merge branch 'develop' into feature/iris/update-competency-generation
Browse files Browse the repository at this point in the history
  • Loading branch information
yassinsws authored Aug 20, 2024
2 parents 8a478b4 + f4deff3 commit ef4a3e3
Show file tree
Hide file tree
Showing 28 changed files with 839 additions and 210 deletions.
79 changes: 53 additions & 26 deletions .github/workflows/analysis-of-endpoint-connections.yml
Original file line number Diff line number Diff line change
@@ -1,12 +1,8 @@
name: Analysis of Endpoint Connections

on:
workflow_dispatch:
pull_request:
types:
- opened
- synchronize
paths:
- 'src/main/java/**'
- 'src/main/webapp/**'
push:

# Keep in sync with build.yml and test.yml and codeql-analysis.yml
env:
Expand All @@ -15,7 +11,7 @@ env:
java: 21

jobs:
analysis-of-endpoint-connections:
Parse-rest-calls-and-endpoints:
timeout-minutes: 10
runs-on: ubuntu-latest
steps:
Expand All @@ -24,39 +20,70 @@ jobs:
with:
fetch-depth: 0

- name: Get list of modified files
run: |
git diff --name-only origin/${{ github.event.pull_request.base.ref }} HEAD > modified_files.txt
- name: Set up JDK 21
uses: actions/setup-java@v4
with:
java-version: '${{ env.java }}'
distribution: 'temurin'
cache: 'gradle'

# Analyze the client sided REST-API calls
- name: Set up Node.js
- name: Set up node.js
uses: actions/setup-node@v4
with:
node-version: '${{ env.node }}'

- name: Install and compile TypeScript
- name: Parse client sided REST-API calls
run: |
cd supporting_scripts/analysis-of-endpoint-connections/src/main/typeScript/
npm install
tsc -p tsconfig.analysisOfEndpointConnections.json
- name: Run analysis-of-endpoint-connections-client
run: |
tsc -p supporting_scripts/analysis-of-endpoint-connections/src/main/typeScript/tsconfig.analysisOfEndpointConnections.json
node supporting_scripts/analysis-of-endpoint-connections/src/main/typeScript/AnalysisOfEndpointConnectionsClient.js
- name: Upload JSON file
- name: Parse server sided Endpoints
run: ./gradlew :supporting_scripts:analysis-of-endpoint-connections:runEndpointParser

- name: Upload parsing results
uses: actions/upload-artifact@v4
with:
name: rest-calls-json
path: supporting_scripts/analysis-of-endpoint-connections/restCalls.json
name: REST API Parsing Results
path: |
supporting_scripts/analysis-of-endpoint-connections/endpoints.json
supporting_scripts/analysis-of-endpoint-connections/restCalls.json
Analysis-of-endpoint-connections:
needs: Parse-rest-calls-and-endpoints
timeout-minutes: 10
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0

# Analyze the server sided endpoints
- name: Set up JDK 21
uses: actions/setup-java@v4
with:
distribution: 'temurin'
java-version: '${{ env.java }}'
cache: 'gradle'

- name: Run analysis-of-endpoint-connections
run: |
./gradlew :supporting_scripts:analysis-of-endpoint-connections:run --args="$(cat modified_files.txt)"
- name: Download JSON files
uses: actions/download-artifact@v4
with:
name: REST API Parsing Results
path: supporting_scripts/analysis-of-endpoint-connections/

- name: Analyze endpoints
run:
./gradlew :supporting_scripts:analysis-of-endpoint-connections:runEndpointAnalysis

- name: Analyze rest calls
run:
./gradlew :supporting_scripts:analysis-of-endpoint-connections:runRestCallAnalysis

- name: Upload analysis results
uses: actions/upload-artifact@v4
with:
name: Endpoint and REST Call Analysis Results
path: |
supporting_scripts/analysis-of-endpoint-connections/endpointAnalysisResult.json
supporting_scripts/analysis-of-endpoint-connections/restCallAnalysisResult.json
1 change: 1 addition & 0 deletions settings.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ pluginManagement {

rootProject.name = 'Artemis'

// needed for rest call and endpoint analysis
include 'supporting_scripts:analysis-of-endpoint-connections'

// needed for programming exercise templates
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
<ul>
@for (auxiliaryRepository of detail.data.auxiliaryRepositories; track auxiliaryRepository) {
@if (auxiliaryRepository.id && auxiliaryRepository.repositoryUri && detail.data.exerciseId) {
<li class="mt-2">
<span>Repository: {{ auxiliaryRepository.name }}</span>
<jhi-code-button class="ms-2" [smallButtons]="true" [repositoryUri]="auxiliaryRepository.repositoryUri" />
<jhi-programming-exercise-instructor-repo-download
class="ms-2"
[exerciseId]="detail.data.exerciseId"
[repositoryType]="'AUXILIARY'"
[auxiliaryRepositoryId]="auxiliaryRepository.id"
/>
<div class="auxiliaryRepositoryDescription">
@if (!auxiliaryRepository.checkoutDirectory) {
<fa-icon [icon]="faExclamationTriangle" class="text-warning me-1" [ngbTooltip]="noCheckoutDirectorySetTooltip" />
<span jhiTranslate="artemisApp.programmingExercise.noCheckoutDirectorySet"></span>
}
<ng-template #noCheckoutDirectorySetTooltip>
<span jhiTranslate="artemisApp.programmingExercise.noCheckoutDirectorySetTooltip"></span>
</ng-template>
</div>
</li>
}
}
</ul>
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import { Component, Input } from '@angular/core';
import { NoDataComponent } from 'app/shared/no-data-component';
import { RouterModule } from '@angular/router';
import { ArtemisSharedComponentModule } from 'app/shared/components/shared-component.module';
import { ArtemisProgrammingExerciseActionsModule } from 'app/exercises/programming/shared/actions/programming-exercise-actions.module';
import { ProgrammingAuxiliaryRepositoryButtonsDetail } from 'app/detail-overview-list/detail.model';
import { faExclamationTriangle } from '@fortawesome/free-solid-svg-icons';
import { ArtemisSharedModule } from 'app/shared/shared.module';

@Component({
selector: 'jhi-programming-auxiliary-repository-buttons-detail',
templateUrl: 'programming-auxiliary-repository-buttons-detail.component.html',
standalone: true,
imports: [NoDataComponent, RouterModule, ArtemisSharedComponentModule, ArtemisProgrammingExerciseActionsModule, ArtemisSharedModule],
})
export class ProgrammingAuxiliaryRepositoryButtonsDetailComponent {
@Input() detail: ProgrammingAuxiliaryRepositoryButtonsDetail;

readonly faExclamationTriangle = faExclamationTriangle;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
@if (detail.data.participation?.repositoryUri && detail.data.exerciseId) {
<div class="clone-buttons">
<jhi-code-button [smallButtons]="true" [routerLinkForRepositoryView]="['.', 'repository', detail.data.type]" [repositoryUri]="detail.data.participation?.repositoryUri!" />
<jhi-programming-exercise-instructor-repo-download class="ms-2" [exerciseId]="detail.data.exerciseId" [repositoryType]="detail.data.type" />
</div>
} @else {
<jhi-no-data />
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import { Component, Input } from '@angular/core';
import type { ProgrammingRepositoryButtonsDetail } from 'app/detail-overview-list/detail.model';
import { NoDataComponent } from 'app/shared/no-data-component';
import { RouterModule } from '@angular/router';
import { ArtemisSharedComponentModule } from 'app/shared/components/shared-component.module';
import { ArtemisProgrammingExerciseActionsModule } from 'app/exercises/programming/shared/actions/programming-exercise-actions.module';

@Component({
selector: 'jhi-programming-repository-buttons-detail',
templateUrl: 'programming-repository-buttons-detail.component.html',
standalone: true,
imports: [NoDataComponent, RouterModule, ArtemisSharedComponentModule, ArtemisProgrammingExerciseActionsModule],
})
export class ProgrammingRepositoryButtonsDetailComponent {
@Input() detail: ProgrammingRepositoryButtonsDetail;
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,51 +15,6 @@ <h3 class="section-headline" [id]="headlinesRecord[section.headline]">{{ section
</dt>
}
@switch (detail.type) {
@case (DetailType.ProgrammingRepositoryButtons) {
<dd id="detail-value-{{ detail.title }}">
@if (detail.data.participation?.repositoryUri && detail.data.exerciseId) {
<div class="clone-buttons">
<jhi-code-button
[smallButtons]="true"
[routerLinkForRepositoryView]="['.', 'repository', detail.data.type]"
[repositoryUri]="detail.data.participation?.repositoryUri!"
/>
<jhi-programming-exercise-instructor-repo-download class="ms-2" [exerciseId]="detail.data.exerciseId" [repositoryType]="detail.data.type" />
</div>
} @else {
<ng-container *ngTemplateOutlet="noData" />
}
</dd>
}
@case (DetailType.ProgrammingAuxiliaryRepositoryButtons) {
<dd id="detail-value-{{ detail.title }}">
<ul>
@for (auxiliaryRepository of detail.data.auxiliaryRepositories; track auxiliaryRepository) {
@if (auxiliaryRepository.id && auxiliaryRepository.repositoryUri && detail.data.exerciseId) {
<li class="mt-2">
<span>Repository: {{ auxiliaryRepository.name }}</span>
<jhi-code-button class="ms-2" [smallButtons]="true" [repositoryUri]="auxiliaryRepository.repositoryUri" />
<jhi-programming-exercise-instructor-repo-download
class="ms-2"
[exerciseId]="detail.data.exerciseId"
[repositoryType]="'AUXILIARY'"
[auxiliaryRepositoryId]="auxiliaryRepository.id"
/>
<div class="auxiliaryRepositoryDescription">
@if (!auxiliaryRepository.checkoutDirectory) {
<fa-icon [icon]="faExclamationTriangle" class="text-warning me-1" [ngbTooltip]="noCheckoutDirectorySetTooltip" />
<span jhiTranslate="artemisApp.programmingExercise.noCheckoutDirectorySet"></span>
}
<ng-template #noCheckoutDirectorySetTooltip>
<span jhiTranslate="artemisApp.programmingExercise.noCheckoutDirectorySetTooltip"></span>
</ng-template>
</div>
</li>
}
}
</ul>
</dd>
}
@case (DetailType.ProgrammingTestStatus) {
<dd id="detail-value-{{ detail.title }}">
@if (detail.data.participation) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { Component, Input, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core';
import { faArrowUpRightFromSquare, faCodeBranch, faCodeCompare, faExclamationTriangle } from '@fortawesome/free-solid-svg-icons';
import { faCodeCompare } from '@fortawesome/free-solid-svg-icons';
import { isEmpty } from 'lodash-es';
import { FeatureToggle } from 'app/shared/feature-toggle/feature-toggle.service';
import { ButtonSize, ButtonType, TooltipPlacement } from 'app/shared/components/button.component';
Expand Down Expand Up @@ -63,10 +63,7 @@ export class DetailOverviewListComponent implements OnInit, OnDestroy {
headlinesRecord: Record<string, string>;

// icons
readonly faExclamationTriangle = faExclamationTriangle;
readonly faCodeCompare = faCodeCompare;
readonly faArrowUpRightFromSquare = faArrowUpRightFromSquare;
readonly faCodeBranch = faCodeBranch;

WARNING = ButtonType.WARNING;

Expand Down
4 changes: 2 additions & 2 deletions src/main/webapp/app/detail-overview-list/detail.model.ts
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ interface ProgrammingIrisEnabledDetail extends DetailBase {
data: { exercise?: ProgrammingExercise; course?: Course; disabled: boolean; subSettingsType: IrisSubSettingsType };
}

interface ProgrammingRepositoryButtonsDetail extends DetailBase {
export interface ProgrammingRepositoryButtonsDetail extends DetailBase {
type: DetailType.ProgrammingRepositoryButtons;
data: {
exerciseId?: number;
Expand All @@ -92,7 +92,7 @@ interface ProgrammingRepositoryButtonsDetail extends DetailBase {
};
}

interface ProgrammingAuxiliaryRepositoryButtonsDetail extends DetailBase {
export interface ProgrammingAuxiliaryRepositoryButtonsDetail extends DetailBase {
type: DetailType.ProgrammingAuxiliaryRepositoryButtons;
data: { auxiliaryRepositories: AuxiliaryRepository[]; exerciseId?: number };
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ import { TextDetailComponent } from 'app/detail-overview-list/components/text-de
import { DateDetailComponent } from 'app/detail-overview-list/components/date-detail.component';
import { LinkDetailComponent } from 'app/detail-overview-list/components/link-detail.component';
import { BooleanDetailComponent } from 'app/detail-overview-list/components/boolean-detail.component';
import { ProgrammingRepositoryButtonsDetailComponent } from 'app/detail-overview-list/components/programming-repository-buttons-detail.component';
import { ProgrammingAuxiliaryRepositoryButtonsDetailComponent } from 'app/detail-overview-list/components/programming-auxiliary-repository-buttons-detail.component';

@Directive({
selector: '[jhiExerciseDetail]',
Expand All @@ -23,11 +25,22 @@ export class ExerciseDetailDirective implements OnInit, OnDestroy {
}
this.detail = this.detail as ShownDetail;

const detailTypeToComponent: { [key in DetailType]?: Type<TextDetailComponent | DateDetailComponent | LinkDetailComponent | BooleanDetailComponent> } = {
const detailTypeToComponent: {
[key in DetailType]?: Type<
| TextDetailComponent
| DateDetailComponent
| LinkDetailComponent
| BooleanDetailComponent
| ProgrammingRepositoryButtonsDetailComponent
| ProgrammingAuxiliaryRepositoryButtonsDetailComponent
>;
} = {
[DetailType.Text]: TextDetailComponent,
[DetailType.Date]: DateDetailComponent,
[DetailType.Link]: LinkDetailComponent,
[DetailType.Boolean]: BooleanDetailComponent,
[DetailType.ProgrammingRepositoryButtons]: ProgrammingRepositoryButtonsDetailComponent,
[DetailType.ProgrammingAuxiliaryRepositoryButtons]: ProgrammingAuxiliaryRepositoryButtonsDetailComponent,
};

const detailComponent = detailTypeToComponent[this.detail.type];
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,25 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { ExerciseDetailDirective } from 'app/detail-overview-list/exercise-detail.directive';
import { Component, ViewChild } from '@angular/core';
import type { BooleanDetail, DateDetail, Detail, LinkDetail, NotShownDetail, ShownDetail, TextDetail } from 'app/detail-overview-list/detail.model';
import type {
BooleanDetail,
DateDetail,
Detail,
LinkDetail,
NotShownDetail,
ProgrammingAuxiliaryRepositoryButtonsDetail,
ProgrammingRepositoryButtonsDetail,
ShownDetail,
TextDetail,
} from 'app/detail-overview-list/detail.model';
import { TextDetailComponent } from 'app/detail-overview-list/components/text-detail.component';
import { MockComponent } from 'ng-mocks';
import { DetailType } from 'app/detail-overview-list/detail-overview-list.component';
import { DateDetailComponent } from 'app/detail-overview-list/components/date-detail.component';
import { LinkDetailComponent } from 'app/detail-overview-list/components/link-detail.component';
import { BooleanDetailComponent } from 'app/detail-overview-list/components/boolean-detail.component';
import { ProgrammingRepositoryButtonsDetailComponent } from 'app/detail-overview-list/components/programming-repository-buttons-detail.component';
import { ProgrammingAuxiliaryRepositoryButtonsDetailComponent } from 'app/detail-overview-list/components/programming-auxiliary-repository-buttons-detail.component';

@Component({
template: `<div jhiExerciseDetail [detail]="detail"></div>`,
Expand Down Expand Up @@ -63,6 +75,17 @@ describe('ExerciseDetailDirective', () => {
it('should create BooleanDetail component', () => {
checkComponentForDetailWasCreated({ type: DetailType.Boolean } as BooleanDetail, BooleanDetailComponent);
});

it('should create ProgrammingRepositoryButtonsDetailComponent component', () => {
checkComponentForDetailWasCreated({ type: DetailType.ProgrammingRepositoryButtons } as ProgrammingRepositoryButtonsDetail, ProgrammingRepositoryButtonsDetailComponent);
});

it('should create ProgrammingAuxiliaryRepositoryButtonsDetailComponent component', () => {
checkComponentForDetailWasCreated(
{ type: DetailType.ProgrammingAuxiliaryRepositoryButtons } as ProgrammingAuxiliaryRepositoryButtonsDetail,
ProgrammingAuxiliaryRepositoryButtonsDetailComponent,
);
});
});

function checkComponentForDetailWasNotCreated(detailToBeChecked: NotShownDetail) {
Expand Down
24 changes: 15 additions & 9 deletions supporting_scripts/analysis-of-endpoint-connections/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -13,20 +13,26 @@ repositories {
evaluationDependsOn(':')

dependencies {
implementation rootProject.ext.qDoxVersionReusable
implementation 'com.github.javaparser:javaparser-symbol-solver-core:3.26.0'
implementation 'com.github.javaparser:javaparser-core:3.26.0'
implementation 'com.github.javaparser:javaparser-core-serialization:3.26.0'
implementation 'com.fasterxml.jackson.core:jackson-databind:2.13.0'
implementation rootProject.ext.springBootStarterWeb
implementation 'org.slf4j:slf4j-api:1.7.32'
implementation 'ch.qos.logback:logback-classic:1.2.6'
}

test {
useJUnitPlatform()
task runEndpointParser(type: JavaExec) {
classpath = sourceSets.main.runtimeClasspath
mainClass = 'de.tum.cit.endpointanalysis.EndpointParser'
}

application {
mainClassName = 'de.tum.cit.endpointanalysis.AnalysisOfEndpointConnections'
task runEndpointAnalysis(type: JavaExec) {
classpath = sourceSets.main.runtimeClasspath
mainClass = 'de.tum.cit.endpointanalysis.EndpointAnalyzer'
}

run {
if (project.hasProperty('appArgs')) {
args = project.appArgs.split(' ')
}
task runRestCallAnalysis(type: JavaExec) {
classpath = sourceSets.main.runtimeClasspath
mainClass = 'de.tum.cit.endpointanalysis.RestCallAnalyzer'
}
Loading

0 comments on commit ef4a3e3

Please sign in to comment.