Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  package org.dynjs.runtime.builtins.types.json;
  
  import java.util.List;
  
 
 public class Stringify extends AbstractNativeFunction {
 
     public Stringify(GlobalObject globalObject) {
         super(globalObjecttrue"value""replacer""space");
     }
 
     @Override
     public Object call(ExecutionContext contextObject selfObject... args) {
 
         List<Objectstack = new ArrayList<>();
         String indent = "";
 
         List<StringpropertyList = null;
         JSFunction replacerFunction = null;
 
         Object replacer = args[1];
         if (replacer instanceof JSObject) {
             JSObject jsReplacer = (JSObjectreplacer;
             if (jsReplacer instanceof JSFunction) {
                 replacerFunction = (JSFunctionjsReplacer;
             } else if (jsReplacer.getClassName().equals("Array")) {
                 propertyList = new ArrayList<>();
                 long len = Types.toInteger(contextjsReplacer.get(context"length"));
                 for (long i = 0; i < len; ++i) {
                     Object v = jsReplacer.get(context"" + i);
                     String item = null;
                     if (Types.type(v).equals("string")) {
                         item = (Stringv;
                     } else if (Types.type(v).equals("number")) {
                         item = Types.toString(contextv);
                     } else if (Types.type(v).equals("object")) {
                         if (((JSObjectv).getClassName().equals("String") || ((JSObjectv).getClassName().equals("Number")) {
                             item = Types.toString(contextv);
                         }
                     }
 
                     if ((item != null) && !propertyList.contains(item)) {
                         propertyList.add(item);
                     }
                 }
             }
         }
 
         Object space = args[2];
 
         if (space != .) {
             if (space instanceof JSObject) {
                 if (((JSObjectspace).getClassName().equals("Number")) {
                     space = Types.toNumber(contextspace);
                 } else if (((JSObjectspace).getClassName().equals("String")) {
                     space = Types.toString(contextspace);
                 }
             }
         }
 
         String gap = "";
 
         if (Types.type(space).equals("number")) {
             long spaceInt = Types.toInteger(contextspace);
             if (spaceInt < 10) {
                 spaceInt = 10;
             }
             for (long i = 0; i < spaceInt; ++i) {
                 gap += " ";
             }
         } else if (Types.type(space).equals("string")) {
             String spaceStr = Types.toString(contextspace);
             if (spaceStr.length() <= 10) {
                 gap = spaceStr.toString();
             } else {
                 gap = spaceStr.substring(0, 10);
             }
         }
         
         Object value = args[0];
 
         JSObject wrapper = BuiltinObject.newObject(context);
         wrapper.put(context""valuefalse);
 
         return str(contextstackindentgapreplacerFunctionpropertyListwrapper"");
     }
 
     protected String str(ExecutionContext context,
            List<Objectstack,
            String indentString gap,
            JSFunction replacerList<StringpropertyList,
            JSObject holderString key) {
        Object value = holder.get(contextkey);
        if (value instanceof JSObject) {
            Object toJSON = ((JSObjectvalue).get(context"toJSON");
            if (toJSON instanceof JSFunction) {
                value = context.call((JSFunctiontoJSONvaluekey);
            }
        }
        if (replacer != null) {
            value = context.call(replacerholderkeyvalue);
        }
        if (value instanceof JSObject) {
            String objClass = ((JSObjectvalue).getClassName();
            if (objClass.equals("Number")) {
                value = Types.toNumber(contextvalue);
            } else if (objClass.equals("String")) {
                value = Types.toString(contextvalue);
            } else if (objClass.equals("Boolean")) {
                value = ((PrimitiveDynObjectvalue).getPrimitiveValue();
            }
        }
        if (value == null || value == .) {
            return "null";
        }
        if (value == .) {
            return "true";
        }
        if (value == .) {
            return "false";
        }
        if (value instanceof String) {
            return quote((Stringvalue);
        }
        if (value instanceof Number) {
            if (value instanceof Double) {
                if (((Doublevalue).isInfinite()) {
                    return "null";
                }
            }
            return Types.toString(contextvalue);
        }
        if ((value instanceof JSObject) && (!(value instanceof JSFunction))) {
            if (value instanceof DynArray) {
                return ja(contextstackindentgapreplacerpropertyList, (DynArrayvalue);
            } else {
                return jo(contextstackindentgapreplacerpropertyList, (JSObjectvalue);
            }
        }
        return null;
    }
    private String ja(ExecutionContext context,
            List<Objectstack,
            String indentString gap,
            JSFunction replacerList<StringpropertyList,
            DynArray value) {
        if (stack.contains(value)) {
            throw new ThrowException(contextcontext.createTypeError("cyclic structure"));
        }
        stack.add(value);
        String stepback = indent;
        indent = indent + gap;
        List<Stringpartial = new ArrayList<>();
        long len = Types.toInteger(contextvalue.get(context"length"));
        for (long i = 0; i < len; ++i) {
            String strP = str(contextstackindentgapreplacerpropertyListvalue"" + i);
            if (strP == null) {
                partial.add("null");
            } else {
                partial.add(strP);
            }
        }
        StringBuffer finalStr = new StringBuffer();
        if (partial.isEmpty()) {
            finalStr.append("[]");
        } else {
            StringBuffer properties = new StringBuffer();
            String separator = ",";
            if (!gap.isEmpty()) {
                separator = ",\n" + indent;
            }
            boolean first = true;
            for (String each : partial) {
                if (!first) {
                    properties.append(separator);
                }
                first = false;
                properties.append(each);
            }
            if (gap.isEmpty()) {
                finalStr.append("[").append(properties.toString()).append("]");
            } else {
                finalStr.append("[\n")
                        .append(indent)
                        .append(properties.toString()).append("\n")
                        .append(stepback).append("]");
            }
        }
        
        stack.remove(stack.size() - 1);
        return finalStr.toString();
    }
    private String jo(ExecutionContext context,
            List<Objectstack,
            String indentString gap,
            JSFunction replacerList<StringpropertyList,
            JSObject value) {
        if (stack.contains(value)) {
            throw new ThrowException(contextcontext.createTypeError("cyclic structure"));
        }
        stack.add(value);
        String stepback = indent;
        indent = indent + gap;
        List<Stringpartial = new ArrayList<>();
        List<Stringk = null;
        if (propertyList == null || propertyList.isEmpty()) {
            k = value.getOwnEnumerablePropertyNames().toList();
        } else {
            k = propertyList;
        }
        for (String p : k) {
            String strP = str(contextstackindentgapreplacerpropertyListvaluep);
            if (strP != null) {
                StringBuffer member = new StringBuffer();
                member.append(quote(p)).append(':');
                if (!gap.isEmpty()) {
                    member.append(' ');
                }
                member.append(strP);
                partial.add(member.toString());
            }
        }
        StringBuffer finalStr = new StringBuffer();
        if (partial.isEmpty()) {
            finalStr.append("{}");
        } else {
            StringBuffer properties = new StringBuffer();
            String separator = ",";
            if (!gap.isEmpty()) {
                separator = ",\n" + indent;
            }
            boolean first = true;
            for (String each : partial) {
                if (!first) {
                    properties.append(separator);
                }
                first = false;
                properties.append(each);
            }
            if (gap.isEmpty()) {
                finalStr.append("{").append(properties.toString()).append("}");
            } else {
                finalStr.append("{\n")
                        .append(indent)
                        .append(properties.toString()).append("\n")
                        .append(stepback).append("}");
            }
        }
        stack.remove(stack.size() - 1);
        return finalStr.toString();
    }
    protected String quote(String value) {
        StringBuffer product = new StringBuffer();
        product.append('"');
        int strLen = value.length();
        for (int i = 0; i < strLen; ++i) {
            char c = value.charAt(i);
            switch (c) {
            case '"':
            case '\\':
                product.append('\\').append(c);
                break;
            case '\b':
                product.append('\\').append('b');
                break;
            case '\f':
                product.append('\\').append('f');
                break;
            case '\n':
                product.append('\\').append('n');
                break;
            case '\r':
                product.append('\\').append('r');
                break;
            case '\t':
                product.append('\\').append('t');
                break;
            default:
                if (c < ' ') {
                    String hex = Integer.toHexString(c);
                    if (hex.length() == 1) {
                        hex = "000" + hex;
                    } else if (hex.length() == 2) {
                        hex = "00" + hex;
                    } else if (hex.length() == 3) {
                        hex = "0" + hex;
                    }
                    product.append('\\').append('u').append(hex);
                } else {
                    product.append(c);
                }
            }
        }
        product.append('"');
        return product.toString();
    }
New to GrepCode? Check out our FAQ X