/*
* Copyright 2004,2005 The Apache Software Foundation.
*
* 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.
*/
package org.wso2.carbon.component.mgt.services.prov.utils;
import org.apache.axis2.context.MessageContext;
import org.eclipse.equinox.internal.provisional.p2.core.Version;
import org.eclipse.equinox.internal.provisional.p2.core.VersionRange;
import org.eclipse.equinox.internal.provisional.p2.metadata.ICopyright;
import org.eclipse.equinox.internal.provisional.p2.metadata.IInstallableUnit;
import org.eclipse.equinox.internal.provisional.p2.metadata.ILicense;
import org.eclipse.equinox.internal.provisional.p2.metadata.IRequiredCapability;
import org.eclipse.equinox.internal.provisional.p2.metadata.query.InstallableUnitQuery;
import org.eclipse.equinox.internal.provisional.p2.query.Collector;
import org.eclipse.equinox.internal.provisional.p2.query.IQueryable;
import org.eclipse.equinox.internal.provisional.p2.query.Query;
import org.eclipse.equinox.internal.provisional.p2.repository.IRepository;
import org.wso2.carbon.component.mgt.core.ProvisioningException;
import org.wso2.carbon.component.mgt.core.ResolutionResult;
import org.wso2.carbon.component.mgt.core.query.InstalledIUQuery;
import org.wso2.carbon.component.mgt.core.query.QueryContext;
import org.wso2.carbon.component.mgt.core.util.IUPropertyUtils;
import org.wso2.carbon.component.mgt.core.util.ProvisioningUtils;
import org.wso2.carbon.component.mgt.core.util.RepositoryUtils;
import org.wso2.carbon.component.mgt.services.prov.data.*;
import javax.servlet.http.HttpSession;
import java.net.URI;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Stack;
public class ProvWSUtils {
public static RepositoryInfo[] wrapURIsAsRepositories(URI[] uriArray) throws ProvisioningException {
if (uriArray == null) {
return new RepositoryInfo[0];
}
RepositoryInfo[] repositories = new RepositoryInfo[uriArray.length];
for (int index = 0; index < uriArray.length; index++) {
URI location = uriArray[index];
boolean enabled = RepositoryUtils.isRepositoryEnabled(location);
String nickName = RepositoryUtils.getMetadataRepositoryProperty(location, IRepository.PROP_NICKNAME);
if (nickName == null) {
nickName = RepositoryUtils.getMetadataRepositoryProperty(location, IRepository.PROP_NAME);
}
if (nickName == null) {
nickName = " ";
}
RepositoryInfo repository = new RepositoryInfo(location.toString(), nickName, enabled);
repositories[index] = repository;
}
return repositories;
}
public static URI[] mergeURIArrays(URI[] array1, URI[] array2) {
int arrayLength = array1.length + array2.length;
URI[] mergedArray = new URI[arrayLength];
System.arraycopy(array1, 0, mergedArray, 0, array1.length);
System.arraycopy(array2, 0, mergedArray, array1.length, array2.length);
return mergedArray;
}
public static FeatureInfo[] wrapIUsAsFeatures(IInstallableUnit[] installableUnits) {
if (installableUnits == null) {
return new FeatureInfo[0];
}
FeatureInfo[] features = new FeatureInfo[installableUnits.length];
for (int index = 0; index < installableUnits.length; index++) {
FeatureInfo feature = new FeatureInfo();
IInstallableUnit installableUnit = installableUnits[index];
features[index] = feature;
feature.setFeatureID(installableUnit.getId());
feature.setFeatureVersion(installableUnit.getVersion().toString());
feature.setFeatureName(IUPropertyUtils.getIUProperty(installableUnit, IInstallableUnit.PROP_NAME));
String provider = IUPropertyUtils.getIUProperty(installableUnit, IInstallableUnit.PROP_PROVIDER);
if (provider == null) {
provider = " ";
}
feature.setProvider(provider);
String description = IUPropertyUtils.getIUProperty(installableUnit, IInstallableUnit.PROP_DESCRIPTION);
if (description == null) {
description = "No description provided";
}
feature.setDescription(description);
}
return features;
}
public static Feature[] wrapInstalledFeatures(IInstallableUnit[] installableUnits, IQueryable queryable) {
if (installableUnits == null) {
return new Feature[0];
}
HashMap<String, IInstallableUnit> installedFeaturesMap = getInstalledRootUnitsMap();
ArrayList<Feature> featuresList = new ArrayList<Feature>();
for (IInstallableUnit iu : installableUnits) {
if (!iu.getId().startsWith("org.eclipse.equinox")) {
featuresList.add(processFeature(iu, queryable, installedFeaturesMap));
}
}
return featuresList.toArray(new Feature[featuresList.size()]);
}
public static Feature[] wrapAvailableFeatures(IInstallableUnit[] installableUnits, IQueryable queryable) {
if (installableUnits == null) {
return new Feature[0];
}
HashMap<String, IInstallableUnit> installedFeaturesMap = getAllInstalledUnitsMap();
ArrayList<Feature> featuresList = new ArrayList<Feature>();
for (IInstallableUnit iu : installableUnits) {
if (iu.getId().startsWith("org.eclipse.equinox") || ProvisioningUtils.isIUInstalled(iu, installedFeaturesMap)) {
continue;
}
featuresList.add(processFeature(iu, queryable, installedFeaturesMap));
}
return featuresList.toArray(new Feature[featuresList.size()]);
}
public static Feature processFeature(IInstallableUnit iu, IQueryable queryable, HashMap<String, IInstallableUnit> installedFeaturesMap) {
Stack<IInstallableUnit> iuStack;
Stack<Feature> featureStack;
Feature groupFeature = wrapIU(iu);
iuStack = new Stack<IInstallableUnit>();
featureStack = new Stack<Feature>();
iuStack.add(iu);
featureStack.add(groupFeature);
while (!iuStack.isEmpty() && !featureStack.isEmpty()) {
IInstallableUnit popedIU = iuStack.pop();
Feature popedFeature = featureStack.pop();
if (popedFeature.isInstalled()) {
popedFeature.setRequiredFeatures(new Feature[0]);
continue;
}
//Processing required Features.
ArrayList<Feature> requiredFeaturesList = new ArrayList<Feature>();
IRequiredCapability[] requiredCapabilities = popedIU.getRequiredCapabilities();
for (IRequiredCapability requiredCapability : requiredCapabilities) {
String namespace = requiredCapability.getNamespace();
String name = requiredCapability.getName();
if (IInstallableUnit.NAMESPACE_IU_ID.equals(namespace) && name.endsWith("feature.group") && !name.startsWith("org.eclipse.equinox")) {
QueryContext queryContext = new QueryContext();
queryContext.setQuery(new InstallableUnitQuery(name, requiredCapability.getRange()));
queryContext.setQueryable(queryable);
InstalledIUQuery installedIUQuery = new InstalledIUQuery(queryContext);
IInstallableUnit[] requiredIUs = (ProvisioningUtils.performIUQuery(installedIUQuery));
IInstallableUnit requiredIU = (requiredIUs.length == 0) ? null : requiredIUs[0];
if (requiredIU != null) {
Feature requiredFeature = wrapIU(requiredIU);
if (!ProvisioningUtils.isIUInstalled(requiredIU, installedFeaturesMap)) {
if (!requiredCapability.isOptional()) {
requiredFeature.setRequired(true);
}
iuStack.push(requiredIU);
featureStack.add(requiredFeature);
requiredFeaturesList.add(requiredFeature);
}
}
}
}
popedFeature.setRequiredFeatures(requiredFeaturesList.toArray(
new Feature[requiredFeaturesList.size()]));
}
return groupFeature;
}
public static Feature wrapIU(IInstallableUnit iu) {
Feature feature = new Feature();
feature.setFeatureID(iu.getId());
feature.setFeatureVersion(iu.getVersion().toString());
feature.setFeatureName(IUPropertyUtils.getIUProperty(iu, IInstallableUnit.PROP_NAME));
String provider = IUPropertyUtils.getIUProperty(iu, IInstallableUnit.PROP_PROVIDER);
if (provider == null) {
provider = " ";
}
feature.setProvider(provider);
String featureType = iu.getProperty("org.wso2.carbon.p2.category.type");
if(featureType == null){
featureType="";
}
feature.setFeatureType(featureType);
String featureDescription = IUPropertyUtils.getIUProperty(iu, IInstallableUnit.PROP_DESCRIPTION);
if (featureDescription == null) {
featureDescription = ""; // setting the empty String if the property is null
}
feature.setFeatureDescription(featureDescription);
return feature;
}
public static IInstallableUnit[] getRequiredFeatureIUs(IInstallableUnit featureIU, IQueryable queryable) {
ArrayList<IInstallableUnit> requiredIUList = new ArrayList<IInstallableUnit>();
IRequiredCapability[] requiredCapabilities = featureIU.getRequiredCapabilities();
for (IRequiredCapability requiredCapability : requiredCapabilities) {
String namespace = requiredCapability.getNamespace();
String name = requiredCapability.getName();
if (IInstallableUnit.NAMESPACE_IU_ID.equals(namespace) && name.endsWith("feature.group") && !name.startsWith("org.eclipse.equinox")) {
QueryContext queryContext = new QueryContext();
queryContext.setQuery(new InstallableUnitQuery(name, requiredCapability.getRange()));
queryContext.setQueryable(queryable);
InstalledIUQuery installedIUQuery = new InstalledIUQuery(queryContext);
IInstallableUnit requiredIU = ProvisioningUtils.performIUQuery(installedIUQuery)[0];
if (requiredIU != null) {
requiredIUList.add(requiredIU);
}
}
}
IInstallableUnit[] requiredIUs = new IInstallableUnit[requiredIUList.size()];
return requiredIUList.toArray(requiredIUs);
}
public static FeatureInfo wrapIUsAsFeaturesWithDetails(IInstallableUnit installableUnit, ILicense license, ICopyright copyright) {
if (installableUnit == null) {
return new FeatureInfo();
}
FeatureInfo feature = new FeatureInfo();
feature.setFeatureID(installableUnit.getId());
feature.setFeatureVersion(installableUnit.getVersion().toString());
feature.setFeatureName(IUPropertyUtils.getIUProperty(installableUnit, IInstallableUnit.PROP_NAME));
String provider = IUPropertyUtils.getIUProperty(installableUnit, IInstallableUnit.PROP_PROVIDER);
if (provider == null) {
provider = " ";
}
feature.setProvider(provider);
String description = IUPropertyUtils.getIUProperty(installableUnit, IInstallableUnit.PROP_DESCRIPTION);
if (description == null) {
description = "No description provided";
}
feature.setDescription(description);
feature.setLicenseInfo(wrapP2LicensesAsLicenses(new ILicense[]{license})[0]);
feature.setCopyrightInfo(wrapP2LicensesAsLicenses(copyright));
return feature;
}
public static IInstallableUnit[] deriveRepositoryIUsFromFeatures(FeatureInfo[] features) throws ProvisioningException {
if (features == null) {
return new IInstallableUnit[0];
}
QueryContext queryContext = new QueryContext();
queryContext.setQueryable(RepositoryUtils.getQuerybleRepositoryManager(null));
HashMap<String, IInstallableUnit> iuMap = new HashMap<String, IInstallableUnit>();
for (FeatureInfo featureInfo : features) {
Collector collector = new Collector();
Query query = new InstallableUnitQuery(featureInfo.getFeatureID(),
new VersionRange(Version.create(featureInfo.getFeatureVersion()),
true, Version.create(featureInfo.getFeatureVersion()), true));
collector = RepositoryUtils.getInstallableUnitsInRepositories(null, query, collector, null);
IInstallableUnit[] units = (IInstallableUnit[]) collector.toArray(IInstallableUnit.class);
if (units[0] == null) {
continue;
}
addIUtoMap(iuMap, units[0]);
}
return iuMap.values().toArray(new IInstallableUnit[iuMap.values().size()]);
}
private static void addIUtoMap(HashMap<String, IInstallableUnit> iuMap, IInstallableUnit iu) {
IInstallableUnit addedIU = iuMap.get(iu.getId());
if (addedIU == null) {
iuMap.put(iu.getId(), iu);
} else if (addedIU.getVersion().compareTo(iu.getVersion()) < 0) {
iuMap.put(iu.getId(), iu);
}
}
public static IInstallableUnit[] deriveProfileIUsFromFeatures(FeatureInfo[] features) throws ProvisioningException {
if (features == null) {
return new IInstallableUnit[0];
}
IInstallableUnit[] ius = new IInstallableUnit[features.length];
for (int i = 0; i < features.length; i++) {
FeatureInfo feature = features[i];
QueryContext queryContext = new QueryContext();
queryContext.setQueryable(ProvisioningUtils.getProfile());
queryContext.setQuery(new InstallableUnitQuery(feature.getFeatureID(), new VersionRange(feature.getFeatureVersion())));
InstalledIUQuery installedIUQuery = new InstalledIUQuery(queryContext);
IInstallableUnit[] units = ProvisioningUtils.performIUQuery(installedIUQuery);
ius[i] = units[0];
}
return ius;
}
public static ProvisioningActionResultInfo wrapResolutionResult(ResolutionResult resolutionResult) {
ProvisioningActionResultInfo resultInfo = new ProvisioningActionResultInfo();
resultInfo.setReviewedInstallableFeatures(wrapIUsAsFeatures(resolutionResult.getReviewedInstallableUnits()));
resultInfo.setReviewedUninstallableFeatures(wrapIUsAsFeatures(resolutionResult.getReviewedUninstallableUnits()));
resultInfo.setFailedinstallableFeatures(wrapIUsAsFeatures(resolutionResult.getFailedInstallableUnits()));
resultInfo.setFailedUninstallableFeatures(wrapIUsAsFeatures(resolutionResult.getFailedUninstallableUnits()));
resultInfo.setDetailedDescription(resolutionResult.getSummaryReport());
resultInfo.setSummary(resolutionResult.getSummaryReport());
resultInfo.setSize(resolutionResult.getInstallationSize());
return resultInfo;
}
public static void saveResolutionResult(String actionType, ResolutionResult resolutionResult,
MessageContext messageContext) throws Exception {
HttpSession session = getHttpSession(messageContext);
if (session != null) {
session.setAttribute(actionType, resolutionResult);
} else {
throw new Exception("HttpSession is null");
}
}
public static ResolutionResult getResolutionResult(String actionType,
MessageContext messageContext) throws Exception {
HttpSession session = getHttpSession(messageContext);
if (session != null) {
return (ResolutionResult) session.getAttribute(actionType);
} else {
throw new Exception("HttpSession is null");
}
}
public static LicenseInfo[] wrapP2LicensesAsLicenses(ILicense[] p2Licenses) {
if (p2Licenses == null) {
return new LicenseInfo[0];
}
LicenseInfo[] licenses = new LicenseInfo[p2Licenses.length];
for (int index = 0; index < licenses.length; index++) {
LicenseInfo license = new LicenseInfo();
license.setBody(p2Licenses[index].getBody());
license.setURL((p2Licenses[index].getLocation() == null) ? "" : p2Licenses[index].getLocation().toString());
licenses[index] = license;
}
return licenses;
}
public static CopyrightInfo wrapP2LicensesAsLicenses(ICopyright iCopyright) {
if (iCopyright == null) {
return new CopyrightInfo();
}
CopyrightInfo copyrightInfo = new CopyrightInfo();
copyrightInfo.setBody(iCopyright.getBody());
copyrightInfo.setURL((iCopyright.getLocation() == null) ? "" : iCopyright.getLocation().toString());
return copyrightInfo;
}
public static ProfileHistory getProfileHistoryFromTimestamp(long timestamp) {
ProfileHistory profileHistory = new ProfileHistory();
profileHistory.setTimestamp(timestamp);
SimpleDateFormat monthDayYearformatter = new SimpleDateFormat("MMMMM dd, yyyy 'at' HH:mm:ss z");
Date date = new Date(timestamp);
profileHistory.setSummary(monthDayYearformatter.format(date));
return profileHistory;
}
public static HttpSession getHttpSession(MessageContext messageContext) {
return (HttpSession) messageContext.getProperty("comp.mgt.servlet.session");
}
public static HashMap<String, IInstallableUnit> getInstalledRootUnitsMap() {
QueryContext queryContext = new QueryContext();
queryContext.setQueryable(ProvisioningUtils.getProfile());
InstalledIUQuery installedIUQuery = new InstalledIUQuery(queryContext);
IInstallableUnit[] installedUnits = ProvisioningUtils.performIUQuery(installedIUQuery);
return getInstalledUnitsMap(installedUnits);
}
public static HashMap<String, IInstallableUnit> getInstalledUnitsMap(IInstallableUnit[] installedUnits) {
HashMap<String, IInstallableUnit> installedUnitsMap = new HashMap<String, IInstallableUnit>(installedUnits.length);
for (IInstallableUnit iu : installedUnits) {
installedUnitsMap.put(iu.getId(), iu);
}
return installedUnitsMap;
}
public static HashMap<String, IInstallableUnit> getAllInstalledUnitsMap() {
QueryContext queryContext = new QueryContext();
IInstallableUnit[] installedUnits = ProvisioningUtils.getAllInstalledIUs(queryContext);
return getInstalledUnitsMap(installedUnits);
}
}