Skip to content

Commit 15e2237

Browse files
authored
Merge pull request #170 from metafacture/102-path
Consolidate path traversal
2 parents c25517a + 5a3fa9b commit 15e2237

File tree

50 files changed

+2005
-505
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

50 files changed

+2005
-505
lines changed

build.gradle

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ editorconfig {
88
excludes = [
99
'**/*.hprof.txt',
1010
'**/*.out',
11+
'**/*.err',
1112
'**/*.vsix',
1213
'**/.*',
1314
'**/bin',
@@ -22,7 +23,7 @@ editorconfig {
2223

2324
task editorconfigChecker(type: Exec, group: 'Verification') {
2425
executable 'misc/bin/editorconfig-checker'
25-
args('-exclude', '/bin/|/\\.|^gradlew.*|^LICENSE$')
26+
args('-exclude', '/bin/|/\\.|^gradlew.*|^LICENSE$|^\\.project$')
2627
}
2728

2829
editorconfigCheck.dependsOn(editorconfigChecker)

metafix-runner/build.gradle

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,10 @@ plugins {
55
dependencies {
66
implementation project(':metafix')
77

8+
implementation "org.metafacture:metafacture-biblio:${versions.metafacture}"
89
implementation "org.metafacture:metafacture-json:${versions.metafacture}"
910
implementation "org.metafacture:metafacture-runner:${versions.metafacture}"
11+
implementation "org.metafacture:metafacture-xml:${versions.metafacture}"
1012
}
1113

1214
application {

metafix/src/main/java/org/metafacture/metafix/FixBind.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ public enum FixBind implements FixContext {
2929
public void execute(final Metafix metafix, final Record record, final List<String> params, final Map<String, String> options, final List<Expression> expressions) {
3030
final RecordTransformer recordTransformer = metafix.getRecordTransformer();
3131
final String scopeVariable = options.get("var");
32-
Value.asList(new FixPath(options.get("path")).findIn(record), a -> {
32+
Value.asList(record.get(options.get("path")), a -> {
3333
for (int i = 0; i < a.size(); ++i) {
3434
final Value value = a.get(i);
3535

metafix/src/main/java/org/metafacture/metafix/FixMethod.java

Lines changed: 41 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ public void apply(final Metafix metafix, final Record record, final List<String>
9999
add_field {
100100
@Override
101101
public void apply(final Metafix metafix, final Record record, final List<String> params, final Map<String, String> options) {
102-
new FixPath(params.get(0)).appendIn(record, params.get(1));
102+
record.add(params.get(0), new Value(params.get(1)));
103103
}
104104
},
105105
array { // array-from-hash
@@ -120,7 +120,12 @@ public void apply(final Metafix metafix, final Record record, final List<String>
120120
copy_field {
121121
@Override
122122
public void apply(final Metafix metafix, final Record record, final List<String> params, final Map<String, String> options) {
123-
record.copy(params);
123+
final String oldName = params.get(0);
124+
final String newName = params.get(1);
125+
Value.asList(record.get(oldName), a -> a.forEach(newValue -> {
126+
record.add(newName, newValue);
127+
newValue.updatePathRename(newName);
128+
}));
124129
}
125130
},
126131
format {
@@ -149,8 +154,8 @@ public void apply(final Metafix metafix, final Record record, final List<String>
149154
move_field {
150155
@Override
151156
public void apply(final Metafix metafix, final Record record, final List<String> params, final Map<String, String> options) {
152-
record.copy(params);
153-
new FixPath(params.get(0)).removeNestedFrom(record);
157+
FixMethod.copy_field.apply(metafix, record, params, options);
158+
record.remove(params.get(0));
154159
}
155160
},
156161
parse_text {
@@ -195,10 +200,11 @@ public void apply(final Metafix metafix, final Record record, final List<String>
195200
@Override
196201
public void apply(final Metafix metafix, final Record record, final List<String> params, final Map<String, String> options) {
197202
final String joinChar = options.get("join_char");
198-
new FixPath(params.get(0)).replaceIn(record, params.subList(1, params.size()).stream()
199-
.filter(f -> literalString(f) || new FixPath(f).findIn(record) != null)
200-
.map(f -> literalString(f) ? new Value(f.substring(1)) : Value.asList(new FixPath(f).findIn(record), null).asArray().get(0))
203+
final Value newValue = new Value(params.subList(1, params.size()).stream()
204+
.filter(f -> literalString(f) || record.get(f) != null)
205+
.map(f -> literalString(f) ? new Value(f.substring(1)) : Value.asList(record.get(f), null).asArray().get(0))
201206
.map(Value::asString).collect(Collectors.joining(joinChar != null ? joinChar : " ")));
207+
record.set(params.get(0), newValue);
202208
}
203209

204210
private boolean literalString(final String s) {
@@ -210,8 +216,7 @@ private boolean literalString(final String s) {
210216
public void apply(final Metafix metafix, final Record record, final List<String> params, final Map<String, String> options) {
211217
final String field = params.get(0);
212218
final int max = getInteger(params, 1);
213-
214-
new FixPath(field).replaceIn(record, String.valueOf(RANDOM.nextInt(max)));
219+
record.set(field, new Value(String.valueOf(RANDOM.nextInt(max))));
215220
}
216221
},
217222
reject {
@@ -223,7 +228,7 @@ public void apply(final Metafix metafix, final Record record, final List<String>
223228
remove_field {
224229
@Override
225230
public void apply(final Metafix metafix, final Record record, final List<String> params, final Map<String, String> options) {
226-
params.forEach(p -> new FixPath(p).removeNestedFrom(record));
231+
params.forEach(p -> record.remove(p));
227232
}
228233
},
229234
rename {
@@ -234,7 +239,7 @@ public void apply(final Metafix metafix, final Record record, final List<String>
234239

235240
final UnaryOperator<String> operator = s -> s.replaceAll(search, replace);
236241

237-
new FixPath(params.get(0)).transformIn(record, (m, c) -> m
242+
record.transform(params.get(0), (m, c) -> m
238243
.ifArray(a -> c.accept(renameArray(a, operator)))
239244
.ifHash(h -> c.accept(renameHash(h, operator)))
240245
.orElseThrow()
@@ -267,35 +272,22 @@ public void apply(final Metafix metafix, final Record record, final List<String>
267272
@Override
268273
public void apply(final Metafix metafix, final Record record, final List<String> params, final Map<String, String> options) {
269274
final String field = params.get(0);
270-
final List<String> toAdd = params.subList(1, params.size());
271-
if (field.endsWith(DOT_APPEND)) {
272-
record.addAll(field.replace(DOT_APPEND, EMPTY), toAdd);
273-
}
274-
else {
275-
record.put(field, newArray(toAdd.stream().map(Value::new)));
276-
}
275+
final Value newValue = newArray(params.subList(1, params.size()).stream().map(Value::new));
276+
record.set(field, newValue);
277277
}
278278
},
279279
set_field {
280280
@Override
281281
public void apply(final Metafix metafix, final Record record, final List<String> params, final Map<String, String> options) {
282-
new FixPath(params.get(0)).replaceIn(record, params.get(1));
282+
record.set(params.get(0), new Value(params.get(1)));
283283
}
284284
},
285285
set_hash {
286286
@Override
287287
public void apply(final Metafix metafix, final Record record, final List<String> params, final Map<String, String> options) {
288288
final String field = params.get(0);
289-
290-
final Value value = record.get(field.replace(DOT_APPEND, EMPTY));
291289
final Value newValue = Value.newHash(h -> options.forEach((f, v) -> h.put(f, new Value(v))));
292-
293-
if (field.endsWith(DOT_APPEND) && value.isArray()) {
294-
value.asArray().add(newValue);
295-
}
296-
else {
297-
record.put(field, newValue);
298-
}
290+
record.set(field, newValue);
299291
}
300292
},
301293
vacuum {
@@ -313,19 +305,19 @@ public void apply(final Metafix metafix, final Record record, final List<String>
313305
@Override
314306
public void apply(final Metafix metafix, final Record record, final List<String> params, final Map<String, String> options) {
315307
final String value = params.get(1);
316-
new FixPath(params.get(0)).transformIn(record, s -> s + value);
308+
record.transform(params.get(0), s -> s + value);
317309
}
318310
},
319311
capitalize {
320312
@Override
321313
public void apply(final Metafix metafix, final Record record, final List<String> params, final Map<String, String> options) {
322-
new FixPath(params.get(0)).transformIn(record, s -> s.substring(0, 1).toUpperCase() + s.substring(1));
314+
record.transform(params.get(0), s -> s.substring(0, 1).toUpperCase() + s.substring(1));
323315
}
324316
},
325317
count {
326318
@Override
327319
public void apply(final Metafix metafix, final Record record, final List<String> params, final Map<String, String> options) {
328-
new FixPath(params.get(0)).transformIn(record, (m, c) -> m
320+
record.transform(params.get(0), (m, c) -> m
329321
.ifArray(a -> c.accept(new Value(a.size())))
330322
.ifHash(h -> c.accept(new Value(h.size())))
331323
);
@@ -334,7 +326,7 @@ public void apply(final Metafix metafix, final Record record, final List<String>
334326
downcase {
335327
@Override
336328
public void apply(final Metafix metafix, final Record record, final List<String> params, final Map<String, String> options) {
337-
new FixPath(params.get(0)).transformIn(record, s -> s.toLowerCase());
329+
record.transform(params.get(0), s -> s.toLowerCase());
338330
}
339331
},
340332
filter {
@@ -345,7 +337,7 @@ public void apply(final Metafix metafix, final Record record, final List<String>
345337

346338
final Predicate<Value> predicate = s -> search.matcher(s.asString()).find();
347339

348-
new FixPath(params.get(0)).transformIn(record, (m, c) -> m
340+
record.transform(params.get(0), (m, c) -> m
349341
.ifArray(a -> c.accept(newArray(a.stream().filter(invert ? predicate.negate() : predicate))))
350342
);
351343
}
@@ -354,14 +346,14 @@ public void apply(final Metafix metafix, final Record record, final List<String>
354346
@Override
355347
public void apply(final Metafix metafix, final Record record, final List<String> params, final Map<String, String> options) {
356348
final String search = params.get(1);
357-
new FixPath(params.get(0)).transformIn(record, s -> String.valueOf(s.indexOf(search))); // TODO: multiple
349+
record.transform(params.get(0), s -> String.valueOf(s.indexOf(search))); // TODO: multiple
358350
}
359351
},
360352
join_field {
361353
@Override
362354
public void apply(final Metafix metafix, final Record record, final List<String> params, final Map<String, String> options) {
363355
final String joinChar = params.size() > 1 ? params.get(1) : "";
364-
new FixPath(params.get(0)).transformIn(record, (m, c) -> m
356+
record.transform(params.get(0), (m, c) -> m
365357
.ifArray(a -> c.accept(new Value(a.stream().map(Value::asString).collect(Collectors.joining(joinChar)))))
366358
);
367359
}
@@ -390,14 +382,17 @@ public void apply(final Metafix metafix, final Record record, final List<String>
390382
}
391383

392384
final String defaultValue = map.get(Maps.DEFAULT_MAP_KEY); // TODO: Catmandu uses 'default'
393-
new FixPath(params.get(0)).transformIn(record, k -> map.getOrDefault(k, defaultValue));
385+
record.transform(params.get(0), oldValue -> {
386+
final String newValue = map.getOrDefault(oldValue, defaultValue);
387+
return newValue != null ? newValue : getBoolean(options, "delete") ? null : oldValue;
388+
});
394389
}
395390
},
396391
prepend {
397392
@Override
398393
public void apply(final Metafix metafix, final Record record, final List<String> params, final Map<String, String> options) {
399394
final String value = params.get(1);
400-
new FixPath(params.get(0)).transformIn(record, s -> value + s);
395+
record.transform(params.get(0), s -> value + s);
401396
}
402397
},
403398
replace_all {
@@ -406,13 +401,13 @@ public void apply(final Metafix metafix, final Record record, final List<String>
406401
final String search = params.get(1);
407402
final String replace = params.get(2);
408403

409-
new FixPath(params.get(0)).transformIn(record, s -> s.replaceAll(search, replace));
404+
record.transform(params.get(0), s -> s.replaceAll(search, replace));
410405
}
411406
},
412407
reverse {
413408
@Override
414409
public void apply(final Metafix metafix, final Record record, final List<String> params, final Map<String, String> options) {
415-
new FixPath(params.get(0)).transformIn(record, (m, c) -> m
410+
record.transform(params.get(0), (m, c) -> m
416411
.ifArray(a -> {
417412
final List<Value> list = a.stream().collect(Collectors.toList());
418413
Collections.reverse(list);
@@ -433,7 +428,7 @@ public void apply(final Metafix metafix, final Record record, final List<String>
433428
final Comparator<Value> comparator = numeric ?
434429
Comparator.comparing(function.andThen(Integer::parseInt)) : Comparator.comparing(function);
435430

436-
new FixPath(params.get(0)).transformIn(record, (m, c) -> m
431+
record.transform(params.get(0), (m, c) -> m
437432
.ifArray(a -> c.accept(new Value((uniq ? unique(a.stream()) : a.stream())
438433
.sorted(reverse ? comparator.reversed() : comparator).collect(Collectors.toList()))))
439434
);
@@ -448,7 +443,7 @@ public void apply(final Metafix metafix, final Record record, final List<String>
448443
final Function<String, Value> splitFunction = s ->
449444
newArray(Arrays.stream(splitPattern.split(s)).map(Value::new));
450445

451-
new FixPath(params.get(0)).transformIn(record, (m, c) -> m
446+
record.transform(params.get(0), (m, c) -> m
452447
.ifArray(a -> c.accept(newArray(a.stream().map(Value::asString).map(splitFunction))))
453448
.ifHash(h -> c.accept(Value.newHash(n -> h.forEach((f, w) -> n.put(f, splitFunction.apply(w.asString()))))))
454449
.ifString(s -> c.accept(splitFunction.apply(s)))
@@ -462,7 +457,7 @@ public void apply(final Metafix metafix, final Record record, final List<String>
462457
final Integer end = params.size() > 2 ? offset + getInteger(params, 2) : null;
463458
// TODO: final String replacement = params.size() > 3 ? params.get(3) : null;
464459

465-
new FixPath(params.get(0)).transformIn(record, s -> {
460+
record.transform(params.get(0), s -> {
466461
final int length = s.length();
467462
return offset > length ? s : end == null || end > length ? s.substring(offset) : s.substring(offset, end);
468463
});
@@ -471,37 +466,34 @@ public void apply(final Metafix metafix, final Record record, final List<String>
471466
sum {
472467
@Override
473468
public void apply(final Metafix metafix, final Record record, final List<String> params, final Map<String, String> options) {
474-
new FixPath(params.get(0)).transformIn(record, (m, c) -> m
469+
record.transform(params.get(0), (m, c) -> m
475470
.ifArray(a -> c.accept(new Value(a.stream().map(Value::asString).mapToInt(Integer::parseInt).sum())))
476471
);
477472
}
478473
},
479474
trim {
480475
@Override
481476
public void apply(final Metafix metafix, final Record record, final List<String> params, final Map<String, String> options) {
482-
new FixPath(params.get(0)).transformIn(record, String::trim);
477+
record.transform(params.get(0), String::trim);
483478
}
484479
},
485480
uniq {
486481
@Override
487482
public void apply(final Metafix metafix, final Record record, final List<String> params, final Map<String, String> options) {
488-
new FixPath(params.get(0)).transformIn(record, (m, c) -> m
483+
record.transform(params.get(0), (m, c) -> m
489484
.ifArray(a -> c.accept(newArray(unique(a.stream()))))
490485
);
491486
}
492487
},
493488
upcase {
494489
@Override
495490
public void apply(final Metafix metafix, final Record record, final List<String> params, final Map<String, String> options) {
496-
new FixPath(params.get(0)).transformIn(record, s -> s.toUpperCase());
491+
record.transform(params.get(0), s -> s.toUpperCase());
497492
}
498493
};
499494

500495
private static final Pattern NAMED_GROUP_PATTERN = Pattern.compile("\\(\\?<(.+?)>");
501496

502-
private static final String EMPTY = "";
503-
private static final String DOT_APPEND = "." + Value.ReservedField.$append.name();
504-
505497
private static final String FILEMAP_SEPARATOR_OPTION = "sep_char";
506498
private static final String FILEMAP_DEFAULT_SEPARATOR = ",";
507499

0 commit comments

Comments
 (0)