1 /*
2 * *************************************************************************************************************************************************************
3 *
4 * TheseFoolishThings: Miscellaneous utilities
5 * http://tidalwave.it/projects/thesefoolishthings
6 *
7 * Copyright (C) 2009 - 2025 by Tidalwave s.a.s. (http://tidalwave.it)
8 *
9 * *************************************************************************************************************************************************************
10 *
11 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License.
12 * You may obtain a copy of the License at
13 *
14 * http://www.apache.org/licenses/LICENSE-2.0
15 *
16 * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
17 * CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
18 *
19 * *************************************************************************************************************************************************************
20 *
21 * git clone https://bitbucket.org/tidalwave/thesefoolishthings-src
22 * git clone https://github.com/tidalwave-it/thesefoolishthings-src
23 *
24 * *************************************************************************************************************************************************************
25 */
26 package it.tidalwave.role.spi;
27
28 import jakarta.annotation.Nonnull;
29 import java.util.List;
30 import it.tidalwave.util.LazySupplier;
31 import static it.tidalwave.util.impl.ServiceLoaderLocator.lazySupplierOf;
32
33 /***************************************************************************************************************************************************************
34 *
35 * A service which retrieves DCI Roles for a given object.
36 *
37 * @author Fabrizio Giudici
38 *
39 **************************************************************************************************************************************************************/
40 @FunctionalInterface
41 public interface SystemRoleFactory
42 {
43 static class Inner
44 {
45 private static final LazySupplier<SystemRoleFactory> INSTANCE_REF =
46 LazySupplier.of(() -> Inner.PROVIDER_REF.get().getSystemRoleFactory());
47
48 private static final LazySupplier<SystemRoleFactoryProvider> PROVIDER_REF =
49 lazySupplierOf(SystemRoleFactoryProvider.class);
50 }
51
52 /***********************************************************************************************************************************************************
53 * Returns a singleton instance.
54 *
55 * @return the singleton instance
56 **********************************************************************************************************************************************************/
57 @Nonnull
58 public static SystemRoleFactory getInstance()
59 {
60 return Inner.INSTANCE_REF.get();
61 }
62
63 /***********************************************************************************************************************************************************
64 * Removes a previously installed {@link SystemRoleFactory}. <b>This method is for testing only (used to clean up a
65 * testing context).</b>
66 *
67 * @see #set(SystemRoleFactory)
68 **********************************************************************************************************************************************************/
69 public static void reset()
70 {
71 Inner.PROVIDER_REF.clear();
72 Inner.INSTANCE_REF.clear();
73 }
74
75 /***********************************************************************************************************************************************************
76 * Installs a {@link SystemRoleFactory}. <b>This method is for testing only (used to set up a testing context).</b>
77 *
78 * @param systemRoleFactory the {@link SystemRoleFactory}
79 * @see #reset()
80 **********************************************************************************************************************************************************/
81 public static void set (@Nonnull final SystemRoleFactory systemRoleFactory)
82 {
83 Inner.PROVIDER_REF.set(() -> systemRoleFactory);
84 }
85
86 /***********************************************************************************************************************************************************
87 * Retrieves the roles of the given class for the given owner object.
88 *
89 * @param <T> the static type of the roles
90 * @param owner the owner object
91 * @param roleType the dynamic type of the roles
92 * @return a list of roles
93 **********************************************************************************************************************************************************/
94 @Nonnull
95 public <T> List<T> findRoles (@Nonnull Object owner, @Nonnull Class<? extends T> roleType);
96 }