All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.datacleaner.extensionswap.ExtensionSwapClient Maven / Gradle / Ivy

/**
 * DataCleaner (community edition)
 * Copyright (C) 2014 Neopost - Customer Information Management
 *
 * This copyrighted material is made available to anyone wishing to use, modify,
 * copy, or redistribute it subject to the terms and conditions of the GNU
 * Lesser General Public License, as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
 * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
 * for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this distribution; if not, write to:
 * Free Software Foundation, Inc.
 * 51 Franklin Street, Fifth Floor
 * Boston, MA  02110-1301  USA
 */
package org.datacleaner.extensionswap;

import java.io.File;
import java.util.List;

import org.apache.commons.vfs2.FileObject;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.metamodel.util.FileHelper;
import org.datacleaner.actions.DownloadFilesActionListener;
import org.datacleaner.actions.FileDownloadListener;
import org.datacleaner.bootstrap.WindowContext;
import org.datacleaner.configuration.DataCleanerConfiguration;
import org.datacleaner.extensions.ExtensionPackage;
import org.datacleaner.extensions.ExtensionReader;
import org.datacleaner.user.UserPreferences;
import org.datacleaner.util.StringUtils;
import org.datacleaner.util.VFSUtils;
import org.datacleaner.util.http.HttpXmlUtils;
import org.datacleaner.util.http.SimpleWebServiceHttpClient;
import org.datacleaner.util.http.WebServiceHttpClient;
import org.w3c.dom.Element;

public final class ExtensionSwapClient {

    public static final String DEFAULT_WEBSITE_HOSTNAME = "datacleaner.org";

    private static final String EXTENSIONSWAP_ID_PROPERTY = "extensionswap.id";

    private final WindowContext _windowContext;
    private final String _baseUrl;
    private final UserPreferences _userPreferences;
    private final DataCleanerConfiguration _configuration;

    public ExtensionSwapClient(final WindowContext windowContext, final UserPreferences userPreferences,
            final DataCleanerConfiguration configuration) {
        this(DEFAULT_WEBSITE_HOSTNAME, windowContext, userPreferences, configuration);
    }

    public ExtensionSwapClient(final String websiteHostname, final WindowContext windowContext,
            final UserPreferences userPreferences, final DataCleanerConfiguration configuration) {
        _windowContext = windowContext;
        _baseUrl = "http://" + websiteHostname + "/ws/extension/";
        _userPreferences = userPreferences;
        _configuration = configuration;
    }

    public ExtensionPackage registerExtensionPackage(final ExtensionSwapPackage extensionSwapPackage,
            final File jarFile) {
        final ExtensionReader reader = new ExtensionReader();
        final ExtensionPackage extensionPackage = reader.readExternalExtension(new File[] { jarFile });

        extensionPackage.getAdditionalProperties().put(EXTENSIONSWAP_ID_PROPERTY, extensionSwapPackage.getId());
        extensionPackage.getAdditionalProperties().put("version", Integer.toString(extensionSwapPackage.getVersion()));
        extensionPackage.loadDescriptors(_configuration.getEnvironment().getDescriptorProvider());
        _userPreferences.getExtensionPackages().add(extensionPackage);
        return extensionPackage;
    }

    public ExtensionSwapPackage getExtensionSwapPackage(final String id) {
        final CloseableHttpClient httpClient = _userPreferences.createHttpClient();
        try {
            final Element rootNode = HttpXmlUtils.getRootNode(httpClient, _baseUrl + id);
            final String name = HttpXmlUtils.getChildNodeText(rootNode, "name");
            final int version = Integer.parseInt(HttpXmlUtils.getChildNodeText(rootNode, "version"));
            final String packageName = HttpXmlUtils.getChildNodeText(rootNode, "package");
            return new ExtensionSwapPackage(id, version, name, packageName);
        } finally {
            FileHelper.safeClose(httpClient);
        }
    }

    public void registerExtensionPackage(final ExtensionSwapPackage extensionSwapPackage, final String username) {
        downloadJarFile(extensionSwapPackage, username, files -> {
            final File jarFile = VFSUtils.toFile(files[0]);
            registerExtensionPackage(extensionSwapPackage, jarFile);
        });
    }

    private void downloadJarFile(final ExtensionSwapPackage extensionSwapPackage, final String username,
            final FileDownloadListener listener) {
        String url = _baseUrl + extensionSwapPackage.getId() + "/jarfile";
        if (!StringUtils.isNullOrEmpty(username)) {
            url = url + "?username=" + username;
        }

        final String filename = extensionSwapPackage.getId() + ".jar";
        final FileObject targetDirectory = VFSUtils.toFileObject(_userPreferences.getExtensionsDirectory());
        final WebServiceHttpClient httpClient = new SimpleWebServiceHttpClient(_userPreferences.createHttpClient());
        final DownloadFilesActionListener actionListener =
                new DownloadFilesActionListener(new String[] { url }, targetDirectory, new String[] { filename },
                        listener, _windowContext, httpClient);
        actionListener.actionPerformed(null);
    }

    public boolean isInstalled(final ExtensionSwapPackage extensionSwapPackage) {
        final List extensionPackages = _userPreferences.getExtensionPackages();
        for (final ExtensionPackage extensionPackage : extensionPackages) {
            final String id = extensionPackage.getAdditionalProperties().get(EXTENSIONSWAP_ID_PROPERTY);
            if (extensionSwapPackage.getId().equals(id)) {
                return true;
            }
        }
        return false;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy