/*
* Copyright (c) 2014.
*
* BaasBox - info@baasbox.com
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.baasbox.service.scripting.base;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.TextNode;
/**
*
* Created by Andrea Tortorella on 10/06/14.
*/
public final class ScriptResult {
public static final ScriptResult NULL = new ScriptResult();
public static final ScriptResult TRUE = new ScriptResult(true,Type.BOOL);
public static final ScriptResult FALSE = new ScriptResult(false,Type.BOOL);
private final Object data;
public final Type type;
private ScriptResult(){
this.data=null;
this.type=Type.NULL;
}
private ScriptResult(Object data,Type type){
this.data = data;
this.type=type;
}
public ScriptResult(JsonNode node){
data = node;
type=node.isArray()?Type.ARRAY:Type.OBJECT;
}
public ScriptResult(String text){
data = text;
type=Type.TEXT;
}
public ScriptResult(Number number){
data=number;
type=Type.NUMBER;
}
public Object data(){
return data;
}
public int status(){
if (!Type.OBJECT.equals(type))return 200;
JsonNode node = (JsonNode)data;
JsonNode status = node.get("status");
if (status==null||!status.isNumber()) return 200;
return status.asInt();
}
public JsonNode content(){
if (!Type.OBJECT.equals(type))return TextNode.valueOf("");
JsonNode node = (JsonNode)data;
JsonNode content = node.get("content");
if (content==null) return TextNode.valueOf("");
return content;
}
public ScriptStatus toScriptStatus() throws ScriptEvalException{
if (type == Type.NULL|| this == TRUE){
return ScriptStatus.ok();
} else if (this == FALSE){
return ScriptStatus.fail();
} else if (type == Type.OBJECT){
JsonNode data = (JsonNode)this.data;
JsonNode status = data.get("status");
if (status ==null||!status.isBoolean()){
throw new ScriptEvalException("Script failure: unexpected result, missing status");
}
JsonNode message = data.get("message");
String msg;
if (message != null && message.isTextual()){
msg = message.asText();
} else {
msg = "";
}
if(status.asBoolean()){
return ScriptStatus.ok(msg);
} else {
return ScriptStatus.fail(msg);
}
}
throw new ScriptEvalException("Script failure: unexpected result type");
}
public JsonNode jsonData(){
if (type == Type.OBJECT){
return (JsonNode)data;
}
throw new IllegalStateException("Expected data should be json");
}
public boolean isFalsy() {
if (type == Type.NULL|| this == FALSE){
return false;
}
return true;
}
public static enum Type{
NULL,
BOOL,
TEXT,
NUMBER,
OBJECT,
BINARY, //todo fix binary results
ARRAY
}
@Override
public String toString() {
return "ScriptResult [Type: "+type+" Data: "+(data==null?"null":data)+"]";
}
}