package tundra;
// -----( IS Java Code Template v1.2
// -----( CREATED: 2017-05-08 18:35:04 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 com.wm.app.b2b.server.ServiceThread;
import com.wm.lang.ns.NSService;
import java.nio.charset.Charset;
import java.util.List;
import permafrost.tundra.collection.CollectionHelper;
import permafrost.tundra.data.IDataHelper;
import permafrost.tundra.io.InputStreamHelper;
import permafrost.tundra.lang.ArrayHelper;
import permafrost.tundra.lang.BooleanHelper;
import permafrost.tundra.lang.CharsetHelper;
import permafrost.tundra.lang.ExceptionHelper;
import permafrost.tundra.lang.IterableHelper;
import permafrost.tundra.lang.ObjectHelper;
import permafrost.tundra.lang.StringHelper;
import permafrost.tundra.lang.ThreadHelper;
import permafrost.tundra.math.IntegerHelper;
import permafrost.tundra.math.NormalDistributionEstimator;
import permafrost.tundra.net.http.HTTPHelper;
import permafrost.tundra.server.invoke.DeferHelper;
import permafrost.tundra.server.invoke.RetryableServiceProcessor;
import permafrost.tundra.server.NodeHelper;
import permafrost.tundra.server.ServiceHelper;
import permafrost.tundra.time.DurationHelper;
import permafrost.tundra.time.DurationPattern;
// --- <<IS-END-IMPORTS>> ---
public final class service
{
// ---( internal utility methods )---
final static service _instance = new service();
static service _newInstance() { return new service(); }
static service _cast(Object o) { return (service)o; }
// ---( server methods )---
public static final void benchmark (IData pipeline)
throws ServiceException
{
// --- <<IS-START(benchmark)>> ---
// @subtype unknown
// @sigtype java 3.5
// [i] field:0:required $service
// [i] record:0:optional $pipeline
// [i] field:0:required $count
// [i] field:0:optional $raise? {"false","true"}
// [o] field:0:required $duration.average
// [o] field:0:required $duration.standard.deviation
// [o] field:0:required $duration.minimum
// [o] field:0:required $duration.maximum
// [o] field:0:required $message
IDataCursor cursor = pipeline.getCursor();
try {
String service = IDataHelper.get(cursor, "$service", String.class);
IData scope = IDataHelper.get(cursor, "$pipeline", IData.class);
int count = IDataHelper.get(cursor, "$count", Integer.class);
boolean raise = IDataHelper.getOrDefault(cursor, "$raise?", Boolean.class, false);
NormalDistributionEstimator estimator = ServiceHelper.benchmark(service, scope == null? pipeline : scope, count, raise);
IDataHelper.put(cursor, "$duration.average", DurationHelper.format(estimator.getMean()/1000.0, 6, DurationPattern.XML));
IDataHelper.put(cursor, "$duration.standard.deviation", DurationHelper.format(estimator.getStandardDeviation()/1000.0, 6, DurationPattern.XML));
IDataHelper.put(cursor, "$duration.minimum", DurationHelper.format(estimator.getMinimum()/1000.0, 6, DurationPattern.XML));
IDataHelper.put(cursor, "$duration.maximum", DurationHelper.format(estimator.getMaximum()/1000.0, 6, DurationPattern.XML));
IDataHelper.put(cursor, "$message", service + " benchmark results: " + estimator.toString());
} finally {
cursor.destroy();
}
// --- <<IS-END>> ---
}
public static final void callstack (IData pipeline)
throws ServiceException
{
// --- <<IS-START(callstack)>> ---
// @subtype unknown
// @sigtype java 3.5
// [o] field:1:required $callstack
// [o] field:0:required $callers
// [o] field:0:required $caller
IDataCursor cursor = pipeline.getCursor();
try {
List<NSService> stack = ServiceHelper.getCallStack();
if (stack.size() > 0) stack.remove(stack.size() - 1); // remove call to this service
String caller = "";
if (stack.size() > 1) {
NSService service = stack.get(stack.size() - 2);
if (service != null) caller = ObjectHelper.stringify(service);
}
IDataHelper.put(cursor, "$callstack", CollectionHelper.arrayify(CollectionHelper.stringify(stack), String.class));
IDataHelper.put(cursor, "$callers", IterableHelper.join(stack, " \u2192 "));
IDataHelper.put(cursor, "$caller", caller);
} finally {
cursor.destroy();
}
// --- <<IS-END>> ---
}
public static final void create (IData pipeline)
throws ServiceException
{
// --- <<IS-START(create)>> ---
// @subtype unknown
// @sigtype java 3.5
// [i] field:0:required $package
// [i] field:0:required $service
IDataCursor cursor = pipeline.getCursor();
try {
String packageName = IDataHelper.get(cursor, "$package", String.class);
String serviceName = IDataHelper.get(cursor, "$service", String.class);
ServiceHelper.create(packageName, serviceName);
} finally {
cursor.destroy();
}
// --- <<IS-END>> ---
}
public static final void defer (IData pipeline)
throws ServiceException
{
// --- <<IS-START(defer)>> ---
// @subtype unknown
// @sigtype java 3.5
// [i] field:0:required $service
// [i] record:0:optional $pipeline
IDataCursor cursor = pipeline.getCursor();
try {
String service = IDataHelper.get(cursor, "$service", String.class);
IData scope = IDataHelper.get(cursor, "$pipeline", IData.class);
DeferHelper.defer(service, scope == null ? pipeline : scope);
} finally {
cursor.destroy();
}
// --- <<IS-END>> ---
}
public static final void ensure (IData pipeline)
throws ServiceException
{
// --- <<IS-START(ensure)>> ---
// @subtype unknown
// @sigtype java 3.5
// [i] field:0:optional $service
// [i] field:0:optional $catch
// [i] field:0:optional $finally
// [i] record:0:optional $pipeline
// [o] record:0:optional $pipeline
IDataCursor cursor = pipeline.getCursor();
try {
String tryService = IDataHelper.get(cursor, "$service", String.class);
String catchService = IDataHelper.get(cursor, "$catch", String.class);
String finallyService = IDataHelper.get(cursor, "$finally", String.class);
IData scope = IDataHelper.get(cursor, "$pipeline", IData.class);
boolean scoped = scope != null;
scope = ServiceHelper.ensure(tryService, catchService, finallyService, scoped ? scope : pipeline);
if (scoped) IDataHelper.put(cursor, "$pipeline", scope);
} finally {
cursor.destroy();
}
// --- <<IS-END>> ---
}
public static final void fork (IData pipeline)
throws ServiceException
{
// --- <<IS-START(fork)>> ---
// @subtype unknown
// @sigtype java 3.5
// [i] field:0:required $service
// [i] record:0:optional $pipeline
// [o] object:0:required $thread
IDataCursor cursor = pipeline.getCursor();
try {
String service = IDataHelper.get(cursor, "$service", String.class);
IData scope = IDataHelper.get(cursor, "$pipeline", IData.class);
IDataHelper.put(cursor, "$thread", ServiceHelper.fork(service, scope == null ? pipeline : scope));
} finally {
cursor.destroy();
}
// --- <<IS-END>> ---
}
public static final void initiator (IData pipeline)
throws ServiceException
{
// --- <<IS-START(initiator)>> ---
// @subtype unknown
// @sigtype java 3.5
// [o] field:0:required $initiator?
IDataCursor cursor = pipeline.getCursor();
try {
List<NSService> stack = ServiceHelper.getCallStack();
if (stack.size() > 0) stack.remove(stack.size() - 1); // remove call to this service
IDataHelper.put(cursor, "$initiator?", stack.size() <= 1, String.class);
} finally {
cursor.destroy();
}
// --- <<IS-END>> ---
}
public static final void invoke (IData pipeline)
throws ServiceException
{
// --- <<IS-START(invoke)>> ---
// @subtype unknown
// @sigtype java 3.5
// [i] field:0:required $service
// [i] record:0:optional $pipeline
// [i] field:0:optional $raise? {"true","false"}
// [o] record:0:optional $pipeline
// [o] field:0:optional $duration
IDataCursor cursor = pipeline.getCursor();
try {
String service = IDataHelper.get(cursor, "$service", String.class);
IData scope = IDataHelper.get(cursor, "$pipeline", IData.class);
String mode = IDataHelper.get(cursor, "$mode", String.class);
boolean raise = IDataHelper.getOrDefault(cursor, "$raise?", Boolean.class, true);
boolean scoped = scope != null;
if (mode != null && mode.equals("asynchronous")) {
// support asynchronous mode for backwards compatiblity
IDataHelper.put(cursor, "$thread", ServiceHelper.fork(service, scoped ? scope : pipeline));
} else {
long start = System.currentTimeMillis();
scope = ServiceHelper.invoke(service, scoped ? scope : pipeline, raise);
long end = System.currentTimeMillis();
if (scoped) IDataUtil.put(cursor, "$pipeline", scope);
IDataHelper.put(cursor, "$duration", DurationHelper.format(end - start, DurationPattern.XML));
}
} finally {
cursor.destroy();
}
// --- <<IS-END>> ---
}
public static final void join (IData pipeline)
throws ServiceException
{
// --- <<IS-START(join)>> ---
// @subtype unknown
// @sigtype java 3.5
// [i] object:0:optional $thread
// [i] field:0:optional $raise? {"true","false"}
// [o] record:0:optional $pipeline
IDataCursor cursor = pipeline.getCursor();
try {
ServiceThread thread = IDataHelper.get(cursor, "$thread", ServiceThread.class);
boolean raise = IDataHelper.getOrDefault(cursor, "$raise", Boolean.class, true);
if (thread != null) IDataHelper.put(cursor, "$pipeline", ServiceHelper.join(thread, raise));
} finally {
cursor.destroy();
}
// --- <<IS-END>> ---
}
public static final void nothing (IData pipeline)
throws ServiceException
{
// --- <<IS-START(nothing)>> ---
// @subtype unknown
// @sigtype java 3.5
// --- <<IS-END>> ---
}
public static final void reflect (IData pipeline)
throws ServiceException
{
// --- <<IS-START(reflect)>> ---
// @subtype unknown
// @sigtype java 3.5
// [i] field:0:optional $service
// [o] record:0:optional $service.properties
// [o] - field:0:required name
// [o] - field:0:required type
// [o] - field:0:required package
// [o] - field:0:optional description
// [o] - record:0:required references
// [o] -- field:1:required packages
// [o] -- field:0:required packages.length
// [o] -- record:1:required nodes
// [o] --- field:0:required package
// [o] --- field:0:required node
// [o] -- field:0:required nodes.length
// [o] -- field:1:required unresolved
// [o] -- field:0:required unresolved.length
// [o] - record:0:required dependents
// [o] -- field:1:required packages
// [o] -- field:0:required packages.length
// [o] -- record:1:required nodes
// [o] --- field:0:required package
// [o] --- field:0:required node
// [o] -- field:0:required nodes.length
IDataCursor cursor = pipeline.getCursor();
try {
String service = IDataHelper.get(cursor, "$service", String.class);
IDataHelper.put(cursor, "$service.properties", ServiceHelper.reflect(service), false);
} finally {
cursor.destroy();
}
// --- <<IS-END>> ---
}
public static final void respond (IData pipeline)
throws ServiceException
{
// --- <<IS-START(respond)>> ---
// @subtype unknown
// @sigtype java 3.5
// [i] field:0:required $code
// [i] field:0:optional $message
// [i] record:0:optional $headers
// [i] object:0:optional $content
// [i] field:0:optional $content.type
// [i] field:0:optional $encoding
IDataCursor cursor = pipeline.getCursor();
try {
int code = IDataHelper.get(cursor, "$code", Integer.class);
String message = IDataHelper.get(cursor, "$message", String.class);
IData headers = IDataHelper.get(cursor, "$headers", IData.class);
Object content = IDataHelper.get(cursor, "$content");
String contentType = IDataHelper.get(cursor, "$content.type", String.class);
Charset charset = IDataHelper.get(cursor, "$encoding", Charset.class);
ServiceHelper.respond(code, message, headers, InputStreamHelper.normalize(content, charset), contentType, charset);
} finally {
cursor.destroy();
}
// --- <<IS-END>> ---
}
public static final void retryable (IData pipeline)
throws ServiceException
{
// --- <<IS-START(retryable)>> ---
// @subtype unknown
// @sigtype java 3.5
RetryableServiceProcessor.getInstance().register();
// --- <<IS-END>> ---
}
public static final void self (IData pipeline)
throws ServiceException
{
// --- <<IS-START(self)>> ---
// @subtype unknown
// @sigtype java 3.5
// [o] field:0:optional $self
IDataCursor cursor = pipeline.getCursor();
try {
NSService self = ServiceHelper.self();
if (self != null) IDataHelper.put(cursor, "$self", self.toString());
} finally {
cursor.destroy();
}
// --- <<IS-END>> ---
}
public static final void sleep (IData pipeline)
throws ServiceException
{
// --- <<IS-START(sleep)>> ---
// @subtype unknown
// @sigtype java 3.5
// [i] field:0:required $duration
tundra.thread.sleep(pipeline);
// --- <<IS-END>> ---
}
public static final void validate (IData pipeline)
throws ServiceException
{
// --- <<IS-START(validate)>> ---
// @subtype unknown
// @sigtype java 3.5
// [i] field:0:optional $service
// [i] field:0:optional $raise? {"false","true"}
// [o] field:0:required $valid?
IDataCursor cursor = pipeline.getCursor();
try {
String service = IDataHelper.get(cursor, "$service", String.class);
boolean raise = IDataHelper.getOrDefault(cursor, "$raise?", Boolean.class, false);
IDataHelper.put(cursor, "$valid?", ServiceHelper.exists(service, raise), String.class);
} finally {
cursor.destroy();
}
// --- <<IS-END>> ---
}
}