package tundra; // -----( IS Java Code Template v1.2 // -----( CREATED: 2017-05-08 19:02:30 EST // -----( ON-HOST: 192.168.66.129 import com.wm.data.*; import com.wm.util.Values; import com.wm.app.b2b.server.Service; import com.wm.app.b2b.server.ServiceException; // --- <<IS-START-IMPORTS>> --- import java.io.IOException; import java.nio.charset.Charset; import java.util.EnumSet; import java.util.Locale; import permafrost.tundra.data.CaseInsensitiveIData; import permafrost.tundra.data.IDataHelper; import permafrost.tundra.data.IDataXMLParser; import permafrost.tundra.data.ImmutableIData; import permafrost.tundra.data.transform.TransformerMode; import permafrost.tundra.flow.ConditionEvaluator; import permafrost.tundra.flow.variable.SubstitutionHelper; import permafrost.tundra.flow.variable.SubstitutionType; import permafrost.tundra.io.InputStreamHelper; import permafrost.tundra.lang.BooleanHelper; import permafrost.tundra.lang.CharsetHelper; import permafrost.tundra.lang.ClassHelper; import permafrost.tundra.lang.ExceptionHelper; import permafrost.tundra.lang.LocaleHelper; import permafrost.tundra.lang.ObjectConvertMode; import permafrost.tundra.lang.ObjectHelper; import permafrost.tundra.lang.Sanitization; import permafrost.tundra.math.IntegerHelper; import permafrost.tundra.server.ServiceHelper; // --- <<IS-END-IMPORTS>> --- public final class document { // ---( internal utility methods )--- final static document _instance = new document(); static document _newInstance() { return new document(); } static document _cast(Object o) { return (document)o; } // ---( server methods )--- public static final void amend (IData pipeline) throws ServiceException { // --- <<IS-START(amend)>> --- // @subtype unknown // @sigtype java 3.5 // [i] record:0:optional $document // [i] record:1:optional $amendments // [i] - field:0:required key // [i] - field:0:optional value // [i] - field:0:optional condition // [o] record:0:optional $document IDataCursor cursor = pipeline.getCursor(); try { IData document = IDataHelper.get(cursor, "$document", IData.class); IData[] amendments = IDataHelper.get(cursor, "$amendments", IData[].class); if (document != null) IDataHelper.put(cursor, "$document", IDataHelper.amend(document, amendments, pipeline)); } finally { cursor.destroy(); } // --- <<IS-END>> --- } public static final void blankify (IData pipeline) throws ServiceException { // --- <<IS-START(blankify)>> --- // @subtype unknown // @sigtype java 3.5 // [i] record:0:optional $document // [i] field:0:optional $recurse? {"false","true"} // [o] record:0:optional $document IDataCursor cursor = pipeline.getCursor(); try { IData document = IDataHelper.get(cursor, "$document", IData.class); boolean recurse = IDataHelper.getOrDefault(cursor, "$recurse?", Boolean.class, false); if (document != null) IDataHelper.put(cursor, "$document", IDataHelper.blankify(document, recurse)); } finally { cursor.destroy(); } // --- <<IS-END>> --- } public static final void clear (IData pipeline) throws ServiceException { // --- <<IS-START(clear)>> --- // @subtype unknown // @sigtype java 3.5 // [i] record:0:optional $document // [i] field:1:optional $preserve // [o] record:0:optional $document IDataCursor cursor = pipeline.getCursor(); try { IData document = IDataHelper.get(cursor, "$document", IData.class); String[] keys = IDataUtil.getStringArray(cursor, "$preserve"); IDataHelper.clear(document, keys); } finally { cursor.destroy(); } // --- <<IS-END>> --- } public static final void compact (IData pipeline) throws ServiceException { // --- <<IS-START(compact)>> --- // @subtype unknown // @sigtype java 3.5 // [i] record:0:optional $document // [i] field:0:optional $recurse? {"false","true"} // [o] record:0:optional $document IDataCursor cursor = pipeline.getCursor(); try { IData input = IDataHelper.get(cursor, "$document", IData.class); boolean recurse = IDataHelper.getOrDefault(cursor, "$recurse?", Boolean.class, false); if (input != null) { IData output = IDataHelper.compact(input, recurse); if (output == null) output = IDataFactory.create(); IDataHelper.put(cursor, "$document", output); } } finally { cursor.destroy(); } // --- <<IS-END>> --- } public static final void copy (IData pipeline) throws ServiceException { // --- <<IS-START(copy)>> --- // @subtype unknown // @sigtype java 3.5 // [i] record:0:optional $document // [i] field:0:required $key.source // [i] field:0:required $key.target // [i] field:0:optional $key.literal? {"false","true"} // [o] record:0:optional $document IDataCursor cursor = pipeline.getCursor(); try { IData document = IDataHelper.get(cursor, "$document", IData.class); String source = IDataHelper.get(cursor, "$key.source", String.class); String target = IDataHelper.get(cursor, "$key.target", String.class); boolean literal = IDataHelper.getOrDefault(cursor, "$key.literal?", Boolean.class, false); IDataHelper.put(cursor, "$document", IDataHelper.copy(document, source, target, literal), false); } finally { cursor.destroy(); } // --- <<IS-END>> --- } public static final void denormalize (IData pipeline) throws ServiceException { // --- <<IS-START(denormalize)>> --- // @subtype unknown // @sigtype java 3.5 // [i] record:0:optional $document // [o] record:0:optional $document IDataCursor cursor = pipeline.getCursor(); try { IData document = IDataHelper.get(cursor, "$document", IData.class); IDataHelper.put(cursor, "$document", IDataHelper.denormalize(document), false); } finally { cursor.destroy(); } // --- <<IS-END>> --- } public static final void drop (IData pipeline) throws ServiceException { // --- <<IS-START(drop)>> --- // @subtype unknown // @sigtype java 3.5 // [i] record:0:optional $document // [i] field:0:optional $key // [i] field:0:optional $key.literal? {"false","true"} // [o] record:0:optional $document IDataCursor cursor = pipeline.getCursor(); try { IData document = IDataHelper.get(cursor, "$document", IData.class); String key = IDataHelper.get(cursor, "$key", String.class); boolean literal = IDataHelper.getOrDefault(cursor, "$key.literal?", Boolean.class, false); IDataHelper.put(cursor, "$document", IDataHelper.drop(document, key, literal), false); } finally { cursor.destroy(); } // --- <<IS-END>> --- } public static final void duplicate (IData pipeline) throws ServiceException { // --- <<IS-START(duplicate)>> --- // @subtype unknown // @sigtype java 3.5 // [i] record:0:optional $document // [i] field:0:optional $recurse? {"false","true"} // [o] record:0:optional $duplicate IDataCursor cursor = pipeline.getCursor(); try { IData document = IDataHelper.get(cursor, "$document", IData.class); boolean recurse = IDataHelper.getOrDefault(cursor, "$recurse?", Boolean.class, false); IDataHelper.put(cursor, "$duplicate", IDataHelper.duplicate(document, recurse), false); } finally { cursor.destroy(); } // --- <<IS-END>> --- } public static final void each (IData pipeline) throws ServiceException { // --- <<IS-START(each)>> --- // @subtype unknown // @sigtype java 3.5 // [i] record:0:optional $document // [i] field:0:optional $service // [i] record:0:optional $pipeline // [i] field:0:optional $key.input // [i] field:0:optional $value.input // [i] field:0:optional $value.class // [i] field:0:optional $recurse? {"false","true"} IDataCursor cursor = pipeline.getCursor(); try { IData document = IDataHelper.get(cursor, "$document", IData.class); String service = IDataHelper.get(cursor, "$service", String.class); IData scope = IDataHelper.get(cursor, "$pipeline", IData.class); String keyInput = IDataHelper.get(cursor, "$key.input", String.class); String valueInput = IDataHelper.get(cursor, "$value.input", String.class); Class valueClass = IDataHelper.get(cursor, "$value.class", Class.class); boolean recurse = IDataHelper.getOrDefault(cursor, "$recurse?", Boolean.class, false); boolean scoped = scope != null; each(document, service, scoped ? scope: pipeline, keyInput, valueInput, valueClass, recurse); } finally { cursor.destroy(); } // --- <<IS-END>> --- } public static final void emit (IData pipeline) throws ServiceException { // --- <<IS-START(emit)>> --- // @subtype unknown // @sigtype java 3.5 // [i] record:0:optional $document // [i] field:0:optional $encoding // [i] field:0:optional $mode {"stream","bytes","string"} // [o] object:0:optional $content IDataCursor cursor = pipeline.getCursor(); try { IData document = IDataHelper.get(cursor, "$document", IData.class); Charset charset = IDataHelper.get(cursor, "$encoding", Charset.class); ObjectConvertMode mode = IDataHelper.get(cursor, "$mode", ObjectConvertMode.class); if (document != null) { IDataHelper.put(cursor, "$content", ObjectHelper.convert(IDataXMLParser.getInstance().emit(document, charset), charset, mode)); } } catch(IOException ex) { ExceptionHelper.raise(ex); } finally { cursor.destroy(); } // --- <<IS-END>> --- } public static final void equal (IData pipeline) throws ServiceException { // --- <<IS-START(equal)>> --- // @subtype unknown // @sigtype java 3.5 // [i] record:0:optional $document.x // [i] record:0:optional $document.y // [o] field:0:required $equal? IDataCursor cursor = pipeline.getCursor(); try { IData x = IDataHelper.get(cursor, "$document.x", IData.class); IData y = IDataHelper.get(cursor, "$document.y", IData.class); IDataHelper.put(cursor, "$equal?", ObjectHelper.equal(x, y), String.class); } finally { cursor.destroy(); } // --- <<IS-END>> --- } public static final void first (IData pipeline) throws ServiceException { // --- <<IS-START(first)>> --- // @subtype unknown // @sigtype java 3.5 // [i] record:0:optional $document // [o] field:0:optional $key // [o] object:0:optional $value IDataCursor cursor = pipeline.getCursor(); try { IData document = IDataHelper.get(cursor, "$document", IData.class); if (document != null) { IDataCursor documentCursor = document.getCursor(); if (documentCursor.first()) { IDataHelper.put(cursor, "$key", documentCursor.getKey()); IDataHelper.put(cursor, "$value", documentCursor.getValue()); } documentCursor.destroy(); } } finally { cursor.destroy(); } // --- <<IS-END>> --- } public static final void flatten (IData pipeline) throws ServiceException { // --- <<IS-START(flatten)>> --- // @subtype unknown // @sigtype java 3.5 // [i] record:0:optional $document // [i] field:1:optional $keys // [i] field:0:optional $nulls? {"false","true"} // [o] object:1:optional $values IDataCursor cursor = pipeline.getCursor(); try { IData document = IDataHelper.get(cursor, "$document", IData.class); String[] keys = IDataHelper.get(cursor, "$keys", String[].class); boolean includeNulls = IDataHelper.getOrDefault(cursor, "$nulls?", Boolean.class, false); // support $key for backwards compatibility if (keys == null) { String key = IDataHelper.get(cursor, "$key", String.class); if (key != null) keys = new String[] { key }; } Object[] values = IDataHelper.flatten(document, includeNulls, keys); IDataHelper.put(cursor, "$values", values, false); } finally { cursor.destroy(); } // --- <<IS-END>> --- } public static final void freeze (IData pipeline) throws ServiceException { // --- <<IS-START(freeze)>> --- // @subtype unknown // @sigtype java 3.5 // [i] record:0:optional $document // [o] record:0:optional $document IDataCursor cursor = pipeline.getCursor(); try { IData document = IDataHelper.get(cursor, "$document", IData.class); if (document != null) IDataHelper.put(cursor, "$document", new ImmutableIData(document)); } finally { cursor.destroy(); } // --- <<IS-END>> --- } public static final void get (IData pipeline) throws ServiceException { // --- <<IS-START(get)>> --- // @subtype unknown // @sigtype java 3.5 // [i] record:0:optional $document // [i] field:0:optional $key // [i] field:0:optional $key.literal? {"false","true"} // [i] object:0:optional $default.object // [i] field:0:optional $default.string // [o] object:0:optional $value IDataCursor cursor = pipeline.getCursor(); try { IData document = IDataHelper.get(cursor, "$document", IData.class); String key = IDataHelper.get(cursor, "$key", String.class); Object defaultObject = IDataHelper.get(cursor, "$default.object"); if (defaultObject == null) defaultObject = IDataHelper.get(cursor, "$default.string", String.class); boolean literal = IDataHelper.getOrDefault(cursor, "$key.literal?", Boolean.class, false); Object value = IDataHelper.get(pipeline, document, key, defaultObject, literal); IDataHelper.put(cursor, "$value", value, false); } finally { cursor.destroy(); } // --- <<IS-END>> --- } public static final void join (IData pipeline) throws ServiceException { // --- <<IS-START(join)>> --- // @subtype unknown // @sigtype java 3.5 // [i] record:0:optional $document // [i] field:0:optional $separator.value // [i] field:0:optional $separator.item // [i] field:0:optional $separator.list // [i] field:0:optional $sanitization {"remove nulls","remove nulls and blanks"} // [o] field:0:optional $result IDataCursor cursor = pipeline.getCursor(); try { IData document = IDataHelper.get(cursor, "$document", IData.class); String valueSeparator = IDataHelper.get(cursor, "$separator.value", String.class); String listSeparator = IDataHelper.get(cursor, "$separator.list", String.class); String itemSeparator = IDataHelper.get(cursor, "$separator.item", String.class); Sanitization sanitization = IDataHelper.get(cursor, "$sanitization", Sanitization.class); if (document != null) IDataHelper.put(cursor, "$result", IDataHelper.join(document, itemSeparator, listSeparator, valueSeparator, sanitization)); } finally { cursor.destroy(); } // --- <<IS-END>> --- } public static final void keys (IData pipeline) throws ServiceException { // --- <<IS-START(keys)>> --- // @subtype unknown // @sigtype java 3.5 // [i] record:0:optional $document // [i] field:0:optional $pattern // [o] field:1:required $keys IDataCursor cursor = pipeline.getCursor(); try { IData document = IDataHelper.get(cursor, "$document", IData.class); String pattern = IDataHelper.get(cursor, "$pattern", String.class); IDataHelper.put(cursor, "$keys", IDataHelper.getKeys(document, pattern)); } finally { cursor.destroy(); } // --- <<IS-END>> --- } public static final void last (IData pipeline) throws ServiceException { // --- <<IS-START(last)>> --- // @subtype unknown // @sigtype java 3.5 // [i] record:0:optional $document // [o] field:0:optional $key // [o] object:0:optional $value IDataCursor cursor = pipeline.getCursor(); try { IData document = IDataHelper.get(cursor, "$document", IData.class); if (document != null) { IDataCursor documentCursor = document.getCursor(); if (documentCursor.last()) { IDataHelper.put(cursor, "$key", documentCursor.getKey()); IDataHelper.put(cursor, "$value", documentCursor.getValue()); } documentCursor.destroy(); } } finally { cursor.destroy(); } // --- <<IS-END>> --- } public static final void leaves (IData pipeline) throws ServiceException { // --- <<IS-START(leaves)>> --- // @subtype unknown // @sigtype java 3.5 // [i] record:0:optional $document // [i] field:1:optional $classes // [o] object:1:optional $values IDataCursor cursor = pipeline.getCursor(); try { IData document = IDataHelper.get(cursor, "$document", IData.class); String[] classes = IDataHelper.get(cursor, "$classes", String[].class); Object[] values = IDataHelper.getLeafValues(document, ClassHelper.forName(classes)); IDataHelper.put(cursor, "$values", values, false, false); } catch(ClassNotFoundException ex) { ExceptionHelper.raise(ex); } finally { cursor.destroy(); } // --- <<IS-END>> --- } public static final void length (IData pipeline) throws ServiceException { // --- <<IS-START(length)>> --- // @subtype unknown // @sigtype java 3.5 // [i] record:0:optional $document // [o] field:0:required $length IDataCursor cursor = pipeline.getCursor(); try { IData document = IDataHelper.get(cursor, "$document", IData.class); IDataHelper.put(cursor, "$length", IDataHelper.size(document), String.class); } finally { cursor.destroy(); } // --- <<IS-END>> --- } public static final void listify (IData pipeline) throws ServiceException { // --- <<IS-START(listify)>> --- // @subtype unknown // @sigtype java 3.5 // [i] field:0:required $key // [i] record:0:optional $scope // [o] record:0:optional $scope IDataCursor cursor = pipeline.getCursor(); try { String key = IDataHelper.get(cursor, "$key", String.class); IData scope = IDataHelper.get(cursor, "$scope", IData.class); boolean scoped = scope != null; if (scoped) { scope = IDataHelper.duplicate(scope); } else { scope = pipeline; } scope = IDataHelper.arrayify(scope, key); if (scoped) IDataHelper.put(cursor, "$scope", scope); } finally { cursor.destroy(); } // --- <<IS-END>> --- } public static final void map (IData pipeline) throws ServiceException { // --- <<IS-START(map)>> --- // @subtype unknown // @sigtype java 3.5 // [i] record:0:optional $document // [i] field:0:optional $service // [i] record:0:optional $pipeline // [i] field:0:optional $key.input // [i] field:0:optional $key.output // [i] field:0:optional $value.input // [i] field:0:optional $value.output // [i] field:0:optional $value.class // [i] field:0:optional $recurse? {"false","true"} // [o] record:0:optional $document IDataCursor cursor = pipeline.getCursor(); try { IData document = IDataHelper.get(cursor, "$document", IData.class); String service = IDataHelper.get(cursor, "$service", String.class); IData scope = IDataHelper.get(cursor, "$pipeline", IData.class); String keyInput = IDataHelper.get(cursor, "$key.input", String.class); String keyOutput = IDataHelper.get(cursor, "$key.output", String.class); String valueInput = IDataHelper.get(cursor, "$value.input", String.class); String valueOutput = IDataHelper.get(cursor, "$value.output", String.class); Class valueClass = IDataHelper.get(cursor, "$value.class", Class.class); boolean recurse = IDataHelper.getOrDefault(cursor, "$recurse?", Boolean.class, false); boolean scoped = scope != null; IDataHelper.put(cursor, "$document", map(document, service, scoped ? scope: pipeline, keyInput, keyOutput, valueInput, valueOutput, valueClass, recurse)); } finally { cursor.destroy(); } // --- <<IS-END>> --- } public static final void merge (IData pipeline) throws ServiceException { // --- <<IS-START(merge)>> --- // @subtype unknown // @sigtype java 3.5 // [i] record:0:optional $operands // [i] field:0:optional $recurse? {"false","true"} // [o] record:0:required $document IDataCursor cursor = pipeline.getCursor(); try { IData operands = IDataHelper.get(cursor, "$operands", IData.class); boolean recurse = IDataHelper.getOrDefault(cursor, "$recurse?", Boolean.class, false); if (operands == null) { // support $documents IData[] argument for backwards compatibility IData[] documents = IDataHelper.get(cursor, "$documents", IData[].class); IDataHelper.put(cursor, "$document", IDataHelper.merge(documents, recurse)); } else { IDataHelper.put(cursor, "$document", IDataHelper.merge(operands, recurse)); } } finally { cursor.destroy(); } // --- <<IS-END>> --- } public static final void normalize (IData pipeline) throws ServiceException { // --- <<IS-START(normalize)>> --- // @subtype unknown // @sigtype java 3.5 // [i] record:0:optional $document // [o] record:0:optional $document IDataCursor cursor = pipeline.getCursor(); try { IData document = IDataHelper.get(cursor, "$document", IData.class); IDataHelper.put(cursor, "$document", IDataHelper.normalize(document), false); } finally { cursor.destroy(); } // --- <<IS-END>> --- } public static final void nullify (IData pipeline) throws ServiceException { // --- <<IS-START(nullify)>> --- // @subtype unknown // @sigtype java 3.5 // [i] record:0:optional $document // [i] field:0:optional $recurse? {"false","true"} // [o] record:0:optional $document IDataCursor cursor = pipeline.getCursor(); try { IData document = IDataHelper.get(cursor, "$document", IData.class); boolean recurse = IDataHelper.getOrDefault(cursor, "$recurse?", Boolean.class, false); IDataHelper.put(cursor, "$document", IDataHelper.nullify(document, recurse), false); } finally { cursor.destroy(); } // --- <<IS-END>> --- } public static final void parse (IData pipeline) throws ServiceException { // --- <<IS-START(parse)>> --- // @subtype unknown // @sigtype java 3.5 // [i] object:0:optional $content // [i] field:0:optional $encoding // [o] record:0:optional $document IDataCursor cursor = pipeline.getCursor(); try { Object content = IDataHelper.get(cursor, "$content"); Charset charset = IDataHelper.get(cursor, "$encoding", Charset.class); IDataHelper.put(cursor, "$document", IDataXMLParser.getInstance().parse(InputStreamHelper.normalize(content, charset)), false); } catch(IOException ex) { ExceptionHelper.raise(ex); } finally { cursor.destroy(); } // --- <<IS-END>> --- } public static final void pivot (IData pipeline) throws ServiceException { // --- <<IS-START(pivot)>> --- // @subtype unknown // @sigtype java 3.5 // [i] record:0:optional $document // [i] field:0:optional $recurse? {"false","true"} // [o] record:1:optional $pivot // [o] - field:0:required key // [o] - object:0:required value IDataCursor cursor = pipeline.getCursor(); try { IData document = IDataHelper.get(cursor, "$document", IData.class); boolean recurse = IDataHelper.getOrDefault(cursor, "$recurse?", Boolean.class, false); IDataHelper.put(cursor, "$pivot", IDataHelper.pivot(document, recurse), false); } finally { cursor.destroy(); } // --- <<IS-END>> --- } public static final void put (IData pipeline) throws ServiceException { // --- <<IS-START(put)>> --- // @subtype unknown // @sigtype java 3.5 // [i] record:0:optional $document // [i] field:0:optional $key // [i] field:0:optional $key.literal? {"false","true"} // [i] object:0:optional $value // [o] record:0:optional $document IDataCursor cursor = pipeline.getCursor(); try { IData document = IDataUtil.getIData(cursor, "$document"); String key = IDataUtil.getString(cursor, "$key"); boolean literal = BooleanHelper.parse(IDataUtil.getString(cursor, "$key.literal?")); Object value = IDataUtil.get(cursor, "$value"); IDataUtil.put(cursor, "$document", IDataHelper.put(document, key, value, literal)); } finally { cursor.destroy(); } // --- <<IS-END>> --- } public static final void rename (IData pipeline) throws ServiceException { // --- <<IS-START(rename)>> --- // @subtype unknown // @sigtype java 3.5 // [i] record:0:optional $document // [i] field:0:required $key.source // [i] field:0:required $key.target // [i] field:0:optional $key.literal? {"false","true"} // [o] record:0:optional $document IDataCursor cursor = pipeline.getCursor(); try { IData document = IDataHelper.get(cursor, "$document", IData.class); String source = IDataHelper.get(cursor, "$key.source", String.class); String target = IDataHelper.get(cursor, "$key.target", String.class); boolean literal = IDataHelper.getOrDefault(cursor, "$key.literal?", Boolean.class, false); IDataHelper.put(cursor, "$document", IDataHelper.rename(document, source, target, literal), false); } finally { cursor.destroy(); } // --- <<IS-END>> --- } public static final void sort (IData pipeline) throws ServiceException { // --- <<IS-START(sort)>> --- // @subtype unknown // @sigtype java 3.5 // [i] record:0:optional $document // [i] field:0:optional $recurse? {"false","true"} // [o] record:0:optional $document IDataCursor cursor = pipeline.getCursor(); try { IData document = IDataHelper.get(cursor, "$document", IData.class); boolean recurse = IDataHelper.getOrDefault(cursor, "$recurse?", Boolean.class, false); IDataHelper.put(cursor, "$document", IDataHelper.sort(document, recurse), false); } finally { cursor.destroy(); } // --- <<IS-END>> --- } public static final void squeeze (IData pipeline) throws ServiceException { // --- <<IS-START(squeeze)>> --- // @subtype unknown // @sigtype java 3.5 // [i] record:0:optional $document // [i] field:0:optional $recurse? {"false","true"} // [o] record:0:optional $document IDataCursor cursor = pipeline.getCursor(); try { IData input = IDataHelper.get(cursor, "$document", IData.class); boolean recurse = IDataHelper.getOrDefault(cursor, "$recurse?", Boolean.class, false); if (input != null) { IData output = IDataHelper.squeeze(input, recurse); if (output == null) output = IDataFactory.create(); IDataHelper.put(cursor, "$document", output); } } finally { cursor.destroy(); } // --- <<IS-END>> --- } public static final void stringify (IData pipeline) throws ServiceException { // --- <<IS-START(stringify)>> --- // @subtype unknown // @sigtype java 3.5 // [i] record:0:optional $document // [i] field:0:optional $recurse? {"false","true"} // [o] record:0:optional $document IDataCursor cursor = pipeline.getCursor(); try { IData document = IDataHelper.get(cursor, "$document", IData.class); boolean recurse = IDataHelper.getOrDefault(cursor, "$recurse?", Boolean.class, false); IDataHelper.put(cursor, "$document", IDataHelper.stringify(document, recurse), false); } finally { cursor.destroy(); } // --- <<IS-END>> --- } public static final void substitute (IData pipeline) throws ServiceException { // --- <<IS-START(substitute)>> --- // @subtype unknown // @sigtype java 3.5 // [i] record:0:optional $document // [i] record:0:optional $pipeline // [i] field:0:optional $default // [i] field:0:optional $mode {"local","global","all"} // [o] record:0:optional $document IDataCursor cursor = pipeline.getCursor(); try { IData document = IDataHelper.get(cursor, "$document", IData.class); IData scope = IDataHelper.get(cursor, "$pipeline", IData.class); String defaultValue = IDataHelper.get(cursor, "$default", String.class); EnumSet<SubstitutionType> mode = SubstitutionType.normalize(IDataHelper.get(cursor, "$mode", String.class)); IDataHelper.put(cursor, "$document", SubstitutionHelper.substitute(document, defaultValue, scope == null ? pipeline : scope, true, mode), false); } finally { cursor.destroy(); } // --- <<IS-END>> --- } public static final void trim (IData pipeline) throws ServiceException { // --- <<IS-START(trim)>> --- // @subtype unknown // @sigtype java 3.5 // [i] record:0:optional $document // [i] field:0:optional $recurse? {"false","true"} // [i] field:0:optional $mode {"values","keys","keys and values"} // [o] record:0:optional $document IDataCursor cursor = pipeline.getCursor(); try { IData document = IDataHelper.get(cursor, "$document", IData.class); boolean recurse = IDataHelper.getOrDefault(cursor, "$recurse?", Boolean.class, false); TransformerMode mode = IDataHelper.get(cursor, "$mode", TransformerMode.class); IDataHelper.put(cursor, "$document", IDataHelper.trim(document, mode, recurse), false); } finally { cursor.destroy(); } // --- <<IS-END>> --- } public static final void uncase (IData pipeline) throws ServiceException { // --- <<IS-START(uncase)>> --- // @subtype unknown // @sigtype java 3.5 // [i] record:0:optional $document // [i] record:0:optional $locale // [i] - field:0:required language // [i] - field:0:optional country // [i] - field:0:optional variant // [o] record:0:optional $document IDataCursor cursor = pipeline.getCursor(); try { IData document = IDataHelper.get(cursor, "$document", IData.class); Locale locale = IDataHelper.getOrDefault(cursor, "$locale", Locale.class, Locale.getDefault()); if (document != null) IDataHelper.put(cursor, "$document", new CaseInsensitiveIData(IDataHelper.duplicate(document, true), locale)); } finally { cursor.destroy(); } // --- <<IS-END>> --- } public static final void values (IData pipeline) throws ServiceException { // --- <<IS-START(values)>> --- // @subtype unknown // @sigtype java 3.5 // [i] record:0:optional $document // [o] object:1:optional $values IDataCursor cursor = pipeline.getCursor(); try { IData document = IDataHelper.get(cursor, "$document", IData.class); IDataHelper.put(cursor, "$values", IDataHelper.getValues(document), false, false); } finally { cursor.destroy(); } // --- <<IS-END>> --- } // --- <<IS-START-SHARED>> --- // visits each element in the given IData document, calls the given service to convert the element, and creates a new IData document with the resulting elements public static IData map(IData input, String service, IData pipeline, String keyInput, String keyOutput, String valueInput, String valueOutput, Class valueClass, boolean recurse) throws ServiceException { IData output = null; if (input != null && service != null) { IDataCursor ic = input.getCursor(); output = IDataFactory.create(); IDataCursor oc = output.getCursor(); if (keyInput == null) keyInput = "$key"; if (keyOutput == null) keyOutput = keyInput; if (valueInput == null) valueInput = "$value"; if (valueOutput == null) valueOutput = valueInput; if (pipeline == null) pipeline = IDataFactory.create(); try { while(ic.next()) { Tuple<Object> tuple = new Tuple<Object>(ic.getKey(), ic.getValue()); if (recurse && tuple.value != null) { if (tuple.value instanceof IData) { tuple.value = map((IData)tuple.value, service, pipeline, keyInput, keyOutput, valueInput, valueOutput, valueClass, recurse); } else if (tuple.value instanceof IData[] || tuple.value instanceof com.wm.util.Table) { IData[] iary = tuple.value instanceof IData[] ? (IData[])tuple.value : ((com.wm.util.Table)tuple.value).getValues(); IData[] oary = new IData[iary.length]; for (int i = 0; i < iary.length; i++) { oary[i] = map(iary[i], service, pipeline, keyInput, keyOutput, valueInput, valueOutput, valueClass, recurse); } tuple.value = oary; } else if (tuple.value instanceof String[][]) { String[][] iary = (String[][])tuple.value; String[][] oary = new String[iary.length][]; for (int i = 0; i < iary.length; i++) { if (iary[i] != null) { oary[i] = new String[iary[i].length]; for (int j = 0; j < iary[i].length; j++) { Tuple<String> t = map(new Tuple<String>(tuple.key, iary[i][j]), service, pipeline, keyInput, keyOutput, valueInput, valueOutput, valueClass); oary[i][j] = t.value; } } } tuple.value = oary; } else if (tuple.value instanceof String[]) { String[] iary = (String[])tuple.value; String[] oary = new String[iary.length]; for (int i = 0; i < iary.length; i++) { Tuple<String> t = map(new Tuple<String>(tuple.key, iary[i]), service, pipeline, keyInput, keyOutput, valueInput, valueOutput, valueClass); oary[i] = t.value; } tuple.value = oary; } else if (tuple.value instanceof Object[]) { Object[] iary = (Object[])tuple.value; Object[] oary = new Object[iary.length]; for (int i = 0; i < iary.length; i++) { Tuple<Object> t = map(new Tuple<Object>(tuple.key, iary[i]), service, pipeline, keyInput, keyOutput, valueInput, valueOutput, valueClass); oary[i] = t.value; } tuple.value = oary; } } tuple = map(tuple, service, pipeline, keyInput, keyOutput, valueInput, valueOutput, valueClass); IDataHelper.put(oc, tuple.key, tuple.value); } } finally { ic.destroy(); oc.destroy(); } } else { output = IDataHelper.duplicate(input, recurse); } return output; } // wrapper class for {key, value} tuples protected static class Tuple<T> { public String key; public T value; public Tuple(String key, T value) { this.key = key; this.value = value; } } // converts the given element by calling the given service, and returns the result protected static <T> Tuple<T> map(Tuple<T> tuple, String service, IData pipeline, String keyInput, String keyOutput, String valueInput, String valueOutput, Class valueClass) throws ServiceException { if (tuple.value == null || valueClass == null || valueClass.isInstance(tuple.value)) { IDataCursor cursor = pipeline.getCursor(); IDataHelper.put(cursor, keyInput, tuple.key); IDataHelper.put(cursor, valueInput, tuple.value); cursor.destroy(); pipeline = ServiceHelper.invoke(service, pipeline); // clean up the input pipeline cursor = pipeline.getCursor(); tuple.key = IDataHelper.get(cursor, keyOutput, String.class); tuple.value = (T)IDataHelper.get(cursor, valueOutput); IDataHelper.remove(cursor, keyInput); if (!keyInput.equals(keyOutput)) IDataHelper.remove(cursor, keyOutput); IDataHelper.remove(cursor, valueInput); if (!valueInput.equals(valueOutput)) IDataHelper.remove(cursor, valueOutput); cursor.destroy(); } return tuple; } // invokes the given service for each {key, value} pair in the given IData document public static <T> void each(IData input, String service, IData pipeline, String keyInput, String valueInput, Class valueClass, boolean recurse) throws ServiceException { map(input, service, pipeline, keyInput, null, valueInput, null, valueClass, recurse); } // --- <<IS-END-SHARED>> --- }