Skip to content

Commit 339ce10

Browse files
committed
CAUSEWAY-3995: immediately after MM init, clear all layout caches
1 parent 89b8348 commit 339ce10

6 files changed

Lines changed: 38 additions & 5 deletions

File tree

api/applib/src/main/java/org/apache/causeway/applib/services/grid/GridService.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,4 +93,6 @@ public LayoutKey(final Class<?> domainClass) {
9393
EnumSet<CommonMimeType> supportedFormats();
9494
Optional<GridMarshaller> marshaller(CommonMimeType format);
9595

96+
void clearCache();
97+
9698
}

core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/grid/BSGridFacet.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,11 @@ public void visitAttributes(final BiConsumer<String, Object> visitor) {
7777
visitor.accept("precedence", precedence().name());
7878
}
7979

80+
@Override
81+
public void clearCache() {
82+
normalizedGridByLayoutPrefix.clear();
83+
}
84+
8085
// -- HELPER
8186

8287
/**
@@ -139,6 +144,7 @@ final static class NoLayout implements GridFacet {
139144
@Override public BSGrid getGrid(@Nullable final ManagedObject mo) {
140145
return null;
141146
}
147+
@Override public void clearCache() {}
142148
}
143149

144150
}

core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/grid/GridFacet.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,4 +35,6 @@ public interface GridFacet extends Facet {
3535

3636
BSGrid getGrid(@Nullable ManagedObject mo);
3737

38+
void clearCache();
39+
3840
}

core/metamodel/src/main/java/org/apache/causeway/core/metamodel/services/grid/GridCache.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,5 +61,9 @@ public void remove(final Class<?> domainClass) {
6161
public Try<BSGrid> computeIfAbsent(final LayoutKey layoutKey, final Function<LayoutKey, Try<BSGrid>> factory) {
6262
return gridsByKey.computeIfAbsent(layoutKey, factory);
6363
}
64+
65+
public void clear() {
66+
gridsByKey.map().clear();
67+
}
6468

6569
}

core/metamodel/src/main/java/org/apache/causeway/core/metamodel/services/grid/GridServiceDefault.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,11 @@ public void invalidate(final Class<?> domainClass) {
9898
cache.remove(domainClass);
9999
}
100100
}
101+
102+
@Override
103+
public void clearCache() {
104+
cache.clear();
105+
}
101106

102107
@Override
103108
public BSGrid load(final LayoutKey layoutKey) {

core/metamodel/src/main/java/org/apache/causeway/core/metamodel/specloader/SpecificationLoaderDefault.java

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -36,14 +36,11 @@
3636
import javax.inject.Named;
3737
import javax.inject.Provider;
3838

39-
import org.springframework.beans.factory.annotation.Qualifier;
40-
import org.springframework.lang.Nullable;
41-
import org.springframework.stereotype.Service;
42-
4339
import org.apache.causeway.applib.Identifier;
4440
import org.apache.causeway.applib.annotation.PriorityPrecedence;
4541
import org.apache.causeway.applib.annotation.SemanticsOf;
4642
import org.apache.causeway.applib.id.LogicalType;
43+
import org.apache.causeway.applib.services.grid.GridService;
4744
import org.apache.causeway.applib.services.menu.MenuBarsService;
4845
import org.apache.causeway.applib.services.metamodel.BeanSort;
4946
import org.apache.causeway.applib.services.registry.ServiceRegistry;
@@ -68,6 +65,7 @@
6865
import org.apache.causeway.core.metamodel.commons.ClassUtil;
6966
import org.apache.causeway.core.metamodel.context.MetaModelContext;
7067
import org.apache.causeway.core.metamodel.facetapi.Facet;
68+
import org.apache.causeway.core.metamodel.facets.object.grid.GridFacet;
7169
import org.apache.causeway.core.metamodel.progmodel.ProgrammingModel;
7270
import org.apache.causeway.core.metamodel.progmodel.ProgrammingModelService;
7371
import org.apache.causeway.core.metamodel.progmodels.dflt.ProgrammingModelFacetsJava11;
@@ -84,6 +82,9 @@
8482
import org.apache.causeway.core.metamodel.specloader.validator.ValidationFailures;
8583
import org.apache.causeway.core.metamodel.valuetypes.ValueSemanticsResolverDefault;
8684
import org.apache.causeway.core.security.authorization.manager.ActionSemanticsResolver;
85+
import org.springframework.beans.factory.annotation.Qualifier;
86+
import org.springframework.lang.Nullable;
87+
import org.springframework.stereotype.Service;
8788

8889
import lombok.Getter;
8990
import lombok.NonNull;
@@ -322,6 +323,9 @@ public void createMetaModel() {
322323

323324
log.info(" - running remaining validators");
324325
_Blackhole.consume(getOrAssessValidationResult()); // as a side effect memoizes the validation result
326+
327+
log.info(" - clearing layout caches");
328+
clearLayoutCaches();
325329

326330
stopWatch.stop();
327331
log.info("Metamodel created in " + stopWatch.getMillis() + " ms.");
@@ -331,7 +335,7 @@ public void createMetaModel() {
331335
}
332336
}
333337

334-
@Override
338+
@Override
335339
public Optional<ValidationFailures> getValidationResult() {
336340
return validationResult.getMemoized();
337341
}
@@ -344,6 +348,7 @@ public ValidationFailures getOrAssessValidationResult() {
344348
@Override
345349
public void disposeMetaModel() {
346350
waitForValidationToFinish();
351+
clearLayoutCaches();
347352
logicalTypeResolver.clear();
348353
cache.clear();
349354
validationResult.clear();
@@ -688,5 +693,14 @@ private void invalidateCache(final Class<?> cls) {
688693
spec = spec.superclass();
689694
}
690695
}
696+
697+
private void clearLayoutCaches() {
698+
cache.forEachConcurrent(spec->{
699+
spec.lookupFacet(GridFacet.class)
700+
.ifPresent(GridFacet::clearCache);
701+
});
702+
serviceRegistry.lookupService(GridService.class)
703+
.ifPresent(GridService::clearCache);
704+
}
691705

692706
}

0 commit comments

Comments
 (0)