org.emfjson.jackson.streaming.References.java Source code

Java tutorial

Introduction

Here is the source code for org.emfjson.jackson.streaming.References.java

Source

/*
 * Copyright (c) 2011-2014 Guillaume Hillairet.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *    Guillaume Hillairet - initial API and implementation
 */
package org.emfjson.jackson.streaming;

import static org.emfjson.common.Constants.EJS_REF_KEYWORD;
import static org.emfjson.common.Constants.EJS_TYPE_KEYWORD;

import java.io.IOException;
import java.util.Collection;

import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.resource.Resource;
import org.emfjson.common.Cache;
import org.emfjson.common.Options;

import com.fasterxml.jackson.core.JsonGenerator;

public class References {

    private final Cache cache;
    private final Options options;
    private final RefWriter writer;
    private final Resource resource;

    public References(Cache cache, Resource resource, RefWriter writer, Options options) {
        this.cache = cache;
        this.resource = resource;
        this.writer = writer;
        this.options = options;
    }

    public void serialize(JsonGenerator generator, String key, EReference reference, Object value) {
        if (reference.isMany()) {
            serializeMany(generator, key, (Collection<?>) value);
        } else {
            serializeOne(generator, key, (EObject) value);
        }
    }

    public void serializeMany(JsonGenerator generator, String key, Collection<?> values) {
        try {
            generator.writeFieldName(key);
            generator.writeStartArray();
            for (Object current : values) {
                if (current instanceof EObject) {
                    writeRef(generator, (EObject) current);
                }
            }
            generator.writeEndArray();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    public void serializeOne(JsonGenerator generator, String key, EObject value) {
        try {
            generator.writeFieldName(key);
            writeRef(generator, value);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void writeRef(JsonGenerator generator, EObject object) throws IOException {
        writer.write(cache, resource, generator, object, options);
    }

    public interface RefWriter {
        void write(Cache cache, Resource resource, JsonGenerator generator, EObject object, Options options)
                throws IOException;
    }

    public static class RefAsObjectWriter implements RefWriter {
        @Override
        public void write(Cache cache, Resource resource, JsonGenerator generator, EObject object, Options options)
                throws IOException {
            String ref = cache.getHref(resource, object);
            generator.writeStartObject();
            if (options.serializeRefTypes) {
                String type = cache.getHref(null, object.eClass());
                generator.writeStringField(EJS_TYPE_KEYWORD, type);
            }
            generator.writeStringField(EJS_REF_KEYWORD, ref);
            generator.writeEndObject();
        }
    }

    public static class RefAsValueWriter implements RefWriter {
        @Override
        public void write(Cache cache, Resource resource, JsonGenerator generator, EObject object, Options options)
                throws IOException {
            generator.writeString(cache.getHref(resource, object));
        }
    }

}