001/*
002 * (C) Copyright 2006-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 *     bstefanescu, jcarsique
016 */
017package org.nuxeo.connect.update.xml;
018
019import org.nuxeo.common.xmap.annotation.XNode;
020import org.nuxeo.common.xmap.annotation.XNodeList;
021import org.nuxeo.common.xmap.annotation.XObject;
022import org.nuxeo.connect.update.NuxeoValidationState;
023import org.nuxeo.connect.update.PackageDependency;
024import org.nuxeo.connect.update.PackageState;
025import org.nuxeo.connect.update.PackageType;
026import org.nuxeo.connect.update.PackageVisibility;
027import org.nuxeo.connect.update.ProductionState;
028import org.nuxeo.connect.update.Validator;
029import org.nuxeo.connect.update.Version;
030import org.nuxeo.connect.update.model.PackageDefinition;
031import org.nuxeo.connect.update.model.TaskDefinition;
032import org.nuxeo.connect.update.task.Task;
033
034/**
035 * @author <a href="mailto:bs@nuxeo.com">Bogdan Stefanescu</a>
036 */
037@XObject("package")
038public class PackageDefinitionImpl implements PackageDefinition {
039
040    @XNode("@name")
041    protected String name;
042
043    @XNode("@version")
044    protected Version version;
045
046    @XNode("@type")
047    protected PackageType type;
048
049    @XNode("visibility")
050    protected PackageVisibility visibility;
051
052    @XNode("title")
053    protected String title;
054
055    @XNode("description")
056    protected String description;
057
058    @XNode("classifier")
059    protected String classifier;
060
061    @XNode("vendor")
062    protected String vendor;
063
064    @XNode("home-page")
065    protected String homePage;
066
067    @XNode("supported")
068    protected boolean supported = false;
069
070    @XNode("hotreload-support")
071    protected boolean hotReloadSupport = false;
072
073    @XNode("require-terms-and-conditions-acceptance")
074    protected boolean requireTermsAndConditionsAcceptance = false;
075
076    protected NuxeoValidationState validationState = NuxeoValidationState.NONE;
077
078    protected ProductionState productionState = ProductionState.TESTING;
079
080    /**
081     * The license name. E.g. LGPL, BSD etc.
082     */
083    @XNode("license")
084    protected String license;
085
086    /**
087     * A license URL. If no specified the license.txt file in the package is the license content
088     */
089    @XNode("license-url")
090    protected String licenseUrl;
091
092    /**
093     * The target platforms where this package may be installed.
094     */
095    @XNodeList(value = "platforms/platform", type = String[].class, componentType = String.class)
096    protected String[] platforms;
097
098    /**
099     * The dependency value format is: <code>package_name[:package_min_version[:package_max_version]]</code> if no min
100     * and max version are specified the the last version should be used.
101     */
102    @XNodeList(value = "dependencies/package", type = PackageDependency[].class, componentType = PackageDependency.class)
103    protected PackageDependency[] dependencies;
104
105    /**
106     * The conflict value format is: <code>package_name[:package_min_version[:package_max_version]]</code> if no min and
107     * max version are specified the the last version should be used.
108     */
109    @XNodeList(value = "conflicts/package", type = PackageDependency[].class, componentType = PackageDependency.class)
110    protected PackageDependency[] conflicts;
111
112    /**
113     * The provides value format is: <code>package_name[:package_min_version[:package_max_version]]</code> if no min and
114     * max version are specified the the last version should be used.
115     */
116    @XNodeList(value = "provides/package", type = PackageDependency[].class, componentType = PackageDependency.class)
117    protected PackageDependency[] provides;
118
119    /**
120     * A class implementing {@link Task}. if not specified the default implementation will be used
121     */
122    @XNode("installer")
123    protected TaskDefinitionImpl installer;
124
125    /**
126     * A class implementing {@link Task}. if not specified the default implementation will be used
127     */
128    @XNode("uninstaller")
129    protected TaskDefinitionImpl uninstaller;
130
131    /**
132     * A class implementing {@link Validator}. If not specified not post install validation will be done
133     */
134    @XNode("validator")
135    protected String validator;
136
137    @XNode("nuxeo-validation")
138    protected void initNuxeoValidationState(String value) {
139        NuxeoValidationState targetState = NuxeoValidationState.getByValue(value);
140        if (targetState != null) {
141            validationState = targetState;
142        }
143    }
144
145    @XNode("production-state")
146    protected void initProductionState(String value) {
147        ProductionState targetState = ProductionState.getByValue(value);
148        if (targetState != null) {
149            productionState = targetState;
150        }
151    }
152
153    @Override
154    public String getId() {
155        if (version == null) {
156            return name;
157        } else {
158            return name + "-" + version.toString();
159        }
160    }
161
162    @Override
163    public String getName() {
164        return name;
165    }
166
167    @Override
168    public void setName(String name) {
169        this.name = name;
170    }
171
172    @Override
173    public Version getVersion() {
174        return version;
175    }
176
177    @Override
178    public void setVersion(Version version) {
179        this.version = version;
180    }
181
182    @Override
183    public String getTitle() {
184        return title;
185    }
186
187    @Override
188    public void setTitle(String title) {
189        this.title = title;
190    }
191
192    @Override
193    public String getDescription() {
194        return description;
195    }
196
197    @Override
198    public void setDescription(String description) {
199        this.description = description;
200    }
201
202    @Override
203    public PackageType getType() {
204        return type;
205    }
206
207    @Override
208    public void setType(PackageType type) {
209        this.type = type;
210    }
211
212    @Override
213    public String getClassifier() {
214        return classifier;
215    }
216
217    @Override
218    public void setClassifier(String classifier) {
219        this.classifier = classifier;
220    }
221
222    @Override
223    public String getHomePage() {
224        return homePage;
225    }
226
227    @Override
228    public void setHomePage(String homePage) {
229        this.homePage = homePage;
230    }
231
232    @Deprecated
233    @Override
234    public String getLicense() {
235        return getLicenseType();
236    }
237
238    @Override
239    public String getLicenseType() {
240        return license;
241    }
242
243    @Deprecated
244    @Override
245    public void setLicense(String license) {
246        setLicenseType(license);
247    }
248
249    @Override
250    public void setLicenseType(String license) {
251        this.license = license;
252    }
253
254    @Override
255    public String getLicenseUrl() {
256        return licenseUrl;
257    }
258
259    @Override
260    public void setLicenseUrl(String licenseUrl) {
261        this.licenseUrl = licenseUrl;
262    }
263
264    @Deprecated
265    @Override
266    public String[] getPlatforms() {
267        return getTargetPlatforms();
268    }
269
270    @Override
271    public String[] getTargetPlatforms() {
272        return platforms;
273    }
274
275    @Deprecated
276    @Override
277    public void setPlatforms(String[] platforms) {
278        setTargetPlatforms(platforms);
279    }
280
281    @Override
282    public void setTargetPlatforms(String[] platforms) {
283        this.platforms = platforms;
284    }
285
286    @Override
287    public PackageDependency[] getDependencies() {
288        return dependencies;
289    }
290
291    @Override
292    public void setDependencies(PackageDependency[] dependencies) {
293        this.dependencies = dependencies;
294    }
295
296    @Override
297    public PackageDependency[] getConflicts() {
298        return conflicts;
299    }
300
301    @Override
302    public void setConflicts(PackageDependency[] conflicts) {
303        this.conflicts = conflicts;
304    }
305
306    @Override
307    public PackageDependency[] getProvides() {
308        return provides;
309    }
310
311    @Override
312    public void setProvides(PackageDependency[] provides) {
313        this.provides = provides;
314    }
315
316    @Override
317    public String getVendor() {
318        return vendor;
319    }
320
321    @Override
322    public void setVendor(String vendor) {
323        this.vendor = vendor;
324    }
325
326    @Override
327    public TaskDefinition getInstaller() {
328        return installer;
329    }
330
331    @Override
332    public void setInstaller(TaskDefinition installer) {
333        if (installer instanceof TaskDefinitionImpl) {
334            this.installer = (TaskDefinitionImpl) installer;
335        } else {
336            this.installer = new TaskDefinitionImpl(installer.getType(), installer.getRequireRestart());
337        }
338    }
339
340    @Override
341    public TaskDefinition getUninstaller() {
342        return uninstaller;
343    }
344
345    @Override
346    public void setUninstaller(TaskDefinition uninstaller) {
347        if (uninstaller instanceof TaskDefinitionImpl) {
348            this.uninstaller = (TaskDefinitionImpl) uninstaller;
349        } else {
350            this.uninstaller = new TaskDefinitionImpl(uninstaller.getType(), uninstaller.getRequireRestart());
351        }
352    }
353
354    @Override
355    public String getValidator() {
356        return validator;
357    }
358
359    @Override
360    public void setValidator(String validator) {
361        this.validator = validator;
362    }
363
364    @Override
365    public void setSupported(boolean supported) {
366        this.supported = supported;
367    }
368
369    @Override
370    public void setHotReloadSupport(boolean hotReloadSupport) {
371        this.hotReloadSupport = hotReloadSupport;
372    }
373
374    @Override
375    public void setValidationState(NuxeoValidationState validationState) {
376        this.validationState = validationState;
377    }
378
379    @Override
380    public void setProductionState(ProductionState productionState) {
381        this.productionState = productionState;
382    }
383
384    @Deprecated
385    public void write(XmlWriter writer) {
386        writer.writeXmlDecl();
387
388        writer.start("package");
389        writer.attr("name", name);
390        if (version != null) {
391            writer.attr("version", version.toString());
392        }
393        if (type != null) {
394            writer.attr("type", type.getValue());
395        }
396        if (visibility != null) {
397            writer.attr("visibility", visibility.toString());
398        }
399        writer.startContent();
400        writer.element("title", title);
401        writer.element("description", description);
402        writer.element("classifier", classifier);
403        writer.element("vendor", vendor);
404        writer.element("home-page", homePage);
405        writer.element("license", license);
406        writer.element("license-url", licenseUrl);
407        writer.element("hotreload-support", Boolean.valueOf(hotReloadSupport).toString());
408        writer.element("supported", Boolean.valueOf(supported).toString());
409        writer.element("require-terms-and-conditions-acceptance",
410                Boolean.valueOf(requireTermsAndConditionsAcceptance).toString());
411        writer.element("production-state", productionState.toString());
412        writer.element("nuxeo-validation", validationState.toString());
413        if (platforms != null) {
414            writer.start("platforms");
415            writer.startContent();
416            for (String platform : platforms) {
417                writer.element("platform", platform);
418            }
419            writer.end("platforms");
420        }
421        if (dependencies != null) {
422            writer.start("dependencies");
423            writer.startContent();
424            for (PackageDependency dep : dependencies) {
425                writer.element("package", dep.toString());
426            }
427            writer.end("dependencies");
428        }
429
430        if (installer != null) {
431            writer.start("installer");
432            writer.attr("class", installer.getType());
433            writer.attr("restart", String.valueOf(installer.getRequireRestart()));
434            writer.end();
435        }
436        if (uninstaller != null) {
437            writer.start("uninstaller");
438            writer.attr("class", uninstaller.getType());
439            writer.attr("restart", String.valueOf(uninstaller.getRequireRestart()));
440            writer.end();
441        }
442        writer.element("validator", validator);
443        writer.end("package");
444    }
445
446    @Override
447    public ProductionState getProductionState() {
448        return productionState;
449    }
450
451    @Override
452    public NuxeoValidationState getValidationState() {
453        return validationState;
454    }
455
456    @Override
457    public boolean isSupported() {
458        return supported;
459    }
460
461    @Override
462    public boolean supportsHotReload() {
463        return hotReloadSupport;
464    }
465
466    @Override
467    public void setRequireTermsAndConditionsAcceptance(boolean requireTermsAndConditionsAcceptance) {
468        this.requireTermsAndConditionsAcceptance = requireTermsAndConditionsAcceptance;
469    }
470
471    @Override
472    public boolean requireTermsAndConditionsAcceptance() {
473        return requireTermsAndConditionsAcceptance;
474    }
475
476    @Override
477    public String toXML() {
478        return new XmlSerializer().toXML(this);
479    }
480
481    @Deprecated
482    @Override
483    public int getState() {
484        return PackageState.UNKNOWN.getValue();
485    }
486
487    @Override
488    public PackageState getPackageState() {
489        return PackageState.UNKNOWN;
490    }
491
492    @Override
493    public boolean isLocal() {
494        throw new UnsupportedOperationException();
495    }
496
497    @Override
498    public PackageVisibility getVisibility() {
499        return visibility;
500    }
501
502    @Override
503    public void setVisibility(PackageVisibility visibility) {
504        this.visibility = visibility;
505    }
506
507}