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;
031import org.nuxeo.ecm.core.schema.types.SimpleType;
032import org.nuxeo.ecm.core.schema.types.Type;
033
034public class AbstractTypeDefWriter {
035
036    public AbstractTypeDefWriter() {
037        super();
038    }
039
040    protected JsonGenerator getGenerator(OutputStream entityStream) throws IOException {
041        JsonFactory factory = new JsonFactory();
042        JsonGenerator jg = factory.createJsonGenerator(entityStream, JsonEncoding.UTF8);
043        jg.useDefaultPrettyPrinter();
044        return jg;
045    }
046
047    protected void writeSchema(JsonGenerator jg, Schema schema) throws IOException {
048        jg.writeObjectFieldStart(schema.getName());
049        jg.writeStringField("@prefix", schema.getNamespace().prefix);
050        for (Field field : schema.getFields()) {
051            writeField(jg, field);
052        }
053        jg.writeEndObject();
054    }
055
056    protected void writeSchemaObject(JsonGenerator jg, Schema schema) throws IOException {
057        jg.writeStartObject();
058        jg.writeStringField("name", schema.getName());
059        jg.writeStringField("@prefix", schema.getNamespace().prefix);
060        jg.writeObjectFieldStart("fields");
061        for (Field field : schema.getFields()) {
062            writeField(jg, field);
063        }
064        jg.writeEndObject();
065        jg.writeEndObject();
066    }
067
068    protected void writeDocType(JsonGenerator jg, DocumentType docType, boolean expandSchemas) throws IOException {
069
070        if (docType.getSuperType() != null) {
071            jg.writeStringField("parent", docType.getSuperType().getName());
072        } else {
073            jg.writeStringField("parent", "None!!!");
074        }
075
076        jg.writeArrayFieldStart("facets");
077        for (String facet : docType.getFacets()) {
078            jg.writeString(facet);
079        }
080        jg.writeEndArray();
081
082        jg.writeArrayFieldStart("schemas");
083        if (expandSchemas) {
084            for (Schema schema : docType.getSchemas()) {
085                writeSchemaObject(jg, schema);
086            }
087        } else {
088            for (String schema : docType.getSchemaNames()) {
089                jg.writeString(schema);
090            }
091        }
092        jg.writeEndArray();
093
094    }
095
096    protected void writeField(JsonGenerator jg, Field field) throws IOException {
097        Type type = field.getType();
098        if (!type.isComplexType()) {
099            if (type.isListType()) {
100                ListType lt = (ListType) type;
101                if (lt.getFieldType().isComplexType()) {
102                    if (lt.getFieldType().getName().equals("content")) {
103                        jg.writeStringField(field.getName().getLocalName(), "blob[]");
104
105                    } else {
106                        jg.writeObjectFieldStart(field.getName().getLocalName());
107                        buildComplexFields(jg, lt.getField());
108                        jg.writeStringField("type", "complex[]");
109                        jg.writeEndObject();
110                    }
111                } else {
112                    Type fieldType = lt.getFieldType();
113                    if (fieldType instanceof SimpleType) {
114                        SimpleType stype = (SimpleType) fieldType;
115                        fieldType = stype.getPrimitiveType();
116                    }
117                    jg.writeStringField(field.getName().getLocalName(), fieldType.getName() + "[]");
118                }
119            } else {
120                if (type instanceof SimpleType) {
121                    SimpleType stype = (SimpleType) type;
122                    type = stype.getPrimitiveType();
123                }
124                jg.writeStringField(field.getName().getLocalName(), type.getName());
125            }
126        } else {
127            if (type.getName().equals("content")) {
128                jg.writeStringField(field.getName().getLocalName(), "blob");
129            } else {
130
131                jg.writeObjectFieldStart(field.getName().getLocalName());
132                buildComplexFields(jg, field);
133                jg.writeStringField("type", "complex");
134                jg.writeEndObject();
135            }
136        }
137
138    }
139
140    protected void buildComplexFields(JsonGenerator jg, Field field) throws IOException {
141        ComplexType cplXType = (ComplexType) field.getType();
142        jg.writeObjectFieldStart("fields");
143        for (Field subField : cplXType.getFields()) {
144            writeField(jg, subField);
145        }
146        jg.writeEndObject();
147    }
148
149    protected void writeFacet(JsonGenerator jg, CompositeType facet, boolean expandSchemas) throws IOException {
150
151        jg.writeStringField("name", facet.getName());
152        if (facet.getSchemaNames() != null && facet.getSchemaNames().length > 0) {
153            jg.writeArrayFieldStart("schemas");
154            if (expandSchemas) {
155                for (Schema schema : facet.getSchemas()) {
156                    writeSchemaObject(jg, schema);
157                }
158            } else {
159                for (String schemaName : facet.getSchemaNames()) {
160                    jg.writeString(schemaName);
161                }
162            }
163            jg.writeEndArray();
164        }
165
166    }
167}