Coder Social home page Coder Social logo

stephanpelikan / elmo Goto Github PK

View Code? Open in Web Editor NEW
0.0 4.0 0.0 7.59 MB

ELMO is an acronym for Electro Mobile. It is software for organizing regional social transport services using electric vehicles.

License: Apache License 2.0

Java 55.02% HTML 0.17% TypeScript 43.93% JavaScript 0.08% Fluent 0.05% FreeMarker 0.73%

elmo's Introduction

ELMO

ELMO is an acronym for Electro Mobile. It is software for organizing regional social transport services using electric vehicles.

It is meant to

  1. fill the gap of local public transportations in areas in which buses cannot be operated in the frequency needed.
  2. be used by non-profit organizations.
  3. use electric vehicles for transportation services.

It supports organizations which apply to these rules:

  1. An organization has at least one electric vehicle used for passenger services at business times.
  2. Beside the times of passenger service cars can be used for car-sharing.
  3. People can join as a passenger:
    1. Members can order cars to pick them up at a certain point and time and bring them to an individual destination.
    2. Only one ride and return can be ordered in advance to keep slots free for a fair distribution of the available capacity.
    3. Destinations are limited to local areas (e.g. community).
  4. People can join as a driver:
    1. Once a week a driver takes over a shift of passenger service (e.g. 3 hours).
    2. In the same amount of doing passenger service a driver can rent a car for individual usage (car-sharing)
    3. Car-sharing is not limited to local areas but is limited in time for a fair distribution of the available capacity (e.g. maximum of 48 hours at once).
  5. People can join as a both passenger and driver at once:
    1. Typically, passengers are charged a flat fee.
    2. Drivers who also use the passenger service pay a lower fee.

Fees are not calculated by the system, but statistics are provided to support charging passengers and drivers.

Features available:

Hint: At the moment the software is not ready to be used in production! Soon all features required for a base usage should be available. Watch the repository to keep up to date.

  1. Member management:
    1. Onboarding
    2. Administration
    3. Bulk imports
    4. Self-management (avatar, email-address, phone-number, personal settings)
  2. Car management:
    1. Define cars
    2. Define car's roles (car-sharing, passenger-service)
  3. Passenger service:
    1. Rule based shift planning
    2. Taking over shifts by drivers
  4. Car-sharing:
    1. Planning of rides
    2. Doing rides
  5. User-interface
    1. Optimized for phones, tablets and PCs
    2. Organisation's details can be defined by configuration: brand-colors, icon, name, homepage, etc.
    3. Social login (currently available: Google, Amazon; planned: Apple)

Planned features:

  1. Passenger service:
    1. Manual shift planning
    2. Statistics for billing
    3. Management of rides by drivers
    4. Self-management of rides by passengers
  2. Car-sharing:
    1. Change car-sharing by administrators (e.g. in case of car outages)
    2. Statistics for billing
  3. App-Wrapper:
    1. For Android and iOS
    2. Special mode for tablets used in cars:
      1. Optimized to support drivers during the shift
      2. Used as an SMS gateway to not be dependent on expensive text service providers.
    3. Not yet scheduled: Recording GPS to calculate accurate durations of rides planned.
  4. Multilingual user-interface 2. English 3. German

Screenshots

Hint: Screenshots show German language

Production

Build

MAVEN_OPTS=--add-opens=java.base/java.util=ALL-UNNAMED mvn -Dorg.slf4j.simpleLogger.log.org.openapitools.codegen.TemplateManager=WARN -P release

Run

java -Dspring.active.profile=production -jar target/elmo-*-runnable.jar

Define a Spring profile production similar to the development profile local. Change existing values and add properties for social login, mailing and SMS texting as shown in section development.

Open in browser: http://localhost:8080

Hint: Social login on localhost only works using Webpack development server (see below) because service and webapp have to use different hostnames what applies for development server since UI is started for localhost:3000 but Spring Boot container runs on localhost:8080.

Configure

Possible configuration attributes you can provide in a file application-production.yaml in the directory from which you start the application.

Checkout the sections elmo and translations in the files application.yaml and application-local.yaml. Most thing are self-explaining. For the rest read the listing underneath:

  1. elmo.gateway-url: The public URL which point to the Elmo application (e.g. https://app.elmo.com)
  2. elmo.sms.support: Whether to use a drivers cell-phone to send SMS (see App-Wrapper).
  3. elmo.passenger-service-phone-number: The drivers cell-phone's number.
  4. elmo.admin-identification-email-address: Once a new social login is registers having this email address, the account is created without onboarding and admin-permissions are given out.
  5. elmo.admin-member-id: A predefined member id of the administrator.
  6. elmo.email.sender: The sender address for emails sent (e.g. [email protected])
  7. elmo.general-email-address: The organisation's email address (e.g. [email protected])

Social login configuration:

Spring Boot's built in mechanism is used for social logins. For each you have to provide these properties:

  1. Google:
    1. spring.security.oauth2.client.registration.google.client-id: see https://console.cloud.google.com/apis/credentials
    2. spring.security.oauth2.client.registration.google.client-secret: see https://console.cloud.google.com/apis/credentials
    3. spring.security.oauth2.client.registration.google.redirect-uri: Use ${elmo.gateway-url}/{action}/oauth2/code/{registrationId}
    4. spring.security.oauth2.client.registration.google.scope: Use ["email", "profile"]
  2. Amazon
    1. spring.security.oauth2.client.registration.amazon.client-name: Use Amazon
    2. spring.security.oauth2.client.registration.amazon.client-id: see https://developer.amazon.com/loginwithamazon/console/site/lwa/overview.html
    3. spring.security.oauth2.client.registration.amazon.client-secret: see https://developer.amazon.com/loginwithamazon/console/site/lwa/overview.html
    4. spring.security.oauth2.client.registration.amazon.authorization-grant-type: Use authorization_code
    5. spring.security.oauth2.client.registration.amazon.redirect-uri: Use ${elmo.gateway-url}/{action}/oauth2/code/{registrationId}
    6. spring.security.oauth2.client.registration.amazon.scope: Use ["profile"]

For some providers, like Amazon-Login, the are no default-values known by Spring Boot so, also the provider's properties need to be set:

  1. Amazon:
    1. spring.security.oauth2.client.provider.amazon.id: Use amazon
    2. spring.security.oauth2.client.provider.amazon.authorization-uri: Use https://www.amazon.com/ap/oa
    3. spring.security.oauth2.client.provider.amazon.token-uri: Use https://api.amazon.co.uk/auth/o2/token
    4. spring.security.oauth2.client.provider.amazon.user-info-uri: Use https://api.amazon.com/user/profile
    5. spring.security.oauth2.client.provider.amazon.userNameAttribute: Use name

Building PDF templates

As a last step of the passenger registration a confirmation email is sent which also includes a passenger agreement to be signed and sent to the organisation's leader board. It is provided as a prefilled PDF attachment.

Two PDF files has to be created manually, one for passenger registrations and one for driver registrations. This PDF should have spaces in which the registree has to fill her/his personal data. To prefill theses spaces with data recording during the online registration a CSV file has to be created containing descriptions were to put which data into the PDF.

To test this, run this command:

MAVEN_OPTS=--add-opens=java.base/java.util=ALL-UNNAMED mvn -Dcamunda-edition=ce clean package -P pdf
java -jar target/pdf-tool.jar src/test/attachments/passenger-agreement/configuration.csv src/test/attachments/passenger-agreement/data.csv src/test/attachments/passenger-agreement/template.pdf ~/Desktop/test.pdf

Hint: If you have limited space to place a certain text into PDF then you can limit the size by using the 'config.csv' column 'max_length'. Do test the limits use a very long value in the 'data.csv'.

Provide the directories containing the configuration files by using this properties:

  1. elmo.passenger-agreement-pdf-directory
  2. elmo.driver-agreement-pdf-directory

Development

Workflows:

This software's architecture is based on BPMN processes. To view the models use an online viewer.

To run the workflows the Open-Source BPMN engine Camunda Platform 7 is used which is loose coupled by using VanillaBP. For editing the models Camunda's free modeler is available.

Run

Run class at.elmo.ElmoApplication from your favorite IDE and add JVM parameters like this:

-Dspring.security.oauth2.client.registration.google.client-id=XXXXXXX
-Dspring.security.oauth2.client.registration.google.client-secret=XXXXXXX
-Dspring.security.oauth2.client.registration.amazon.client-id=YYYYYYY
-Dspring.security.oauth2.client.registration.amazon.client-secret=YYYYYYY
-Delmo.passenger-agreement-pdf-directory=/media/sf_Shared/elmo/passenger-agreement
-Delmo.driver-agreement-pdf-directory=/media/sf_Shared/elmo/driver-agreement
[email protected]
[email protected]
[email protected]
[email protected]
-Delmo.initial-new-member-id=2
-Delmo.admin-member-id=1
-Delmo.sms.redirect-all-to='+436661234567'
-Delmo.sms.dont-redirect='+436661234567,+436661234567'
-Dspring.mail.host=my-smtp-host
-Dspring.mail.port=25

Values XXXXXXX can be configured at https://console.cloud.google.com and for YYYYYYY at https://developer.amazon.com/apps-and-games/login-with-amazon.

Run Webpack development server:

cd src/main/webapp
npm run start

Open in browser: http://localhost:3000

Hot module replacement is active. All requests having pathes matching /api, *oauth2*, /logout will be proxied to http://localhost:8080/.

OpenRouteService:

The free tool OpenRouteService is used to plan rides.

Swagger-URL

https://openrouteservice.org/wp-json/ors-api/v1/api-doc/source/V2

Noteworthy & Contributors

ELMO was developed by Stephan Pelikan to support the non-profit organization ElektroMobil Gänserndorf.

If you need support to operate the system, feel free to create an Github issue having a label help wanted. If you don't have the technical skills to operate this system get in contact with Phactum Softwareentwicklung GmbH which is a supporter of the project.

License

Copyright 2023 Stephan Pelikan

Licensed under the Apache License, Version 2.0

elmo's People

Contributors

stefantucekphactum avatar stephanpelikan avatar

Watchers

 avatar  avatar  avatar  avatar

elmo's Issues

NPE

org.camunda.bpm.engine.ProcessEngineException: Error while evaluating expression: ${empty driver}. Cause: Cannot invoke "org.hibernate.loader.plan.exec.process.spi.EntityReferenceInitializer.getEntityReference()" because "entityReferenceInitializer" is null
	at org.camunda.bpm.engine.impl.el.JuelExpression.getValue(JuelExpression.java:69) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.el.UelExpressionCondition.evaluate(UelExpressionCondition.java:50) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.el.UelExpressionCondition.evaluate(UelExpressionCondition.java:45) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.bpmn.behavior.ExclusiveGatewayActivityBehavior.doLeave(ExclusiveGatewayActivityBehavior.java:64) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.pvm.runtime.operation.PvmAtomicOperationActivityLeave.execute(PvmAtomicOperationActivityLeave.java:56) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.pvm.runtime.operation.PvmAtomicOperationActivityLeave.execute(PvmAtomicOperationActivityLeave.java:32) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.interceptor.AtomicOperationInvocation.execute(AtomicOperationInvocation.java:99) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.interceptor.CommandInvocationContext.invokeNext(CommandInvocationContext.java:131) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.interceptor.CommandInvocationContext.performNext(CommandInvocationContext.java:111) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.interceptor.CommandInvocationContext.performOperation(CommandInvocationContext.java:86) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.persistence.entity.ExecutionEntity.performOperation(ExecutionEntity.java:622) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.persistence.entity.ExecutionEntity.performOperation(ExecutionEntity.java:596) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.pvm.runtime.PvmExecutionImpl$6.callback(PvmExecutionImpl.java:2021) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.pvm.runtime.PvmExecutionImpl$6.callback(PvmExecutionImpl.java:2018) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.pvm.runtime.PvmExecutionImpl.continueExecutionIfNotCanceled(PvmExecutionImpl.java:2088) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.pvm.runtime.PvmExecutionImpl.dispatchDelayedEventsAndPerformOperation(PvmExecutionImpl.java:2037) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.pvm.runtime.PvmExecutionImpl.dispatchDelayedEventsAndPerformOperation(PvmExecutionImpl.java:2018) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.bpmn.behavior.FlowNodeActivityBehavior.leave(FlowNodeActivityBehavior.java:52) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.bpmn.behavior.FlowNodeActivityBehavior.execute(FlowNodeActivityBehavior.java:44) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.pvm.runtime.operation.PvmAtomicOperationActivityExecute$2.callback(PvmAtomicOperationActivityExecute.java:61) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.pvm.runtime.operation.PvmAtomicOperationActivityExecute$2.callback(PvmAtomicOperationActivityExecute.java:50) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.pvm.runtime.PvmExecutionImpl.continueIfExecutionDoesNotAffectNextOperation(PvmExecutionImpl.java:2082) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.pvm.runtime.operation.PvmAtomicOperationActivityExecute.execute(PvmAtomicOperationActivityExecute.java:42) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.pvm.runtime.operation.PvmAtomicOperationActivityExecute.execute(PvmAtomicOperationActivityExecute.java:31) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.interceptor.AtomicOperationInvocation.execute(AtomicOperationInvocation.java:99) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.interceptor.CommandInvocationContext.invokeNext(CommandInvocationContext.java:131) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.interceptor.CommandInvocationContext.performNext(CommandInvocationContext.java:111) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.interceptor.CommandInvocationContext.performOperation(CommandInvocationContext.java:86) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.persistence.entity.ExecutionEntity.performOperation(ExecutionEntity.java:622) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.persistence.entity.ExecutionEntity.performOperation(ExecutionEntity.java:596) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.pvm.runtime.PvmExecutionImpl$6.callback(PvmExecutionImpl.java:2021) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.pvm.runtime.PvmExecutionImpl$6.callback(PvmExecutionImpl.java:2018) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.pvm.runtime.PvmExecutionImpl.continueExecutionIfNotCanceled(PvmExecutionImpl.java:2088) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.pvm.runtime.PvmExecutionImpl.dispatchDelayedEventsAndPerformOperation(PvmExecutionImpl.java:2037) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.pvm.runtime.PvmExecutionImpl.dispatchDelayedEventsAndPerformOperation(PvmExecutionImpl.java:2018) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.pvm.runtime.operation.PvmAtomicOperationTransitionNotifyListenerStart.eventNotificationsCompleted(PvmAtomicOperationTransitionNotifyListenerStart.java:61) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.pvm.runtime.operation.PvmAtomicOperationTransitionNotifyListenerStart.eventNotificationsCompleted(PvmAtomicOperationTransitionNotifyListenerStart.java:30) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.core.operation.AbstractEventAtomicOperation.execute(AbstractEventAtomicOperation.java:70) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.interceptor.AtomicOperationInvocation.execute(AtomicOperationInvocation.java:99) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.interceptor.CommandInvocationContext.invokeNext(CommandInvocationContext.java:131) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.interceptor.CommandInvocationContext.performNext(CommandInvocationContext.java:111) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.interceptor.CommandInvocationContext.performOperation(CommandInvocationContext.java:86) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.interceptor.CommandInvocationContext.performOperation(CommandInvocationContext.java:76) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.persistence.entity.ExecutionEntity.performOperationSync(ExecutionEntity.java:631) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.persistence.entity.ExecutionEntity.performOperationSync(ExecutionEntity.java:606) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.core.operation.AbstractEventAtomicOperation.execute(AbstractEventAtomicOperation.java:66) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.interceptor.AtomicOperationInvocation.execute(AtomicOperationInvocation.java:99) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.interceptor.CommandInvocationContext.invokeNext(CommandInvocationContext.java:131) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.interceptor.CommandInvocationContext.performNext(CommandInvocationContext.java:111) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.interceptor.CommandInvocationContext.performOperation(CommandInvocationContext.java:86) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.interceptor.CommandInvocationContext.performOperation(CommandInvocationContext.java:76) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.persistence.entity.ExecutionEntity.performOperationSync(ExecutionEntity.java:631) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.persistence.entity.ExecutionEntity.performOperationSync(ExecutionEntity.java:606) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.core.operation.AbstractEventAtomicOperation.execute(AbstractEventAtomicOperation.java:66) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.interceptor.AtomicOperationInvocation.execute(AtomicOperationInvocation.java:99) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.interceptor.CommandInvocationContext.invokeNext(CommandInvocationContext.java:131) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.interceptor.CommandInvocationContext.performNext(CommandInvocationContext.java:111) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.interceptor.CommandInvocationContext.performOperation(CommandInvocationContext.java:86) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.interceptor.CommandInvocationContext.performOperation(CommandInvocationContext.java:76) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.persistence.entity.ExecutionEntity.performOperationSync(ExecutionEntity.java:631) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.persistence.entity.ExecutionEntity.performOperationSync(ExecutionEntity.java:606) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.core.operation.AbstractEventAtomicOperation.execute(AbstractEventAtomicOperation.java:66) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.interceptor.AtomicOperationInvocation.execute(AtomicOperationInvocation.java:99) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.interceptor.CommandInvocationContext.invokeNext(CommandInvocationContext.java:131) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.interceptor.CommandInvocationContext.performNext(CommandInvocationContext.java:111) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.interceptor.CommandInvocationContext.performOperation(CommandInvocationContext.java:86) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.persistence.entity.ExecutionEntity.performOperation(ExecutionEntity.java:622) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.persistence.entity.ExecutionEntity.performOperation(ExecutionEntity.java:596) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.pvm.runtime.operation.PvmAtomicOperationTransitionCreateScope.scopeCreated(PvmAtomicOperationTransitionCreateScope.java:38) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.pvm.runtime.operation.PvmAtomicOperationCreateScope.execute(PvmAtomicOperationCreateScope.java:53) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.pvm.runtime.operation.PvmAtomicOperationCreateScope.execute(PvmAtomicOperationCreateScope.java:27) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.interceptor.AtomicOperationInvocation.execute(AtomicOperationInvocation.java:99) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.interceptor.CommandInvocationContext.invokeNext(CommandInvocationContext.java:131) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.interceptor.CommandInvocationContext.performNext(CommandInvocationContext.java:118) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.interceptor.CommandInvocationContext$1.call(CommandInvocationContext.java:102) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.interceptor.CommandInvocationContext$1.call(CommandInvocationContext.java:100) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.context.ProcessApplicationClassloaderInterceptor.call(ProcessApplicationClassloaderInterceptor.java:48) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.application.AbstractProcessApplication.execute(AbstractProcessApplication.java:131) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.application.AbstractProcessApplication.execute(AbstractProcessApplication.java:142) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.context.Context.executeWithinProcessApplication(Context.java:206) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.interceptor.CommandInvocationContext.performNext(CommandInvocationContext.java:100) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.interceptor.CommandInvocationContext.performOperation(CommandInvocationContext.java:86) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.interceptor.CommandInvocationContext.performOperation(CommandInvocationContext.java:76) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.jobexecutor.AsyncContinuationJobHandler.execute(AsyncContinuationJobHandler.java:81) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.jobexecutor.AsyncContinuationJobHandler.execute(AsyncContinuationJobHandler.java:40) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.persistence.entity.JobEntity.execute(JobEntity.java:133) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.cmd.ExecuteJobsCmd.execute(ExecuteJobsCmd.java:110) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.cmd.ExecuteJobsCmd.execute(ExecuteJobsCmd.java:43) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.interceptor.CommandExecutorImpl.execute(CommandExecutorImpl.java:28) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.interceptor.CommandContextInterceptor.execute(CommandContextInterceptor.java:110) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.spring.SpringTransactionInterceptor$1.doInTransaction(SpringTransactionInterceptor.java:72) ~[camunda-engine-spring-7.17.6-ee.jar:7.17.6-ee]
	at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:140) ~[spring-tx-5.3.23.jar:5.3.23]
	at org.camunda.bpm.engine.spring.SpringTransactionInterceptor.execute(SpringTransactionInterceptor.java:70) ~[camunda-engine-spring-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.interceptor.ProcessApplicationContextInterceptor.execute(ProcessApplicationContextInterceptor.java:70) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.interceptor.CommandCounterInterceptor.execute(CommandCounterInterceptor.java:35) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.interceptor.LogInterceptor.execute(LogInterceptor.java:33) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.jobexecutor.ExecuteJobHelper.executeJob(ExecuteJobHelper.java:57) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.jobexecutor.ExecuteJobsRunnable.executeJob(ExecuteJobsRunnable.java:110) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.jobexecutor.ExecuteJobsRunnable.run(ExecuteJobsRunnable.java:71) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) ~[na:na]
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) ~[na:na]
	at java.base/java.lang.Thread.run(Thread.java:833) ~[na:na]
Caused by: java.lang.NullPointerException: Cannot invoke "org.hibernate.loader.plan.exec.process.spi.EntityReferenceInitializer.getEntityReference()" because "entityReferenceInitializer" is null
	at org.hibernate.loader.plan.exec.process.internal.AbstractRowReader.resolveEntityKey(AbstractRowReader.java:104) ~[hibernate-core-5.6.12.Final.jar:5.6.12.Final]
	at org.hibernate.loader.plan.exec.process.internal.AbstractRowReader.resolveEntityKey(AbstractRowReader.java:120) ~[hibernate-core-5.6.12.Final.jar:5.6.12.Final]
	at org.hibernate.loader.plan.exec.process.internal.AbstractRowReader.resolveEntityKey(AbstractRowReader.java:108) ~[hibernate-core-5.6.12.Final.jar:5.6.12.Final]
	at org.hibernate.loader.plan.exec.process.internal.AbstractRowReader.readRow(AbstractRowReader.java:71) ~[hibernate-core-5.6.12.Final.jar:5.6.12.Final]
	at org.hibernate.loader.plan.exec.internal.EntityLoadQueryDetails$EntityLoaderRowReader.readRow(EntityLoadQueryDetails.java:288) ~[hibernate-core-5.6.12.Final.jar:5.6.12.Final]
	at org.hibernate.loader.plan.exec.process.internal.ResultSetProcessorImpl.extractRows(ResultSetProcessorImpl.java:157) ~[hibernate-core-5.6.12.Final.jar:5.6.12.Final]
	at org.hibernate.loader.plan.exec.process.internal.ResultSetProcessorImpl.extractResults(ResultSetProcessorImpl.java:94) ~[hibernate-core-5.6.12.Final.jar:5.6.12.Final]
	at org.hibernate.loader.plan.exec.internal.AbstractLoadPlanBasedLoader.executeLoad(AbstractLoadPlanBasedLoader.java:105) ~[hibernate-core-5.6.12.Final.jar:5.6.12.Final]
	at org.hibernate.loader.entity.plan.AbstractLoadPlanBasedEntityLoader.load(AbstractLoadPlanBasedEntityLoader.java:285) ~[hibernate-core-5.6.12.Final.jar:5.6.12.Final]
	at org.hibernate.persister.entity.AbstractEntityPersister.doLoad(AbstractEntityPersister.java:4521) ~[hibernate-core-5.6.12.Final.jar:5.6.12.Final]
	at org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:4511) ~[hibernate-core-5.6.12.Final.jar:5.6.12.Final]
	at org.hibernate.event.internal.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:571) ~[hibernate-core-5.6.12.Final.jar:5.6.12.Final]
	at org.hibernate.event.internal.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:539) ~[hibernate-core-5.6.12.Final.jar:5.6.12.Final]
	at org.hibernate.event.internal.DefaultLoadEventListener.load(DefaultLoadEventListener.java:208) ~[hibernate-core-5.6.12.Final.jar:5.6.12.Final]
	at org.hibernate.event.internal.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:327) ~[hibernate-core-5.6.12.Final.jar:5.6.12.Final]
	at org.hibernate.event.internal.DefaultLoadEventListener.doOnLoad(DefaultLoadEventListener.java:108) ~[hibernate-core-5.6.12.Final.jar:5.6.12.Final]
	at org.hibernate.event.internal.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:74) ~[hibernate-core-5.6.12.Final.jar:5.6.12.Final]
	at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:118) ~[hibernate-core-5.6.12.Final.jar:5.6.12.Final]
	at org.hibernate.internal.SessionImpl.fireLoadNoChecks(SessionImpl.java:1231) ~[hibernate-core-5.6.12.Final.jar:5.6.12.Final]
	at org.hibernate.internal.SessionImpl.fireLoad(SessionImpl.java:1220) ~[hibernate-core-5.6.12.Final.jar:5.6.12.Final]
	at org.hibernate.internal.SessionImpl.access$2100(SessionImpl.java:202) ~[hibernate-core-5.6.12.Final.jar:5.6.12.Final]
	at org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.doLoad(SessionImpl.java:2848) ~[hibernate-core-5.6.12.Final.jar:5.6.12.Final]
	at org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.lambda$load$1(SessionImpl.java:2825) ~[hibernate-core-5.6.12.Final.jar:5.6.12.Final]
	at org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.perform(SessionImpl.java:2781) ~[hibernate-core-5.6.12.Final.jar:5.6.12.Final]
	at org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.load(SessionImpl.java:2825) ~[hibernate-core-5.6.12.Final.jar:5.6.12.Final]
	at org.hibernate.internal.SessionImpl.find(SessionImpl.java:3413) ~[hibernate-core-5.6.12.Final.jar:5.6.12.Final]
	at org.hibernate.internal.SessionImpl.find(SessionImpl.java:3380) ~[hibernate-core-5.6.12.Final.jar:5.6.12.Final]
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na]
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
	at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na]
	at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:311) ~[spring-orm-5.3.23.jar:5.3.23]
	at jdk.proxy2/jdk.proxy2.$Proxy155.find(Unknown Source) ~[na:na]
	at org.springframework.data.jpa.repository.support.SimpleJpaRepository.findById(SimpleJpaRepository.java:335) ~[spring-data-jpa-2.7.5.jar:2.7.5]
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na]
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
	at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na]
	at org.springframework.data.repository.core.support.RepositoryMethodInvoker$RepositoryFragmentMethodInvoker.lambda$new$0(RepositoryMethodInvoker.java:289) ~[spring-data-commons-2.7.5.jar:2.7.5]
	at org.springframework.data.repository.core.support.RepositoryMethodInvoker.doInvoke(RepositoryMethodInvoker.java:137) ~[spring-data-commons-2.7.5.jar:2.7.5]
	at org.springframework.data.repository.core.support.RepositoryMethodInvoker.invoke(RepositoryMethodInvoker.java:121) ~[spring-data-commons-2.7.5.jar:2.7.5]
	at org.springframework.data.repository.core.support.RepositoryComposition$RepositoryFragments.invoke(RepositoryComposition.java:530) ~[spring-data-commons-2.7.5.jar:2.7.5]
	at org.springframework.data.repository.core.support.RepositoryComposition.invoke(RepositoryComposition.java:286) ~[spring-data-commons-2.7.5.jar:2.7.5]
	at org.springframework.data.repository.core.support.RepositoryFactorySupport$ImplementationMethodExecutionInterceptor.invoke(RepositoryFactorySupport.java:640) ~[spring-data-commons-2.7.5.jar:2.7.5]
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.23.jar:5.3.23]
	at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.doInvoke(QueryExecutorMethodInterceptor.java:164) ~[spring-data-commons-2.7.5.jar:2.7.5]
	at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.invoke(QueryExecutorMethodInterceptor.java:139) ~[spring-data-commons-2.7.5.jar:2.7.5]
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.23.jar:5.3.23]
	at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:81) ~[spring-data-commons-2.7.5.jar:2.7.5]
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.23.jar:5.3.23]
	at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:123) ~[spring-tx-5.3.23.jar:5.3.23]
	at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:388) ~[spring-tx-5.3.23.jar:5.3.23]
	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) ~[spring-tx-5.3.23.jar:5.3.23]
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.23.jar:5.3.23]
	at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137) ~[spring-tx-5.3.23.jar:5.3.23]
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.23.jar:5.3.23]
	at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:174) ~[spring-data-jpa-2.7.5.jar:2.7.5]
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.23.jar:5.3.23]
	at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97) ~[spring-aop-5.3.23.jar:5.3.23]
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.23.jar:5.3.23]
	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:215) ~[spring-aop-5.3.23.jar:5.3.23]
	at jdk.proxy2/jdk.proxy2.$Proxy173.findById(Unknown Source) ~[na:na]
	at io.vanillabp.camunda7.wiring.ProcessEntityELResolver.lambda$getValue$6(ProcessEntityELResolver.java:118) ~[camunda7-spring-boot-adapter-1.0.7.jar:na]
	at java.base/java.util.Optional.orElseGet(Optional.java:364) ~[na:na]
	at io.vanillabp.camunda7.wiring.ProcessEntityELResolver.getValue(ProcessEntityELResolver.java:107) ~[camunda7-spring-boot-adapter-1.0.7.jar:na]
	at org.camunda.bpm.engine.impl.javax.el.CompositeELResolver.getValue(CompositeELResolver.java:231) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.juel.AstIdentifier.eval(AstIdentifier.java:81) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.juel.AstUnary$SimpleOperator.eval(AstUnary.java:28) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.juel.AstUnary.eval(AstUnary.java:60) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.juel.AstEval.eval(AstEval.java:50) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.juel.AstNode.getValue(AstNode.java:26) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.juel.TreeValueExpression.getValue(TreeValueExpression.java:114) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.delegate.ExpressionGetInvocation.invoke(ExpressionGetInvocation.java:40) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.delegate.DelegateInvocation.proceed(DelegateInvocation.java:58) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.delegate.DefaultDelegateInterceptor.handleInvocationInContext(DefaultDelegateInterceptor.java:92) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.delegate.DefaultDelegateInterceptor.handleInvocation(DefaultDelegateInterceptor.java:63) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	at org.camunda.bpm.engine.impl.el.JuelExpression.getValue(JuelExpression.java:60) ~[camunda-engine-7.17.6-ee.jar:7.17.6-ee]
	... 101 common frames omitted

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.