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