This is an automated email from the git hooks/post-receive script. New commit to branch feature/3860_introduce_topiasqlbatchsupport in repository topia. See http://git.nuiton.org/topia.git commit 7a4fee1fb91979649397f9994d648b6df317ca13 Author: Tony CHEMIT <chemit@codelutin.com> Date: Mon Jan 4 13:33:37 2016 +0100 Introduce TopiaMetadataModel --- .../persistence/metadata/TopiaMetadataEntity.java | 123 ++++++++++++ .../persistence/metadata/TopiaMetadataModel.java | 62 ++++++ .../metadata/TopiaMetadataModelVisitor.java | 219 +++++++++++++++++++++ 3 files changed, 404 insertions(+) diff --git a/topia-persistence/src/main/java/org/nuiton/topia/persistence/metadata/TopiaMetadataEntity.java b/topia-persistence/src/main/java/org/nuiton/topia/persistence/metadata/TopiaMetadataEntity.java new file mode 100644 index 0000000..cf7fdcb --- /dev/null +++ b/topia-persistence/src/main/java/org/nuiton/topia/persistence/metadata/TopiaMetadataEntity.java @@ -0,0 +1,123 @@ +package org.nuiton.topia.persistence.metadata; + +import com.google.common.base.MoreObjects; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.Objects; + +/** + * Created on 03/01/16. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class TopiaMetadataEntity { + + private static final Log log = LogFactory.getLog(TopiaMetadataEntity.class); + + protected final String type; + protected final Map<String, String> associations = new LinkedHashMap<>(); + protected final Map<String, String> reversedAssociations = new LinkedHashMap<>(); + protected final Map<String, String> nmAssociations = new LinkedHashMap<>(); + protected final Map<String, String> required = new LinkedHashMap<>(); + + public TopiaMetadataEntity(String type) { + this.type = type; + } + + public String getType() { + return type; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + TopiaMetadataEntity that = (TopiaMetadataEntity) o; + return Objects.equals(type, that.type); + } + + @Override + public int hashCode() { + return Objects.hash(type); + } + + @Override + public String toString() { + return MoreObjects.toStringHelper(this) + .add("type", type) + .toString(); + } + + public Map<String, String> getReversedAssociations() { + return reversedAssociations; + } + + public Map<String, String> getNmAssociations() { + return nmAssociations; + } + + public Map<String, String> getAssociations() { + return associations; + } + + public Map<String, String> getRequired() { + return required; + } + + public void addAssociation(TopiaMetadataEntity associationClazz, String name) { + log.info(getType() + "/" + name + "→" + associationClazz.getType()); + associations.put(name, associationClazz.getType()); + } + + public void addReversedAssociation(TopiaMetadataEntity associationClazz, String name) { + log.info(getType() + "/" + name + "→" + associationClazz.getType()); + reversedAssociations.put(name, associationClazz.getType()); + } + + public void addNmAssociation(TopiaMetadataEntity associationClazz, String name) { + log.info(getType() + "/" + name + "→" + associationClazz.getType()); + nmAssociations.put(name, associationClazz.getType()); + } + + public void addRequired(TopiaMetadataEntity attributeClazz, String name) { + log.info(getType() + "/" + name + "→" + attributeClazz.getType()); + required.put(name, attributeClazz.getType()); + } + + public TopiaMetadataEntity copy() { + TopiaMetadataEntity copy = new TopiaMetadataEntity(type); + copy.associations.putAll(associations); + copy.reversedAssociations.putAll(reversedAssociations); + copy.nmAssociations.putAll(nmAssociations); + copy.required.putAll(required); + return copy; + } + + public void accept(TopiaMetadataModelVisitor visitor, TopiaMetadataModel metadataModel) { + visitor.visitEntiyStart(metadataModel, this); + for (Map.Entry<String, String> entry : reversedAssociations.entrySet()) { + String propertyName = entry.getKey(); + String propertyType = entry.getValue(); + visitor.visitReversedAssociation(metadataModel, this, propertyName, metadataModel.getEntity(propertyType)); + } + for (Map.Entry<String, String> entry : associations.entrySet()) { + String propertyName = entry.getKey(); + String propertyType = entry.getValue(); + visitor.visitAssociation(metadataModel, this, propertyName, metadataModel.getEntity(propertyType)); + } + for (Map.Entry<String, String> entry : nmAssociations.entrySet()) { + String propertyName = entry.getKey(); + String propertyType = entry.getValue(); + visitor.visitNmAssociation(metadataModel, this, propertyName, metadataModel.getEntity(propertyType)); + } + for (Map.Entry<String, String> entry : required.entrySet()) { + String propertyName = entry.getKey(); + String propertyType = entry.getValue(); + visitor.visitRequired(metadataModel, this, propertyName, metadataModel.getEntity(propertyType)); + } + visitor.visitEntiyEnd(metadataModel, this); + } +} diff --git a/topia-persistence/src/main/java/org/nuiton/topia/persistence/metadata/TopiaMetadataModel.java b/topia-persistence/src/main/java/org/nuiton/topia/persistence/metadata/TopiaMetadataModel.java new file mode 100644 index 0000000..70cc470 --- /dev/null +++ b/topia-persistence/src/main/java/org/nuiton/topia/persistence/metadata/TopiaMetadataModel.java @@ -0,0 +1,62 @@ +package org.nuiton.topia.persistence.metadata; + +import com.google.common.base.Optional; +import com.google.common.base.Preconditions; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.Reader; +import java.net.URL; +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * Created on 03/01/16. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class TopiaMetadataModel { + + private static final Log log = LogFactory.getLog(TopiaMetadataModel.class); + + protected final Map<String, TopiaMetadataEntity> entities = new LinkedHashMap<>(); + + public TopiaMetadataEntity getEntity(String type) { + return entities.get(type); + } + + public Optional<TopiaMetadataEntity> getOptionalEntity(String type) { + return Optional.fromNullable(getEntity(type)); + } + + public void accept(TopiaMetadataModelVisitor visitor) { + visitor.visitModelStart(this); + for (TopiaMetadataEntity entity : entities.values()) { + entity.accept(visitor, this); + } + visitor.visitModelEnd(this); + } + + public TopiaMetadataEntity newEntity(String type) { + Preconditions.checkState(!entities.containsKey(type), type + " already in cache"); + TopiaMetadataEntity clazz = new TopiaMetadataEntity(type); + entities.put(type, clazz); + log.info(clazz.getType()); + return clazz; + } + + public static TopiaMetadataModel load(URL url) throws IOException { + try (Reader reader = new InputStreamReader(url.openStream())) { + + Gson gson = new GsonBuilder().create(); + TopiaMetadataModel metadataModel = gson.fromJson(reader, TopiaMetadataModel.class); + return metadataModel; + + } + } + +} diff --git a/topia-persistence/src/main/java/org/nuiton/topia/persistence/metadata/TopiaMetadataModelVisitor.java b/topia-persistence/src/main/java/org/nuiton/topia/persistence/metadata/TopiaMetadataModelVisitor.java new file mode 100644 index 0000000..b3c55c5 --- /dev/null +++ b/topia-persistence/src/main/java/org/nuiton/topia/persistence/metadata/TopiaMetadataModelVisitor.java @@ -0,0 +1,219 @@ +package org.nuiton.topia.persistence.metadata; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import java.util.LinkedHashSet; +import java.util.Set; + +/** + * Created on 04/01/16. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public interface TopiaMetadataModelVisitor { + + void visitModelStart(TopiaMetadataModel metadataModel); + + void visitModelEnd(TopiaMetadataModel metadataModel); + + void visitEntiyStart(TopiaMetadataModel metadataModel, TopiaMetadataEntity metadataEntity); + + void visitEntiyEnd(TopiaMetadataModel metadataModel, TopiaMetadataEntity metadataEntity); + + void visitReversedAssociation(TopiaMetadataModel metadataModel, TopiaMetadataEntity metadataEntity, String propertyName, TopiaMetadataEntity propertyType); + + void visitAssociation(TopiaMetadataModel metadataModel, TopiaMetadataEntity metadataEntity, String propertyName, TopiaMetadataEntity propertyType); + + void visitNmAssociation(TopiaMetadataModel metadataModel, TopiaMetadataEntity metadataEntity, String propertyName, TopiaMetadataEntity propertyType); + + void visitRequired(TopiaMetadataModel metadataModel, TopiaMetadataEntity metadataEntity, String propertyName, TopiaMetadataEntity propertyType); + + class TopiaMetadataModelVisitorAdapter implements TopiaMetadataModelVisitor { + + @Override + public void visitModelStart(TopiaMetadataModel metadataModel) { + + } + + @Override + public void visitModelEnd(TopiaMetadataModel metadataModel) { + + } + + @Override + public void visitEntiyStart(TopiaMetadataModel metadataModel, TopiaMetadataEntity metadataEntity) { + + } + + @Override + public void visitEntiyEnd(TopiaMetadataModel metadataModel, TopiaMetadataEntity metadataEntity) { + + } + + @Override + public void visitReversedAssociation(TopiaMetadataModel metadataModel, TopiaMetadataEntity metadataEntity, String propertyName, TopiaMetadataEntity propertyType) { + + } + + @Override + public void visitAssociation(TopiaMetadataModel metadataModel, TopiaMetadataEntity metadataEntity, String propertyName, TopiaMetadataEntity propertyType) { + + } + + @Override + public void visitNmAssociation(TopiaMetadataModel metadataModel, TopiaMetadataEntity metadataEntity, String propertyName, TopiaMetadataEntity propertyType) { + + } + + @Override + public void visitRequired(TopiaMetadataModel metadataModel, TopiaMetadataEntity metadataEntity, String propertyName, TopiaMetadataEntity propertyType) { + + } + + } + + class PrintVisitor implements TopiaMetadataModelVisitor { + + private final Log log = LogFactory.getLog(TopiaMetadataModelVisitor.class); + protected final boolean deepVisit; + protected final String eol; + protected final StringBuilder builder; + + protected String prefix = ""; + + class DeepVisitor extends TopiaMetadataModelVisitorAdapter { + + String prefix; + Set<String> visited = new LinkedHashSet<>(); + + public DeepVisitor(String prefix) { + this.prefix = prefix; + } + + @Override + public void visitEntiyStart(TopiaMetadataModel metadataModel, TopiaMetadataEntity metadataEntity) { + prefix += " "; + appendPrefix("E → ").append(metadataEntity).append(eol); + } + + @Override + public void visitEntiyEnd(TopiaMetadataModel metadataModel, TopiaMetadataEntity metadataEntity) { + appendPrefix("E ← ").append(metadataEntity).append(eol); + prefix = prefix.substring(2); + } + + @Override + public void visitReversedAssociation(TopiaMetadataModel metadataModel, TopiaMetadataEntity metadataEntity, String propertyName, TopiaMetadataEntity propertyType) { + appendPrefix("ReversedAssociation: ").append(metadataEntity).append("/").append(propertyName).append("→").append(propertyType.getType()).append(eol); + if (visited.add(propertyType.getType())) { + propertyType.accept(this, metadataModel); + } + } + + @Override + public void visitAssociation(TopiaMetadataModel metadataModel, TopiaMetadataEntity metadataEntity, String propertyName, TopiaMetadataEntity propertyType) { + appendPrefix("Association: ").append(metadataEntity).append("/").append(propertyName).append("→").append(propertyType.getType()).append(eol); + if (visited.add(propertyType.getType())) { + propertyType.accept(this, metadataModel); + } + } + + @Override + public void visitNmAssociation(TopiaMetadataModel metadataModel, TopiaMetadataEntity metadataEntity, String propertyName, TopiaMetadataEntity propertyType) { + appendPrefix("NmAssociation: ").append(metadataEntity).append("/").append(propertyName).append("→").append(propertyType.getType()).append(eol); + if (visited.add(propertyType.getType())) { + propertyType.accept(this, metadataModel); + } + } + + @Override + public void visitRequired(TopiaMetadataModel metadataModel, TopiaMetadataEntity metadataEntity, String propertyName, TopiaMetadataEntity propertyType) { + appendPrefix("Required: ").append(metadataEntity).append("/").append(propertyName).append("→").append(propertyType.getType()).append(eol); + if (visited.add(propertyType.getType())) { + propertyType.accept(this, metadataModel); + } + } + + protected StringBuilder appendPrefix(String prefix) { + return builder.append(this.prefix).append(prefix); + } + + } + + public PrintVisitor(boolean deepVisit, String eol) { + this.deepVisit = deepVisit; + this.eol = eol; + this.builder = new StringBuilder(); + } + + @Override + public void visitModelStart(TopiaMetadataModel metadataModel) { + appendPrefix("M → ").append(metadataModel).append(eol); + } + + @Override + public void visitModelEnd(TopiaMetadataModel metadataModel) { + appendPrefix("M ← ").append(metadataModel).append(eol); + + } + + @Override + public void visitEntiyStart(TopiaMetadataModel metadataModel, TopiaMetadataEntity metadataEntity) { + + if (deepVisit) { + metadataEntity.accept(new DeepVisitor(prefix), metadataModel); + }else { + prefix += " "; + appendPrefix("E → ").append(metadataEntity).append(eol); + } + } + + @Override + public void visitEntiyEnd(TopiaMetadataModel metadataModel, TopiaMetadataEntity metadataEntity) { + if (!deepVisit) { + appendPrefix("E ← ").append(metadataEntity).append(eol); + prefix = prefix.substring(2); + } + } + + @Override + public void visitReversedAssociation(TopiaMetadataModel metadataModel, TopiaMetadataEntity metadataEntity, String propertyName, TopiaMetadataEntity propertyType) { + if (!deepVisit) { + appendPrefix("ReversedAssociation: ").append(metadataEntity).append("/").append(propertyName).append("→").append(propertyType.getType()).append(eol); + } + } + + @Override + public void visitAssociation(TopiaMetadataModel metadataModel, TopiaMetadataEntity metadataEntity, String propertyName, TopiaMetadataEntity propertyType) { + if (!deepVisit) { + appendPrefix("Association: ").append(metadataEntity).append("/").append(propertyName).append("→").append(propertyType.getType()).append(eol); + } + } + + @Override + public void visitNmAssociation(TopiaMetadataModel metadataModel, TopiaMetadataEntity metadataEntity, String propertyName, TopiaMetadataEntity propertyType) { + if (!deepVisit) { + appendPrefix("NmAssociation: ").append(metadataEntity).append("/").append(propertyName).append("→").append(propertyType.getType()).append(eol); + } + } + + @Override + public void visitRequired(TopiaMetadataModel metadataModel, TopiaMetadataEntity metadataEntity, String propertyName, TopiaMetadataEntity propertyType) { + if (!deepVisit) { + appendPrefix("Required: ").append(metadataEntity).append("/").append(propertyName).append("→").append(propertyType.getType()).append(eol); + } + } + + @Override + public String toString() { + return builder.toString(); + } + + protected StringBuilder appendPrefix(String prefix) { + return builder.append(this.prefix).append(prefix); + } + + } + +} -- To stop receiving notification emails like this one, please contact nuiton.org SCM administrator <admin+scm@nuiton.org>.