Package org.wso2.carbon.component.mgt.services.prov.utils

Source Code of org.wso2.carbon.component.mgt.services.prov.utils.ProvWSUtils

/*                                                                            
* 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);
    }
}
TOP

Related Classes of org.wso2.carbon.component.mgt.services.prov.utils.ProvWSUtils

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.