001package org.nuxeo.template.processors.xdocreport;
002
003import java.io.IOException;
004import java.io.StringWriter;
005
006import org.nuxeo.ecm.core.api.DocumentModel;
007import org.nuxeo.ecm.core.api.NuxeoException;
008import org.nuxeo.ecm.core.schema.DocumentType;
009import org.nuxeo.ecm.core.schema.SchemaManager;
010import org.nuxeo.ecm.core.schema.types.ComplexType;
011import org.nuxeo.ecm.core.schema.types.Field;
012import org.nuxeo.ecm.core.schema.types.Schema;
013import org.nuxeo.runtime.api.Framework;
014
015import fr.opensagres.xdocreport.template.TemplateEngineKind;
016import fr.opensagres.xdocreport.template.formatter.FieldsMetadata;
017
018/**
019 * @author <a href="mailto:tdelprat@nuxeo.com">Tiry</a>
020 */
021public class FieldDefinitionGenerator {
022
023    public static String generate(String type) {
024        SchemaManager sm = Framework.getLocalService(SchemaManager.class);
025        DocumentType docType = sm.getDocumentType(type);
026
027        return generate(docType.getSchemaNames());
028    }
029
030    public static String generate(DocumentModel doc) {
031        return generate(doc.getSchemas());
032    }
033
034    protected static String generate(String[] schemaNames) {
035
036        FieldsMetadata fieldsMetadata = new FieldsMetadata(TemplateEngineKind.Freemarker.name());
037
038        for (String schemaName : schemaNames) {
039            SchemaManager sm = Framework.getLocalService(SchemaManager.class);
040
041            Schema schema = sm.getSchema(schemaName);
042            for (Field field : schema.getFields()) {
043                // String pname = field.getName().getPrefixedName();
044                String name = field.getName().getLocalName();
045                // String fieldName = "doc['" + name + "']";
046                // fieldsMetadata.addField(fieldName, false, null, null, null);
047                String fieldName = "doc." + schemaName + "." + name;
048                if (field.getType().isListType()) {
049                    fieldsMetadata.addField(fieldName, true, null, null, null);
050                } else {
051                    fieldsMetadata.addField(fieldName, false, null, null, null);
052                    if (field.getType().isComplexType()) {
053
054                        ComplexType ct = (ComplexType) field.getType();
055                        if ("content".equals(ct.getName())) {
056                            fieldsMetadata.addField(fieldName + ".filename", false, null, null, null);
057                        } else {
058                            for (Field subField : ct.getFields()) {
059                                fieldsMetadata.addField(fieldName + "." + subField.getName().getLocalName(), false,
060                                        null, null, null);
061                            }
062                        }
063                    }
064                }
065            }
066        }
067
068        fieldsMetadata.addField("doc.versionLabel", false, null, null, null);
069        fieldsMetadata.addField("doc.id", false, null, null, null);
070        fieldsMetadata.addField("doc.name", false, null, null, null);
071        fieldsMetadata.addField("doc.title", false, null, null, null);
072        fieldsMetadata.addField("doc.pathAsString", false, null, null, null);
073        fieldsMetadata.addField("doc.type", false, null, null, null);
074        fieldsMetadata.addField("doc.schemas", true, null, null, null);
075        fieldsMetadata.addField("doc.facets", true, null, null, null);
076        fieldsMetadata.addField("doc.locked", false, null, null, null);
077        fieldsMetadata.addField("doc.lockInfo", false, null, null, null);
078        fieldsMetadata.addField("doc.lockInfo.owner", false, null, null, null);
079        fieldsMetadata.addField("doc.lockInfo.created", false, null, null, null);
080        fieldsMetadata.addField("doc.checkedOut", false, null, null, null);
081        fieldsMetadata.addField("doc.", false, null, null, null);
082
083        // fieldsMetadata.load("principal", NuxeoPrincipal.class); //
084        // stackoverflow
085
086        fieldsMetadata.addField("principal.firstName", false, null, null, null);
087        fieldsMetadata.addField("principal.lastName", false, null, null, null);
088        fieldsMetadata.addField("principal.company", false, null, null, null);
089        fieldsMetadata.addField("principal.email", false, null, null, null);
090        fieldsMetadata.addField("principal.name", false, null, null, null);
091
092        fieldsMetadata.addField("auditEntries", false, null, null, null);
093        fieldsMetadata.addField("auditEntries.id", true, null, null, null);
094        fieldsMetadata.addField("auditEntries.principalName", true, null, null, null);
095        fieldsMetadata.addField("auditEntries.eventId", true, null, null, null);
096        fieldsMetadata.addField("auditEntries.eventDate", true, null, null, null);
097        fieldsMetadata.addField("auditEntries.docUUID", true, null, null, null);
098        fieldsMetadata.addField("auditEntries.docPath", true, null, null, null);
099        fieldsMetadata.addField("auditEntries.docType", true, null, null, null);
100        fieldsMetadata.addField("auditEntries.category", true, null, null, null);
101        fieldsMetadata.addField("auditEntries.comment", true, null, null, null);
102        fieldsMetadata.addField("auditEntries.docLifeCycle", true, null, null, null);
103        fieldsMetadata.addField("auditEntries.repositoryId", true, null, null, null);
104
105        StringWriter writer = new StringWriter();
106
107        try {
108            fieldsMetadata.saveXML(writer, true);
109        } catch (IOException e) {
110            throw new NuxeoException(e);
111        }
112
113        return writer.getBuffer().toString();
114    }
115}