org.ebayopensource.turmeric.eclipse.ui.util.SOADomainUtil.java Source code

Java tutorial

Introduction

Here is the source code for org.ebayopensource.turmeric.eclipse.ui.util.SOADomainUtil.java

Source

/*******************************************************************************
 * Copyright (c) 2006-2010 eBay Inc. All Rights Reserved.
 * 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
 *******************************************************************************/
/**
 * 
 */
package org.ebayopensource.turmeric.eclipse.ui.util;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;

import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.StringUtils;
import org.ebayopensource.turmeric.eclipse.config.core.SOADomainAccessor;
import org.ebayopensource.turmeric.eclipse.core.logging.SOALogger;
import org.ebayopensource.turmeric.eclipse.registry.ExtensionPointFactory;
import org.ebayopensource.turmeric.eclipse.registry.models.NameValuePair;
import org.ebayopensource.turmeric.eclipse.repositorysystem.core.GlobalRepositorySystem;
import org.eclipse.core.runtime.Platform;

/**
 * Reading the domain names.
 * 
 * The logics are:
 * 1) AR plugin not installed
 * SOA plugin always read from the locally cached properties file
 * 
 * 2) AR plugin installed
 * If connection to AR established, then always get the latest from AR server, 
 * then persist the retrieved data into a Configuration scoped preference store as a cache.
 * If no connection established, then always use the data in the cache.
 * 
 * @author yayu
 * @since 1.0.0
 */
public final class SOADomainUtil {
    private static final SOALogger logger = SOALogger.getLogger();

    /** The Constant SOA_DOMAIN_PREFERENCE_ID. */
    public static final String SOA_DOMAIN_PREFERENCE_ID = "org.ebayopensource.turmeric.eclipse.domains";

    /** The Constant SOA_DOMAIN_PREFERENCE_NODE. */
    public static final String SOA_DOMAIN_PREFERENCE_NODE = "domainNames";
    private static final URL SOA_DOMAIN_PREF_LOCATION;

    static {
        URL url = null;
        try {
            url = new URL(Platform.getInstallLocation().getURL() + "/configuration/" + SOA_DOMAIN_PREFERENCE_ID
                    + "/" + SOA_DOMAIN_PREFERENCE_NODE + ".prefs");
            logger.info("Configuration location->", url);
        } catch (MalformedURLException e) {
            logger.error(e);
        }
        SOA_DOMAIN_PREF_LOCATION = url;
    }

    /**
     * 
     */
    private SOADomainUtil() {
        super();
    }

    /**
     * Key is the domain name, value is the list of namespace parts.
     *
     * @return the registered domains
     * @throws Exception the exception
     */
    public static Map<String, List<String>> getRegisteredDomains() throws Exception {
        final Map<String, List<String>> result = new LinkedHashMap<String, List<String>>();
        try {
            if (ExtensionPointFactory.getSOARegistryProvider() != null) {
                final List<NameValuePair> domains = ExtensionPointFactory.getSOARegistryProvider()
                        .getDomainNamespaceValues();
                if (domains != null && domains.isEmpty() == false) {
                    StringBuffer buf = new StringBuffer();
                    for (NameValuePair nameValuePair : domains) {
                        result.put(nameValuePair.getDomainName(), nameValuePair.getClassifiers());
                        buf.append(nameValuePair.getDomainName() + "="
                                + StringUtils.join(nameValuePair.getClassifiers(), ":") + ", ");
                    }
                    logger.info("Domain list retrieved from AR: ", buf.toString());
                    if (result.isEmpty() == false) {
                        saveDomainsToCache(result);
                        return result;
                    }
                }
            }
        } catch (Exception e) {
            logger.warning("Failed to retrieve data from the Asset Repository, use local cache instead.", e);
        }

        //could not read from the AR, use the local cache instead.
        result.putAll(loadDomainsFromCache());
        if (result.isEmpty() == false)
            return result;

        //use the properties file
        final String buildSystemID = GlobalRepositorySystem.instanceOf().getActiveRepositorySystem().getId();
        final String organization = GlobalRepositorySystem.instanceOf().getActiveRepositorySystem()
                .getActiveOrganizationProvider().getName();
        logger.info("Loading functional domain list from the static file...");
        result.putAll(SOADomainAccessor.getDomains(buildSystemID, organization));

        saveDomainsToCache(result);
        return result;
    }

    private static Map<String, List<String>> loadDomainsFromCache() {
        final Map<String, List<String>> result = new LinkedHashMap<String, List<String>>();
        if (SOA_DOMAIN_PREF_LOCATION != null) {
            if (FileUtils.toFile(SOA_DOMAIN_PREF_LOCATION).canRead() == false) {
                logger.warning("The cache file does not exist->", SOA_DOMAIN_PREF_LOCATION);
                return result;
            }
            InputStream input = null;
            try {
                input = SOA_DOMAIN_PREF_LOCATION.openStream();
                final Properties props = new Properties();
                props.load(input);
                final String data = props.getProperty(SOA_DOMAIN_PREFERENCE_NODE, "");
                logger.info("Domain names loaded from cache->", data);
                return SOADomainAccessor.parseStringToDomainMap(data);
            } catch (Exception e) {
                logger.warning(e);
            } finally {
                IOUtils.closeQuietly(input);
            }
        }
        return result;
    }

    private static void saveDomainsToCache(Map<String, List<String>> domains) {
        if (SOA_DOMAIN_PREF_LOCATION != null) {
            InputStream input = null;
            OutputStream output = null;
            try {
                File file = FileUtils.toFile(SOA_DOMAIN_PREF_LOCATION);
                if (file.exists() == false) {
                    if (file.getParentFile().exists() == false) {
                        FileUtils.forceMkdir(file.getParentFile());
                    }
                    file.createNewFile();
                } else if (file.canWrite() == false) {
                    logger.warning("The SOA domain cache file is not writable->", file);
                    return;
                }

                final String data = SOADomainAccessor.paseDomainMapToString(domains);
                final Properties props = new Properties();
                output = new FileOutputStream(file);
                props.setProperty(SOA_DOMAIN_PREFERENCE_NODE, data);
                props.store(output, "SOA Domain names.\n");
                logger.info("Storing domain names->", data);
            } catch (Exception e) {
                logger.warning(e);
            } finally {
                IOUtils.closeQuietly(input);
                IOUtils.closeQuietly(output);
            }
        }
    }

    /* (non-Javadoc)
     * @see java.lang.Object#clone()
     */
    @Override
    protected Object clone() throws CloneNotSupportedException {
        throw new CloneNotSupportedException();
    }
}