/*
* (C) Copyright 2012-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:
* mguillaume
*/
package org.nuxeo.launcher.info;
import java.io.File;
import java.io.IOException;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import java.util.StringTokenizer;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.apache.commons.logging.LogFactory;
import org.nuxeo.connect.update.LocalPackage;
import org.nuxeo.connect.update.NuxeoValidationState;
import org.nuxeo.connect.update.Package;
import org.nuxeo.connect.update.PackageDependency;
import org.nuxeo.connect.update.PackageException;
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.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "package")
@XmlType(propOrder = { "id", "state", "version", "name", "type", "visibility", "targetPlatforms", "vendor",
"supportsHotReload", "supported", "productionState", "validationState", "provides", "dependencies", "conflicts",
"title", "description", "homePage", "licenseType", "licenseUrl", "templates" })
public class PackageInfo {
public String name;
public String version;
public String id;
public PackageState state;
public String title;
public String description;
public String homePage;
public String licenseType;
public String licenseUrl;
public ProductionState productionState;
public NuxeoValidationState validationState;
public String[] targetPlatforms;
public PackageType type;
public String vendor;
public PackageVisibility visibility;
public PackageDependency[] provides;
public PackageDependency[] dependencies;
public PackageDependency[] conflicts;
public boolean supportsHotReload;
public boolean supported;
public Set<String> templates;
public PackageInfo() {
}
/**
* @since 5.7
*/
public PackageInfo(Package pkg) {
name = pkg.getName();
version = pkg.getVersion().toString();
id = pkg.getId();
state = pkg.getPackageState();
title = pkg.getTitle();
description = pkg.getDescription();
homePage = pkg.getHomePage();
licenseType = pkg.getLicenseType();
licenseUrl = pkg.getLicenseUrl();
productionState = pkg.getProductionState();
validationState = pkg.getValidationState();
targetPlatforms = pkg.getTargetPlatforms();
type = pkg.getType();
vendor = pkg.getVendor();
visibility = pkg.getVisibility();
if (visibility == null) {
visibility = PackageVisibility.UNKNOWN;
}
provides = pkg.getProvides();
dependencies = pkg.getDependencies();
conflicts = pkg.getConflicts();
supportsHotReload = pkg.supportsHotReload();
supported = pkg.isSupported();
templates = templates(pkg);
}
/**
* @since 8.3
*/
private Set<String> templates(Package pkg) {
if (!(pkg instanceof LocalPackage)) {
return Collections.emptySet();
}
Set<String> templatesFound = new HashSet<>();
try {
File installFile = ((LocalPackage) pkg).getInstallFile();
if (!installFile.exists()) {
return Collections.emptySet();
}
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document dom = db.parse(installFile);
NodeList nodes = dom.getDocumentElement().getElementsByTagName("config");
for (int i = 0; i < nodes.getLength(); i++) {
Element node = (Element) nodes.item(i);
if (!node.hasAttribute("addtemplate")) {
continue;
}
StringTokenizer tokenizer = new StringTokenizer(node.getAttribute("addtemplate"), ",");
while (tokenizer.hasMoreTokens()) {
templatesFound.add(tokenizer.nextToken());
}
}
} catch (PackageException | ParserConfigurationException | SAXException | IOException e) {
LogFactory.getLog(PackageInfo.class).warn("Could not parse install file for " + pkg.getName(), e);
}
return templatesFound;
}
}