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

com.effektif.workflow.impl.json.JsonObjectWriter Maven / Gradle / Ivy

/* Copyright (c) 2014, Effektif GmbH.
 * 
 * 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.effektif.workflow.impl.json;

import java.util.List;
import java.util.Map;
import java.util.Stack;

/**
 * Serialises to JSON using a {@link Map}-based JSON representation.
 */
public class JsonObjectWriter extends JsonWriter {
  
  public static class ObjectContext {
    List jsonList;
    Map jsonMap;
    String fieldName;
    public void setValue(Object value) {
      if (jsonMap!=null && fieldName!=null) {
        jsonMap.put(fieldName, value);
        fieldName = null;
      } else if (jsonList!=null) {
        jsonList.add(value);
      }
    }
  }
  
  JsonObjectMapper jsonObjectMapper;
  Stack objectContextStack = new Stack<>();
  Object result = null;
  
  public JsonObjectWriter(Mappings mappings, JsonObjectMapper jsonObjectMapper) {
    super(mappings);
    this.jsonObjectMapper = jsonObjectMapper;
  }

  @Override
  public void objectStart() {
    ObjectContext objectContext = new ObjectContext();
    objectContext.jsonMap = jsonObjectMapper.newObjectMap();
    objectContextStack.push(objectContext);
  }

  @Override
  public void objectEnd() {
    ObjectContext objectContext = objectContextStack.pop();
    writeValue(objectContext.jsonMap);
  }

  @Override
  public void writeFieldName(String fieldName) {
    objectContextStack.peek().fieldName = fieldName;
  }

  @Override
  public void arrayEnd() {
    ObjectContext objectContext = objectContextStack.pop();
    writeValue(objectContext.jsonList);
  }

  @Override
  public void arrayStart() {
    ObjectContext objectContext = new ObjectContext();
    objectContext.jsonList = jsonObjectMapper.newArray();
    objectContextStack.push(objectContext);
  }

  public void writeValue(Object value) {
    if (!objectContextStack.isEmpty()) {
      objectContextStack.peek().setValue(value);
    } else {
      result = value;
    }
  }

  @Override
  public void writeString(String s) {
    writeValue(s);
  }

  @Override
  public void writeBoolean(Boolean b) {
    writeValue(b);
  }
  
  @Override
  public void writeNumber(Number n) {
    writeValue(n);
  }

  @Override
  public void writeNull() {
  }
}