com.amazonaws.eclipse.explorer.sns.CreateTopicWizard.java Source code

Java tutorial

Introduction

Here is the source code for com.amazonaws.eclipse.explorer.sns.CreateTopicWizard.java

Source

/*
 * Copyright 2011-2013 Amazon Technologies, Inc.
 *
 * 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://aws.amazon.com/apache2.0
 *
 * This file 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 com.amazonaws.eclipse.explorer.sns;

import java.util.regex.Pattern;

import org.eclipse.core.databinding.validation.ValidationStatus;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.wizard.Wizard;
import org.eclipse.swt.widgets.Display;

import com.amazonaws.AmazonClientException;
import com.amazonaws.eclipse.core.AwsToolkitCore;
import com.amazonaws.eclipse.core.ui.wizards.CompositeWizardPage;
import com.amazonaws.eclipse.core.ui.wizards.InputValidator;
import com.amazonaws.eclipse.core.ui.wizards.TextWizardPageInput;
import com.amazonaws.eclipse.core.ui.wizards.WizardPageInput;
import com.amazonaws.eclipse.explorer.ContentProviderRegistry;
import com.amazonaws.services.sns.AmazonSNS;
import com.amazonaws.services.sns.model.CreateTopicRequest;
import com.amazonaws.services.sns.model.CreateTopicResult;
import com.amazonaws.services.sns.model.SetTopicAttributesRequest;

/**
 * A wizard for creating an SNS topic.
 */
public class CreateTopicWizard extends Wizard {

    private final CompositeWizardPage page;

    /**
     * Constructor.
     */
    public CreateTopicWizard() {

        page = new CompositeWizardPage("Create New SNS Topic", "Create New SNS Topic",
                AwsToolkitCore.getDefault().getImageRegistry().getDescriptor("aws-logo"));

        WizardPageInput topicName = new TextWizardPageInput("Topic Name: ", null, // no descriptive text.
                TopicNameValidator.INSTANCE, null // no async validation possible for topic names.
        );

        WizardPageInput displayName = new TextWizardPageInput("Display Name: ",
                "An optional display name for this topic.", DisplayNameValidator.INSTANCE, null // no async validation here either.
        );

        page.addInput(TOPIC_NAME_INPUT, topicName);
        page.addInput(DISPLAY_NAME_INPUT, displayName);
    }

    @Override
    public void addPages() {
        super.addPage(page);
    }

    @Override
    public int getPageCount() {
        return 1;
    }

    @Override
    public boolean needsPreviousAndNextButtons() {
        return false;
    }

    @Override
    public boolean performFinish() {
        String topicName = (String) page.getInputValue(TOPIC_NAME_INPUT);
        String displayName = (String) page.getInputValue(DISPLAY_NAME_INPUT);

        AmazonSNS client = AwsToolkitCore.getClientFactory().getSNSClient();

        CreateTopicResult result = client.createTopic(new CreateTopicRequest(topicName));

        if (displayName != null && displayName.length() > 0) {
            try {

                client.setTopicAttributes(new SetTopicAttributesRequest().withTopicArn(result.getTopicArn())
                        .withAttributeName(DISPLAY_NAME_ATTRIBUTE).withAttributeValue(displayName));

            } catch (AmazonClientException exception) {
                AwsToolkitCore.getDefault().logException("Error setting topic display name", exception);

                MessageDialog dialog = new MessageDialog(Display.getCurrent().getActiveShell(), "Warning", null,
                        ("The topic was successfully created, but the display " + "name could not be set ("
                                + exception.toString() + ")"),
                        MessageDialog.WARNING, new String[] { "OK" }, 0);
                dialog.open();
            }
        }

        ContentProviderRegistry.refreshAllContentProviders();
        return true;
    }

    private static final String TOPIC_NAME_INPUT = "topicName";
    private static final String DISPLAY_NAME_INPUT = "displayName";

    private static final String DISPLAY_NAME_ATTRIBUTE = "DisplayName";

    /**
     * Synchronous validator for topic names.
     */
    private static class TopicNameValidator implements InputValidator {

        public static TopicNameValidator INSTANCE = new TopicNameValidator();

        /** {@inheritDoc} */
        public IStatus validate(final Object value) {
            String topicName = (String) value;

            if (topicName == null || topicName.length() == 0) {
                return ValidationStatus.error("Please enter a topic name");
            }

            if (topicName.length() > MAX_TOPIC_NAME_LENGTH) {
                return ValidationStatus
                        .error(String.format("Topic names may not exceed %d characters", MAX_TOPIC_NAME_LENGTH));
            }

            if (!TOPIC_NAME_PATTERN.matcher(topicName).matches()) {
                return ValidationStatus.error("Topic names may only contain letters, numbers, '-', " + "or '_'");
            }

            return ValidationStatus.ok();
        }

        /**
         * I'm stateless, use my singleton INSTANCE.
         */
        private TopicNameValidator() {
        }

        /**
         * Valid characters which can appear in a topic name, per
         * http://aws.amazon.com/sns/faqs/#10.
         */
        private static final Pattern TOPIC_NAME_PATTERN = Pattern.compile("[A-Za-z0-9-_]+");

        private static final int MAX_TOPIC_NAME_LENGTH = 256;
    }

    /**
     * Synchronous validator for display names.
     */
    private static class DisplayNameValidator implements InputValidator {

        public static DisplayNameValidator INSTANCE = new DisplayNameValidator();

        /** {@inheritDoc} */
        public IStatus validate(final Object value) {
            String displayName = (String) value;

            if (displayName == null || displayName.length() == 0) {
                // Display name is optional.
                return ValidationStatus.ok();
            }

            if (displayName.length() > MAX_DISPLAY_NAME_LENGTH) {
                return ValidationStatus.error(
                        String.format("Display names may not exceed %d characters", MAX_DISPLAY_NAME_LENGTH));
            }

            return ValidationStatus.ok();
        }

        private static final int MAX_DISPLAY_NAME_LENGTH = 100;
    }
}