diff --git a/metafix/src/main/java/org/metafacture/metafix/FixMethod.java b/metafix/src/main/java/org/metafacture/metafix/FixMethod.java index 25756a99..a3f1eaec 100644 --- a/metafix/src/main/java/org/metafacture/metafix/FixMethod.java +++ b/metafix/src/main/java/org/metafacture/metafix/FixMethod.java @@ -122,7 +122,10 @@ public void apply(final Metafix metafix, final Record record, final List public void apply(final Metafix metafix, final Record record, final List params, final Map options) { final String oldName = params.get(0); final String newName = params.get(1); - Value.asList(record.get(oldName), a -> a.forEach(v -> record.add(newName, v))); + Value.asList(record.get(oldName), a -> a.forEach(newValue -> { + record.add(newName, newValue); + newValue.updatePathRename(newName); + })); } }, format { @@ -151,12 +154,8 @@ public void apply(final Metafix metafix, final Record record, final List move_field { @Override public void apply(final Metafix metafix, final Record record, final List params, final Map options) { - final String oldName = params.get(0); - final String newName = params.get(1); - Value.asList(record.get(oldName), a -> a.forEach(v -> { - record.add(newName, v); - record.remove(oldName); - })); + FixMethod.copy_field.apply(metafix, record, params, options); + record.remove(params.get(0)); } }, parse_text { diff --git a/metafix/src/main/java/org/metafacture/metafix/FixPath.java b/metafix/src/main/java/org/metafacture/metafix/FixPath.java index fdff347c..07e190a8 100644 --- a/metafix/src/main/java/org/metafacture/metafix/FixPath.java +++ b/metafix/src/main/java/org/metafacture/metafix/FixPath.java @@ -299,6 +299,7 @@ private Value processRef(final Value referencedValue, final InsertMode mode, fin final String[] tail) { if (referencedValue != null) { final FixPath fixPath = new FixPath(tail); + newValue.updatePathAddBase(referencedValue, field); return referencedValue.extractType((m, c) -> m .ifArray(a -> c.accept(fixPath.insertInto(referencedValue.asArray(), mode, newValue))) .ifHash(h -> c.accept(fixPath.insertInto(referencedValue.asHash(), mode, newValue))) @@ -345,6 +346,7 @@ private Value getReferencedValue(final Array array, final String field) { case $append: referencedValue = Value.newHash(); // TODO: append non-hash? array.add(referencedValue); + referencedValue.updatePathAppend(String.valueOf(array.size()), ""); break; default: break; diff --git a/metafix/src/main/java/org/metafacture/metafix/Metafix.java b/metafix/src/main/java/org/metafacture/metafix/Metafix.java index 08b935e5..c501d07e 100644 --- a/metafix/src/main/java/org/metafacture/metafix/Metafix.java +++ b/metafix/src/main/java/org/metafacture/metafix/Metafix.java @@ -226,7 +226,7 @@ private void addValue(final String name, final Value value) { else { final Value entity = entities.get(index); entity.matchType() - .ifArray(a -> a.add(value)) + .ifArray(a -> a.add(value.updatePathAddBase(entity, name))) .ifHash(h -> h.add(name, value.updatePathAddBase(entity, name))) .orElseThrow(); } diff --git a/metafix/src/main/java/org/metafacture/metafix/Value.java b/metafix/src/main/java/org/metafacture/metafix/Value.java index bb41471f..94d20ca6 100644 --- a/metafix/src/main/java/org/metafacture/metafix/Value.java +++ b/metafix/src/main/java/org/metafacture/metafix/Value.java @@ -203,6 +203,13 @@ public Value asList(final Consumer consumer) { } } + /*package-private*/ Value updatePathRename(final String newName) { + if (path != null) { + path = newName.replaceAll("\\$[^.]+", split(path)[0]); + } + return this; + } + /*package-private*/ Value updatePathAddBase(final Value container, final String fallback) { if (container.path != null) { final String[] pathSegments = split(path != null ? path : fallback); @@ -212,7 +219,7 @@ public Value asList(final Consumer consumer) { return this; } - private Value updatePathAppend(final String suffix, final String fallback) { + /*package-private*/ Value updatePathAppend(final String suffix, final String fallback) { if (path != null) { path = path + suffix; } diff --git a/metafix/src/test/java/org/metafacture/metafix/MetafixMethodTest.java b/metafix/src/test/java/org/metafacture/metafix/MetafixMethodTest.java index f4915258..92cf0e2f 100644 --- a/metafix/src/test/java/org/metafacture/metafix/MetafixMethodTest.java +++ b/metafix/src/test/java/org/metafacture/metafix/MetafixMethodTest.java @@ -1448,7 +1448,6 @@ public void inDoBindCopyFieldWithVarInSourceAndTarget() { } @Test - @MetafixToDo("See https://github.com/metafacture/metafacture-fix/pull/170") public void replaceAllWithWildcardAfterCopyFieldWithVarInSourceAndTarget() { MetafixTestHelpers.assertFix(streamReceiver, Arrays.asList( "set_array('RSWK[]')", diff --git a/metafix/src/test/resources/org/metafacture/metafix/integration/method/fromXml/toJson/replace_allInOptionalSubfieldOfRepeatedObjectsWithAsterisk/todo.txt b/metafix/src/test/resources/org/metafacture/metafix/integration/method/fromXml/toJson/replace_allInOptionalSubfieldOfRepeatedObjectsWithAsterisk/todo.txt deleted file mode 100644 index 753a771e..00000000 --- a/metafix/src/test/resources/org/metafacture/metafix/integration/method/fromXml/toJson/replace_allInOptionalSubfieldOfRepeatedObjectsWithAsterisk/todo.txt +++ /dev/null @@ -1 +0,0 @@ -See PR #170