Skip to content

Commit

Permalink
Merge branch 'master' into dependabot/maven/liquibase-dist/com.h2data…
Browse files Browse the repository at this point in the history
…base-h2-2.0.202
  • Loading branch information
nvoxland committed Dec 28, 2021
2 parents 9e426ee + efd286a commit 255780a
Show file tree
Hide file tree
Showing 9 changed files with 410 additions and 27 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/snyk.yml
Expand Up @@ -60,7 +60,7 @@ jobs:
SLACK_COLOR: ${{ job.status }} # or a specific color like 'good' or '#ff00ff'
SLACK_MESSAGE: "${{ github.job }}: ${{ job.status }} @here"
SLACK_USERNAME: "liquibot"
SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }}
SLACK_WEBHOOK: ${{ secrets.SNYK_LIQUIBASE_SLACK_WEBHOOK }}
MSG_MINIMAL: actions url
SLACK_ICON_EMOJI: ':liquibase:'
SLACK_LINK_NAMES: true
69 changes: 65 additions & 4 deletions liquibase-core/pom.xml
Expand Up @@ -57,13 +57,13 @@
<version>1.3</version>
<scope>test</scope>
</dependency>

<dependency>
<groupId>org.osgi</groupId>
<artifactId>org.osgi.core</artifactId>
<scope>provided</scope>
<version>4.3.1</version>
</dependency>
<version>5.0.0</version>
</dependency>

<dependency>
<groupId>org.springframework</groupId>
Expand Down Expand Up @@ -155,10 +155,11 @@
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<version>3.3.0</version>
<version>5.1.2</version>
<configuration>
<instructions>
<Bundle-SymbolicName>org.liquibase.core</Bundle-SymbolicName>
<Bundle-Activator>liquibase.osgi.Activator</Bundle-Activator>
<Import-Package>
javax.activation*;resolution:=optional,
javax.servlet.*;version="[2.6,4)";resolution:=optional,
Expand All @@ -167,6 +168,66 @@
org.yaml.snakeyaml.*,
*;resolution:=optional
</Import-Package>
<Provide-Capability>
osgi.serviceloader; osgi.serviceloader=liquibase.serializer.ChangeLogSerializer,
osgi.serviceloader; osgi.serviceloader=liquibase.parser.NamespaceDetails,
osgi.serviceloader; osgi.serviceloader=liquibase.database.Database,
osgi.serviceloader; osgi.serviceloader=liquibase.change.Change,
osgi.serviceloader; osgi.serviceloader=liquibase.database.DatabaseConnection,
osgi.serviceloader; osgi.serviceloader=liquibase.precondition.Precondition,
osgi.serviceloader; osgi.serviceloader=liquibase.serializer.SnapshotSerializer,
osgi.serviceloader; osgi.serviceloader=liquibase.configuration.AutoloadedConfigurations,
osgi.serviceloader; osgi.serviceloader=liquibase.diff.DiffGenerator,
osgi.serviceloader; osgi.serviceloader=liquibase.lockservice.LockService,
osgi.serviceloader; osgi.serviceloader=liquibase.changelog.ChangeLogHistoryService,
osgi.serviceloader; osgi.serviceloader=liquibase.datatype.LiquibaseDataType,
osgi.serviceloader; osgi.serviceloader=liquibase.configuration.ConfigurationValueProvider,
osgi.serviceloader; osgi.serviceloader=liquibase.logging.LogService,
osgi.serviceloader; osgi.serviceloader=liquibase.snapshot.SnapshotGenerator,
osgi.serviceloader; osgi.serviceloader=liquibase.parser.ChangeLogParser,
osgi.serviceloader; osgi.serviceloader=liquibase.servicelocator.ServiceLocator,
osgi.serviceloader; osgi.serviceloader=liquibase.diff.compare.DatabaseObjectComparator,
osgi.serviceloader; osgi.serviceloader=liquibase.command.LiquibaseCommand,
osgi.serviceloader; osgi.serviceloader=liquibase.license.LicenseService,
osgi.serviceloader; osgi.serviceloader=liquibase.diff.output.changelog.ChangeGenerator,
osgi.serviceloader; osgi.serviceloader=liquibase.executor.Executor,
osgi.serviceloader; osgi.serviceloader=liquibase.structure.DatabaseObject,
osgi.serviceloader; osgi.serviceloader=liquibase.parser.SnapshotParser,
osgi.serviceloader; osgi.serviceloader=liquibase.hub.HubService,
osgi.serviceloader; osgi.serviceloader=liquibase.command.CommandStep,
osgi.serviceloader; osgi.serviceloader=liquibase.sqlgenerator.SqlGenerator
</Provide-Capability>
<Require-Capability>
osgi.extender; filter:="(osgi.extender=osgi.serviceloader.registrar)",
osgi.extender; filter:="(osgi.extender=osgi.serviceloader.processor)",
osgi.serviceloader; filter:="(osgi.serviceloader=liquibase.serializer.ChangeLogSerializer)"; cardinality:=multiple,
osgi.serviceloader; filter:="(osgi.serviceloader=liquibase.parser.NamespaceDetails)"; cardinality:=multiple,
osgi.serviceloader; filter:="(osgi.serviceloader=liquibase.database.Database)"; cardinality:=multiple,
osgi.serviceloader; filter:="(osgi.serviceloader=liquibase.change.Change)"; cardinality:=multiple,
osgi.serviceloader; filter:="(osgi.serviceloader=liquibase.database.DatabaseConnection)"; cardinality:=multiple,
osgi.serviceloader; filter:="(osgi.serviceloader=liquibase.precondition.Precondition)"; cardinality:=multiple,
osgi.serviceloader; filter:="(osgi.serviceloader=liquibase.serializer.SnapshotSerializer)"; cardinality:=multiple,
osgi.serviceloader; filter:="(osgi.serviceloader=liquibase.configuration.AutoloadedConfigurations)"; cardinality:=multiple,
osgi.serviceloader; filter:="(osgi.serviceloader=liquibase.diff.DiffGenerator)"; cardinality:=multiple,
osgi.serviceloader; filter:="(osgi.serviceloader=liquibase.lockservice.LockService)"; cardinality:=multiple,
osgi.serviceloader; filter:="(osgi.serviceloader=liquibase.changelog.ChangeLogHistoryService)"; cardinality:=multiple,
osgi.serviceloader; filter:="(osgi.serviceloader=liquibase.datatype.LiquibaseDataType)"; cardinality:=multiple,
osgi.serviceloader; filter:="(osgi.serviceloader=liquibase.configuration.ConfigurationValueProvider)"; cardinality:=multiple,
osgi.serviceloader; filter:="(osgi.serviceloader=liquibase.logging.LogService)"; cardinality:=multiple,
osgi.serviceloader; filter:="(osgi.serviceloader=liquibase.snapshot.SnapshotGenerator)"; cardinality:=multiple,
osgi.serviceloader; filter:="(osgi.serviceloader=liquibase.parser.ChangeLogParser)"; cardinality:=multiple,
osgi.serviceloader; filter:="(osgi.serviceloader=liquibase.servicelocator.ServiceLocator)"; cardinality:=multiple,
osgi.serviceloader; filter:="(osgi.serviceloader=liquibase.diff.compare.DatabaseObjectComparator)"; cardinality:=multiple,
osgi.serviceloader; filter:="(osgi.serviceloader=liquibase.command.LiquibaseCommand)"; cardinality:=multiple,
osgi.serviceloader; filter:="(osgi.serviceloader=liquibase.license.LicenseService)"; cardinality:=multiple,
osgi.serviceloader; filter:="(osgi.serviceloader=liquibase.diff.output.changelog.ChangeGenerator)"; cardinality:=multiple,
osgi.serviceloader; filter:="(osgi.serviceloader=liquibase.executor.Executor)"; cardinality:=multiple,
osgi.serviceloader; filter:="(osgi.serviceloader=liquibase.structure.DatabaseObject)"; cardinality:=multiple,
osgi.serviceloader; filter:="(osgi.serviceloader=liquibase.parser.SnapshotParser)"; cardinality:=multiple,
osgi.serviceloader; filter:="(osgi.serviceloader=liquibase.hub.HubService)"; cardinality:=multiple,
osgi.serviceloader; filter:="(osgi.serviceloader=liquibase.command.CommandStep)"; cardinality:=multiple,
osgi.serviceloader; filter:="(osgi.serviceloader=liquibase.sqlgenerator.SqlGenerator)"; cardinality:=multiple
</Require-Capability>
</instructions>
</configuration>
<executions>
Expand Down
3 changes: 3 additions & 0 deletions liquibase-core/src/main/java/liquibase/Scope.java
Expand Up @@ -11,6 +11,7 @@
import liquibase.logging.Logger;
import liquibase.logging.core.JavaLogService;
import liquibase.logging.core.LogServiceFactory;
import liquibase.osgi.Activator;
import liquibase.resource.ClassLoaderResourceAccessor;
import liquibase.resource.ResourceAccessor;
import liquibase.servicelocator.ServiceLocator;
Expand Down Expand Up @@ -55,6 +56,7 @@ public enum Attr {
fileEncoding,
databaseChangeLog,
changeSet,
osgiPlatform
}

private static ScopeManager scopeManager;
Expand Down Expand Up @@ -95,6 +97,7 @@ public static Scope getCurrentScope() {
}

rootScope.values.put(Attr.serviceLocator.name(), serviceLocator);
rootScope.values.put(Attr.osgiPlatform.name(), Activator.OSGIContainerChecker.isOsgiPlatform());
}
return scopeManager.getCurrentScope();
}
Expand Down
Expand Up @@ -3,15 +3,19 @@
import liquibase.change.*;
import liquibase.database.Database;
import liquibase.database.core.DB2Database;
import liquibase.database.core.SQLiteDatabase;
import liquibase.database.core.PostgresDatabase;
import liquibase.database.core.SQLiteDatabase.AlterTableVisitor;
import liquibase.exception.DatabaseException;
import liquibase.datatype.DataTypeFactory;
import liquibase.datatype.LiquibaseDataType;
import liquibase.datatype.core.BooleanType;
import liquibase.statement.DatabaseFunction;
import liquibase.statement.SqlStatement;
import liquibase.statement.core.ReorganizeTableStatement;
import liquibase.statement.core.SetNullableStatement;
import liquibase.statement.core.UpdateStatement;
import liquibase.structure.core.Column;
import liquibase.structure.core.Index;
import liquibase.util.BooleanUtil;
import liquibase.util.StringUtil;

import java.util.ArrayList;
Expand Down Expand Up @@ -135,9 +139,41 @@ public void setConstraintName(String constraintName) {
public SqlStatement[] generateStatements(Database database) {
List<SqlStatement> statements = new ArrayList<>();

if (defaultNullValue != null) {
if (defaultNullValue != null && !defaultNullValue.equalsIgnoreCase("null")) {
final String columnDataType = this.getColumnDataType();

Object finalDefaultNullValue = defaultNullValue;
if (columnDataType != null) {
final LiquibaseDataType datatype = DataTypeFactory.getInstance().fromDescription(columnDataType, database);
if (datatype instanceof BooleanType) {
//need to detect a boolean or bit type and handle it correctly sometimes or it is not converted to the correct datatype
finalDefaultNullValue = datatype.objectToSql(finalDefaultNullValue, database);
if (finalDefaultNullValue.equals("0")) {
finalDefaultNullValue = 0;
} else if (finalDefaultNullValue.equals("1")) {
finalDefaultNullValue = 1;
}

if (columnDataType.toLowerCase().contains("bit")) {
if (BooleanUtil.parseBoolean(finalDefaultNullValue.toString())) {
finalDefaultNullValue = 1;
} else {
finalDefaultNullValue = 0;
}
}

if (database instanceof PostgresDatabase) {
if (finalDefaultNullValue.equals(0)) {
finalDefaultNullValue = new DatabaseFunction( "B'0'");
} else if (finalDefaultNullValue.equals(1)) {
finalDefaultNullValue = new DatabaseFunction( "B'1'");
}
}
}
}

statements.add(new UpdateStatement(getCatalogName(), getSchemaName(), getTableName())
.addNewColumnValue(getColumnName(), defaultNullValue)
.addNewColumnValue(getColumnName(), finalDefaultNullValue)
.setWhereClause(database.escapeObjectName(getColumnName(), Column.class) +
" IS NULL"));
}
Expand Down
Expand Up @@ -14,6 +14,7 @@
import liquibase.util.ObjectUtil;

import java.util.*;
import liquibase.util.OsgiUtil;

/**
* Adapts CustomChange implementations to the standard change system used by Liquibase.
Expand Down Expand Up @@ -69,16 +70,21 @@ public CustomChangeWrapper setClass(String className) throws CustomChangeExcepti
return this;
}
this.className = className;
try {
try {
Boolean osgiPlatform = Scope.getCurrentScope().get(Scope.Attr.osgiPlatform, Boolean.class);
if (Boolean.TRUE.equals(osgiPlatform)) {
customChange = (CustomChange)OsgiUtil.loadClass(className).getConstructor().newInstance();
} else {
try {
customChange = (CustomChange) Class.forName(className, true, Scope.getCurrentScope().getClassLoader()).getConstructor().newInstance();
} catch (ClassCastException e) { //fails in Ant in particular
try {
customChange = (CustomChange) Class.forName(className, true, Scope.getCurrentScope().getClassLoader()).getConstructor().newInstance();
} catch (ClassCastException e) { //fails in Ant in particular
try {
customChange = (CustomChange) Thread.currentThread().getContextClassLoader().loadClass(className).getConstructor().newInstance();
} catch (ClassNotFoundException e1) {
customChange = (CustomChange) Class.forName(className).getConstructor().newInstance();
}
customChange = (CustomChange) Thread.currentThread().getContextClassLoader().loadClass(className).getConstructor().newInstance();
} catch (ClassNotFoundException e1) {
customChange = (CustomChange) Class.forName(className).getConstructor().newInstance();
}
}
}
} catch (Exception e) {
throw new CustomChangeException(e);
}
Expand Down Expand Up @@ -316,7 +322,12 @@ public void customLoadLogic(ParsedNode parsedNode, ResourceAccessor resourceAcce

CustomChange customChange = null;
try {
customChange = (CustomChange) Class.forName(className, false, Scope.getCurrentScope().getClassLoader()).getConstructor().newInstance();
Boolean osgiPlatform = Scope.getCurrentScope().get(Scope.Attr.osgiPlatform, Boolean.class);
if (Boolean.TRUE.equals(osgiPlatform)) {
customChange = (CustomChange)OsgiUtil.loadClass(className).getConstructor().newInstance();
} else {
customChange = (CustomChange) Class.forName(className, false, Scope.getCurrentScope().getClassLoader()).getConstructor().newInstance();
}
} catch (Exception e) {
throw new UnexpectedLiquibaseException(e);
}
Expand Down
108 changes: 108 additions & 0 deletions liquibase-core/src/main/java/liquibase/osgi/Activator.java
@@ -0,0 +1,108 @@
package liquibase.osgi;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import liquibase.osgi.Activator.LiquibaseBundle;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.framework.BundleEvent;
import org.osgi.util.tracker.BundleTracker;
import org.osgi.util.tracker.BundleTrackerCustomizer;

public class Activator implements BundleActivator, BundleTrackerCustomizer<LiquibaseBundle> {

private static final String LIQUIBASE_CUSTOM_CHANGE_WRAPPER_PACKAGES = "Liquibase-Custom-Change-Packages";
private BundleTracker<LiquibaseBundle> bundleTracker;
private static final List<LiquibaseBundle> liquibaseBundles = new CopyOnWriteArrayList<>();

@Override
public void start(final BundleContext bc) throws Exception {
OSGIContainerChecker.osgiPlatform();
bundleTracker = new BundleTracker<>(bc, Bundle.ACTIVE, this);
bundleTracker.open();
}

@Override
public void stop(BundleContext context) throws Exception {
bundleTracker.close();
liquibaseBundles.clear();
}

public static List<LiquibaseBundle> getLiquibaseBundles() {
return Collections.unmodifiableList(liquibaseBundles);
}

@Override
public LiquibaseBundle addingBundle(Bundle bundle, BundleEvent event) {
if (bundle.getBundleId() == 0) {
return null;
}
String customWrapperPackages = (String) bundle.getHeaders().get(LIQUIBASE_CUSTOM_CHANGE_WRAPPER_PACKAGES);
if (customWrapperPackages != null) {
LiquibaseBundle lb = new LiquibaseBundle(bundle, customWrapperPackages);
liquibaseBundles.add(lb);
return lb;
}
return null;
}

@Override
public void modifiedBundle(Bundle bundle, BundleEvent event, LiquibaseBundle liquibaseBundle) {
// nothing to do
}

@Override
public void removedBundle(Bundle bundle, BundleEvent event, LiquibaseBundle liquibaseBundle) {
if (liquibaseBundle != null) {
liquibaseBundles.remove(liquibaseBundle);
}
}

public static class LiquibaseBundle {

private final Bundle bundle;
private final List<String> allowedPackages;

public LiquibaseBundle(Bundle bundle, String allowedPackages) {
if (bundle == null) {
throw new IllegalArgumentException("bundle cannot be empty");
}
if (allowedPackages == null || allowedPackages.isEmpty()) {
throw new IllegalArgumentException("packages cannot be empty");
}
this.bundle = bundle;
this.allowedPackages = Collections.unmodifiableList(Arrays.asList(allowedPackages.split(",")));
}

public Bundle getBundle() {
return bundle;
}

public boolean allowedAllPackages() {
return allowedPackages.size() == 1
&& "*".equals(allowedPackages.get(0));
}

public List<String> getAllowedPackages() {
return allowedPackages;
}

}

public static class OSGIContainerChecker {

private static volatile boolean osgiPlatform = false;

public static boolean isOsgiPlatform() {
return osgiPlatform;
}

static void osgiPlatform() {
osgiPlatform = true;
}
}

}

0 comments on commit 255780a

Please sign in to comment.