1 /*
2 * Copyright (c) 2022-2023. Roland T. Lichti, Kaiserpfalz EDV-Service.
3 *
4 * This program is free software: you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation, either version 3 of the License, or
7 * (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program. If not, see <https://www.gnu.org/licenses/>.
16 */
17
18 package de.kaiserpfalzedv.commons.rest.workflow;
19
20 import java.util.Optional;
21
22 import de.kaiserpfalzedv.commons.api.workflow.WorkflowInfo;
23 import de.kaiserpfalzedv.commons.core.workflow.WorkflowInfoImpl;
24 import jakarta.enterprise.inject.Produces;
25 import jakarta.inject.Singleton;
26 import jakarta.validation.constraints.NotNull;
27
28 /**
29 * WorkflowProvider -- Provides the workflow data of the current request.
30 *
31 * @author klenkes74 {@literal <rlichti@kaiserpfalz-edv.de>}
32 * @since 2.0.0 2022-01-04
33 */
34 @Singleton
35 public class WorkflowProvider {
36 private final ThreadLocal<WorkflowInfo> workflowRepository = new WorkflowInfoThreadLocal();
37
38 @Produces
39 public Optional<WorkflowInfo> getWorkflowInfo() {
40 return Optional.ofNullable(workflowRepository.get());
41 }
42
43 public void registerWorkflowInfo(@NotNull final WorkflowInfo context) {
44 workflowRepository.set(context);
45 }
46
47 public void unregisterWorkflowInfo() {
48 workflowRepository.remove();
49 }
50
51 /**
52 * Subclass of {@link ThreadLocal} to generate an initial {@link WorkflowInfoImpl}.
53 */
54 private static class WorkflowInfoThreadLocal extends ThreadLocal<WorkflowInfo> {
55 @Override
56 public WorkflowInfoImpl initialValue() {
57 return WorkflowInfoImpl.builder().build();
58 }
59 }
60 }