forked from grails/grails-database-migration
-
Notifications
You must be signed in to change notification settings - Fork 0
/
DatabaseMigrationGrailsPlugin.groovy
139 lines (114 loc) · 5.1 KB
/
DatabaseMigrationGrailsPlugin.groovy
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
/* Copyright 2010-2013 SpringSource.
*
* 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.
*/
import grails.plugin.databasemigration.GormDatabaseSnapshotGenerator
import grails.plugin.databasemigration.GormDatabaseTypeConverter
import grails.plugin.databasemigration.GrailsChange
import grails.plugin.databasemigration.GrailsChangeLogParser
import grails.plugin.databasemigration.GrailsClassLoaderResourceAccessor
import grails.plugin.databasemigration.GrailsDiffStatusListener
import grails.plugin.databasemigration.GrailsPrecondition
import grails.plugin.databasemigration.MigrationRunner
import grails.plugin.databasemigration.MigrationUtils
import grails.plugin.databasemigration.MysqlAwareCreateTableGenerator
import grails.plugin.databasemigration.Slf4jLogger
import liquibase.change.ChangeFactory
import liquibase.database.typeconversion.TypeConverterFactory
import liquibase.logging.LogFactory
import liquibase.logging.Logger
import liquibase.parser.ChangeLogParserFactory
import liquibase.precondition.PreconditionFactory
import liquibase.resource.ClassLoaderResourceAccessor
import liquibase.resource.CompositeResourceAccessor
import liquibase.resource.FileSystemResourceAccessor
import liquibase.resource.ResourceAccessor
import liquibase.servicelocator.ServiceLocator
import liquibase.snapshot.DatabaseSnapshotGeneratorFactory
import liquibase.sqlgenerator.SqlGeneratorFactory
import liquibase.sqlgenerator.core.CreateTableGenerator
class DatabaseMigrationGrailsPlugin {
String grailsVersion = '2.3.0 > *'
String version = '1.4.1-SNAPSHOT'
String author = 'Burt Beckwith'
String authorEmail = 'burt@burtbeckwith.com'
String title = 'Grails Database Migration Plugin'
String description = 'Grails Database Migration Plugin'
String documentation = 'http://grails-plugins.github.io/grails-database-migration/'
List pluginExcludes = [
'grails-app/domain/**',
'docs/**',
'src/docs/**',
'src/groovy/grails/plugin/databasemigration/test/**'
]
String license = 'APACHE'
def organization = [name: 'Pivotal', url: 'http://www.gopivotal.com/oss']
def issueManagement = [system: 'JIRA', url: 'http://jira.grails.org/browse/GPDATABASEMIGRATION']
def scm = [url: 'https://github.com/grails-plugins/grails-database-migration']
def doWithSpring = {
MigrationUtils.application = application
ResourceAccessor classLoaderResourceAccessor = new ClassLoaderResourceAccessor()
if (application.warDeployed) {
migrationResourceAccessor(CompositeResourceAccessor, [new GrailsClassLoaderResourceAccessor(), classLoaderResourceAccessor])
}
else {
String changelogLocation = MigrationUtils.changelogLocation
String changelogLocationPath = new File(changelogLocation).path
migrationResourceAccessor(CompositeResourceAccessor, [new FileSystemResourceAccessor(changelogLocationPath), classLoaderResourceAccessor])
}
diffStatusListener(GrailsDiffStatusListener)
}
def doWithApplicationContext = { ctx ->
def conf = ctx.grailsApplication.config.grails.plugin.databasemigration
if (conf.databaseChangeLogTableName) {
System.setProperty 'liquibase.databaseChangeLogTableName', conf.databaseChangeLogTableName
}
if (conf.databaseChangeLogLockTableName) {
System.setProperty 'liquibase.databaseChangeLogLockTableName', conf.databaseChangeLogLockTableName
}
register ctx
fixLogging()
MigrationRunner.autoRun ctx.migrationCallbacks
}
private void register(ctx) {
// adds support for .groovy extension
ChangeLogParserFactory.instance.register new GrailsChangeLogParser(ctx)
// adds support for Groovy-based changes in DSL changelogs
ChangeFactory.instance.register GrailsChange
// adds support for Groovy-based preconditions in DSL changelogs
PreconditionFactory.instance.register GrailsPrecondition
// appends 'ENGINE=InnoDB' to 'create table ...' statements in MySQL if using InnoDB
SqlGeneratorFactory.instance.unregister CreateTableGenerator
SqlGeneratorFactory.instance.register new MysqlAwareCreateTableGenerator()
if (MigrationUtils.hibernateAvailable()) {
registerHibernate ctx
}
}
private void registerHibernate(ctx) {
// used by gorm-diff and generate-gorm-changelog
DatabaseSnapshotGeneratorFactory.instance.register new GormDatabaseSnapshotGenerator()
// fixes changelog errors generated from the GORM scripts
TypeConverterFactory.instance.register GormDatabaseTypeConverter
}
private void fixLogging() {
// ensure that classesBySuperclass is populated
LogFactory.getLogger 'NOT_A_REAL_LOGGER_NAME'
try {
// register the plugin's logger
ServiceLocator.instance.classesBySuperclass[Logger] << Slf4jLogger
}
catch (Throwable t) {
// ignored, fall back to default logging
}
}
}