/* * (C) Copyright 2006-2016 Nuxeo SA (http://nuxeo.com/) and others. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * Contributors: * bstefanescu * jcarsique * Yannis JULIENNE */ package org.nuxeo.connect.update.xml; import org.apache.commons.lang.mutable.MutableObject; import org.nuxeo.common.xmap.annotation.XNode; import org.nuxeo.common.xmap.annotation.XNodeList; import org.nuxeo.common.xmap.annotation.XObject; import org.nuxeo.connect.data.PackageDescriptor; import org.nuxeo.connect.update.NuxeoValidationState; import org.nuxeo.connect.update.PackageDependency; import org.nuxeo.connect.update.PackageState; import org.nuxeo.connect.update.PackageType; import org.nuxeo.connect.update.PackageVisibility; import org.nuxeo.connect.update.ProductionState; import org.nuxeo.connect.update.Validator; import org.nuxeo.connect.update.Version; import org.nuxeo.connect.update.model.PackageDefinition; import org.nuxeo.connect.update.model.TaskDefinition; import org.nuxeo.connect.update.task.Task; /** * @author <a href="mailto:bs@nuxeo.com">Bogdan Stefanescu</a> */ @XObject("package") public class PackageDefinitionImpl implements PackageDefinition { @XNode("@name") protected String name; @XNode("@version") protected Version version; @XNode("@type") protected PackageType type; @XNode("visibility") protected PackageVisibility visibility; @XNode("title") protected String title; @XNode("description") protected String description; @XNode("classifier") protected String classifier; @XNode("vendor") protected String vendor; @XNode("home-page") protected String homePage; @XNode("supported") protected boolean supported = false; @XNode("hotreload-support") protected boolean hotReloadSupport = false; @XNode("require-terms-and-conditions-acceptance") protected boolean requireTermsAndConditionsAcceptance = false; protected NuxeoValidationState validationState = NuxeoValidationState.NONE; protected ProductionState productionState = ProductionState.TESTING; /** * The license name. E.g. LGPL, BSD etc. */ @XNode("license") protected String license; /** * A license URL. If no specified the license.txt file in the package is the license content */ @XNode("license-url") protected String licenseUrl; /** * The target platforms where this package may be installed. */ protected String[] platforms; /** * The dependency value format is: <code>package_name[:package_min_version[:package_max_version]]</code> if no min * and max version are specified the the last version should be used. */ @XNodeList(value = "dependencies/package", type = PackageDependency[].class, componentType = PackageDependency.class) protected PackageDependency[] dependencies; /** * The optional dependencies are defined for ordering purpose, to make sure that if they are being installed along * with the current package, they will be ordered first. */ @XNodeList(value = "optional-dependencies/package", type = PackageDependency[].class, componentType = PackageDependency.class) protected PackageDependency[] optionalDependencies; /** * The conflict value format is: <code>package_name[:package_min_version[:package_max_version]]</code> if no min and * max version are specified the the last version should be used. */ @XNodeList(value = "conflicts/package", type = PackageDependency[].class, componentType = PackageDependency.class) protected PackageDependency[] conflicts; /** * The provides value format is: <code>package_name[:package_min_version[:package_max_version]]</code> if no min and * max version are specified the the last version should be used. */ @XNodeList(value = "provides/package", type = PackageDependency[].class, componentType = PackageDependency.class) protected PackageDependency[] provides; /** * A class implementing {@link Task}. if not specified the default implementation will be used */ @XNode("installer") protected TaskDefinitionImpl installer; /** * A class implementing {@link Task}. if not specified the default implementation will be used */ @XNode("uninstaller") protected TaskDefinitionImpl uninstaller; /** * A class implementing {@link Validator}. If not specified not post install validation will be done */ @XNode("validator") protected String validator; @XNode("nuxeo-validation") protected void initNuxeoValidationState(String value) { NuxeoValidationState targetState = NuxeoValidationState.getByValue(value); if (targetState != null) { validationState = targetState; } } @XNode("production-state") protected void initProductionState(String value) { ProductionState targetState = ProductionState.getByValue(value); if (targetState != null) { productionState = targetState; } } @Override public String getId() { if (version == null) { return name; } else { return name + "-" + version.toString(); } } @Override public String getName() { return name; } @Override public void setName(String name) { this.name = name; dependencies = PackageDescriptor.fixDependencies(name, dependencies); } @Override public Version getVersion() { return version; } @Override public void setVersion(Version version) { this.version = version; } @Override public String getTitle() { return title; } @Override public void setTitle(String title) { this.title = title; } @Override public String getDescription() { return description; } @Override public void setDescription(String description) { this.description = description; } @Override public PackageType getType() { return type; } @Override public void setType(PackageType type) { this.type = type; } @Override public String getClassifier() { return classifier; } @Override public void setClassifier(String classifier) { this.classifier = classifier; } @Override public String getHomePage() { return homePage; } @Override public void setHomePage(String homePage) { this.homePage = homePage; } @Deprecated @Override public String getLicense() { return getLicenseType(); } @Override public String getLicenseType() { return license; } @Deprecated @Override public void setLicense(String license) { setLicenseType(license); } @Override public void setLicenseType(String license) { this.license = license; } @Override public String getLicenseUrl() { return licenseUrl; } @Override public void setLicenseUrl(String licenseUrl) { this.licenseUrl = licenseUrl; } @Deprecated @Override public String[] getPlatforms() { return getTargetPlatforms(); } @Override public String[] getTargetPlatforms() { return platforms; } @Deprecated @Override public void setPlatforms(String[] platforms) { setTargetPlatforms(platforms); } @XNodeList(value = "platforms/platform", type = String[].class, componentType = String.class) @Override public void setTargetPlatforms(String[] platforms) { MutableObject packageDependencies = new MutableObject(); this.platforms = PackageDescriptor.fixTargetPlatforms(name, platforms, packageDependencies); setDependencies((PackageDependency[]) packageDependencies.getValue()); } @Override public PackageDependency[] getDependencies() { return dependencies; } @Override public PackageDependency[] getOptionalDependencies() { return optionalDependencies; } @Override public void setDependencies(PackageDependency[] dependencies) { this.dependencies = PackageDescriptor.addPackageDependencies(this.dependencies, dependencies); } @Override public PackageDependency[] getConflicts() { return conflicts; } @Override public void setConflicts(PackageDependency[] conflicts) { this.conflicts = conflicts; } @Override public PackageDependency[] getProvides() { return provides; } @Override public void setProvides(PackageDependency[] provides) { this.provides = provides; } @Override public String getVendor() { return vendor; } @Override public void setVendor(String vendor) { this.vendor = vendor; } @Override public TaskDefinition getInstaller() { return installer; } @Override public void setInstaller(TaskDefinition installer) { if (installer instanceof TaskDefinitionImpl) { this.installer = (TaskDefinitionImpl) installer; } else { this.installer = new TaskDefinitionImpl(installer.getType(), installer.getRequireRestart()); } } @Override public TaskDefinition getUninstaller() { return uninstaller; } @Override public void setUninstaller(TaskDefinition uninstaller) { if (uninstaller instanceof TaskDefinitionImpl) { this.uninstaller = (TaskDefinitionImpl) uninstaller; } else { this.uninstaller = new TaskDefinitionImpl(uninstaller.getType(), uninstaller.getRequireRestart()); } } @Override public String getValidator() { return validator; } @Override public void setValidator(String validator) { this.validator = validator; } @Override public void setSupported(boolean supported) { this.supported = supported; } @Override public void setHotReloadSupport(boolean hotReloadSupport) { this.hotReloadSupport = hotReloadSupport; } @Override public void setValidationState(NuxeoValidationState validationState) { this.validationState = validationState; } @Override public void setProductionState(ProductionState productionState) { this.productionState = productionState; } @Deprecated public void write(XmlWriter writer) { writer.writeXmlDecl(); writer.start("package"); writer.attr("name", name); if (version != null) { writer.attr("version", version.toString()); } if (type != null) { writer.attr("type", type.getValue()); } if (visibility != null) { writer.attr("visibility", visibility.toString()); } writer.startContent(); writer.element("title", title); writer.element("description", description); writer.element("classifier", classifier); writer.element("vendor", vendor); writer.element("home-page", homePage); writer.element("license", license); writer.element("license-url", licenseUrl); writer.element("hotreload-support", Boolean.valueOf(hotReloadSupport).toString()); writer.element("supported", Boolean.valueOf(supported).toString()); writer.element("require-terms-and-conditions-acceptance", Boolean.valueOf(requireTermsAndConditionsAcceptance).toString()); writer.element("production-state", productionState.toString()); writer.element("nuxeo-validation", validationState.toString()); if (platforms != null) { writer.start("platforms"); writer.startContent(); for (String platform : platforms) { writer.element("platform", platform); } writer.end("platforms"); } if (dependencies != null) { writer.start("dependencies"); writer.startContent(); for (PackageDependency dep : dependencies) { writer.element("package", dep.toString()); } writer.end("dependencies"); } if (installer != null) { writer.start("installer"); writer.attr("class", installer.getType()); writer.attr("restart", String.valueOf(installer.getRequireRestart())); writer.end(); } if (uninstaller != null) { writer.start("uninstaller"); writer.attr("class", uninstaller.getType()); writer.attr("restart", String.valueOf(uninstaller.getRequireRestart())); writer.end(); } writer.element("validator", validator); writer.end("package"); } @Override public ProductionState getProductionState() { return productionState; } @Override public NuxeoValidationState getValidationState() { return validationState; } @Override public boolean isSupported() { return supported; } @Override public boolean supportsHotReload() { return hotReloadSupport; } @Override public void setRequireTermsAndConditionsAcceptance(boolean requireTermsAndConditionsAcceptance) { this.requireTermsAndConditionsAcceptance = requireTermsAndConditionsAcceptance; } @Override public boolean requireTermsAndConditionsAcceptance() { return requireTermsAndConditionsAcceptance; } @Override public String toXML() { return new XmlSerializer().toXML(this); } @Deprecated @Override public int getState() { return PackageState.UNKNOWN.getValue(); } @Override public PackageState getPackageState() { return PackageState.UNKNOWN; } @Override public boolean isLocal() { throw new UnsupportedOperationException(); } @Override public PackageVisibility getVisibility() { return visibility; } @Override public void setVisibility(PackageVisibility visibility) { this.visibility = visibility; } }