Browse Source

pass cascade flag from fk to reference, respect cascade flag in deleteDependencies

tags/2.0.1
Jonathan Cobb 4 years ago
parent
commit
7937eb3f39
3 changed files with 14 additions and 4 deletions
  1. +7
    -1
      wizard-common/src/main/java/org/cobbzilla/wizard/model/entityconfig/EntityFieldReference.java
  2. +1
    -1
      wizard-common/src/main/java/org/cobbzilla/wizard/model/entityconfig/EntityReferences.java
  3. +6
    -2
      wizard-server/src/main/java/org/cobbzilla/wizard/server/config/PgRestServerConfiguration.java

+ 7
- 1
wizard-common/src/main/java/org/cobbzilla/wizard/model/entityconfig/EntityFieldReference.java View File

@@ -2,6 +2,7 @@ package org.cobbzilla.wizard.model.entityconfig;


import lombok.*; import lombok.*;


import static org.cobbzilla.util.daemon.ZillaRuntime.bool;
import static org.cobbzilla.util.daemon.ZillaRuntime.empty; import static org.cobbzilla.util.daemon.ZillaRuntime.empty;


/** /**
@@ -11,9 +12,10 @@ import static org.cobbzilla.util.daemon.ZillaRuntime.empty;
@NoArgsConstructor @EqualsAndHashCode(of={"entity", "field"}) @ToString(of={"entity", "field"}) @NoArgsConstructor @EqualsAndHashCode(of={"entity", "field"}) @ToString(of={"entity", "field"})
public class EntityFieldReference { public class EntityFieldReference {


public EntityFieldReference (String entity, String field) {
public EntityFieldReference (String entity, String field, Boolean cascade) {
this.entity = entity; this.entity = entity;
this.field = field; this.field = field;
this.cascade = cascade;
} }


/** A special value that can be used by child entities to indicate that the lexically enclosing entity is their parent. */ /** A special value that can be used by child entities to indicate that the lexically enclosing entity is their parent. */
@@ -36,4 +38,8 @@ public class EntityFieldReference {
*/ */
@Getter @Setter private String finder; @Getter @Setter private String finder;


/** Should a deletion of an entity cascade to the entity referenced? */
@Getter @Setter private Boolean cascade;
public boolean cascade() { return bool(cascade); }

} }

+ 1
- 1
wizard-common/src/main/java/org/cobbzilla/wizard/model/entityconfig/EntityReferences.java View File

@@ -85,7 +85,7 @@ public class EntityReferences {
Arrays.stream(dependencyOrParent.getDeclaredFields()) Arrays.stream(dependencyOrParent.getDeclaredFields())
.filter(FIELD_HAS_FK) .filter(FIELD_HAS_FK)
.filter(f -> f.getAnnotation(ECForeignKey.class).entity().equals(entityClass)) .filter(f -> f.getAnnotation(ECForeignKey.class).entity().equals(entityClass))
.forEach(f -> refs.add(new EntityFieldReference(dependency.getName(), f.getName())));
.forEach(f -> refs.add(new EntityFieldReference(dependency.getName(), f.getName(), f.getAnnotation(ECForeignKey.class).cascade())));
refs.addAll(getDependencyRefs(entityClass, dependency, dependencyOrParent.getSuperclass(), refs)); refs.addAll(getDependencyRefs(entityClass, dependency, dependencyOrParent.getSuperclass(), refs));
return refs; return refs;
} }


+ 6
- 2
wizard-server/src/main/java/org/cobbzilla/wizard/server/config/PgRestServerConfiguration.java View File

@@ -347,12 +347,12 @@ public class PgRestServerConfiguration extends RestServerConfiguration implement
return reversed; return reversed;
} }


private Map<Class<? extends Identifiable>, List<Class<? extends Identifiable>>> dependencyCache = new ConcurrentHashMap<>();
private final Map<Class<? extends Identifiable>, List<Class<? extends Identifiable>>> dependencyCache = new ConcurrentHashMap<>();
public List<Class<? extends Identifiable>> getDependencies (Class<? extends Identifiable> entityClass) { public List<Class<? extends Identifiable>> getDependencies (Class<? extends Identifiable> entityClass) {
return dependencyCache.computeIfAbsent(entityClass, c -> getDependentEntities(entityClass, getEntityClassesReverse())); return dependencyCache.computeIfAbsent(entityClass, c -> getDependentEntities(entityClass, getEntityClassesReverse()));
} }


private Map<Class<? extends Identifiable>, Collection<EntityFieldReference>> dependencyDAOCache = new ConcurrentHashMap<>();
private final Map<Class<? extends Identifiable>, Collection<EntityFieldReference>> dependencyDAOCache = new ConcurrentHashMap<>();
public Collection<EntityFieldReference> dependencyRefs(Class<? extends Identifiable> entityClass) { public Collection<EntityFieldReference> dependencyRefs(Class<? extends Identifiable> entityClass) {
return dependencyDAOCache.computeIfAbsent(entityClass, c -> getDependencyRefs(c, getDependencies(c))); return dependencyDAOCache.computeIfAbsent(entityClass, c -> getDependencyRefs(c, getDependencies(c)));
} }
@@ -364,6 +364,10 @@ public class PgRestServerConfiguration extends RestServerConfiguration implement
final Collection<String> excludeDepFields) { final Collection<String> excludeDepFields) {
dependencyRefs(thing.getClass()).forEach( dependencyRefs(thing.getClass()).forEach(
dep -> { dep -> {
if (!dep.cascade()) {
log.debug("deleteDependencies("+thing+"): excluding due to cascade=false: "+dep);
return;
}
if (excludeDepClasses != null && excludeDepClasses.stream().anyMatch(depClass -> depClass.getName().equals(dep.getEntity()))) { if (excludeDepClasses != null && excludeDepClasses.stream().anyMatch(depClass -> depClass.getName().equals(dep.getEntity()))) {
log.debug("deleteDependencies("+thing+"): excluding by dep class: "+dep); log.debug("deleteDependencies("+thing+"): excluding by dep class: "+dep);
return; return;


Loading…
Cancel
Save