JarEntry.java

package org.ferris.riviera.console.jar;

import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.validation.constraints.Max;
import javax.validation.constraints.Size;

/**
 *
 * @author Michael Remijan mjremijan@yahoo.com @mjremijan
 */
public class JarEntry extends java.util.jar.JarEntry implements Comparable<JarEntry> {

    protected static final Pattern pattern
        = Pattern.compile(
              // directory regex
              "^((\\d+\\.\\d+\\.\\d+)(?:\\s*-\\s*(\\S{1}.*))?)"
              // directory separator
            + "\\/"
              // file regex
            + "((\\d+\\.\\d+\\.\\d+\\.\\d+)(?:\\s*-\\s*(\\S{1}.*))?.sql)$"
        );

    protected boolean matches;
    protected long appliedOn;

    @Max(value=99, message = "{JarEntry.major.Max.message}")
    protected Integer major;
    @Max(value=99, message = "{JarEntry.feature.Max.message}")
    protected Integer feature;
    @Max(value=99, message = "{JarEntry.bug.Max.message}")
    protected Integer bug;
    @Max(value=999, message = "{JarEntry.build.Max.message}")
    protected Integer build;
    @Size(min = 0, max = 50, message = "{JarEntry.title.Size.message}")
    protected String title;
    @Size(min = 1, max = 100, message = "{JarEntry.fileName.Size.message}")
    protected String fileName;
    @Size(min = 0, max = 50, message = "{JarEntry.fileDescription.Size.message}")
    protected String fileDescription;


    /**
     * "1.0.0 - abc_zyz 123.789 - cool/1.0.0.1 - description.sql"
     * @param name Fully qualified name of the entry inside the jar file
     */
    public JarEntry(String name) {

        super(name);

        Matcher m = pattern.matcher(name);
        matches = m.matches();

        if (matches) {
            //"1.0.0 - abc_zyz 123.789 - cool/1.0.0.1 - description.sql"
            //"1.0.0"
            String[] releaseVersionTokens
                = m.group(2).split("\\.");
            Integer releaseMajor = Integer.valueOf(releaseVersionTokens[0]);
            Integer releaseFeature = Integer.valueOf(releaseVersionTokens[1]);
            Integer releaseBug = Integer.valueOf(releaseVersionTokens[2]);

            title = m.group(3);
            fileName = m.group(4);
            fileDescription = m.group(6);

            String[] fileVersionTokens
                = m.group(5).split("\\.");

            major = Integer.valueOf(fileVersionTokens[0]);
            feature = Integer.valueOf(fileVersionTokens[1]);
            bug = Integer.valueOf(fileVersionTokens[2]);
            build = Integer.valueOf(fileVersionTokens[3]);

            if (
                !major.equals(releaseMajor)
                ||
                !feature.equals(releaseFeature)
                ||
                !bug.equals(releaseBug)
            ) {
                throw new RuntimeException(
                    String.format(
                        "Script file version does not match directory version \"%s\""
                        , m.group(0)
                    )
                );
            }
        }
    }

    public boolean matches() {
        return matches;
    }

    public String getReleaseVersion() {
        return String.format("%d.%d.%d",
            major,
            feature,
            bug
        );
    }

    public String getReleaseTitle() {
        return title;
    }

    public Integer getMajor() {
        return major;
    }

    public Integer getFeature() {
        return feature;
    }

    public Integer getBug() {
        return bug;
    }

    public Integer getBuild() {
        return build;
    }

    public String getFileName() {
        return fileName;
    }

    public String getFileDescription() {
        return fileDescription;
    }

    public String getVersion() {
        return String.format("%d.%d.%d.%d",
            major,
            feature,
            bug,
            build
        );
    }

    @Override
    public int compareTo(JarEntry other) {

        int retval;

        if (this.major.compareTo(other.major) < 0) {
            retval = -1;
        } else if (this.major.compareTo(other.major) > 0) {
            retval = 1;
        } else {
            if (this.feature.compareTo(other.feature) < 0) {
                retval = -1;
            } else if (this.feature.compareTo(other.feature) > 0) {
                retval = 1;
            } else {
                if (this.bug.compareTo(other.bug) < 0) {
                    retval = -1;
                } else if (this.bug.compareTo(other.bug) > 0) {
                    retval = 1;
                } else {
                    if (this.build.compareTo(other.build) < 0) {
                        retval = -1;
                    } else if (this.build.compareTo(other.build) > 0) {
                        retval = 1;
                    } else {
                        retval = 0;
                    }
                }
            }
        }

        return retval;
    }

    public void setAppliedOn(long currentTimeMillis) {
        this.appliedOn = currentTimeMillis;
    }

    public long getAppliedOn() {
        return this.appliedOn;
    }
}