All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.ibm.sbt.playground.dojo.JsonWriter Maven / Gradle / Ivy

There is a newer version: 1.1.12.20161007-1200
Show newest version
/*
 * Copyright IBM Corp. 2010
 * 
 * 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.ibm.sbt.playground.dojo;

import java.io.IOException;
import java.io.Writer;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;

import com.ibm.commons.util.AbstractIOException;
import com.ibm.commons.util.io.json.JsonException;
import com.ibm.commons.util.io.json.JsonGenerator;
import com.ibm.commons.util.io.json.JsonJavaFactory;



/**
 * Specialized JSON writer.
 * 
 * @author Philippe Riand
 */
public class JsonWriter extends JsonGenerator.WriterGenerator {
    
    private int objectLevels = 0;
    private boolean first[] = new boolean[32]; // max 32 for now...
    
    public JsonWriter(Writer writer, boolean compact) {
        super(JsonJavaFactory.instance,writer,compact);
    }
    
    public void startObject() throws IOException {
        nl();
        indent();
        out('{');
        first[++objectLevels]=true;
        incIndent();
    }
    public void endObject() throws IOException {
        nl();
        decIndent();
        indent();
        out('}');
        first[--objectLevels]=false;
    }
    public void startArray() throws IOException {
        nl();
        indent();
        out('[');
        first[++objectLevels]=true;
        incIndent();
    }
    public void endArray() throws IOException {
        nl();
        decIndent();
        indent();
        out(']');
        first[--objectLevels]=false;
    }
    public void startArrayItem() throws IOException {
        if(!first[objectLevels]) {
            out(',');
        }
    }
    public void endArrayItem() throws IOException {
        first[objectLevels]=false;
    }
    public void startProperty(String propertyName) throws IOException {
        if(!first[objectLevels]) {
            out(',');
        } else {
            first[objectLevels]=false;
        }
        nl();
        incIndent();
        indent();
        outPropertyName(propertyName);
        out(':');
    }
    public void endProperty() throws IOException {
        decIndent();
    }

    // Should be moved to the core libs
    @Override
    public void outNumberLiteral(double d) throws IOException {
        long l = (long)d;
        if((double)l==d) {
            String s = Long.toString(l);
            out(s);
        } else {
            String s = Double.toString(d);
            out(s);
        }
    }
    
    // Should be moved to the core libs
    public void outDateLiteral(Date value) throws IOException {
        String s = dateToString(value, true);
        outStringLiteral(s);
    }

    //Time Format
    public static final String TIME_FORMAT_C = "yyyy-MM-dd'T'HH:mm:ssZ"; //$NON-NLS-1$
    public static final String TIME_FORMAT_DO = "yyyy-MM-dd"; //$NON-NLS-1$
    public static final String TIME_FORMAT_TO = "HH:mm:ss"; //$NON-NLS-1$
    public static final String TIME_FORMAT_D = "yyyy-MM-dd'T'HH:mm:ss'Z'"; //$NON-NLS-1$
    public static final String TIME_ZONE_UTC = "UTC"; //$NON-NLS-1$

	public static SimpleDateFormat ISO8601_UTC = null;
	public static SimpleDateFormat ISO8601_DT = new SimpleDateFormat(TIME_FORMAT_C); // $NON-NLS-1$
    
    /**
     * Converts a date to an ISO8601 string.
     * 
     * @param value The date.
     * @param utc   If true, format the time in UTC.  If false,
     *              format the time in the local time zone.
     * @return      The ISO8601 string.
     * @throws IOException
     */
    private String dateToString(Date value, boolean utc) throws IOException {
        String result = null;
        
        if ( utc ) {
            if ( ISO8601_UTC == null ) {
                // Initialize the UTC formatter once
                TimeZone tz = TimeZone.getTimeZone(TIME_ZONE_UTC); 
                ISO8601_UTC = new SimpleDateFormat(TIME_FORMAT_D); 
                ISO8601_UTC.setTimeZone(tz);        
            }
            
            result = ISO8601_UTC.format((Date)value);
        }
        else {
            result = ISO8601_DT.format((Date)value);
        }
        
        return result;
    }
}   




© 2015 - 2024 Weber Informatics LLC | Privacy Policy