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}