001/*
002 * (C) Copyright 2018 Nuxeo (http://nuxeo.com/) and others.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 *     http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 *
016 * Contributors:
017 *     pierre
018 */
019package org.nuxeo.ecm.core.io.avro;
020
021import java.util.Arrays;
022
023import org.apache.avro.LogicalType;
024import org.apache.avro.Schema;
025import org.apache.avro.Schema.Field;
026import org.apache.avro.Schema.Type;
027import org.nuxeo.ecm.core.api.DocumentModel;
028import org.nuxeo.runtime.avro.AvroSchemaFactory;
029import org.nuxeo.runtime.avro.AvroSchemaFactoryContext;
030
031/**
032 * @since 10.2
033 */
034public class DocumentModelSchemaFactory extends AvroSchemaFactory<DocumentModel> {
035
036    public DocumentModelSchemaFactory(AvroSchemaFactoryContext context) {
037        super(context);
038    }
039
040    @Override
041    public Schema createSchema(DocumentModel input) {
042        Schema typeSchema = context.createSchema(input.getDocumentType());
043        Schema schema = Schema.createRecord(getName(input), null, AvroConstants.ECM, false);
044        new LogicalType(AvroConstants.DOCUMENT_MODEL).addToSchema(schema);
045        schema.setFields(Arrays.asList(
046                // mandatory
047                new Field(AvroConstants.UUID, Schema.create(Type.STRING), null, (Object) null),
048                new Field(AvroConstants.PATH, Schema.create(Type.STRING), null, (Object) null),
049                new Field(AvroConstants.NAME, Schema.create(Type.STRING), null, (Object) null),
050                new Field(AvroConstants.TITLE, Schema.create(Type.STRING), null, (Object) null),
051                new Field(AvroConstants.REPOSITORY_NAME, Schema.create(Type.STRING), null, (Object) null),
052                new Field(AvroConstants.PRIMARY_TYPE, Schema.create(Type.STRING), null, (Object) null),
053                new Field(AvroConstants.CHANGE_TOKEN, Schema.create(Type.STRING), null, (Object) null),
054                new Field(AvroConstants.CURRENT_LIFE_CYCLE_STATE, Schema.create(Type.STRING), null, (Object) null),
055                new Field(AvroConstants.IS_PROXY, Schema.create(Type.BOOLEAN), null, (Object) null),
056                new Field(AvroConstants.IS_TRASHED, Schema.create(Type.BOOLEAN), null, (Object) null),
057                new Field(AvroConstants.IS_VERSION, Schema.create(Type.BOOLEAN), null, (Object) null),
058                new Field(AvroConstants.IS_CHECKEDIN, Schema.create(Type.BOOLEAN), null, (Object) null),
059                new Field(AvroConstants.IS_LATEST_VERSION, Schema.create(Type.BOOLEAN), null, (Object) null),
060                new Field(AvroConstants.IS_LATEST_MAJOR_VERSION, Schema.create(Type.BOOLEAN), null, (Object) null),
061                // nullable
062                new Field(AvroConstants.PARENT_ID, nullable(Schema.create(Type.STRING)), null, (Object) null),
063                new Field(AvroConstants.VERSION_LABEL, nullable(Schema.create(Type.STRING)), null, (Object) null),
064                new Field(AvroConstants.VERSION_VERSIONABLE_ID, nullable(Schema.create(Type.STRING)), null,
065                        (Object) null),
066                new Field(AvroConstants.POS, nullable(Schema.create(Type.LONG)), null, (Object) null),
067                new Field(AvroConstants.MIXIN_TYPES, nullable(Schema.createArray(Schema.create(Type.STRING))), null,
068                        (Object) null),
069                new Field(AvroConstants.TAGS, nullable(Schema.createArray(Schema.create(Type.STRING))), null,
070                        (Object) null),
071                new Field(AvroConstants.DOCUMENT_TYPE, typeSchema, null, (Object) null)));
072        return schema;
073    }
074
075    @Override
076    public String getName(DocumentModel input) {
077        return context.getService().encodeName(input.getName());
078    }
079
080}