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