Skip to contentMethod: asComparing()
1: /*
2: * *************************************************************************************************************************************************************
3: *
4: * TheseFoolishThings: Miscellaneous utilities
5: * http://tidalwave.it/projects/thesefoolishthings
6: *
7: * Copyright (C) 2009 - 2024 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.ui;
27:
28: import javax.annotation.Nonnull;
29: import java.util.Comparator;
30: import java.util.function.Consumer;
31: import java.util.function.Function;
32: import java.util.function.Supplier;
33: import it.tidalwave.util.As;
34: import it.tidalwave.role.ui.impl.AsDisplayableComparator;
35: import it.tidalwave.role.ui.impl.DefaultDisplayable;
36: import it.tidalwave.role.ui.impl.DisplayableComparator;
37: import static it.tidalwave.util.BundleUtilities.getMessage;
38:
39: /***************************************************************************************************************************************************************
40: *
41: * The role of an object which can provide its own display name.
42: *
43: * @stereotype Role
44: *
45: * @author Fabrizio Giudici
46: * @it.tidalwave.javadoc.stable
47: *
48: **************************************************************************************************************************************************************/
49: @FunctionalInterface
50: public interface Displayable
51: {
52: public static final Class<Displayable> _Displayable_ = Displayable.class;
53:
54: /***********************************************************************************************************************************************************
55: * A default {@code Displayable} with an empty display name.
56: **********************************************************************************************************************************************************/
57: public static final Displayable DEFAULT = new DefaultDisplayable("", "DEFAULT");
58:
59: /***********************************************************************************************************************************************************
60: * Returns the display name in the current {@link java.util.Locale}.
61: *
62: * @return the display name
63: **********************************************************************************************************************************************************/
64: @Nonnull
65: public String getDisplayName();
66:
67: /***********************************************************************************************************************************************************
68: * Sends the display name in the current {@link java.util.Locale} to a given customer.
69: *
70: * @param consumer the {@code Consumer}
71: * @since 3.2-ALPHA-15
72: **********************************************************************************************************************************************************/
73: @SuppressWarnings("BoundedWildcard")
74: public default void display (@Nonnull final Consumer<String> consumer)
75: {
76: consumer.accept(getDisplayName());
77: }
78:
79: /***********************************************************************************************************************************************************
80: * Creates an instance with a given display name.
81: *
82: * @param displayName the display name
83: * @return the new instance
84: * @since 3.2-ALPHA-1 (was {@code DefaultDisplayable}
85: **********************************************************************************************************************************************************/
86: @Nonnull
87: public static Displayable of (@Nonnull final String displayName)
88: {
89: return of(displayName, "???");
90: }
91:
92: /***********************************************************************************************************************************************************
93: * Creates an instance with a given display name iand an explicit label for {@code toString()}.
94: *
95: * @param displayName the display name
96: * @param toStringName the name to be rendered when {@code toString()} is called
97: * @return the new instance
98: * @since 3.2-ALPHA-1 (was {@code DefaultDisplayable}
99: **********************************************************************************************************************************************************/
100: @Nonnull
101: public static Displayable of (@Nonnull final String displayName, @Nonnull final String toStringName)
102: {
103: return new DefaultDisplayable(displayName, toStringName);
104: }
105:
106: /***********************************************************************************************************************************************************
107: * Creates an instance from a {@link Supplier}{@code <String>}. The supplier is invoked each time
108: * {@link #getDisplayName()} is called.
109: *
110: * @param supplier the {@code Supplier}
111: * @return the new instance
112: * @since 3.2-ALPHA-3
113: * @it.tidalwave.javadoc.experimental
114: **********************************************************************************************************************************************************/
115: @Nonnull
116: public static Displayable of (@Nonnull final Supplier<String> supplier)
117: {
118: return supplier::get;
119: }
120:
121: /***********************************************************************************************************************************************************
122: * Creates an instance from a {@link Function}{@code <T, String>} and a generic object that the function is applied
123: * to. The function is invoked each time {@link #getDisplayName()} is called.
124: *
125: * @param <T> the type of the object
126: * @param function the {@code Function}
127: * @param object the object
128: * @return the new instance
129: * @since 3.2-ALPHA-3
130: * @it.tidalwave.javadoc.experimental
131: **********************************************************************************************************************************************************/
132: @Nonnull
133: public static <T> Displayable of (@Nonnull final Function<T, String> function, @Nonnull final T object)
134: {
135: return () -> function.apply(object);
136: }
137:
138: /***********************************************************************************************************************************************************
139: * Creates a {@link LocalizedDisplayable} from a resource bundle. The bundle resource file is named
140: * {@code Bundle.properties} and it should be placed in the same package as the owner class.
141: *
142: * @param ownerClass the class that owns the bundle
143: * @param key the resource key
144: * @return the new instance
145: * @since 3.2-ALPHA-1 (was previously in {@code Displayable8}
146: **********************************************************************************************************************************************************/
147: @Nonnull
148: public static LocalizedDisplayable fromBundle (@Nonnull final Class<?> ownerClass, @Nonnull final String key)
149: {
150: return new DefaultDisplayable(getMessage(ownerClass, key));
151: }
152:
153: /***********************************************************************************************************************************************************
154: * Returns a {@link Comparator} for comparing two instances of {@code Displayable}.
155: *
156: * @return the {@code Comparator}
157: * @since 3.2-ALPHA-6
158: **********************************************************************************************************************************************************/
159: @Nonnull
160: public static Comparator<Displayable> comparing()
161: {
162: return DisplayableComparator.getInstance();
163: }
164:
165: /***********************************************************************************************************************************************************
166: * Returns a {@link Comparator} for comparing two instances of objects implementing {@code As} that contain the
167: * {@code Displayable} role.
168: *
169: * @return the {@code Comparator}
170: * @since 3.2-ALPHA-6
171: **********************************************************************************************************************************************************/
172: @Nonnull
173: public static Comparator<As> asComparing()
174: {
175: return AsDisplayableComparator.getInstance();
176: }
177: }