org.cloudifysource.esc.shell.installer.BootstrapUrlValidator.java Source code

Java tutorial

Introduction

Here is the source code for org.cloudifysource.esc.shell.installer.BootstrapUrlValidator.java

Source

/*******************************************************************************
 * Copyright (c) 2013 GigaSpaces Technologies Ltd. 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
 * 
 * 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.cloudifysource.esc.shell.installer;

import java.io.IOException;
import java.util.HashSet;
import java.util.Map.Entry;
import java.util.Set;
import java.util.logging.Logger;

import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpHead;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.client.SystemDefaultHttpClient;
import org.cloudifysource.domain.cloud.Cloud;
import org.cloudifysource.domain.cloud.ScriptLanguages;
import org.cloudifysource.domain.cloud.compute.ComputeTemplate;
import org.cloudifysource.dsl.internal.CloudifyErrorMessages;
import org.cloudifysource.esc.driver.provisioning.CloudProvisioningException;
import org.cloudifysource.esc.driver.provisioning.context.ValidationContext;
import org.cloudifysource.esc.driver.provisioning.validation.ValidationMessageType;
import org.cloudifysource.esc.driver.provisioning.validation.ValidationResultType;
import org.cloudifysource.shell.ShellUtils;

/****************
 * Validator for url settings in a cloud object.
 * 
 * @author barakme
 * @since 2.7.0
 * 
 */
public class BootstrapUrlValidator {
    private static final Logger logger = Logger.getLogger(BootstrapUrlValidator.class.getName());
    private final Cloud cloud;

    public BootstrapUrlValidator(final Cloud cloud) {
        this.cloud = cloud;
    }

    /*****
     * Validates the cloud object's cloudify url.
     * 
     * @param validationContext
     *            the validation context.
     * @throws CloudProvisioningException
     *             in case of a problem with the url.
     */
    public void validateCloudifyUrls(final ValidationContext validationContext) throws CloudProvisioningException {
        final String baseCloudifyUrl = cloud.getProvider().getCloudifyUrl();

        final SystemDefaultHttpClient client = new SystemDefaultHttpClient();

        if (baseCloudifyUrl.endsWith(".tar.gz") || baseCloudifyUrl.endsWith(".zip")) {
            validateUrl(client, baseCloudifyUrl, validationContext);
        } else {
            final Set<String> scriptLanguages = getScriptLanguages();
            if (scriptLanguages.contains(ScriptLanguages.LINUX_SHELL.toString())) {
                validateUrl(client, baseCloudifyUrl + ".tar.gz", validationContext);
            }

            if (scriptLanguages.contains(ScriptLanguages.WINDOWS_BATCH.toString())) {
                validateUrl(client, baseCloudifyUrl + ".zip", validationContext);
            }
        }

    }

    private void validateUrl(final DefaultHttpClient httpClient, final String cloudifyUrl,
            final ValidationContext validationContext) throws CloudProvisioningException {

        final HttpHead httpMethod = new HttpHead(cloudifyUrl);

        try {
            validationContext.validationOngoingEvent(ValidationMessageType.TOP_LEVEL_VALIDATION_MESSAGE,
                    ShellUtils.getFormattedMessage(CloudifyErrorMessages.EVENT_VALIDATING_CLOUDIFY_URL.getName(),
                            cloudifyUrl));
            final HttpResponse response = httpClient.execute(httpMethod);
            if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {
                validationContext.validationEventEnd(ValidationResultType.ERROR);
                logger.warning("Failed to validate Cloudify URL: " + cloudifyUrl);
                throw new CloudProvisioningException("Invalid cloudify URL: " + cloudifyUrl);
            }
            validationContext.validationEventEnd(ValidationResultType.OK);
        } catch (final ClientProtocolException e) {
            validationContext.validationOngoingEvent(ValidationMessageType.TOP_LEVEL_VALIDATION_MESSAGE,
                    " Unable to validate URL");
            validationContext.validationEventEnd(ValidationResultType.WARNING);
            logger.fine("Failed to validate Cloudify URL: " + cloudifyUrl);
        } catch (final IOException e) {
            validationContext.validationOngoingEvent(ValidationMessageType.TOP_LEVEL_VALIDATION_MESSAGE,
                    " Unable to validate URL");
            validationContext.validationEventEnd(ValidationResultType.WARNING);
            logger.fine("Failed to validate Cloudify URL: " + cloudifyUrl);
        }
    }

    private Set<String> getScriptLanguages() {
        final Set<String> langs = new HashSet<String>();

        for (final Entry<String, ComputeTemplate> entry : cloud.getCloudCompute().getTemplates().entrySet()) {
            final ComputeTemplate template = entry.getValue();
            langs.add(template.getScriptLanguage().toString());
        }

        return langs;
    }
}