Giter Club home page Giter Club logo

orion's Introduction

Orion IntelliJ Plugin

Open Artemis IDE plugin for the programming exercise integration. This plugin integrates the Artemis interactive learning platform into a JetBrains IDE. It allows you to directly import programming exercises from Artemis and submit your changes to the build servers.

Detailed documentation is integrated into Artemis' documentation.

Current Version:
GitHub release (latest by date)

Example Usage

Manual Installation

Download the release from here and install it as described further down in this document.

Development

Orion Deployment diagram

UI Elements within the Orion tool window are provided

Run/Debug the Plugin

  • Import as gradle project
  • Select the JDK >17 as the project SDK with language level 17
  • Run Gradle task: runIde. This will open a new IntelliJ window with the plugin installed.

Perform Version Upgrade

Upon release of a new major version from JetBrains, the plugin needs updated dependencies to support the latest version. This upgrade can often also be performed with little knowledge of the codebase. The following outlines the necessary steps:

  1. If you do not have write access to the GitHub repository, fork the repository and clone it
  2. Make sure you are able to run the plugin locally as described above
  3. Adapt the versions in the build configuration file build.gradle.kts
    1. At intellij, change the version property to the latest version. This is the IntelliJ version used for "runIde". Also, adapt the version numbers of all versioned plugins at intellijplugins. You can look up each plugin in the IntelliJ marketplace and find the latest compatible version there.
    2. At taskspatchPluginXml, change the sinceBuild and untilBuild property accordingly. A comment explains the format there.
    3. Optionally upgrade the versions of the dependencies at plugins and dependencies, however, this is usually unnecessary.
  4. Run the project locally with runIde or buildPlugin. If compilation errors happen, try to resolve them; on version changes, IntelliJ sometimes deprecates APIs or moves packages. Fixing these errors requires looking into and changing the code. A helpful resource is the documentation of the IntelliJ Platform SDK.
  5. When the plugin runs locally, create a pull request with your changes. Also, consider notifying a maintainer of Orion or Artemis to make sure your pull request gets noticed.

Testing of Pull Requests

  1. Download Release (.zip)

    Download the release file from the pull request's ChecksArtifactsorion

    The artifact is unavailable during building. The full history of artifacts can be retrieved through the Actions tab

  2. Install Release (.zip)

    Install the release file in IntelliJ at SettingsPluginsSettingsInstall Plugin from Disk... → Select the file

    Installation process as gif

Publish a new Release

Before you release any new version, make sure that all version properties in the repository are updated (version in build.gradle.kts) and the changelog contains the relevant version information (also in build.gradle.kts)

Follow the steps outlined here:

  1. Go to the GitHub "Actions" tab on the Orion repository
  2. Select the "Release" workflow
  3. Click on "Run workflow" and input the new version number to release (e.g. 1.5.0 releases and tags version v1.5.0)
  4. An admin now has to review and accept the new release by viewing the created workflow run
  5. After the release is approved, GitHub will automatically build and upload the artifact. It will also create a new draft of the GitHub release
  6. An admin must promote the GitHub draft release to properly tag and release the latest build on GitHub.
    1. Go to the releases page and open the generated latest draft release of Orion
    2. Update the changelog by copy-pasting the information into the description box
    3. Click on 'Publish release' to finish the process

The latest plugin artifact is now available on GitHub and via the JetBrains marketplace.

It might take some time for the latest version to be seen on the marketplace since JetBrains still has to review and approve the changes!

Release Process Implementation

How can I modify the pipeline?

The release pipeline is implemented using GitHub actions. To change anything about the process, you just have to edit the release.yml in the .github/workflows directory.

Where can I find secrets like the authentication token for the JetBrains repository?

Admins of the GitHub repository can modify the build environment under Settings -> Environments -> prod. This includes

adding and updating any secrets that should get injected into the environment during the build process.

Feedback? Questions?

Email: krusche(at)tum(dot)de

orion's People

Contributors

gnut-neygun avatar gunnibusch avatar jpbernius avatar kroko-fant avatar krusche avatar mdk5 avatar strohgelaender avatar ungaralex avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

orion's Issues

Assessment start via Scores page not possible

Describe the bug

Id of the opened submission and the loaded Artemis page do not match, loading of feedback aborted. Make sure to open the correct submission in Orion.

To Reproduce

  1. Go to the ‘Scores’ page for an exercise with manual assessments.
  2. Click on ‘Assess submission’ for a student submission.
  3. Error appears.

Expected behavior

The manual assessment can be started.

Screenshots

Environment

 - IntelliJ 2023.3
 - Artemis 6.7.1

Additional context

Output in IntelliJ

  [REPLACE THIS WITH YOUR INFORMATION]

Add and execute run configuration on submit

Is your feature request related to a problem?

Once code is submitted, Artemis automatically runs tests in the backend and reports the results to the webapp. In Orion we should be able to mimic and better visualize this behavior by also displaying a "running" application while the build job in the backend is running.

Describe the solution you'd like

A call to the submit button should trigger and create a new run configuration in IntelliJ, which will effectively just wait for results from the backend, but display a "running build" to the user, so that the student knows that tests and builds for his code get executed.

Non-Artemis Websites

Describe the bug

The Opening of an Bitbucket Link (through the yellow marked Button Lösungsvorschlag) is

  • a one-way street
  • Soft-Crashes something in the Background

To Reproduce

  1. Go to any P-Type Challange of PgDP
  2. Click on "Lösungsvorschlag"
  3. See error

Expected behavior

The Link schould either not be displayed at all (;D), there should be a way to get back to artemis.
One way to realise this would be is through the Actions-Menu (i.e. a Artemis Tab in the Top with an Option "Go Back to Artemis", that 'Links' back to the Atremis-Main Page)

Screenshots

Bitbucket
Bitbucket_Open

Environment

 - OS: Windows 10
 - IntelliJ 2019.2
 - Browser Chrome
 - Orion-Version 0.2.4

Additional context

Output in IntelliJ

netscape.javascript.JSException: TypeError: undefined is not an object
	at javafx.web/com.sun.webkit.dom.JSObject.fwkMakeException(JSObject.java:157)
	at javafx.web/com.sun.webkit.WebPage.twkExecuteScript(Native Method)
	at javafx.web/com.sun.webkit.WebPage.executeScript(WebPage.java:1511)
	at javafx.web/javafx.scene.web.WebEngine.executeScript(WebEngine.java:973)
	at de.tum.www1.orion.bridge.ArtemisJSBridge.lambda$onOpenedExercise$1(ArtemisJSBridge.java:78)
	at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$9(PlatformImpl.java:418)
	at java.base/java.security.AccessController.doPrivileged(Native Method)
	at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:417)
	at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
	at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
	at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:175)
	at java.base/java.lang.Thread.run(Thread.java:834)

Refactoring of the OrionConnector classes

Currently the initializeHandlers() function of the OrionConnector subclasses use quite a bit of duplicated logic. A refactoring into a more general, type-safe approach would be more desirable.

Orion crashes for Kotlin Exercises

Describe the bug

Orion crashes when attempting to assess Kotlin programming exercises.

To Reproduce

  1. Generate a Kotlin programming exercise
  2. Participate in it
  3. Asses the submission in Orion
  4. Orion crashes

Output in IntelliJ

java.lang.NullPointerException: Parameter specified as non-null is null: method de.tum.www1.orion.exercise.registry.ImportedExercise., parameter language
	at de.tum.www1.orion.exercise.registry.ImportedExercise.(ImportedExercise.kt)
	at de.tum.www1.orion.exercise.registry.OrionGlobalExerciseRegistryService.createImportFileForNewProject(OrionGlobalExerciseRegistryService.java:108)
	at de.tum.www1.orion.exercise.registry.OrionGlobalExerciseRegistryService.registerExercise(OrionGlobalExerciseRegistryService.java:94)
	at de.tum.www1.orion.exercise.OrionExerciseService$assessExercise$1$1.invoke(OrionExerciseService.kt:119)
	at de.tum.www1.orion.exercise.OrionExerciseService$assessExercise$1$1.invoke(OrionExerciseService.kt:34)
	at de.tum.www1.orion.vcs.OrionGitAdapter$clone$1.onSuccess(OrionGitAdapter.kt:110)
	at com.intellij.openapi.progress.impl.CoreProgressManager.finishTask(CoreProgressManager.java:602)
	at com.intellij.openapi.progress.impl.ProgressManagerImpl.finishTask(ProgressManagerImpl.java:153)
	at com.intellij.openapi.progress.impl.CoreProgressManager.lambda$runProcessWithProgressAsync$6(CoreProgressManager.java:525)
	at com.intellij.openapi.application.TransactionGuardImpl.runWithWritingAllowed(TransactionGuardImpl.java:218)
	at com.intellij.openapi.application.TransactionGuardImpl.access$200(TransactionGuardImpl.java:21)
	at com.intellij.openapi.application.TransactionGuardImpl$2.run(TransactionGuardImpl.java:200)
	at com.intellij.openapi.application.impl.ApplicationImpl.runIntendedWriteActionOnCurrentThread(ApplicationImpl.java:781)
	at com.intellij.openapi.application.impl.ApplicationImpl.lambda$invokeLater$4(ApplicationImpl.java:319)
	at com.intellij.openapi.application.impl.FlushQueue.doRun(FlushQueue.java:84)
	at com.intellij.openapi.application.impl.FlushQueue.runNextEvent(FlushQueue.java:133)
	at com.intellij.openapi.application.impl.FlushQueue.flushNow(FlushQueue.java:46)
	at com.intellij.openapi.application.impl.FlushQueue$FlushNow.run(FlushQueue.java:189)
	at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:313)
	at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:776)
	at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:727)
	at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
	at java.base/java.security.AccessController.doPrivileged(Native Method)
	at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
	at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:746)
	at com.intellij.ide.IdeEventQueue.defaultDispatchEvent(IdeEventQueue.java:969)
	at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.java:839)
	at com.intellij.ide.IdeEventQueue.lambda$dispatchEvent$8(IdeEventQueue.java:449)
	at com.intellij.openapi.progress.impl.CoreProgressManager.computePrioritized(CoreProgressManager.java:808)
	at com.intellij.ide.IdeEventQueue.lambda$dispatchEvent$9(IdeEventQueue.java:448)
	at com.intellij.openapi.application.impl.ApplicationImpl.runIntendedWriteActionOnCurrentThread(ApplicationImpl.java:781)
	at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:496)
	at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
	at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
	at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
	at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)

Resume Exercise Button invisible

Describe the bug

The "Resume Exercise" button is not displayed

To Reproduce

  1. Find a Page with the Resume Exercise button
  2. Don't find the button

Expected behavior

The "Resume Exercise" button should be displayed

Screenshots

Artemis:
Anmerkung 2020-01-03 103623

Chrome:
Anmerkung 2020-01-03 103645

Assessment line comment strings are not html escaped

Describe the bug

I am currently a tutor and I realized while assessing a submission that line comment strings are not being escaped while sending to artemis servers, which cause some problems such that following comments will not be sent to artemis anymore or they are interpreted as special chars such as "\n"

To Reproduce

  1. Open an assessment on Orion
  2. Add a line comment for example < Hello \n from "world" >
  3. Try adding a new line comment < test >
  4. You'll see that the first one will be sent to artemis as < Hello
    from> , but the second one will be ignored because of quotation marks.

Expected behavior

Strings should be html escaped before being sent to remote server

Screenshots

Screen Shot 2021-11-17 at 16 14 46
Screen Shot 2021-11-17 at 16 14 53

Environment

 - OS: MacOS
 - IntelliJ 2021.2.23
 - Browser Chrome
 - Version 96.0

Additional context

Output in IntelliJ

  [REPLACE THIS WITH YOUR INFORMATION]

Orion does not recognise new test results after submit

Describe the bug

After using the ‘Submit’ button, the ‘Executing tests on the server’ window opens. After some time the browser with the Artemis UI updates, but the new Run window at the bottom remains stuck.

To Reproduce

  1. Practice exercise (may also be reproducible with regular exercise)
  2. Submit some code.
  3. Browser updates to show result, run window remains.

Expected behavior

The run window closes/shows build results (?) after the server has finished testing the submission.

Screenshots

image

Environment

 - IntelliJ 2024.3

Change Repository Path

The plugin looks good, and i tested that only with one Project. But you create a folder in /%User%/ Dictionary. But i want so save repositores on an other disk in a specific folder.
I need an option to change your create/clone path to my on path. Then I will use your plugin more often.

Migrate to new Chromium based native Browser

JetBrains deprecated JavaFX in all newer IntelliJ versions, thereby also stopping support for the by us used JavaFX Browser WebView. As an alternative, they introduced a wrapper for the Chromium Embedded Framework, which serves an up-to-date and most importantly maintained browser.

The original wrapper for this in Java, JCEF, has been integrated into the JBR, resulting in the JBCef wrapper components. The documentation, as it is sadly often the case for the JetBrains plugin development, is very rudimentary. The most important parts are explained here: https://jetbrains.org/intellij/sdk/docs/reference_guide/jcef.html.
Everything else should be possible to use 1-to-1 as with the existing Java wrappers, only that we now have to use the JBCef wrapper components instead. So, if one were to have a look at the original CEF/JCEF documentation, it should be doable to migrate to the new framework and remove the current (unstable) workaround of relying on the JavaFX plugin.

As an example, a very basic browser can already be created with

class JcefBrowserWebView {
    private lateinit var browser: JBCefBrowser

    fun init() {
        runInEdt {
            browser = JBCefBrowser("https://www.google.com")
        }
    }

    fun getBrowserComponent(): JComponent = browser.component
}

In order to fully integrate Artemis and especially the bridge between browser and native Kotlin/Java IDE components, one would have to have a look at how executing Javascript code (i.e. modifying the ArtemisClientConnector class) and calling methods on Java components (i.e. modifying the OrionConnector class and maybe all subclasses). Afaik, executing JS is possible in an asynchronous was, the bigger problem should be calling Java code from within the browser as this is not as easy as with the old WebView. Here, CefMessageRouter might be one way to solve this problem, but further research is necessary.

Loading exercise broken (propably due to Git/CI change)

Describe the bug

As instructor clicking 'Edit in your IDE' leads to the following Exception:
Cannot invoke "java.net.URL.toString()" because the return value of "de.tum.www1.orion.dto.ProgrammingExerciseParticipation.getRepositoryUrl()" is null

I assume this is caused by the changes to be backend of Artemis.

Environment

 - OS: Windows 11
 - IntelliJ 2023.3.4 ; Build #IU-233.14475.28
 - Version 1.2.9
 - Runtime version: 17.0.10+1-b1087.17 amd64
 - VM: OpenJDK 64-Bit Server VM by JetBrains s.r.o.

Additional context

Output in IntelliJ

java.lang.NullPointerException: Cannot invoke "java.net.URL.toString()" because the return value of "de.tum.www1.orion.dto.ProgrammingExerciseParticipation.getRepositoryUrl()" is null
	at de.tum.www1.orion.exercise.OrionExerciseService$editExercise$1.invoke(OrionExerciseService.kt:95)
	at de.tum.www1.orion.exercise.OrionExerciseService$editExercise$1.invoke(OrionExerciseService.kt:76)
	at de.tum.www1.orion.exercise.OrionExerciseService$createProject$1.invoke(OrionExerciseService.kt:58)
	at de.tum.www1.orion.exercise.OrionExerciseService$createProject$1.invoke(OrionExerciseService.kt:54)
	at com.intellij.openapi.application.ActionsKt.invokeLater$lambda$5(actions.kt:66)
	at com.intellij.openapi.application.TransactionGuardImpl.runWithWritingAllowed(TransactionGuardImpl.java:209)
	at com.intellij.openapi.application.TransactionGuardImpl.access$100(TransactionGuardImpl.java:22)
	at com.intellij.openapi.application.TransactionGuardImpl$1.run(TransactionGuardImpl.java:191)
	at com.intellij.openapi.application.impl.ApplicationImpl.runIntendedWriteActionOnCurrentThread(ApplicationImpl.java:843)
	at com.intellij.openapi.application.impl.ApplicationImpl$4.run(ApplicationImpl.java:463)
	at com.intellij.openapi.application.impl.RwLockHolder.runWithEnabledImplicitRead(RwLockHolder.kt:75)
	at com.intellij.openapi.application.impl.RwLockHolder.runWithImplicitRead(RwLockHolder.kt:67)
	at com.intellij.openapi.application.impl.ApplicationImpl.runWithImplicitRead(ApplicationImpl.java:1436)
	at com.intellij.openapi.application.impl.FlushQueue.doRun(FlushQueue.java:82)
	at com.intellij.openapi.application.impl.FlushQueue.runNextEvent(FlushQueue.java:124)
	at com.intellij.openapi.application.impl.FlushQueue.flushNow(FlushQueue.java:44)
	at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:318)
	at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:792)
	at java.desktop/java.awt.EventQueue$3.run(EventQueue.java:739)
	at java.desktop/java.awt.EventQueue$3.run(EventQueue.java:733)
	at java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
	at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86)
	at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:761)
	at com.intellij.ide.IdeEventQueue.defaultDispatchEvent(IdeEventQueue.kt:695)
	at com.intellij.ide.IdeEventQueue._dispatchEvent$lambda$12(IdeEventQueue.kt:589)
	at com.intellij.openapi.application.impl.RwLockHolder.runWithoutImplicitRead(RwLockHolder.kt:44)
	at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.kt:589)
	at com.intellij.ide.IdeEventQueue.access$_dispatchEvent(IdeEventQueue.kt:72)
	at com.intellij.ide.IdeEventQueue$dispatchEvent$processEventRunnable$1$1$1.compute(IdeEventQueue.kt:355)
	at com.intellij.ide.IdeEventQueue$dispatchEvent$processEventRunnable$1$1$1.compute(IdeEventQueue.kt:354)
	at com.intellij.openapi.progress.impl.CoreProgressManager.computePrioritized(CoreProgressManager.java:793)
	at com.intellij.ide.IdeEventQueue$dispatchEvent$processEventRunnable$1$1.invoke(IdeEventQueue.kt:354)
	at com.intellij.ide.IdeEventQueue$dispatchEvent$processEventRunnable$1$1.invoke(IdeEventQueue.kt:349)
	at com.intellij.ide.IdeEventQueueKt.performActivity$lambda$1(IdeEventQueue.kt:1014)
	at com.intellij.openapi.application.TransactionGuardImpl.performActivity(TransactionGuardImpl.java:106)
	at com.intellij.ide.IdeEventQueueKt.performActivity(IdeEventQueue.kt:1014)
	at com.intellij.ide.IdeEventQueue.dispatchEvent$lambda$7(IdeEventQueue.kt:349)
	at com.intellij.openapi.application.impl.ApplicationImpl.runIntendedWriteActionOnCurrentThread(ApplicationImpl.java:848)
	at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.kt:391)
	at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:207)
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128)
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117)
	at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113)
	at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105)
	at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:92)

Back button in the webview sometimes not working any more

Describe the bug

The back button in the webview stops working after some time (no clear pattern so far).

To Reproduce

Cannot reproduce so far. Seems to be happening spontaneously

Expected behavior

You should be able to navigate to the previous page if there is a visible back button in the Artemis UI

Environment

 - OS: macOS Mojave 10.14.6
 - Version: 0.2.4

Exam Mode Support

Is your feature request related to a problem?

Exams can’t be done with Orion.

Describe the solution you'd like

Have the same features like submit, open in IntelliJ etc. for exams.

Describe alternatives you've considered

Additional context

Starting assessment via assessment dashboard not possible

Describe the bug

I cannot start the manual assessment via the assessment dashboard.

To Reproduce

  1. Go to the assessment dashboard for an exercise.
  2. Click on ‘Assess exercise via Orion’.
  3. Error as in ‘Output in IntelliJ’ below appears. No dialogue for the ImportPathChooser appeared.

Expected behavior

The assessment can be started.

Screenshots

Environment

 - OS: [e.g. iOS]
 - IntelliJ 2023.3
 - Artemis 6.7.1

Additional context

Output in IntelliJ

```
java.lang.NullPointerException
	at de.tum.www1.orion.settings.OrionBundle.message(OrionBundle.kt:22)
	at de.tum.www1.orion.util.UtilsKt.translate(Utils.kt:54)
	at de.tum.www1.orion.ui.util.ImportPathChooser.(ImportPathChooser.kt:36)
	at de.tum.www1.orion.exercise.OrionExerciseService$createProject$1.invoke(OrionExerciseService.kt:55)
	at de.tum.www1.orion.exercise.OrionExerciseService$createProject$1.invoke(OrionExerciseService.kt:54)
	at com.intellij.openapi.application.ActionsKt.invokeLater$lambda$5(actions.kt:66)
	at com.intellij.openapi.application.TransactionGuardImpl.runWithWritingAllowed(TransactionGuardImpl.java:209)
	at com.intellij.openapi.application.TransactionGuardImpl.access$100(TransactionGuardImpl.java:22)
	at com.intellij.openapi.application.TransactionGuardImpl$1.run(TransactionGuardImpl.java:191)
	at com.intellij.openapi.application.impl.ApplicationImpl.runIntendedWriteActionOnCurrentThread(ApplicationImpl.java:843)
	at com.intellij.openapi.application.impl.ApplicationImpl$4.run(ApplicationImpl.java:463)
	at com.intellij.openapi.application.impl.RwLockHolder.runWithEnabledImplicitRead(RwLockHolder.kt:75)
	at com.intellij.openapi.application.impl.RwLockHolder.runWithImplicitRead(RwLockHolder.kt:67)
	at com.intellij.openapi.application.impl.ApplicationImpl.runWithImplicitRead(ApplicationImpl.java:1430)
	at com.intellij.openapi.application.impl.FlushQueue.doRun(FlushQueue.java:82)
	at com.intellij.openapi.application.impl.FlushQueue.runNextEvent(FlushQueue.java:124)
	at com.intellij.openapi.application.impl.FlushQueue.flushNow(FlushQueue.java:44)
	at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:318)
	at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:792)
	at java.desktop/java.awt.EventQueue$3.run(EventQueue.java:739)
	at java.desktop/java.awt.EventQueue$3.run(EventQueue.java:733)
	at java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
	at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86)
	at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:761)
	at com.intellij.ide.IdeEventQueue.defaultDispatchEvent(IdeEventQueue.kt:695)
	at com.intellij.ide.IdeEventQueue._dispatchEvent$lambda$12(IdeEventQueue.kt:589)
	at com.intellij.openapi.application.impl.RwLockHolder.runWithoutImplicitRead(RwLockHolder.kt:44)
	at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.kt:589)
	at com.intellij.ide.IdeEventQueue.access$_dispatchEvent(IdeEventQueue.kt:72)
	at com.intellij.ide.IdeEventQueue$dispatchEvent$processEventRunnable$1$1$1.compute(IdeEventQueue.kt:355)
	at com.intellij.ide.IdeEventQueue$dispatchEvent$processEventRunnable$1$1$1.compute(IdeEventQueue.kt:354)
	at com.intellij.openapi.progress.impl.CoreProgressManager.computePrioritized(CoreProgressManager.java:793)
	at com.intellij.ide.IdeEventQueue$dispatchEvent$processEventRunnable$1$1.invoke(IdeEventQueue.kt:354)
	at com.intellij.ide.IdeEventQueue$dispatchEvent$processEventRunnable$1$1.invoke(IdeEventQueue.kt:349)
	at com.intellij.ide.IdeEventQueueKt.performActivity$lambda$1(IdeEventQueue.kt:1014)
	at com.intellij.openapi.application.TransactionGuardImpl.performActivity(TransactionGuardImpl.java:106)
	at com.intellij.ide.IdeEventQueueKt.performActivity(IdeEventQueue.kt:1014)
	at com.intellij.ide.IdeEventQueue.dispatchEvent$lambda$7(IdeEventQueue.kt:349)
	at com.intellij.openapi.application.impl.ApplicationImpl.runIntendedWriteActionOnCurrentThread(ApplicationImpl.java:848)
	at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.kt:391)
	at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:207)
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128)
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117)
	at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113)
	at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105)
	at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:92)
```

Plugin crashes on saved settings if tool windows is closed

Describe the bug

When changing any setting and saving them, the plugin crashes, if the tool window is not open.

Expected behavior

The settings should be saved and unrelated to the state of the tool window.

Environment

Concerns all environments

Output in IntelliJ

java.lang.nullPointerException
stacktrace
at java.base/java.util.Objects.requireNonNull(Objects.java:221)
at de.tum.www1.orion.ui.browser.BrowserWebView.lambda$init$0(BrowserWebView.java:43)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$9(PlatformImpl.java:418)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:417)
at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:175)
at java.base/java.lang.Thread.run(Thread.java:834)

Not compatible with IJ 2019.3

Describe the bug

I cannot install the plugin bc it is not compatible with IJ 2019.3

Expected behavior

Should Install properly

Environment

 - OS: macOS 10.15.1
 - IntelliJ [e.g. 2019.3]
 - Browser Safari
 - Version 13.0.3

Output in IntelliJ

  Plugin 'Artemis Programming Exercise Integration' is incompatible with this installation

Add support for auxiliary repositories

Is your feature request related to a problem?

Since not long ago, Artemis now supports auxiliary repositories for programming exercises. If I use the plugin to clone an exercise, these repositories don't get added.

Describe the solution you'd like

I expect the auxiliary repositories to be added as all the other ones as well.

Open in IntelliJ and Submit show the wrong Logo/text after Multi-IDE PR

Describe the bug

In other IDEs apart from IntelliJ the icon used in Orion still is IntelliJ and it shows IntelliJ as a name

To Reproduce

  1. Install Orion in any Jetbrains IDE apart from IntelliJ
  2. Open a programming excercise in Orion
  3. It should show "Open in IntelliJ"
  4. Open the excercise
  5. It should show "Submit" with the wrong icon

Expected behavior

Screenshots

grafik

Environment

 - OS: any
 - All Jetbrains IDEs apart from IntelliJ

Additional context

Only one web view instance supported

Describe the bug

If more than one projects are open and one tries to open the Artemis window in both of them, only one view will actually initialize, the other stays empty.

Expected behavior

Users should be able to open as many Artemis tool windows as they want.

Orion language should be the same as the Artemis language

Describe the bug

I am on a machine in German but IntelliJ is completely in English. Therefore Orion is in German which is very confusing.

To Reproduce

Open IntelliJ with Orion on a German machine.

Expected behavior

The language is either the same as IntelliJ (English) or Artemis (whatever gets loaded).
If possible a language change in the Orion Browser should trigger a language change but if that's too difficult or not possible, it's not a big issue.

Orion does not support Access to pages outside of Artemis

Describe the bug

We have extended ArTEMiS at https://artemis.codeability.uibk.ac.at/ to be able to login with EduID, which is a Sibboleth-based Login-Mechanism.

When using ORION and logging in, we get the (German) error message: Orion unterstütz keine Zugriff auf Seiten außerhab von Artemis.

image

To Reproduce

  1. Go to https://artemis.codeability.uibk.ac.at/
  2. Activate "Accept terms' Click on 'Sign in with your institution'
  3. Select "Innsbruck" on the next page
  4. See error

Expected behavior

Login with EduId, then you will get automatically redirected back to ArTEMiS and authenticated.

Screenshots

see above

Environment

not relevant.

Additional context

Instance of ArTEMiS für the Austrian CodeAbility Project

Output in IntelliJ

See Screenshot.

Support Intellij 2021.3

Is your feature request related to a problem?

Intellij recently got the 2021.3 update and when starting it, I get this error message:
Plugin error: Plugin 'Orion - Artemis Programming Exercise Integration' (version '1.2.0') is not compatible with the current version of the IDE, because it requires build 212.* or older but the current build is IU-213.5744.223

Describe the solution you'd like

Please add compatibility for Intellij 2021.3 🙂

Create template and github action for building pull-requests

Currently testers need to either download the repository and build the plugin themselves or the creator needs to manually attatch an up-to-date build artifact to the pr. An automated GitHub action would make both creating a pr and keeping track of the latest build artifact a lot easier.

Additionally, a pr-template similar to Artemis's template explaining e.g. how to install the artifact would further speed up the process.

Allow the user to select wether or not they would like to be asked for a commit message on every submitt.

Is your feature request related to a problem?

I think it would be nice to be able to give proper commit messages for better overview of past changes. (might also help the tutors who have to correct the programms?)

Describe the solution you'd like

An option to get asked for a commit message every time the submit button is clicked.
(Preferably, this feature would be optional to use as users who don't care about commit messages don't want to be asked everytime they commit)

Notifications are doubled

Describe the bug

Most notifications (see screenshot) are shown twice in Orion

To Reproduce

  1. Locate an exercise not yet started
  2. Start it
  3. See 2 notifications informing the repository has been set up

Expected behavior

Only one notification should be shown

Screenshots

Environment

 - OS: Win 8
 - IntelliJ 2021.1
 - Version Orion 1.1.2, Artemis 4.12.4

Additional context

Some notifcations (certain errors) are not doubled

Das Repository wird nicht geklont.

Describe the bug

Das Repository wird nicht geklont.

To Reproduce

  1. In Artemis einloggen.
  2. Aufgabe auswählen.
  3. "Open in IntelliJ" auswählen.
  4. Speicherort wählen.
  5. "OK" Klicken.

Expected behavior

Repository wird in das gewählte Verzeichnis geklont und geöffnet.

Behavior

Verzeichnisse werden erstellt aber Repository wird weder geklont noch geöffnet.

Environment

 - OS: [e.g. Windows (64bit)]
 - IntelliJ [e.g. 2020.2.3x64]
 - Browser [e.g. Firefox]

Output in IntelliJ

  Kein outpot.

All buttons load if one button loads

To Reproduce

  1. Lock one submission
  2. Go in the assessment dashboard
  3. Click on the button to start a new assessment on a second exercise
  4. Both buttons load instead of only the clicked one

Expected behaviour

Only the clicked one load, the others are only deactivated

Screenshots

Allow users to navigate back to Artemis from external webcontent

This was the result of a discussion we had way back, where we decided to not let users break out of the "Artemis space" since we can't really guarantee what will happen as only the usage with the Artemis website is tested.
Let's also say a teaching assistant links a code example and the student clicks on it. He is now outside of our domain and has no obvious way of going back, apart from re-opening the IDE/reloading in the settings/left-click context menu.

Now, for this specific case, we absolutely should allow users to use external login mechanisms. What I wanted to have and would be my favorite solution, is to remove the pop-up completely and then have a button above the browser (so an IDE-native button on top off the tool window next to the default ones), which always brings you back to the Artemis homepage if you have any problems whatsoever. An alternative would be to have a prominent button overlayed, having the same functionality, as soon as we detect a user leaving the domain.
No matter what, removing the current blocking of external domains should be the first step @nutatuna .

Originally posted by @ungaralex in #30 (comment)

Pushing empty commit to repository both succeeds and fails

Describe the bug

In the student view I used the ‘Submit’ button to create a commit and push it.

To Reproduce

Setting in my case:

  • Student repository
  • Create a new empty directory
  • Use the ‘Submit’ button
  • Check in VCS: empty commit was indeed created by Orion

When the commit is non-empty, the error message is not shown.

Expected behavior

Only the success message is shown since the operation seemed to be successful.

Screenshots

image

Environment

 - IntelliJ 2023.3

Part of Artemis is soehow not displayed at all, I dont know if that is intentional

Describe the bug

To Reproduce

  1. Go to a wide Excercise, like PgDP's Woche 06 P01

Expected behavior

the Right Part of the Screen should not be wasted that way, but I dont know if that is a byproduct of Artemis' "by desighn"

Screenshots

Unbenannt
Expanded

Environment

 - OS: Microsoft Windows [Version 10.0.18363.476]
 - IntelliJ 2019.2
 - Browser chrome

Show build and test output in existing test runner view

Is your feature request related to a problem?

As of now, Orion only displays test results and build logs in the integrated web view. This is counter-intuitive since we are working inside a proper IDE here.

Describe the solution you'd like

Build and test outputs should be forwarded to Orion once a student submitted hist code. The existing OpenAPI views should be re-used for displaying the test results. In the case of a build failure, the output in the console should linke to the related file and line in the code.

TODOs:

  • Add interfaces allowing the webapp to forward build and test results
  • Show each test result in a separate test node using the existing test result GUI
  • Link failed builds to the appropriate lines in the source code

Submit Button is not showing

Describe the bug

After starting an exercise, I get the "In IntelliJ öffnen" button, which successfully opens the project, but after that I don't get a "Submit" button, it stays as the "In IntelliJ öffnen" button.

To Reproduce

  1. Open IntelliJ
  2. Login to your Artemis Account
  3. Select exercise and start it
  4. Open exercise in IntelliJ
  5. Work on exercise
  6. See no "Submit" button

Expected behavior

Instead of the "In IntelliJ öffnen" button it should show the "Submit" button

Environment

 - Windows 10 Pro
 - IntelliJ 2021.2.3
 - Orion 1.2.0

Additional context

A student encountered the problem first, so I tested it on my machine

IDE Error directly after Installing the .zip-File from disk

Describe the bug

To Reproduce

  1. Zip laden
  2. IntelliJ öffnen
  3. Settings aufrufen
  4. Pluginstab
  5. aufs zahnrad und Plugins von disk hinzufügen
  6. See error

Expected behavior

  1. Installing went as expected
  2. Plugin should launch

Screenshots

Unbenannt

Environment

 - OS: Windows 10
 - IntelliJ 2019.2
 - Browser Chrome
 - Orion-Version 0.2.4

Additional context

Fresh istall from the zip file under the "release"-tab

Output in IntelliJ

  [java.lang.NoClassDefFoundError: javafx/embed/swing/JFXPanel
	at de.tum.www1.orion.ui.browser.Browser.init(Browser.java:22)
	at de.tum.www1.orion.ui.browser.BrowserFactory.createToolWindowContent(BrowserFactory.java:18)
	at com.intellij.openapi.wm.impl.ToolWindowImpl.ensureContentInitialized(ToolWindowImpl.java:533)
	at com.intellij.openapi.wm.impl.ToolWindowImpl.getContentManager(ToolWindowImpl.java:356)
	at com.intellij.openapi.wm.impl.content.ContentTabLabel.contentManager(ContentTabLabel.java:356)
	at com.intellij.openapi.wm.impl.content.ContentTabLabel.isSelected(ContentTabLabel.java:339)
	at com.intellij.openapi.wm.impl.content.ContentTabLabel._getGraphics(ContentTabLabel.java:348)
	at com.intellij.openapi.wm.impl.content.BaseLabel.paintComponent(BaseLabel.java:78)
	at com.intellij.openapi.wm.impl.content.ContentTabLabel.paintComponent(ContentTabLabel.java:334)
	at java.desktop/javax.swing.JComponent.paint(JComponent.java:1074)
	at java.desktop/javax.swing.JComponent.paintChildren(JComponent.java:907)
	at com.intellij.openapi.wm.impl.content.ToolWindowContentUi.paintChildren(ToolWindowContentUi.java:257)
	at java.desktop/javax.swing.JComponent.paint(JComponent.java:1083)
	at java.desktop/javax.swing.JComponent.paintChildren(JComponent.java:907)
	at java.desktop/javax.swing.JComponent.paint(JComponent.java:1083)
	at java.desktop/javax.swing.JComponent.paintChildren(JComponent.java:907)
	at com.intellij.openapi.wm.impl.ToolWindowHeader.paintChildren(ToolWindowHeader.java:345)
	at java.desktop/javax.swing.JComponent.paint(JComponent.java:1083)
	at java.desktop/javax.swing.JComponent.paintChildren(JComponent.java:907)
	at java.desktop/javax.swing.JComponent.paint(JComponent.java:1083)
	at java.desktop/javax.swing.JComponent.paintChildren(JComponent.java:907)
	at java.desktop/javax.swing.JComponent.paint(JComponent.java:1083)
	at java.desktop/javax.swing.JComponent.paintChildren(JComponent.java:907)
	at java.desktop/javax.swing.JComponent.paint(JComponent.java:1083)
	at java.desktop/javax.swing.JComponent.paintChildren(JComponent.java:907)
	at java.desktop/javax.swing.JComponent.paint(JComponent.java:1083)
	at java.desktop/javax.swing.JComponent.paintChildren(JComponent.java:907)
	at java.desktop/javax.swing.JComponent.paint(JComponent.java:1083)
	at java.desktop/javax.swing.JLayeredPane.paint(JLayeredPane.java:590)
	at java.desktop/javax.swing.JComponent.paintChildren(JComponent.java:907)
	at java.desktop/javax.swing.JComponent.paint(JComponent.java:1083)
	at java.desktop/javax.swing.JLayeredPane.paint(JLayeredPane.java:590)
	at java.desktop/javax.swing.JComponent.paintChildren(JComponent.java:907)
	at java.desktop/javax.swing.JComponent.paint(JComponent.java:1083)
	at java.desktop/javax.swing.JComponent.paintChildren(JComponent.java:907)
	at java.desktop/javax.swing.JComponent.paint(JComponent.java:1083)
	at java.desktop/javax.swing.JLayeredPane.paint(JLayeredPane.java:590)
	at java.desktop/javax.swing.JComponent.paintToOffscreen(JComponent.java:5255)
	at java.desktop/javax.swing.RepaintManager$PaintManager.paintDoubleBufferedImpl(RepaintManager.java:1643)
	at java.desktop/javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(RepaintManager.java:1618)
	at java.desktop/javax.swing.RepaintManager$PaintManager.paint(RepaintManager.java:1556)
	at java.desktop/javax.swing.BufferStrategyPaintManager.paint(BufferStrategyPaintManager.java:262)
	at java.desktop/javax.swing.RepaintManager.paint(RepaintManager.java:1323)
	at java.desktop/javax.swing.JComponent._paintImmediately(JComponent.java:5203)
	at java.desktop/javax.swing.JComponent.paintImmediately(JComponent.java:5013)
	at java.desktop/javax.swing.RepaintManager$4.run(RepaintManager.java:865)
	at java.desktop/javax.swing.RepaintManager$4.run(RepaintManager.java:848)
	at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
	at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
	at java.desktop/javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:848)
	at java.desktop/javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:823)
	at java.desktop/javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:772)
	at java.desktop/javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1884)
	at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:313)
	at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:770)
	at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
	at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:715)
	at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
	at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
	at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:740)
	at com.intellij.ide.IdeEventQueue.defaultDispatchEvent(IdeEventQueue.java:878)
	at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.java:827)
	at com.intellij.ide.IdeEventQueue.lambda$dispatchEvent$8(IdeEventQueue.java:466)
	at com.intellij.openapi.progress.impl.CoreProgressManager.computePrioritized(CoreProgressManager.java:704)
	at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:465)
	at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
	at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
	at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
	at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
Caused by: java.lang.ClassNotFoundException: javafx.embed.swing.JFXPanel PluginClassLoader[de.tum.www1.orion, 0.2.4] com.intellij.ide.plugins.cl.PluginClassLoader@9d5245c
	at com.intellij.ide.plugins.cl.PluginClassLoader.loadClass(PluginClassLoader.java:75)
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
	... 71 more]

Return button from student exercise view redirects to the current page

Describe the bug

The return button from the student exercise view redirects to the current page.

To Reproduce

  1. Open an exercise from the student perspective
  2. Click on Open in IntelliJ
  3. Click on the return button in the upper left corner
  4. See that you are redirected to the current page

Expected behavior

The user should be redirected to the course exercise student view.

Screenshots

Orion-ReturnButtonDoesNotWork

Environment

 - OS: Windows 10
 - IntelliJ 2021.1.1 ultimate
 - Browser Chrome
 - Orion Version 1.1.2

Crash on opening settings after first installation without opening the browser first

Description

If a user opens the Orion settings after installing the plugin for the first time before he actually opens the web view tool window, the settings (for Orion) crash.
This is caused by the way we fetch the default user agent displayed in the settings. The JavaFx application thread has not been properly initialized before opening the WebView, so we might want to think about starting the JavaFx platform even before that.

Can't load Settings properties after a while

Describe the bug

When using Orion, after a while, Orion can't fetch its settings. Also Settings in the Tools panel, can't load.

To Reproduce

  1. Open IDE with Orion
  2. wait some time. Like an hour or more.
  3. Try importing or submitting a project
  4. get error

Expected behavior

Screenshots

Bildschirmfoto 2023-12-11 um 00 09 52

Environment

 - OS: MacOS 17.1
 - IntelliJ 2023.2.4 & 2023.3
 - Browser [e.g. chrome, safari]
 - Version [e.g. 22]

Additional context

Error Stack trace

kotlin.UninitializedPropertyAccessException: lateinit property artemisUrlField has not been initialized
	at de.tum.www1.orion.ui.settings.OrionPluginSettings.getSettings(OrionPluginSettings.kt:39)
	at de.tum.www1.orion.ui.settings.OrionPluginSettings.isModified(OrionPluginSettings.kt:48)
	at com.intellij.openapi.options.ex.ConfigurableWrapper.isModified(ConfigurableWrapper.java:186)
	at com.intellij.openapi.options.newEditor.SettingsEditor.checkModifiedInternal(SettingsEditor.java:522)
	at com.intellij.openapi.options.newEditor.SettingsEditor.checkModifiedForItem(SettingsEditor.java:516)
	at com.intellij.openapi.options.newEditor.SettingsEditor.checkModified(SettingsEditor.java:504)
	at com.intellij.openapi.options.newEditor.SettingsEditor$4.onSelected(SettingsEditor.java:154)
	at com.intellij.openapi.options.newEditor.OptionsEditorContext$1.process(OptionsEditorContext.java:43)
	at com.intellij.openapi.options.newEditor.OptionsEditorContext.lambda$notify$0(OptionsEditorContext.java:100)
	at com.intellij.util.containers.ContainerUtil.mapNotNull(ContainerUtil.java:2077)
	at com.intellij.openapi.options.newEditor.OptionsEditorContext.notify(OptionsEditorContext.java:100)
	at com.intellij.openapi.options.newEditor.OptionsEditorContext.fireSelected(OptionsEditorContext.java:40)
	at com.intellij.openapi.options.newEditor.SettingsTreeView.fireSelected(SettingsTreeView.java:465)
	at com.intellij.openapi.options.newEditor.SettingsTreeView.lambda$new$0(SettingsTreeView.java:196)
	at java.desktop/javax.swing.tree.DefaultTreeSelectionModel.fireValueChanged(DefaultTreeSelectionModel.java:650)
	at com.intellij.ui.treeStructure.Tree$MySelectionModel.fireValueChanged(Tree.java:667)
	at java.desktop/javax.swing.tree.DefaultTreeSelectionModel.notifyPathChange(DefaultTreeSelectionModel.java:1120)
	at java.desktop/javax.swing.tree.DefaultTreeSelectionModel.removeSelectionPaths(DefaultTreeSelectionModel.java:514)
	at java.desktop/javax.swing.tree.DefaultTreeSelectionModel.removeSelectionPath(DefaultTreeSelectionModel.java:445)
	at java.desktop/javax.swing.JTree.removeSelectionPath(JTree.java:2705)
	at java.desktop/javax.swing.plaf.basic.BasicTreeUI.selectPathForEvent(BasicTreeUI.java:2754)
	at java.desktop/javax.swing.plaf.basic.BasicTreeUI$Handler.handleSelection(BasicTreeUI.java:4099)
	at java.desktop/javax.swing.plaf.basic.BasicTreeUI$Handler.mousePressed(BasicTreeUI.java:4038)
	at com.intellij.util.ui.MouseEventAdapter.mousePressed(MouseEventAdapter.java:30)
	at java.desktop/java.awt.AWTEventMulticaster.mousePressed(AWTEventMulticaster.java:287)
	at java.desktop/java.awt.AWTEventMulticaster.mousePressed(AWTEventMulticaster.java:287)
	at java.desktop/java.awt.AWTEventMulticaster.mousePressed(AWTEventMulticaster.java:287)
	at java.desktop/java.awt.AWTEventMulticaster.mousePressed(AWTEventMulticaster.java:287)
	at java.desktop/java.awt.AWTEventMulticaster.mousePressed(AWTEventMulticaster.java:287)
	at java.desktop/java.awt.AWTEventMulticaster.mousePressed(AWTEventMulticaster.java:287)
	at java.desktop/java.awt.Component.processMouseEvent(Component.java:6654)
	at java.desktop/javax.swing.JComponent.processMouseEvent(JComponent.java:3385)
	at com.intellij.ui.treeStructure.Tree.processMouseEvent(Tree.java:434)
	at com.intellij.openapi.options.newEditor.SettingsTreeView$MyTree.processMouseEvent(SettingsTreeView.java:873)
	at java.desktop/java.awt.Component.processEvent(Component.java:6422)
	at java.desktop/java.awt.Container.processEvent(Container.java:2266)
	at java.desktop/java.awt.Component.dispatchEventImpl(Component.java:5027)
	at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2324)
	at java.desktop/java.awt.Component.dispatchEvent(Component.java:4855)
	at java.desktop/java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4969)
	at java.desktop/java.awt.LightweightDispatcher.processMouseEvent(Container.java:4580)
	at java.desktop/java.awt.LightweightDispatcher.dispatchEvent(Container.java:4524)
	at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2310)
	at java.desktop/java.awt.Window.dispatchEventImpl(Window.java:2809)
	at java.desktop/java.awt.Component.dispatchEvent(Component.java:4855)
	at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:794)
	at java.desktop/java.awt.EventQueue$3.run(EventQueue.java:739)
	at java.desktop/java.awt.EventQueue$3.run(EventQueue.java:733)
	at java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
	at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86)
	at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:97)
	at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:766)
	at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:764)
	at java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
	at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86)
	at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:763)
	at com.intellij.ide.IdeEventQueue.defaultDispatchEvent(IdeEventQueue.kt:695)
	at com.intellij.ide.IdeEventQueue.dispatchMouseEvent(IdeEventQueue.kt:635)
	at com.intellij.ide.IdeEventQueue._dispatchEvent$lambda$10(IdeEventQueue.kt:580)
	at com.intellij.openapi.application.impl.RwLockHolder.runWithEnabledImplicitRead(RwLockHolder.kt:75)
	at com.intellij.openapi.application.impl.RwLockHolder.runWithImplicitRead(RwLockHolder.kt:67)
	at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.kt:580)
	at com.intellij.ide.IdeEventQueue.access$_dispatchEvent(IdeEventQueue.kt:72)
	at com.intellij.ide.IdeEventQueue$dispatchEvent$processEventRunnable$1$1$1.compute(IdeEventQueue.kt:355)
	at com.intellij.ide.IdeEventQueue$dispatchEvent$processEventRunnable$1$1$1.compute(IdeEventQueue.kt:354)
	at com.intellij.openapi.progress.impl.CoreProgressManager.computePrioritized(CoreProgressManager.java:793)
	at com.intellij.ide.IdeEventQueue$dispatchEvent$processEventRunnable$1$1.invoke(IdeEventQueue.kt:354)
	at com.intellij.ide.IdeEventQueue$dispatchEvent$processEventRunnable$1$1.invoke(IdeEventQueue.kt:349)
	at com.intellij.ide.IdeEventQueueKt.performActivity$lambda$1(IdeEventQueue.kt:1014)
	at com.intellij.openapi.application.TransactionGuardImpl.performActivity(TransactionGuardImpl.java:106)
	at com.intellij.ide.IdeEventQueueKt.performActivity(IdeEventQueue.kt:1014)
	at com.intellij.ide.IdeEventQueue.dispatchEvent$lambda$7(IdeEventQueue.kt:349)
	at com.intellij.openapi.application.impl.ApplicationImpl.runIntendedWriteActionOnCurrentThread(ApplicationImpl.java:843)
	at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.kt:391)
	at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:207)
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128)
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:121)
	at java.desktop/java.awt.WaitDispatchSupport$2.run(WaitDispatchSupport.java:191)
	at java.desktop/java.awt.WaitDispatchSupport$4.run(WaitDispatchSupport.java:236)
	at java.desktop/java.awt.WaitDispatchSupport$4.run(WaitDispatchSupport.java:234)
	at java.base/java.security.AccessController.doPrivileged(AccessController.java:318)
	at java.desktop/java.awt.WaitDispatchSupport.enter(WaitDispatchSupport.java:234)
	at java.desktop/java.awt.Dialog.lambda$show$2(Dialog.java:1081)
	at java.desktop/sun.awt.SunToolkit.performOnMainThreadIfNeeded(SunToolkit.java:2170)
	at java.desktop/java.awt.Dialog.show(Dialog.java:1041)
	at com.intellij.openapi.ui.impl.DialogWrapperPeerImpl$MyDialog.show(DialogWrapperPeerImpl.java:875)
	at com.intellij.openapi.ui.impl.DialogWrapperPeerImpl.show(DialogWrapperPeerImpl.java:474)
	at com.intellij.openapi.ui.DialogWrapper.doShow(DialogWrapper.java:1733)
	at com.intellij.openapi.ui.DialogWrapper.show(DialogWrapper.java:1682)
	at com.intellij.ide.actions.ShowSettingsUtilImpl.showSettingsDialog(ShowSettingsUtilImpl.kt:104)
	at com.intellij.ide.actions.ShowSettingsAction.perform(ShowSettingsAction.java:61)
	at com.intellij.ui.mac.MacOSApplicationProviderKt$initMacApplication$2$1.invoke(MacOSApplicationProvider.kt:64)
	at com.intellij.ui.mac.MacOSApplicationProviderKt$initMacApplication$2$1.invoke(MacOSApplicationProvider.kt:63)
	at com.intellij.ui.mac.MacOSApplicationProviderKt$submit$2.invokeSuspend(MacOSApplicationProvider.kt:164)
	at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
	at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:108)
	at com.intellij.openapi.application.impl.DispatchedRunnable.run(DispatchedRunnable.kt:43)
	at com.intellij.openapi.application.TransactionGuardImpl.runWithWritingAllowed(TransactionGuardImpl.java:209)
	at com.intellij.openapi.application.TransactionGuardImpl.access$100(TransactionGuardImpl.java:22)
	at com.intellij.openapi.application.TransactionGuardImpl$1.run(TransactionGuardImpl.java:191)
	at com.intellij.openapi.application.impl.ApplicationImpl.runIntendedWriteActionOnCurrentThread(ApplicationImpl.java:843)
	at com.intellij.openapi.application.impl.ApplicationImpl$4.run(ApplicationImpl.java:463)
	at com.intellij.openapi.application.impl.RwLockHolder.runWithEnabledImplicitRead(RwLockHolder.kt:75)
	at com.intellij.openapi.application.impl.RwLockHolder.runWithImplicitRead(RwLockHolder.kt:67)
	at com.intellij.openapi.application.impl.ApplicationImpl.runWithImplicitRead(ApplicationImpl.java:1430)
	at com.intellij.openapi.application.impl.FlushQueue.doRun(FlushQueue.java:82)
	at com.intellij.openapi.application.impl.FlushQueue.runNextEvent(FlushQueue.java:124)
	at com.intellij.openapi.application.impl.FlushQueue.flushNow(FlushQueue.java:44)
	at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:318)
	at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:792)
	at java.desktop/java.awt.EventQueue$3.run(EventQueue.java:739)
	at java.desktop/java.awt.EventQueue$3.run(EventQueue.java:733)
	at java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
	at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86)
	at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:761)
	at com.intellij.ide.IdeEventQueue.defaultDispatchEvent(IdeEventQueue.kt:695)
	at com.intellij.ide.IdeEventQueue._dispatchEvent$lambda$12(IdeEventQueue.kt:589)
	at com.intellij.openapi.application.impl.RwLockHolder.runWithoutImplicitRead(RwLockHolder.kt:44)
	at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.kt:589)
	at com.intellij.ide.IdeEventQueue.access$_dispatchEvent(IdeEventQueue.kt:72)
	at com.intellij.ide.IdeEventQueue$dispatchEvent$processEventRunnable$1$1$1.compute(IdeEventQueue.kt:355)
	at com.intellij.ide.IdeEventQueue$dispatchEvent$processEventRunnable$1$1$1.compute(IdeEventQueue.kt:354)
	at com.intellij.openapi.progress.impl.CoreProgressManager.computePrioritized(CoreProgressManager.java:793)
	at com.intellij.ide.IdeEventQueue$dispatchEvent$processEventRunnable$1$1.invoke(IdeEventQueue.kt:354)
	at com.intellij.ide.IdeEventQueue$dispatchEvent$processEventRunnable$1$1.invoke(IdeEventQueue.kt:349)
	at com.intellij.ide.IdeEventQueueKt.performActivity$lambda$1(IdeEventQueue.kt:1014)
	at com.intellij.openapi.application.TransactionGuardImpl.performActivity(TransactionGuardImpl.java:106)
	at com.intellij.ide.IdeEventQueueKt.performActivity(IdeEventQueue.kt:1014)
	at com.intellij.ide.IdeEventQueue.dispatchEvent$lambda$7(IdeEventQueue.kt:349)
	at com.intellij.openapi.application.impl.ApplicationImpl.runIntendedWriteActionOnCurrentThread(ApplicationImpl.java:848)
	at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.kt:391)
	at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:207)
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128)
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117)
	at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113)
	at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105)
	at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:92)

Output in IntelliJ

  [REPLACE THIS WITH YOUR INFORMATION]

Project "src" folder not marked as "Sources Root Folder" + no output path

The project "src" folder is not marked as "Sources Root Folder" and therefore code completion+code review doesn't work (unless you mark it manually). Because of that the project classes also don't show up in the (default) project view, so that you have to select "Project files" first and only there you can mark the src folder as sources root folder.
Building projects is also not possible by default as the output path is not specified in the Project Structure. One has to manually select the corresponding folder in ~/ArtemisProjects under the "Project compiler output" section under File>Project Structure

Open in IntelliJ does not work

Describe the bug

The Open in IntelliJ functionality does not work.

To Reproduce

  1. Start Orion with gradle runIDE
  2. Log in as editor in a course (tested on the ts1 and also works for editors)
  3. Try to start working on this exercise from the student view
  4. Open in IntelliJ does not work
  5. See that a JsonSyntaxException is thrown

Expected behavior

Clicking Open in IntellJ should open the project in the IDE

Screenshots

Button does not work:
ReviewPR39OrionUpdateDependencies

Environment

 - OS: Windows 10
 - IntelliJ 2021.1
 - Browser Chrome 90.0.4430.93
 - Orion Version: 1.1.1

Additional context

Output in IntelliJ

Exception in thread "Thread-13730" com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected a string but was BEGIN_OBJECT at line 1 column 3960 path $.categories[0]
	at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:226)
	at com.google.gson.Gson.fromJson(Gson.java:932)
	at com.google.gson.Gson.fromJson(Gson.java:897)
	at com.google.gson.Gson.fromJson(Gson.java:846)
	at com.google.gson.Gson.fromJson(Gson.java:817)
	at de.tum.www1.orion.connector.ide.exercise.OrionExerciseConnector.importParticipation(OrionExerciseConnector.kt:76)
	at de.tum.www1.orion.connector.ide.exercise.OrionExerciseConnector$initializeHandlers$1.onQuery(OrionExerciseConnector.kt:43)
Caused by: java.lang.IllegalStateException: Expected a string but was BEGIN_OBJECT at line 1 column 3960 path $.categories[0]
	at com.google.gson.stream.JsonReader.nextString(JsonReader.java:826)
	at com.google.gson.internal.bind.TypeAdapters$16.read(TypeAdapters.java:402)
	at com.google.gson.internal.bind.TypeAdapters$16.read(TypeAdapters.java:390)
	at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.read(TypeAdapterRuntimeTypeWrapper.java:41)
	at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:82)
	at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:61)
	at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:131)
	at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:222)
	... 6 more

Edit in Editor view cannot be left

Describe the bug

The Edit in Editor view cannot be left once entered.
The breadcrumbs do not work, Course Overview and Course Management cannot be accessed.

To Reproduce

  1. Login as Editor / Instructor
  2. Go to the Course Exercise view
  3. Edit a programming exercise with Edit in IntelliJ
  4. The opened view, which is similar to the Edit in Editor Artemis view cannot be left anymore

Expected behavior

The buttons should produce the expected behaviour.

Screenshots

Orion-EditInEditorAlikeViewNotWorking

Environment

 - OS: Windows 10
 - IntelliJ 2021.1.1 ultimate
 - Browser Chrome
 - Orion Version 1.1.2

Error message

ERROR Error: Uncaught (in promise): TypeError: this.codeEditorContainer is undefined
canDeactivate@https://artemis.ase.in.tum.de/app/10.588f1fdec75a95d68c14.chunk.js:1:1026157
canDeactivate@https://artemis.ase.in.tum.de/app/7.588f1fdec75a95d68c14.chunk.js:2:6725226
subscribe@https://artemis.ase.in.tum.d…
    Angular 18
    _wrapEventTarget trycatch.js:45
    Yn inboundfilters.js:149
    Angular 6
    bn code-editor-instructor-and-editor-orion-container.component.html:27
    Angular 9
    template code-editor-instructor-and-editor-orion-container.component.html:14
    Angular 22
    RxJS 5
    Angular 16
    _wrapEventTarget trycatch.js:45
    Yn inboundfilters.js:150
    handle Angular
    RxJS 20
inboundfilters.js:120:19

Make download submission for tutors functionality accessible from multiple places

Is your feature request related to a problem?

When monitoring student progress for programming exercises teaching assistants often clone the student submission and run the tests locally to identify and resolve issues.

Describe the solution you'd like

With #56 Orion offers the functionality to download student submissions, integrated into a test project setup.
It would be great if this functionality can be accessed from multiple places in Artemis.

I found the following places that would be beneficial to be supported:

  • Participation view
    Often used when students report problems with the exercise/tests and a teaching assistant
    image
  • Scores view
    image
  • Assessment Dashboard Submission view
    image

Describe alternatives you've considered

The teaching assistants can also do this manually, but this takes time that should rather be spent on resolving issues.

Wrong rendering of browser view after moving to other bottom of window

Describe the bug

After moving the tool window to the bottom of the screen and scrolling on a page, the rendered view is stretched out weirdly.
So far, we could only observe this behavior on Windows systems and even then in a rare situations.

Expected behavior

The browser view should stay the same for all attached window locations.

Screenshots

image

Storing Credentials does not work reliably with runIDE

Describe the bug

Currently Orion uses JCEF's settings to configure it to store credentials locally. However these settings can only be set before the first JCEF client is instantiated. If any other plugin/component happens to also use JCEF and also happens to be loaded before Orion, the settings dont get modified. Such a scenario is given if the opened project has an open markdown file since the markdown viewer also uses JCEF and open files get loaded before Orion.

To Reproduce

This bug only appears when running Orion with runIde and could not be observed with installed releases yet.

  1. Run Orion with runIde
  2. Log in to Artemis via Orion and select to store your credentials
  3. Open a markdown file in an Artemis project
  4. Restart IntelliJ
  5. Orion will ask for credentials to log in, even though they have been stored before
  6. Close the markdown file
  7. Restart IntelliJ
  8. Usually it works again (unless your setup has some other plugin using JCEF)

Solution

The only solution I can think of would be to not reflect into the library at all but instead transfer the session tokens via the connectors and store it somewhere in the global registry or the secure password registry and write them back in the local storage on startup using javascript.

Highlight student's changes in an assessment

Is your feature request related to a problem?

When assessing a submission, it sometimes gets difficult to determine what the student actually coded and what was already present in the template.

Describe the solution you'd like

Artemis solves this problem by highlighting the student's changes to the template, similar to a git commit. Such a solution should also be integrated into the assessment editor of Orion.

Describe alternatives you've considered

Instead tutors can use the git plugin to review the changes, but this can only be done independent of the assessment and would force them to swap editors.

Additional context

I already experimented with IntelliJs diff-editors, but failed to find a solution to access the gutter of a diff editor, making it impossible to display the buttons to add new inline comments. The code with more explanaition can be found here.

Alternatively one could look into not using IntelliJ's diff functions but instead calculate the diff themselves with the same algorithm used by Artemis and then find a way to simply highlight specific lines in the editor.

Submit Button is only visually disabled.

Describe the bug

The submit button gets only visually disabled and retains its functionality.
Submitting an exercise works, even though tests are running at the moment and the button looks like it should be disabled.
Clicking the submit button while it is disabled opens the dialog to commit.
It is easier to see if the custom commit dialog is activated. Otherwise, only a green info message will pop up.

To Reproduce

  1. Log into Artemis via Intellij.
  2. Start an exercise.
  3. Submit the exercise.
  4. Make a small change in the source code.
  5. While the tests are running and the submit button is disabled click it again.
  6. A new Dialog/info message will pop up to commit the exercise.

Expected behavior

No new submission should be made while the tests are still running from the last submission.

Environment

 - IntelliJ 2021.1.1
 - Version Orion 1.1.2

Screencast

submitButton

Build process never stops on build errors

Describe the bug

When pushing a submission with syntax errors or other errors producing a build error the local build process does not show anything useful nor stops, even after Artemis shows the feedback.

To Reproduce

  1. Open an exercise as student
  2. Submit a build error (e.g. syntax error)
  3. Wait for feedback

Expected behavior

Feedback should appear even if it cannot be shown as test failures

Environment

 - OS: Win8
 - IntelliJ 2021.1.1
 - Browser JCEF
 - Version 1.1.2

Publish new version to Marketplace to support IntelliJ 2022

Is your feature request related to a problem?

Users of IntelliJ 2022 versions can't download the plugin via the Marketplace function because the version there is heavily outdated.

Describe the solution you'd like

Release a new version on the IntelliJ Marketplace

Describe alternatives you've considered

Downloading the orion.zip via Actions Artifacts and installing manually. This is tedious and not user friendly.

Additional context

-/-

java.util.ConcurrentModificationException

Describe the bug

Intellij reports this Fatal Error:

java.util.ConcurrentModificationException
	at java.base/java.util.HashMap$EntrySpliterator.forEachRemaining(HashMap.java:1769)
	at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484)
	at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)
	at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:913)
	at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
	at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:578)
	at de.tum.www1.orion.exercise.registry.OrionGlobalExerciseRegistryService.cleanMap(OrionGlobalExerciseRegistryService.java:133)
	at de.tum.www1.orion.exercise.registry.OrionGlobalExerciseRegistryService.cleanup(OrionGlobalExerciseRegistryService.java:125)
	at de.tum.www1.orion.OrionStartupProjectRefreshActivity.runActivity(OrionStartupProjectRefreshActivity.kt:37)
	at com.intellij.ide.startup.impl.StartupManagerImpl.runStartupActivity(StartupManagerImpl.kt:268)
	at com.intellij.ide.startup.impl.StartupManagerImpl.runActivity(StartupManagerImpl.kt:247)
	at com.intellij.ide.startup.impl.StartupManagerImpl.access$runActivity(StartupManagerImpl.kt:59)
	at com.intellij.ide.startup.impl.StartupManagerImpl$runPostStartupActivities$1.accept(StartupManagerImpl.kt:214)
	at com.intellij.ide.startup.impl.StartupManagerImpl$runPostStartupActivities$1.accept(StartupManagerImpl.kt:59)
	at com.intellij.openapi.extensions.impl.ExtensionPointImpl.processWithPluginDescriptor(ExtensionPointImpl.java:293)
	at com.intellij.openapi.extensions.ExtensionPointName.processWithPluginDescriptor(ExtensionPointName.java:156)
	at com.intellij.ide.startup.impl.StartupManagerImpl.runPostStartupActivities(StartupManagerImpl.kt:209)
	at com.intellij.ide.startup.impl.StartupManagerImpl.access$runPostStartupActivities(StartupManagerImpl.kt:59)
	at com.intellij.ide.startup.impl.StartupManagerImpl$projectOpened$3$1.run(StartupManagerImpl.kt:166)
	at com.intellij.openapi.progress.impl.CoreProgressManager.lambda$runProcess$2(CoreProgressManager.java:183)
	at com.intellij.openapi.progress.impl.CoreProgressManager.registerIndicatorAndRun(CoreProgressManager.java:705)
	at com.intellij.openapi.progress.impl.CoreProgressManager.executeProcessUnderProgress(CoreProgressManager.java:647)
	at com.intellij.openapi.progress.impl.ProgressManagerImpl.executeProcessUnderProgress(ProgressManagerImpl.java:63)
	at com.intellij.openapi.progress.impl.CoreProgressManager.runProcess(CoreProgressManager.java:170)
	at com.intellij.openapi.progress.util.BackgroundTaskUtil.runUnderDisposeAwareIndicator(BackgroundTaskUtil.java:270)
	at com.intellij.openapi.progress.util.BackgroundTaskUtil.runUnderDisposeAwareIndicator(BackgroundTaskUtil.java:248)
	at com.intellij.ide.startup.impl.StartupManagerImpl$projectOpened$3.run(StartupManagerImpl.kt:166)
	at java.base/java.util.concurrent.ForkJoinTask$RunnableExecuteAction.exec(ForkJoinTask.java:1426)
	at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:290)
	at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1020)
	at java.base/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1656)
	at java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1594)
	at java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:183)

To Reproduce

This happens sometimes during indexing.
For ex. when restarting the IDE or installing a new Plugin.
But I can't reproduce this error consistently.

Expected behavior

No Fatal Error happens

Environment

 - OS: MacOs 11.6.3
 - IntelliJ: 2021.2.4 (Ultimate Edition)
 - Orion Version 1.2.0

Error in exercise view if Artemis base URL ends with "/"

Describe the bug

If the Artemis base URL ends with a "/", the view for a specific exercise (not the login or Home view) shows "Your request cannot be processed"

To Reproduce

  1. Configure the Artemis base URL to end with a "/"
  2. Open an exercise

Expected behavior

Remove the unnecessary slash automatically, display a warning/error in the settings or provide a useful error message to the user.

Screenshots

image

Environment

  • IntelliJ IDEA Community Edition 2021.2.3
  • Artemis 5.3.2

Additional context

The error is caused because after the base URL, a "/" is added for some requests. If the base URL already ended with a "/", there now are two slashes, which Artemis does not accept. I know this is a configuration error on my side, however it would be good to give the user understandable feedback how the settings can be fixed.

Output in IntelliJ

fixurl.js:1 Failed to load resource: the server responded with a status of 404 ()
16:1 Uncaught TypeError: Cannot read property 'onExerciseOpened' of undefined
    at 16:1
16:1 Failed to load resource: the server responded with a status of 500 ()

Navigation in an Instructor Project doesn't work.

To Reproduce

  1. Go to Course Management -> Scroll right -> Exercises
  2. Open some random project
  3. Try to go back to the Artemis main page by clicking on its logo or Course Overview / Course Management. It doesn't work

Screenshots

Capture

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.