view com.redhat.thermostat.tools.eclipse.plugin/src/com/redhat/thermostat/tools/eclipse/plugin/Validators.java @ 127:f64440e971ac

Validate thermostat versions in project wizard
author Omair Majid <omajid@redhat.com>
date Fri, 28 Mar 2014 12:52:27 -0400
parents a0c68ec37305
children 90f52517b764
line wrap: on
line source

package com.redhat.thermostat.tools.eclipse.plugin;

import java.util.Objects;

import org.eclipse.core.databinding.validation.IValidator;
import org.eclipse.core.databinding.validation.ValidationStatus;
import org.eclipse.core.runtime.IStatus;

public class Validators {

    public static class NonEmptyStringRequired implements IValidator {

        private String errorMessage;

        public NonEmptyStringRequired(String errorMessage) {
            this.errorMessage = errorMessage;
        }

        @Override
        public IStatus validate(Object value) {
            Objects.requireNonNull(value);

            if (!(value instanceof String)) {
                throw new AssertionError("Expected String, but got '" + value + "' (" + value.getClass() + ").");
            }
            String text = (String) value;
            if (text.trim().length() == 0) {
                return ValidationStatus.error(errorMessage);
            } else {
                return ValidationStatus.ok();
            }
        }
    }

    public static class PackageNameRequired implements IValidator {

        @Override
        public IStatus validate(Object value) {
            Objects.requireNonNull(value);
            if (!(value instanceof String)) {
                throw new AssertionError("Expected String, but got '" + value + "' (" + value.getClass() + ").");
            }
            String packageName = (String) value;
            if (packageName.length() == 0) {
                return ValidationStatus.error("Package name must be specified");
            }
            if (packageName.contains(" ")) {
                return ValidationStatus.error("Package name must be valid");
            }
            return ValidationStatus.ok();
        }
    }

    /** Validate maven's groupIds and artifactIds */
    public static class ValidIdRequired implements IValidator {

        private String idName;

        public ValidIdRequired(String idName) {
            this.idName = idName;
        }

        @Override
        public IStatus validate(Object value) {
            Objects.requireNonNull(value);
            if (!(value instanceof String)) {
                throw new AssertionError("Expected String, but got '" + value + "' (" + value.getClass() + ").");
            }
            String projectName = (String) value;
            if (projectName.length() == 0) {
                return ValidationStatus.error(idName + " must be specified");
            }
            if (projectName.replace('\\', '/').indexOf('/', 1) > 0) {
                return ValidationStatus.error(idName + " must be valid");
            }
            if (projectName.contains(" ")) {
                return ValidationStatus.error(idName + " must be valid");
            }
            return ValidationStatus.ok();
        }
    }

    /**
     * Matches SemVer and OSGi-style versions
     *
     * @see http://semver.org/
     * @see http://www.osgi.org/javadoc/r4v43/core/org/osgi/framework/Version.html
     */
    public static class VersionRequired implements IValidator {

        private String errorMessage;

        public VersionRequired(String errorMessage) {
            this.errorMessage = errorMessage;
        }

        @Override
        public IStatus validate(Object value) {
            Objects.requireNonNull(value);
            if (!(value instanceof String)) {
                throw new AssertionError("Expected String, but got '" + value + "' (" + value.getClass() + ").");
            }
            String version = (String) value;
            if (version.trim().length() == 0) {
                return ValidationStatus.error(errorMessage);
            }

            final int INDEX_NOT_FOUND = -1;

            String rest = version;
            int endIndex;
            String versionPart;

            /* major */
            endIndex = rest.indexOf('.');

            if (endIndex == INDEX_NOT_FOUND) {
                if (isValidVersion(rest)) {
                    return ValidationStatus.ok();
                } else {
                    return ValidationStatus.error(errorMessage);
                }
            }

            versionPart = rest.substring(0, endIndex);
            if (!isValidVersion(versionPart)) {
                return ValidationStatus.error(errorMessage);
            }

            rest = rest.substring(endIndex+1);

            /* minor */
            endIndex = rest.indexOf('.');

            if (endIndex == INDEX_NOT_FOUND) {
                if (isValidVersion(rest)) {
                    return ValidationStatus.ok();
                } else {
                    return ValidationStatus.error(errorMessage);
                }
            }

            versionPart = rest.substring(0, endIndex);
            if (!isValidVersion(versionPart)) {
                return ValidationStatus.error(errorMessage);
            }

            rest = rest.substring(endIndex+1);

            /* micro */
            int microEndIndexDot = rest.indexOf('.');
            int microEndIndexDash = rest.indexOf('-');

            if (microEndIndexDot == INDEX_NOT_FOUND && microEndIndexDash == INDEX_NOT_FOUND) {
                if (isValidVersion(rest)) {
                    return ValidationStatus.ok();
                } else {
                    return ValidationStatus.error(errorMessage);
                }
            }

            if (microEndIndexDot == INDEX_NOT_FOUND) {
                versionPart = rest.substring(0, microEndIndexDash);
            } else {
                versionPart = rest.substring(0, microEndIndexDot);
            }

            if (!isValidVersion(versionPart)) {
                return ValidationStatus.error(errorMessage);
            }

            rest = version.substring(endIndex+1);

            if (rest.length() == 0) {
                return ValidationStatus.error(errorMessage);
            }

            return ValidationStatus.ok();
        }

        private boolean isValidVersion(String part) {
            if (part.isEmpty()) {
                return false;
            }

            try {
                Integer.parseInt(part);
            } catch (NumberFormatException nfe) {
                return false;
            }
            return true;
        }
    }

}