From 3f05cc0b8b7fe4b4b883896eb7cd621aced907cb Mon Sep 17 00:00:00 2001 From: daquino Date: Thu, 25 Jun 2015 19:14:04 -0500 Subject: [PATCH] First commit for Liquifier, the Liquibase change log converter. --- .gitignore | 4 ++ build.gradle | 35 ++++++++++++ settings.gradle | 2 + src/main/java/com/refactify/Liquify.java | 55 +++++++++++++++++++ .../arguments/ConversionArguments.java | 42 ++++++++++++++ .../arguments/ConversionArgumentsParser.java | 28 ++++++++++ .../com/refactify/printer/UsagePrinter.java | 15 +++++ src/main/shell/liquify | 2 + 8 files changed, 183 insertions(+) create mode 100644 .gitignore create mode 100644 build.gradle create mode 100644 settings.gradle create mode 100644 src/main/java/com/refactify/Liquify.java create mode 100644 src/main/java/com/refactify/arguments/ConversionArguments.java create mode 100644 src/main/java/com/refactify/arguments/ConversionArgumentsParser.java create mode 100644 src/main/java/com/refactify/printer/UsagePrinter.java create mode 100644 src/main/shell/liquify diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1827ef2 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +*.iml +build +.gradle +.idea diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..a9dee92 --- /dev/null +++ b/build.gradle @@ -0,0 +1,35 @@ +plugins { + id 'com.github.johnrengelman.shadow' version '1.2.1' +} + +group 'com.refactify' +version '1.0-SNAPSHOT' + +apply plugin: 'java' + +sourceCompatibility = 1.6 + +repositories { + mavenLocal() + mavenCentral() +} + +shadowJar { + manifest { + attributes 'Main-Class': 'com.refactify.Liquify' + } +} + +dependencies { + testCompile group: 'junit', name: 'junit', version: '4.11' + compile "org.liquibase:liquibase-core:3.4.0" + compile "org.yaml:snakeyaml:1.13" +} + +task dist(dependsOn: ['clean', 'shadowJar'], type: Copy) { + from 'src/main/shell/' + from ('build/libs/') { + rename 'liquify(.*).jar', 'liquify.jar' + } + into 'build/dist/' +} \ No newline at end of file diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..d73c153 --- /dev/null +++ b/settings.gradle @@ -0,0 +1,2 @@ +rootProject.name = 'liquify' + diff --git a/src/main/java/com/refactify/Liquify.java b/src/main/java/com/refactify/Liquify.java new file mode 100644 index 0000000..047a916 --- /dev/null +++ b/src/main/java/com/refactify/Liquify.java @@ -0,0 +1,55 @@ +package com.refactify; + +import com.refactify.arguments.ConversionArguments; +import com.refactify.arguments.ConversionArgumentsParser; +import com.refactify.printer.UsagePrinter; +import liquibase.changelog.ChangeSet; +import liquibase.changelog.DatabaseChangeLog; +import liquibase.exception.LiquibaseException; +import liquibase.parser.ChangeLogParser; +import liquibase.parser.ChangeLogParserFactory; +import liquibase.resource.FileSystemResourceAccessor; +import liquibase.resource.ResourceAccessor; +import liquibase.serializer.ChangeLogSerializer; +import liquibase.serializer.ChangeLogSerializerFactory; + +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; + +public class Liquify { + private final static ConversionArgumentsParser parser = new ConversionArgumentsParser(); + private final static UsagePrinter usagePrinter = new UsagePrinter(); + public static void main(final String[] args) { + ConversionArguments conversionArguments = parser.parseArguments(args); + + if(conversionArguments.areValid()) { + convertDatabaseChangeLog(conversionArguments); + } + else { + usagePrinter.printUsage(); + } + } + + private static void convertDatabaseChangeLog(final ConversionArguments conversionArguments) { + try { + ResourceAccessor resourceAccessor = new FileSystemResourceAccessor(System.getProperty("user.dir")); + ChangeLogParser parser = ChangeLogParserFactory.getInstance().getParser(conversionArguments.getSource(), resourceAccessor); + DatabaseChangeLog changeLog = parser.parse(conversionArguments.getSource(), null, resourceAccessor); + ChangeLogSerializer serializer = ChangeLogSerializerFactory.getInstance().getSerializer(conversionArguments.getDestination()); + for (ChangeSet set : changeLog.getChangeSets()) { + set.setFilePath(conversionArguments.getDestination()); + } + serializer.write(changeLog.getChangeSets(), new FileOutputStream(conversionArguments.getDestination())); + } + catch (LiquibaseException e) { + e.printStackTrace(); + } + catch (FileNotFoundException e) { + e.printStackTrace(); + } + catch (IOException e) { + e.printStackTrace(); + } + } +} diff --git a/src/main/java/com/refactify/arguments/ConversionArguments.java b/src/main/java/com/refactify/arguments/ConversionArguments.java new file mode 100644 index 0000000..1c13a95 --- /dev/null +++ b/src/main/java/com/refactify/arguments/ConversionArguments.java @@ -0,0 +1,42 @@ +package com.refactify.arguments; + +public class ConversionArguments { + private String source; + private String destination; + private static final String[] validFileExtensions = new String[] {"xml", "yaml", "json", "sql"}; + + public String getSource() { + return source; + } + + public void setSource(final String source) { + this.source = source; + } + + public String getDestination() { + return destination; + } + + public void setDestination(final String destination) { + this.destination = destination; + } + + public boolean areValid() { + return isValidPath(source) && isValidPath(destination); + } + + private boolean isValidPath(final String path) { + return path != null && hasValidExtension(path); + } + + private boolean hasValidExtension(final String path) { + boolean validExtension = false; + for(String fileExtension: validFileExtensions) { + if(path.endsWith(fileExtension)) { + validExtension = true; + break; + } + } + return validExtension; + } +} diff --git a/src/main/java/com/refactify/arguments/ConversionArgumentsParser.java b/src/main/java/com/refactify/arguments/ConversionArgumentsParser.java new file mode 100644 index 0000000..ea8a5fb --- /dev/null +++ b/src/main/java/com/refactify/arguments/ConversionArgumentsParser.java @@ -0,0 +1,28 @@ +package com.refactify.arguments; + +import java.util.ArrayList; +import java.util.List; + +public class ConversionArgumentsParser { + + public ConversionArguments parseArguments(String[] arguments) { + ConversionArguments conversionArguments = new ConversionArguments(); + try { + for (int i = 0; i < arguments.length; i++) { + String argument = arguments[i]; + if (argument.equals("-s") || argument.equals("--source")) { + String value = arguments[++i]; + conversionArguments.setSource(value); + } + else if (argument.equals("-d") || argument.equals("--dest")) { + String value = arguments[++i]; + conversionArguments.setDestination(value); + } + } + } + catch(ArrayIndexOutOfBoundsException exc) { + System.out.println("Invalid arguments."); + } + return conversionArguments; + } +} diff --git a/src/main/java/com/refactify/printer/UsagePrinter.java b/src/main/java/com/refactify/printer/UsagePrinter.java new file mode 100644 index 0000000..9d02e21 --- /dev/null +++ b/src/main/java/com/refactify/printer/UsagePrinter.java @@ -0,0 +1,15 @@ +package com.refactify.printer; + +public class UsagePrinter { + public void printUsage() { + System.out.println("Liquify can be use to convert Liquibase changelog " + + "files between the supported file formats: xml,yaml,json,sql."); + System.out.println("===================================="); + System.out.println("Usage: "); + System.out.println(" liquify -s -d "); + System.out.println(""); + System.out.println(" Options:"); + System.out.println(" -s,--source Database changelog source file."); + System.out.println(" -d,--dest Database changelog destination file."); + } +} diff --git a/src/main/shell/liquify b/src/main/shell/liquify new file mode 100644 index 0000000..ddaa1e7 --- /dev/null +++ b/src/main/shell/liquify @@ -0,0 +1,2 @@ +#!/bin/sh +java -jar liquify.jar "$@"