GithubHelp home page GithubHelp logo

taskana / taskana Goto Github PK

View Code? Open in Web Editor NEW
81.0 10.0 99.0 28.85 MB

Lightweight library for general purpose task management

Home Page: https://taskana.pro

License: Apache License 2.0

TypeScript 9.91% JavaScript 0.37% HTML 2.39% CSS 0.01% Java 85.18% Shell 0.24% Batchfile 0.04% Dockerfile 0.05% SQLPL 0.19% SCSS 0.93% Vim Snippet 0.02% PLSQL 0.67%
taskana java task-management task-management-system hacktoberfest

taskana's Introduction

TASKANA - The open source task management library

Contributors Styling CI Quality Gate Status Maven Central License

TASKANA is a task management component open source library. It can be embedded into your application or be operated standalone if appropriate. Beside the basic task management functionalities, TASKANA adds workbaskets and classifications to control and monitor a large amount of Tasks within a larger organization.


We're not aware of all installations of our Open Source project. However, we love

  • listening to your feedback,
  • discussing possible use cases with you,
  • aligning the roadmap to your needs!

📨 Please contact us if you need consulting support.


Table of Contents

✨Overview

TASKS

Tasks are the main entity of TASKANA. Each Task has its describing attributes like priority and due date.

Furthermore each Task has a state.

And a Task holds a reference to the system and business object, it is associated with. This is important since is meant to be a standalone component.

All Tasks are placed in a Workbasket to control and direct the handling of the Tasks.

Tasklifecycle

WORKBASKETS

Workbaskets are the main structure to distribute the Tasks to the available users. There are personal, group/team and topic Workbaskets.

Workbaskets indicate the responsibility for a Task. The concepts of Workbaskets allow to differentiate between the permissions or the skills required to complete a Tasks and the determination who should complete the Tasks. This can diverge a lot in a larger organization.

Workbaskets

CLASSIFICATIONS

Classifications allow to identify the type of a Task. The Task derives some major attributes from the Classification, such as the service level and the priority.

Classifications can be configured by a responsible business administrator to control the handling of the Tasks.

Routing

It offers various routing and distribution functions to assign incoming Tasks to the correct Workbaskets, or to redistribute them between Workbaskets.

Routing

Prioritization

The dynamic prioritization functions in allow you to control the processing sequence of Tasks at any time. This ensures that the most important Tasks are always addressed first.

Prioritization

Components

Components

It splits up into five components:

  • TASKANA Lib
    • The Java library providing the Task management functions
  • TASKANA REST API
    • REST API to allow remote access to the TASKANA system.
  • TASKANA workplace
    • Angular based web application to work on the Tasks
    • Sample Tasklist application you can use if appropriate
  • TASKANA admin
    • Angular based web application to configure the system
    • Supports Workbaskets and Classifications
  • TASKANA monitor
    • Angular based web application to monitor the status of the entire Task pool
    • Provides views and statistics about the conformance with defined services levels
    • Shows the workload of your organization and the individual teams

Demo App Components Diagram

Demo App Components

🚀Getting Started

As TASKANA is meant to be integrated in the development environment and process of your organisation, you have to create your own small integration project as a wrapper and starting point for your customisations.

We currently provide examples how to run TASKANA as a Spring Boot Application or as a an Enterprise Application on Wildfly Application Server.

If you are only interested in how TASKANA looks and feel, you can try our Demo Environment instead.

Requirements

Runtime Environment at least Java 17

Supported Databases:

  • H2 (We test with 2.1.214*)
  • Postgres (We test with 14.7*)
  • DB2 (We test with 11.5.6*)
  • Oracle (We test with 18c*)

* other versions of the named databases should work also, but haven't been tested

Wrapper Application

Spring Boot Example

We use the h2 database in this example.

See rest/taskana-rest-spring-example-boot and it dependencies

EJB Example

We use a Wildfly Application Server in this example.

See lib/taskana-cdi.

Customize Behaviour

TASKANA allows to customize and modify it’s behaviour through the use of dedicated Service Provider Interfaces (SPI). Each SPI defines an interface that can be implemented by custom code. This is a common approach for Java developers to extend their applications. You can find out more about the background and the details in the Java documentation: https://docs.oracle.com/javase/tutorial/sound/SPI-intro.html

In order to use an SPI within TASKANA, you must

  • create a class that implements the relevant interface.

  • place that class into the classpath of your application

  • provide a control file with full name of the SPI (e. g. pro.taskana.spi.task.api.CreateTaskPreprocessor) in the subdirectory META-INF/services of the classpath. This control file must contain the fully qualified classname (including the package) of the class that implements the relevant interface. This control file is used by the ServiceLoader to load the custom class at runtime. The control file may contain multiple classes has implement the interface. Each implementation should be declared in a new line.

    All implementations will be used consecutively in the declaration order of the control file.

If you provide one or multiple implementations according to the description above, TASKANA will invoke the implementations at a specific point. The Javadoc of each SPI describes the conditions for the implementation to be executed.

Currently, TASKANA provides the following SPIs:

📚Releases

The list of releases contains a detailed changelog.

We use Semantic Versioning.

The following compatibility matrix shows the officially supported Spring version for each release. Other combinations might also work but have not been tested.

Release SpringBoot
7.0.0 2.7.16
6.3.2 2.7.14
6.2.2 2.7.12
6.1.1 2.7.10

📨Contact

If you have any questions or ideas feel free to create an issue or contact us via GitHub Discussions.

We love listening to your feedback, and of course also discussing the project roadmap and possible use cases with you!

This open source project is being developed by Novatec Consulting GmbH and envite consulting GmbH with the support of the open source community.


Novatec Consulting GmbH

envite consulting GmbH

taskana's People

Contributors

arolfes avatar benjamineckstein avatar berndbreier avatar bvier avatar cnguyen-de avatar dependabot-preview[bot] avatar dependabot[bot] avatar eberhardmayer avatar ensarevlideveloper avatar franzi321 avatar gitgoodjhe avatar holgerhagen avatar ignaciorecuerda avatar jamesrdi avatar julianschallenmueller avatar kklaeger avatar krozzus avatar larsleo avatar lialissmann avatar lnrivas avatar mlengl avatar mustaphazorgati avatar norman-schmidt avatar ryzheboka avatar sallhusen avatar sebastianroseneck avatar sfrevel avatar sofie29 avatar tge20 avatar tristan2357 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  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  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

taskana's Issues

Create test data for benchmarking suite

Please use the test api to automatically create the needed test data for the benchmarking suite.

The test data structure constraints have to be discussed with the team beforehand.

Create AWS infrastructure programmatically

We decided to perform our load tests in the cloud. specifically: AWS.

Please create an “empty” AWS infrastructure, which can be started automatically via terraform.

For this ticket it’s enough to have 1 EC2 instance start automatically and do nothing.

Add license header to every file

In our backend we want to add a license header to every file.

Please don't do this manually! We also want to make sure that all java files always contain a license header (and break the build, when a java file is uploaded without a license header).

One way of automatically maintaining the license is the License Maven Plugin.

Please have a look if that Plugin will solve our need and configure it :)

WorkbasketAccessItem tab conducts unnecessary calls to lookup up accessName

When a user opens the access items tab on a Workbasket the UI looks up the name of the access item in individual calls for each item. This is unnecessary as this information is already contained in the WorkbasketAccessItem list (attribute accessName).

Please remove those calls as they cause additional traffic and slow down the ui.

Create more meaningful test-api tests which demonstrate the usage of @WithServiceProvider

Currently the test api tests, which should demonstrate the usage of @WithServiceProvider, are not ideal.

They

  • Don’t verify that the Service Provider is actually running
  • They use a Service Provider which contains business logic.

Please

  • verify that the Service Provider is actually running
  • Use a different Service Provider, which does not contain any business logic

Bump maven-javadoc-plugin from 3.4.1 to 3.5.0

After Upgrade maven-javadoc-plugin the following error occured during build from taskana-rest-spring

javadoc: error - In doclet class capital.scalable.restdocs.jsondoclet.ExtractDocumentationAsJsonDoclet,  method start has thrown an exception java.lang.reflect.InvocationTargetException
java.lang.NoClassDefFoundError: com/fasterxml/jackson/databind/ObjectMapper
        at capital.scalable.restdocs.jsondoclet.ExtractDocumentationAsJsonDoclet.createObjectMapper(ExtractDocumentationAsJsonDoclet.java:94)
        at capital.scalable.restdocs.jsondoclet.ExtractDocumentationAsJsonDoclet.start(ExtractDocumentationAsJsonDoclet.java:44)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:566)
        at jdk.javadoc/com.sun.tools.javadoc.main.DocletInvoker.invoke(DocletInvoker.java:333)
        at jdk.javadoc/com.sun.tools.javadoc.main.DocletInvoker.start(DocletInvoker.java:212)
        at jdk.javadoc/com.sun.tools.javadoc.main.Start.parseAndExecute(Start.java:446)
        at jdk.javadoc/com.sun.tools.javadoc.main.Start.begin(Start.java:238)
        at jdk.javadoc/com.sun.tools.javadoc.main.Start.begin(Start.java:224)
        at jdk.javadoc/com.sun.tools.javadoc.Main.execute(Main.java:174)
        at jdk.javadoc/jdk.javadoc.internal.tool.Start.begin(Start.java:420)
        at jdk.javadoc/jdk.javadoc.internal.tool.Start.begin(Start.java:345)
        at jdk.javadoc/jdk.javadoc.internal.tool.Main.execute(Main.java:63)
        at jdk.javadoc/jdk.javadoc.internal.tool.Main.main(Main.java:52)
Caused by: java.lang.ClassNotFoundException: com.fasterxml.jackson.databind.ObjectMapper
        at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:476)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:589)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
        ... 16 more
Command line was: /opt/graalvm/graalvm-22.3.1-java11/bin/javadoc @options @packages

Refactor README to make it more appealing

Currently our README does not contain detailed explanation about TASKANA.
This can be done by adding e.g. images.

Please refactor our README so that it will be more appealing to people who have no idea what TASKANA is and which problem TASKANA is trying to solve.

Create GitHub Actions Pipeline which starts load tests

We want to execute our load tests “with a simple button click”.

For this we want a GitHub Actions pipeline which automatically triggers a deployment to AWS where the load tests are executed and after completion shuts the AWS infrastructure down.

For now a manual trigger is enough.

Add missing indexes

Based on experiences from production we are missing some indexes. E.g. for the Adapter query and the history.

Remove redundant entries in application-<DB>.properties in taskana-rest-spring-example-boot

rest/taskana-rest-spring-example-boot/src/main/resources

Currently there are property files for every supported DB-configuration containing all entries of the application.properties file which is redundant. In Spring Boot you can configure Profiles which will activate the given property-file (e.g. profile DB2 activates application-DB2.properties). This property-file will extend the application.properties file and either adds or overwrites its poperties.

TODO:
Move all common entries into the application.properties file and only keep db-configuration-specific entries in the appropriate files.

Taskana Adapter db configuration issue

To connect to Taskana I have added ( taskana-adapter-taskana-connector ) in the Flowable BPMN (https://flowable.com/open-source/docs/bpmn/ch02-GettingStarted/) spring boot project pom xml

By default flowable creates few tables like Taskana , When I added the adapter connector dependency tables are not creating , I am getting below error and failing to start the application

When I remove taskana-adapter-taskana-connector dependency , it works fine

Caused by: org.apache.ibatis.exceptions.PersistenceException:

Error querying database. Cause: org.postgresql.util.PSQLException: ERROR: relation "act_re_deployment" does not exist

Position: 34

The error may exist in org/flowable/db/mapping/entity/Deployment.xml

Can you please help me how to integrate Flowable BPMN with Taskana

Perform architecture & pojo test on every module

Currently our architecture- & pojo tests are only executed in taskana-core.

Please make them available for every single module in taskana-core to verify code quality.

One Idea:
Move ArchitectureTest + POJO Test into dedicated module. Then import that module and create a sub class which derives from the ArchitectureTest class. This should allow execution of that ArchitectureTest within the given module. The ClassPathImporter should be adjusted to NOT look into transitive classes anymore

Update SonarCloud integration guide

The description of the SonarCloud integration in our getting started guide is outdated. Please update the pictures with the menu steps etc. to the current SonarCloud version.

Create Ticket templates

In order to improve the quality of our tickets we want to create some templates.

Please design the templates for each issue type and configure the template

Develop a benchmarking suite development roadmap

In order to create a benchmarking suite according to our needs, we want to develop a roadmap and identify during that process which needs we actually have.

This can include the following questions:

  • How to trigger the suite?

  • what should be benchmarked?

    • Java API and/or REST API

    • which methods/ scenarios?

  • which tools should be used for benchmarking?

Rewrite Test in TaskControllerIntTest to use RestHelper for communication

should_ThrowException_When_CreatingTaskWithInvalidParameter() doesn’t use RestHelper for communication. The method could probably be simplified by using RestHelper, like other methods in this test class already do.

[L] examine JSON Blobs and how they can be removed (they can be built with RepresentationModelEntity instead of JSON Blob)

Upgrade Postgres Version to 14.7

TASKANA is already manually tested on compatibility with Postgres 14.7 . We only need to adjust the version itself.

TODOs:

  • adjust docker image name from postgres:10 to postgres:14.7 (in both DockerContainerCreator.java files)
  • adjust Dockerfile in the docker_databases folder
  • rename all postgres related variables and files referencing version 10 to reference version 14 (e. g. rename postgres_10 to postgres_14)

GitHub Actions: new way to print to stdout

Currently our Workflow throws this warning:

The `set-output` command is deprecated and will be disabled soon. Please upgrade to using Environment Files. For more information see: https://github.blog/changelog/2022-10-11-github-actions-deprecating-save-state-and-set-output-commands/

We have to adjust the way we write to stdout in order to fix that warning.

Java 17 Migration

As a developer I want to keep up with "new" Java LTS Releases.

Please compile everything with Java 17

Optimize handling of object references during task updates

Currently we add, remove or update each object reference during update. This is probably not very efficient (complex and many database calls). An easier way might be to replace the entire list of object references during the update. (t.b.d.)

don't allow invalid content to a custom field of a classification

As business admin I want to make sure that I don't add invalid content to a custom field of a classification

What
Currently there is no validation for content in custom fields (except for Serviuce Level but this is handled by the backend). I would like to have some kind of custom validation in the UI for each field

Why
Invalid data will lead to incorrect content and errors during runtime.

How
Add configuration possibilities for validation for a custom field in the UI e.g. to have at least a regex to validate the format of the entered String, if the field is required etc. But we are open for dicussion on what option we might have here

Update chart.js and ng2-charts

During the FE dependency update it turned out that two FE dependencies - chart.js and ng2-charts - have breaking stuff which has to be fixed.

Please upgrade those two dependencies and fix all the issues.

Migrate to new JavaDoc jdk.javadoc.doclet API

Constructing Javadoc information...
Warning:  Javadoc Warnings
Warning:  javadoc: warning - The old Doclet and Taglet APIs in the packages
Warning:  com.sun.javadoc, com.sun.tools.doclets and their implementations
Warning:  are planned to be removed in a future JDK release. These
Warning:  components have been superseded by the new APIs in jdk.javadoc.doclet.
Warning:  Users are strongly recommended to migrate to the new APIs.

Replace Thorntail

Thorntail is end-of-life since over 2 years and makes problems with the jdk17 migration. therefore thorntail should be replaced and a "normal" EJB Application should be deployed

Move Bean declaration from taskana-rest-spring to taskana-spring

Currently Spring Beans (of TASKANA Services) are declared in the RestConfiguration, which is within taskana-rest-spring.

This is not ideal since users which only use taskana-spring have to declare the beans manually if they use taskana-spring without taskana-rest-spring. Therefore, we want to move the declaration of beans from taskana-rest-spring to taskana-spring

SqlConnectionRunner commit behaviour

Change the check for commit behaviour from the consumer in SqlConnectionRunner.runWithConnection() to the runWithConnection() method directly.

Introduce Lombok

We want to introduce Lombok.

Open Questions: How does lombok behave with interface methods?

Error during LDAP lookup of groups for user

When looking up a user in access item management we get an error that the groups for the user cannot be looked up

REST Calls

GET /api/v1/access-ids?search-for=vXXXXXX (while typing → works)
GET /api/v1/access-ids/groups?access-id=vXXXXXX (enter → fails)

Step to reproduce

  • open access item management

  • search for a user (in our case vXXXXXX)

  • press enter

Expected behaviour

the groups and access items for the user are listed

Actual behaviour

an exception is shown

javax.naming.InvalidNameException: : [LDAP: error code 34 - Invalid DN Syntax]; remaining name '', path=/kpkfachadmin-gel/api/v1/access-ids/groups]

Fix getting additional user info from claim

Now, if claim is executed with additionalUserInfo, the user info table can't be found. The method Claim in TaskServiceImpl needs to be fixed.

Todo:
OwnerLongName should be filled out after a connection to the database has been opened. Move setting ownerLongName, so that it's done after a connection to the database has been opened.

TaskServiceImpl.createTask includes some code smell according evaluation of a unique key constraint violation

During the TSK-1197 we "discovered" this code smell where the message of the exception is used to discover a unique key constraint violation. In this Task we should evaluate if there is an other possibility to decide that such a violation has happened.

...
             new CreatedEvent(task, CurrentUserContext.getUserid(), details));
        }
      } catch (PersistenceException e) {
        // Error messages:
        // Postgres: ERROR: duplicate key value violates unique constraint "uc_external_id"
        // DB/2: ### Error updating database.  Cause:
        // com.ibm.db2.jcc.am.SqlIntegrityConstraintViolationException: DB2 SQL Error: SQLCODE=-803,
        // SQLSTATE=23505, SQLERRMC=2;TASKANA.TASK, DRIVER=4.22.29
        //       ### The error may involve pro.taskana.mappings.TaskMapper.insert-Inline
        //       ### The error occurred while setting parameters
        //       ### SQL: INSERT INTO TASK(ID, EXTERNAL_ID, CREATED, CLAIMED, COMPLETED, MODIFIED,
        // PLANNED, DUE, NAME, CREATOR, DESCRIPTION, NOTE, PRIORITY, STATE,
        // CLASSIFICATION_CATEGORY, CLASSIFICATION_KEY, CLASSIFICATION_ID, WORKBASKET_ID,
        // WORKBASKET_KEY, DOMAIN, BUSINESS_PROCESS_ID, PARENT_BUSINESS_PROCESS_ID, OWNER,
        // POR_COMPANY, POR_SYSTEM, POR_INSTANCE, POR_TYPE, POR_VALUE, IS_READ, IS_TRANSFERRED,
        // CALLBACK_INFO, CUSTOM_ATTRIBUTES, CUSTOM_1, CUSTOM_2, CUSTOM_3, CUSTOM_4, CUSTOM_5,
        // CUSTOM_6, CUSTOM_7, CUSTOM_8, CUSTOM_9, CUSTOM_10, CUSTOM_11,  CUSTOM_12,  CUSTOM_13,
        // CUSTOM_14,  CUSTOM_15,  CUSTOM_16 ) VALUES(?,?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,
        // ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,
        // ?,  ?)
        //       ### Cause: com.ibm.db2.jcc.am.SqlIntegrityConstraintViolationException: DB2 SQL
        // Error: SQLCODE=-803, SQLSTATE=23505, SQLERRMC=2;TASKANA.TASK, DRIVER=4.22.29
        // H2:   ### Error updating database.  Cause: org.h2.jdbc.JdbcSQLException: Unique index or
        // primary key violation: "UC_EXTERNAL_ID_INDEX_2 ON TASKANA.TASK(EXTERNAL_ID) ...
        String msg = e.getMessage() != null ? e.getMessage().toLowerCase() : null;
        if (msg != null
            && (msg.contains("violation") || msg.contains("violates") || msg.contains("verletzt"))
            && msg.contains("external_id")) {
          throw new TaskAlreadyExistException(
              "Task with external id " + task.getExternalId() + " already exists");
        } else {
          throw e;
        }
      }

The problem with this code has occured as the language was adjusted in the postgress DB to get exactly the same collation as in the other databases. So this code part is always depending on the language.

Reuse Basequery#toLowerCopy

The TimeIntervalReportBuilderImpl and the WorkbasketPriorityReportBuilderImpl define a toLowerCopy method, which is an exact duplicate of BaseQuery#toLowerCopy. Please refactor this by either introducing a util class or making BaseQuery#toLowerCopy static.

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.