21
21
import java .util .Map ;
22
22
import java .util .Optional ;
23
23
import java .util .concurrent .ConcurrentHashMap ;
24
+ import java .util .function .BiConsumer ;
24
25
26
+ import org .jspecify .annotations .NonNull ;
25
27
import org .jspecify .annotations .Nullable ;
26
28
27
29
import org .apache .causeway .applib .layout .grid .Grid ;
30
32
import org .apache .causeway .commons .internal .base ._Strings ;
31
33
import org .apache .causeway .commons .internal .exceptions ._Exceptions ;
32
34
import org .apache .causeway .core .metamodel .facetapi .Facet ;
33
- import org .apache .causeway .core .metamodel .facetapi .FacetAbstract ;
34
35
import org .apache .causeway .core .metamodel .facetapi .FacetHolder ;
35
36
import org .apache .causeway .core .metamodel .facets .object .layout .LayoutPrefixFacet ;
36
37
import org .apache .causeway .core .metamodel .object .ManagedObject ;
37
38
import org .apache .causeway .core .metamodel .object .ManagedObjects ;
38
39
import org .apache .causeway .core .metamodel .spec .ObjectSpecification ;
39
40
40
- import org .jspecify .annotations .NonNull ;
41
-
42
- public class GridFacetDefault
43
- extends FacetAbstract
41
+ record GridFacetDefault (
42
+ GridService gridService ,
43
+ Map <String , Grid > gridByLayoutPrefix ,
44
+ _Lazy <LayoutPrefixFacet > layoutFacetLazy ,
45
+ @ NonNull FacetHolder facetHolder ,
46
+ Facet .@ NonNull Precedence precedence )
44
47
implements GridFacet {
45
48
46
- private static final Class <? extends Facet > type () {
47
- return GridFacet .class ;
48
- }
49
+ // -- FACTORIES
49
50
50
51
public static GridFacet create (
51
52
final FacetHolder facetHolder ,
52
53
final GridService gridService ) {
53
- return new GridFacetDefault (facetHolder , gridService );
54
+ return new GridFacetDefault (gridService , new ConcurrentHashMap <>(),
55
+ _Lazy .threadSafe (()->facetHolder .getFacet (LayoutPrefixFacet .class )),
56
+ facetHolder , Precedence .DEFAULT );
54
57
}
55
58
56
- private final GridService gridService ;
57
-
58
- private final _Lazy <LayoutPrefixFacet > layoutFacetLazy = _Lazy .threadSafe (()->
59
- getFacetHolder ().getFacet (LayoutPrefixFacet .class ));
59
+ // -- METHODS
60
60
61
- private final Map <String , Grid > gridByLayoutName = new ConcurrentHashMap <>();
62
-
63
- private GridFacetDefault (
64
- final FacetHolder facetHolder ,
65
- final GridService gridService ) {
66
- super (GridFacetDefault .type (), facetHolder );
67
- this .gridService = gridService ;
68
- }
61
+ @ Override public Class <? extends Facet > facetType () { return GridFacet .class ; }
62
+ @ Override public Precedence getPrecedence () { return precedence (); }
63
+ @ Override public FacetHolder getFacetHolder () { return facetHolder (); }
69
64
70
65
@ Override
71
66
public Grid getGrid (final @ Nullable ManagedObject objectAdapter ) {
72
-
73
67
guardAgainstObjectOfDifferentType (objectAdapter );
74
68
75
69
// gridByLayoutName is used as cache, unless gridService.supportsReloading() returns true
76
- return gridByLayoutName .compute (layoutNameFor (objectAdapter ),
77
- (layoutName , cachedLayout )->
70
+ return gridByLayoutPrefix .compute (layoutPrefixFor (objectAdapter ),
71
+ (layoutPrefix , cachedLayout )->
78
72
(cachedLayout ==null
79
73
|| gridService .supportsReloading ())
80
- ? this .load (layoutName )
74
+ ? this .load (layoutPrefix )
81
75
: cachedLayout
82
76
);
77
+ }
83
78
79
+ @ Override
80
+ public void visitAttributes (final BiConsumer <String , Object > visitor ) {
81
+ visitor .accept ("precedence" , getPrecedence ().name ());
84
82
}
85
83
86
84
// -- HELPER
87
85
88
86
private void guardAgainstObjectOfDifferentType (final @ Nullable ManagedObject objectAdapter ) {
89
-
90
- if (ManagedObjects .isNullOrUnspecifiedOrEmpty (objectAdapter )) {
91
- return ; // cannot introspect
92
- }
93
-
87
+ if (ManagedObjects .isNullOrUnspecifiedOrEmpty (objectAdapter )) return ; // cannot introspect
94
88
if (!getSpecification ().equals (objectAdapter .getSpecification ())) {
95
89
throw _Exceptions .unrecoverable (
96
90
"getGrid(adapter) was called passing an adapter (type: %s), "
@@ -101,26 +95,24 @@ private void guardAgainstObjectOfDifferentType(final @Nullable ManagedObject obj
101
95
}
102
96
}
103
97
104
- private String layoutNameFor (final @ Nullable ManagedObject objectAdapter ) {
105
- if (! hasLayoutFacet ( )
106
- || ManagedObjects . isNullOrUnspecifiedOrEmpty ( objectAdapter )) {
98
+ private String layoutPrefixFor (final @ Nullable ManagedObject objectAdapter ) {
99
+ if (ManagedObjects . isNullOrUnspecifiedOrEmpty ( objectAdapter )
100
+ || ! hasLayoutPrefixFacet ( )) {
107
101
return "" ;
108
102
}
109
103
var layoutName = _Strings .nullToEmpty (layoutFacetLazy .get ().layoutPrefix (objectAdapter ));
110
104
return layoutName ;
111
105
}
112
106
113
- private boolean hasLayoutFacet () {
107
+ private boolean hasLayoutPrefixFacet () {
114
108
return layoutFacetLazy .get ()!=null ;
115
109
}
116
110
117
- private Grid load (final @ NonNull String layoutName ) {
118
-
111
+ private Grid load (final @ NonNull String layoutPrefix ) {
119
112
var domainClass = getSpecification ().getCorrespondingClass ();
120
-
121
113
var grid = Optional .ofNullable (
122
114
// loads from object's XML if available
123
- gridService .load (domainClass , _Strings .emptyToNull (layoutName )))
115
+ gridService .load (domainClass , _Strings .emptyToNull (layoutPrefix )))
124
116
// loads from default-XML if available
125
117
.orElseGet (()->gridService .defaultGridFor (domainClass ));
126
118
return gridService .normalize (grid );
0 commit comments