001/*
002 * (C) Copyright 2014 Nuxeo SA (http://nuxeo.com/) and contributors.
003 *
004 * All rights reserved. This program and the accompanying materials
005 * are made available under the terms of the GNU Lesser General Public License
006 * (LGPL) version 2.1 which accompanies this distribution, and is available at
007 * http://www.gnu.org/licenses/lgpl-2.1.html
008 *
009 * This library is distributed in the hope that it will be useful,
010 * but WITHOUT ANY WARRANTY; without even the implied warranty of
011 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
012 * Lesser General Public License for more details.
013 *
014 * Contributors:
015 *     tdelprat
016 */
017package org.nuxeo.ecm.restapi.jaxrs.io.types;
018
019import java.io.IOException;
020import java.io.OutputStream;
021
022import org.codehaus.jackson.JsonEncoding;
023import org.codehaus.jackson.JsonFactory;
024import org.codehaus.jackson.JsonGenerator;
025import org.nuxeo.ecm.core.schema.DocumentType;
026import org.nuxeo.ecm.core.schema.types.ComplexType;
027import org.nuxeo.ecm.core.schema.types.CompositeType;
028import org.nuxeo.ecm.core.schema.types.Field;
029import org.nuxeo.ecm.core.schema.types.ListType;
030import org.nuxeo.ecm.core.schema.types.Schema;
031
032public class AbstractTypeDefWriter {
033
034    public AbstractTypeDefWriter() {
035        super();
036    }
037
038    protected JsonGenerator getGenerator(OutputStream entityStream) throws IOException {
039        JsonFactory factory = new JsonFactory();
040        JsonGenerator jg = factory.createJsonGenerator(entityStream, JsonEncoding.UTF8);
041        jg.useDefaultPrettyPrinter();
042        return jg;
043    }
044
045    protected void writeSchema(JsonGenerator jg, Schema schema) throws IOException {
046        jg.writeObjectFieldStart(schema.getName());
047        jg.writeStringField("@prefix", schema.getNamespace().prefix);
048        for (Field field : schema.getFields()) {
049            writeField(jg, field);
050        }
051        jg.writeEndObject();
052    }
053
054    protected void writeSchemaObject(JsonGenerator jg, Schema schema) throws IOException {
055        jg.writeStartObject();
056        jg.writeStringField("name", schema.getName());
057        jg.writeStringField("@prefix", schema.getNamespace().prefix);
058        jg.writeObjectFieldStart("fields");
059        for (Field field : schema.getFields()) {
060            writeField(jg, field);
061        }
062        jg.writeEndObject();
063        jg.writeEndObject();
064    }
065
066    protected void writeDocType(JsonGenerator jg, DocumentType docType, boolean expandSchemas) throws IOException {
067
068        if (docType.getSuperType() != null) {
069            jg.writeStringField("parent", docType.getSuperType().getName());
070        } else {
071            jg.writeStringField("parent", "None!!!");
072        }
073
074        jg.writeArrayFieldStart("facets");
075        for (String facet : docType.getFacets()) {
076            jg.writeString(facet);
077        }
078        jg.writeEndArray();
079
080        jg.writeArrayFieldStart("schemas");
081        if (expandSchemas) {
082            for (Schema schema : docType.getSchemas()) {
083                writeSchemaObject(jg, schema);
084            }
085        } else {
086            for (String schema : docType.getSchemaNames()) {
087                jg.writeString(schema);
088            }
089        }
090        jg.writeEndArray();
091
092    }
093
094    protected void writeField(JsonGenerator jg, Field field) throws IOException {
095        if (!field.getType().isComplexType()) {
096            if (field.getType().isListType()) {
097                ListType lt = (ListType) field.getType();
098                if (lt.getFieldType().isComplexType()) {
099                    if (lt.getFieldType().getName().equals("content")) {
100                        jg.writeStringField(field.getName().getLocalName(), "blob[]");
101
102                    } else {
103                        jg.writeObjectFieldStart(field.getName().getLocalName());
104                        buildComplexFields(jg, lt.getField());
105                        jg.writeStringField("type", "complex[]");
106                        jg.writeEndObject();
107                    }
108                } else {
109
110                    jg.writeStringField(field.getName().getLocalName(), lt.getFieldType().getName() + "[]");
111                }
112            } else {
113                jg.writeStringField(field.getName().getLocalName(), field.getType().getName());
114            }
115        } else {
116            if (field.getType().getName().equals("content")) {
117                jg.writeStringField(field.getName().getLocalName(), "blob");
118            } else {
119
120                jg.writeObjectFieldStart(field.getName().getLocalName());
121                buildComplexFields(jg, field);
122                jg.writeStringField("type", "complex");
123                jg.writeEndObject();
124            }
125        }
126
127    }
128
129    protected void buildComplexFields(JsonGenerator jg, Field field) throws IOException {
130        ComplexType cplXType = (ComplexType) field.getType();
131        jg.writeObjectFieldStart("fields");
132        for (Field subField : cplXType.getFields()) {
133            writeField(jg, subField);
134        }
135        jg.writeEndObject();
136    }
137
138    protected void writeFacet(JsonGenerator jg, CompositeType facet, boolean expandSchemas) throws IOException {
139
140        jg.writeStringField("name", facet.getName());
141        if (facet.getSchemaNames() != null && facet.getSchemaNames().length > 0) {
142            jg.writeArrayFieldStart("schemas");
143            if (expandSchemas) {
144                for (Schema schema : facet.getSchemas()) {
145                    writeSchemaObject(jg, schema);
146                }
147            } else {
148                for (String schemaName : facet.getSchemaNames()) {
149                    jg.writeString(schemaName);
150                }
151            }
152            jg.writeEndArray();
153        }
154
155    }
156}