diff --git a/metafix-runner/build.gradle b/metafix-runner/build.gradle index 783e85e2..f4b55c1c 100644 --- a/metafix-runner/build.gradle +++ b/metafix-runner/build.gradle @@ -47,3 +47,13 @@ application { applicationDefaultJvmArgs = ["-agentlib:hprof=heap=sites,cpu=samples,depth=${depth},cutoff=${cutoff},file=${file}.hprof.txt"] } } + +tasks.withType(JavaExec) { + doFirst { + def prefix = project.group + '.' + + System.properties.each { k, v -> + if (k.startsWith(prefix)) systemProperties[k] = v + } + } +} diff --git a/metafix/src/main/java/org/metafacture/metafix/Metafix.java b/metafix/src/main/java/org/metafacture/metafix/Metafix.java index 3d3c215c..f98d87ac 100644 --- a/metafix/src/main/java/org/metafacture/metafix/Metafix.java +++ b/metafix/src/main/java/org/metafacture/metafix/Metafix.java @@ -93,6 +93,7 @@ public class Metafix implements StreamPipe, Maps { // checkstyle private boolean repeatedFieldsToEntities; private boolean strictnessHandlesProcessExceptions; private int entityCount; + private int maxEntityCount = Integer.getInteger("org.metafacture.metafix.maxEntityCount", -1); public Metafix() { this(NO_VARS); @@ -305,22 +306,36 @@ public void startEntity(final String name) { throw new IllegalArgumentException("Entity name must not be null."); } + ++entityCount; + if (maxEntityCountExceeded()) { + LOG.debug("Maximum number of entities exceeded: {}/{}", entityCount, maxEntityCount); + return; + } + final Value value = isArrayName(name) ? Value.newArray() : Value.newHash(); addValue(name, value); entities.add(value); - entityCountStack.push(++entityCount); + entityCountStack.push(entityCount); flattener.startEntity(name); } @Override public void endEntity() { + if (maxEntityCountExceeded()) { + return; + } + entityCountStack.pop(); flattener.endEntity(); } @Override public void literal(final String name, final String value) { + if (entityCountStack.size() > 1 && maxEntityCountExceeded()) { + return; + } + LOG.debug("Putting '{}': '{}'", name, value); flattener.literal(name, value); } @@ -430,6 +445,18 @@ public String getEntityMemberName() { return entityMemberName; } + public void setMaxEntityCount(final int maxEntityCount) { + this.maxEntityCount = maxEntityCount; + } + + public int getMaxEntityCount() { + return maxEntityCount; + } + + private boolean maxEntityCountExceeded() { + return maxEntityCount >= 0 && entityCount > maxEntityCount; + } + public enum Strictness { /**