1616
1717package com .techsenger .mvvm4fx .core ;
1818
19+ import java .util .UUID ;
20+ import javafx .beans .property .ObjectProperty ;
21+ import javafx .beans .property .ReadOnlyObjectProperty ;
22+ import javafx .beans .property .ReadOnlyObjectWrapper ;
23+ import javafx .beans .property .SimpleObjectProperty ;
1924import org .slf4j .Logger ;
2025import org .slf4j .LoggerFactory ;
2126
@@ -27,76 +32,233 @@ public abstract class AbstractComponent<T extends AbstractComponentView<?>> impl
2732
2833 private static final Logger logger = LoggerFactory .getLogger (AbstractComponent .class );
2934
35+ private static String logDelimiter = " :" ;
36+
37+ public static String getLogDelimiter () {
38+ return logDelimiter ;
39+ }
40+
41+ public static void setLogDelimiter (String logDelimiter ) {
42+ AbstractComponent .logDelimiter = logDelimiter ;
43+ }
44+
3045 protected abstract class Mediator implements ComponentMediator {
3146
47+ @ Override
48+ public ComponentName getName () {
49+ return AbstractComponent .this .getName ();
50+ }
51+
52+ @ Override
53+ public UUID getUuid () {
54+ return uuid ;
55+ }
56+
57+ @ Override
58+ public String getFullName () {
59+ return fullName ;
60+ }
61+
62+ @ Override
63+ public String getLogPrefix () {
64+ return logPrefix ;
65+ }
66+
67+ @ Override
68+ public ComponentState getState () {
69+ return state .get ();
70+ }
71+
72+ @ Override
73+ public ReadOnlyObjectProperty <ComponentState > stateProperty () {
74+ return state .getReadOnlyProperty ();
75+ }
76+
77+ @ Override
78+ public ObjectProperty <HistoryPolicy > historyPolicyProperty () {
79+ return historyPolicy ;
80+ }
81+
82+ @ Override
83+ public HistoryPolicy getHistoryPolicy () {
84+ return historyPolicy .get ();
85+ }
86+
87+ @ Override
88+ public void setHistoryPolicy (HistoryPolicy policy ) {
89+ historyPolicy .set (policy );
90+ }
91+
92+ @ Override
93+ public ComponentHistory <?> getHistory () {
94+ return history ;
95+ }
96+
97+ @ Override
98+ public ComponentGroup getGroup () {
99+ return group .get ();
100+ }
101+
102+ @ Override
103+ public void setGroup (ComponentGroup value ) {
104+ group .set (value );
105+ }
106+
107+ @ Override
108+ public ObjectProperty <ComponentGroup > groupProperty () {
109+ return group ;
110+ }
32111 }
33112
34113 private final T view ;
35114
115+ private final UUID uuid = UUID .randomUUID ();
116+
117+ private final String fullName ;
118+
119+ private final String logPrefix ;
120+
121+ private final ReadOnlyObjectWrapper <ComponentState > state = new ReadOnlyObjectWrapper <>(ComponentState .CREATING );
122+
123+ private final ObjectProperty <HistoryPolicy > historyPolicy = new SimpleObjectProperty <>(HistoryPolicy .NONE );
124+
125+ private final ObjectProperty <ComponentGroup > group = new SimpleObjectProperty <>();
126+
127+ private HistoryProvider historyProvider ;
128+
129+ private ComponentHistory <?> history ;
130+
36131 public AbstractComponent (T view ) {
37132 this .view = view ;
38133 this .view .setComponent (this );
134+ long least32bits = uuid .getLeastSignificantBits () & 0xFFFFFFFFL ;
135+ String shortUuid = String .format ("%08X" , least32bits );
136+ this .fullName = getName ().getText () + "@" + shortUuid ;
137+ this .logPrefix = resolveLogPrefix (fullName );
39138 }
40139
41140 @ Override
42141 public T getView () {
43142 return view ;
44143 }
45144
145+ @ Override
146+ public UUID getUuid () {
147+ return uuid ;
148+ }
149+
150+ @ Override
151+ public String getFullName () {
152+ return fullName ;
153+ }
154+
155+ @ Override
156+ public String getLogPrefix () {
157+ return logPrefix ;
158+ }
159+
160+ @ Override
161+ public ComponentState getState () {
162+ return this .state .get ();
163+ }
164+
165+ @ Override
166+ public ReadOnlyObjectProperty <ComponentState > stateProperty () {
167+ return state .getReadOnlyProperty ();
168+ }
169+
170+ @ Override
171+ public ObjectProperty <HistoryPolicy > historyPolicyProperty () {
172+ return historyPolicy ;
173+ }
174+
175+ @ Override
176+ public HistoryPolicy getHistoryPolicy () {
177+ return historyPolicy .get ();
178+ }
179+
180+ @ Override
181+ public void setHistoryPolicy (HistoryPolicy policy ) {
182+ historyPolicy .set (policy );
183+ }
184+
185+ @ Override
186+ public ComponentHistory <?> getHistory () {
187+ return history ;
188+ }
189+
190+ @ Override
191+ public ComponentGroup getGroup () {
192+ return group .get ();
193+ }
194+
195+ @ Override
196+ public void setGroup (ComponentGroup value ) {
197+ group .set (value );
198+ }
199+
200+ @ Override
201+ public ObjectProperty <ComponentGroup > groupProperty () {
202+ return group ;
203+ }
204+
46205 @ Override
47206 public final void initialize () {
48207 var viewModel = this .view .getViewModel ();
49- var descriptor = viewModel .getDescriptor ();
50208 try {
51- var currentState = descriptor .getState ();
52- if (currentState != ComponentState .CREATING ) {
53- throw new IllegalStateException ("Unexpected state of the component - " + currentState .name ());
209+ if (getState () != ComponentState .CREATING ) {
210+ throw new IllegalStateException ("Unexpected state of the component - " + getState ().name ());
54211 }
55212 // pre-initialization
56213 preInitialize ();
57214 // initialization
58- descriptor . getStateWrapper () .set (ComponentState .INITIALIZING );
215+ state .set (ComponentState .INITIALIZING );
59216 viewModel .initialize ();
60217 this .view .initialize ();
61- descriptor . getStateWrapper () .set (ComponentState .INITIALIZED );
62- logger .debug ("{} Initialized component" , descriptor . getLogPrefix () );
218+ state .set (ComponentState .INITIALIZED );
219+ logger .debug ("{} Initialized component" , logPrefix );
63220 // post-initialization
64221 postInitialize ();
65222 } catch (Exception ex ) {
66- logger .error ("{} Error initializing" , descriptor . getLogPrefix () , ex );
223+ logger .error ("{} Error initializing" , logPrefix , ex );
67224 }
68225 }
69226
70227 @ Override
71228 public final void deinitialize () {
72229 var viewModel = this .view .getViewModel ();
73- var descriptor = viewModel .getDescriptor ();
74230 try {
75- var currentState = descriptor .getState ();
76- if (currentState != ComponentState .INITIALIZED ) {
77- throw new IllegalStateException ("Unexpected state of the component - " + currentState .name ());
231+ if (getState () != ComponentState .INITIALIZED ) {
232+ throw new IllegalStateException ("Unexpected state of the component - " + getState ().name ());
78233 }
79234 // pre-deinitialization
80235 preDeinitialize ();
81236 // deinitialization
82- descriptor . getStateWrapper () .set (ComponentState .DEINITIALIZING );
237+ state .set (ComponentState .DEINITIALIZING );
83238 this .view .deinitialize ();
84239 viewModel .deinitialize ();
85- descriptor . getStateWrapper () .set (ComponentState .DEINITIALIZED );
86- logger .debug ("{} Deinitialized component" , descriptor . getLogPrefix () );
240+ state .set (ComponentState .DEINITIALIZED );
241+ logger .debug ("{} Deinitialized component" , logPrefix );
87242 // post-deinitialization
88243 postDeinitialize ();
89244 } catch (Exception ex ) {
90- logger .error ("{} Error deinitializing" , descriptor . getLogPrefix () , ex );
245+ logger .error ("{} Error deinitializing" , logPrefix , ex );
91246 }
92247 }
93248
249+ protected String resolveLogPrefix (String fullName ) {
250+ return fullName + logDelimiter ;
251+ }
252+
94253 /**
95254 * The first method called in initialization.
96255 */
97256 protected void preInitialize () {
98257 var mediator = createMediator ();
99258 this .view .getViewModel ().setMediator (mediator );
259+ if (this .historyProvider != null ) {
260+ this .history = this .historyProvider .provide ();
261+ }
100262 this .view .getViewModel ().restoreHistory ();
101263 }
102264
@@ -114,7 +276,13 @@ protected void preDeinitialize() { }
114276 * The last method called in deinitialization.
115277 */
116278 protected void postDeinitialize () {
117- this .view .getViewModel ().saveHistory ();
279+ if (this .history != null ) {
280+ this .view .getViewModel ().saveHistory ();
281+ }
282+ }
283+
284+ protected void setHistoryProvider (HistoryProvider historyProvider ) {
285+ this .historyProvider = historyProvider ;
118286 }
119287
120288 protected abstract AbstractComponent .Mediator createMediator ();
0 commit comments