001/*
002 * (C) Copyright 2006-2015 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 *     bstefanescu, mguillaume, jcarsique
016 */
017package org.nuxeo.connect.update.xml;
018
019import org.nuxeo.connect.update.PackageDependency;
020import org.nuxeo.connect.update.model.Field;
021import org.nuxeo.connect.update.model.Form;
022import org.nuxeo.connect.update.model.PackageDefinition;
023
024/**
025 * @author <a href="mailto:bs@nuxeo.com">Bogdan Stefanescu</a>
026 */
027public class XmlSerializer extends XmlWriter {
028
029    public XmlSerializer() {
030    }
031
032    public XmlSerializer(String tab) {
033        super(tab);
034    }
035
036    public String toXML(PackageDefinition def) {
037        start("package");
038        if (def.getType() != null) {
039            attr("type", def.getType().getValue());
040        }
041        attr("name", def.getName());
042        if (def.getVersion() != null) {
043            attr("version", def.getVersion().toString());
044        }
045        startContent();
046
047        element("title", def.getTitle());
048        element("description", def.getDescription());
049        element("vendor", def.getVendor());
050        element("classifier", def.getClassifier());
051        element("home-page", def.getHomePage());
052
053        element("hotreload-support", Boolean.valueOf(def.supportsHotReload()).toString());
054        element("supported", Boolean.valueOf(def.isSupported()).toString());
055        element("require-terms-and-conditions-acceptance", Boolean.valueOf(def.requireTermsAndConditionsAcceptance())
056                                                                  .toString());
057        element("production-state", def.getProductionState().toString());
058        element("nuxeo-validation", def.getValidationState().toString());
059
060        if (def.getInstaller() != null) {
061            start("installer");
062            attr("class", def.getInstaller().getType());
063            attr("restart", String.valueOf(def.getInstaller().getRequireRestart()));
064            end();
065        }
066        if (def.getUninstaller() != null) {
067            start("uninstaller");
068            attr("class", def.getUninstaller().getType());
069            attr("restart", String.valueOf(def.getUninstaller().getRequireRestart()));
070            end();
071        }
072        element("validator", def.getValidator());
073
074        try {
075            def.getClass().getMethod("getVisibility");
076            if (def.getVisibility() != null) {
077                element("visibility", def.getVisibility().toString());
078            }
079        } catch (NoSuchMethodException e) {
080            // Ignore visibility with old Connect Client versions
081        }
082
083        if (def.getTargetPlatforms() != null && def.getTargetPlatforms().length > 0) {
084            start("platforms");
085            startContent();
086            for (String platform : def.getTargetPlatforms()) {
087                element("platform", platform);
088            }
089            end("platforms");
090        }
091
092        if (def.getDependencies() != null && def.getDependencies().length > 0) {
093            start("dependencies");
094            startContent();
095            for (PackageDependency dep : def.getDependencies()) {
096                element("package", dep.toString());
097            }
098            end("dependencies");
099        }
100
101        try {
102            def.getClass().getMethod("getConflicts");
103            if (def.getConflicts() != null && def.getConflicts().length > 0) {
104                start("conflicts");
105                startContent();
106                for (PackageDependency conflict : def.getConflicts()) {
107                    element("package", conflict.toString());
108                }
109                end("conflicts");
110            }
111        } catch (NoSuchMethodException e) {
112            // Ignore conflicts with old Connect Client versions
113        }
114
115        try {
116            def.getClass().getMethod("getProvides");
117            if (def.getProvides() != null && def.getProvides().length > 0) {
118                start("provides");
119                startContent();
120                for (PackageDependency provide : def.getProvides()) {
121                    element("package", provide.toString());
122                }
123                end("provides");
124            }
125        } catch (NoSuchMethodException e) {
126            // Ignore provides with old Connect Client versions
127        }
128
129        end("package");
130        return sb.toString();
131    }
132
133    public void buildXML(Form form) {
134        start("form");
135        startContent();
136        element("title", form.getTitle());
137        element("image", form.getImage());
138        element("description", form.getDescription());
139        if (form.getFields() != null && form.getFields().length > 0) {
140            start("fields");
141            startContent();
142            for (Field field : form.getFields()) {
143                start("field");
144                attr("name", field.getName());
145                attr("type", field.getType());
146                if (field.isRequired()) {
147                    attr("required", "true");
148                }
149                if (field.isReadOnly()) {
150                    attr("readonly", "true");
151                }
152                if (field.isVertical()) {
153                    attr("vertical", "true");
154                }
155                startContent();
156                element("label", field.getLabel());
157                element("value", field.getValue());
158                end("field");
159            }
160            end("fields");
161        }
162        end("form");
163    }
164
165    public String toXML(FormDefinition form) {
166        buildXML(form);
167        return sb.toString();
168    }
169
170    public String toXML(FormDefinition... forms) {
171        start("forms");
172        startContent();
173        for (FormDefinition form : forms) {
174            buildXML(form);
175        }
176        end("forms");
177        return sb.toString();
178    }
179
180    public String toXML(FormsDefinition forms) {
181        start("forms");
182        startContent();
183        for (Form form : forms.getForms()) {
184            buildXML(form);
185        }
186        end("forms");
187        return sb.toString();
188    }
189}