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