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}