com.nokia.carbide.remoteconnections.interfaces.AbstractPackageInstallerProvider.java Source code

Java tutorial

Introduction

Here is the source code for com.nokia.carbide.remoteconnections.interfaces.AbstractPackageInstallerProvider.java

Source

/*
* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of the License "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description: 
*
*/
package com.nokia.carbide.remoteconnections.interfaces;

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.lang.reflect.InvocationTargetException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.methods.GetMethod;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.jface.operation.IRunnableContext;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.swt.graphics.Image;
import org.osgi.framework.Version;

import com.nokia.carbide.installpackages.InstallPackages;
import com.nokia.carbide.installpackages.InstallPackages.IServerData;
import com.nokia.carbide.installpackages.gen.InstallPackages.PackageType;
import com.nokia.carbide.remoteconnections.Messages;
import com.nokia.carbide.remoteconnections.RemoteConnectionsActivator;

@SuppressWarnings("deprecation")
public abstract class AbstractPackageInstallerProvider implements IRemoteAgentInstallerProvider {

    public class PackageTypeInstaller implements IRemoteAgentInstaller {

        private class PackageContents implements IPackageContents {
            public PackageContents(String defaultFileName, InputStream inputStream) {
                this.defaultFileName = ""; //$NON-NLS-1$
                if (defaultFileName != null)
                    this.defaultFileName = defaultFileName;
                this.inputStream = inputStream;
            }

            private String defaultFileName;
            private InputStream inputStream;

            public String getDefaultNameFileName() {
                return defaultFileName;
            }

            public InputStream getInputStream() {
                return inputStream;
            }
        }

        private InstallPackages packages;
        private PackageType packageType;

        public PackageTypeInstaller(InstallPackages packages, PackageType packageType) {
            this.packages = packages;
            this.packageType = packageType;
        }

        private boolean isArchive(PackageType pkg) {
            IPath path = new Path(pkg.getInstallFilePath());
            String extension = path.getFileExtension();
            return ZIPEXT.equalsIgnoreCase(extension);
        }

        public boolean fileSupportsInstall() {
            return !isArchive(packageType);
        }

        public Image getImage() {
            return getCachedImage(isArchive(packageType) ? ZIPFILEIMGDESC : INSTALLFILEIMGDESC);
        }

        public String getInformation() {
            return packageType.getInformation();
        }

        public String getLabel() {
            return packageType.getDisplayName();
        }

        public Version getInstallerVersion() {
            try {
                return new Version(packageType.getPackageVersion());
            } catch (IllegalArgumentException e) {
                RemoteConnectionsActivator.logError(e);
            }
            return null;
        }

        public IPackageContents getPackageContents(IRunnableContext runnableContext) {
            InputStream inputStream = null;
            String installFileUrl = null;
            try {
                installFileUrl = getInstallFileUrl(runnableContext);
                inputStream = getInstallFile(installFileUrl, runnableContext);
            } catch (Exception e) {
                RemoteConnectionsActivator.log("Failed to find package URL " + installFileUrl, e);
            }
            String defaultFileName = null;
            if (installFileUrl != null)
                defaultFileName = new Path(installFileUrl).lastSegment();
            return new PackageContents(defaultFileName, inputStream);
        }

        private InputStream getInstallFile(String installFileUrl, IRunnableContext runnableContext)
                throws Exception {

            URL url = null;

            // see if the file is local (Ed's hack for testing...)
            url = new URL(installFileUrl);
            if (url.getProtocol().equals("file")) {
                return url.openStream();
            }

            GetMethod getMethod = new GetMethod(installFileUrl);
            HttpClient client = new HttpClient();
            InstallPackages.setProxyData(client, getMethod);
            client.getHttpConnectionManager().getParams().setConnectionTimeout(8000);
            int serverStatus = 0;
            byte[] responseBody;
            try {
                serverStatus = client.executeMethod(getMethod);
                responseBody = getMethod.getResponseBody();
            } catch (Exception e) {
                // could be HttpException or IOException
                throw new Exception(e);
            } finally {
                getMethod.releaseConnection();
            }

            // HTTP status codes: 2xx = Success
            if (serverStatus >= 200 && serverStatus < 300) {
                return new ByteArrayInputStream(responseBody);
            }

            return null;
        }

        private String getInstallFileUrl(IRunnableContext runnableContext) {
            final String[] installFileUrl = { null };
            try {
                runnableContext.run(false, false, new IRunnableWithProgress() {
                    public void run(IProgressMonitor monitor)
                            throws InvocationTargetException, InterruptedException {
                        monitor.beginTask(
                                Messages.getString("AbstractPackageInstallerProvider.DownloadingAgentJobLabel"), //$NON-NLS-1$
                                IProgressMonitor.UNKNOWN);
                        installFileUrl[0] = packages.getInstallUrlString(packageType.getInstallFilePath());
                    }
                });
            } catch (Exception e) {
                RemoteConnectionsActivator.logError(e);
            }
            return installFileUrl[0];
        }

    }

    protected static final String ZIPEXT = "ZIP"; //$NON-NLS-1$
    protected static final ImageDescriptor ZIPFILEIMGDESC = RemoteConnectionsActivator
            .getImageDescriptor("icons/archiveFile.png"); //$NON-NLS-1$
    protected static final ImageDescriptor INSTALLFILEIMGDESC = RemoteConnectionsActivator
            .getImageDescriptor("icons/installFile.png"); //$NON-NLS-1$
    private InstallPackages packages;
    private List<PackageType> packageList;
    private Map<ImageDescriptor, Image> imageCache;

    /**
     * @deprecated
     */
    protected abstract IServerData getServerData();

    public List<String> getSDKFamilyNames(IRunnableContext runnableContext) {
        if (packages == null)
            packages = new InstallPackages(getService(), runnableContext);
        Set<String> sdkFamilyNames = new HashSet<String>();
        packageList = packages.getAvailablePackageList();
        if (packageList == null)
            return Collections.emptyList();
        for (PackageType packageType : packageList) {
            String sdkFamily = packageType.getSdkFamily();
            sdkFamilyNames.add(sdkFamily);
        }
        List<String> sdkFamilyNameList = new ArrayList<String>(sdkFamilyNames);
        Collections.sort(sdkFamilyNameList, packages.getSDKFamilyComparator());
        return sdkFamilyNameList;
    }

    public List<String> getVersions(String familyName) {
        Set<String> versions = new HashSet<String>();
        for (PackageType packageType : packageList) {
            if (packageType.getSdkFamily().equals(familyName)) {
                try {
                    versions.add(packageType.getSdkVersion());
                } catch (IllegalArgumentException e) {
                    RemoteConnectionsActivator.logError(e);
                }
            }
        }
        List<String> versionList = new ArrayList<String>(versions);
        Collections.sort(versionList, packages.getSDKVersionComparator());
        return versionList;
    }

    public List<IRemoteAgentInstaller> getRemoteAgentInstallers(String familyName, String version) {
        Set<IRemoteAgentInstaller> installers = new HashSet<IRemoteAgentInstaller>();
        if (packageList == null) {
            getSDKFamilyNames(null);
        }
        for (PackageType packageType : packageList) {
            if (packageType.getSdkFamily().equals(familyName)) {
                try {
                    if (version.equals(packageType.getSdkVersion())) {
                        installers.add(new PackageTypeInstaller(packages, packageType));
                    }
                } catch (IllegalArgumentException e) {
                    RemoteConnectionsActivator.logError(e);
                }
            }
        }
        List<IRemoteAgentInstaller> installerList = new ArrayList<IRemoteAgentInstaller>(installers);
        Collections.sort(installerList, new Comparator<IRemoteAgentInstaller>() {
            public int compare(IRemoteAgentInstaller o1, IRemoteAgentInstaller o2) {
                return o1.getLabel().compareToIgnoreCase(o2.getLabel());
            }
        });
        return installerList;
    }

    protected synchronized Image getCachedImage(ImageDescriptor desc) {
        if (imageCache == null)
            imageCache = new HashMap<ImageDescriptor, Image>();

        Image image = imageCache.get(desc);
        if (image == null) {
            image = desc.createImage();
            imageCache.put(desc, image);
        }

        return image;
    }

    public synchronized void dispose() {
        if (imageCache != null) {
            for (Image image : imageCache.values()) {
                image.dispose();
            }
            imageCache.clear();
            imageCache = null;
        }
        packages = null;
    }

}