001package ca.uhn.fhir.jpa.migrate.taskdef; 002 003/*- 004 * #%L 005 * HAPI FHIR Server - SQL Migration 006 * %% 007 * Copyright (C) 2014 - 2022 Smile CDR, Inc. 008 * %% 009 * Licensed under the Apache License, Version 2.0 (the "License"); 010 * you may not use this file except in compliance with the License. 011 * You may obtain a copy of the License at 012 * 013 * http://www.apache.org/licenses/LICENSE-2.0 014 * 015 * Unless required by applicable law or agreed to in writing, software 016 * distributed under the License is distributed on an "AS IS" BASIS, 017 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 018 * See the License for the specific language governing permissions and 019 * limitations under the License. 020 * #L% 021 */ 022 023import ca.uhn.fhir.jpa.migrate.DriverTypeEnum; 024import ca.uhn.fhir.jpa.migrate.JdbcUtils; 025import ca.uhn.fhir.jpa.migrate.tasks.api.ISchemaInitializationProvider; 026import org.apache.commons.lang3.builder.EqualsBuilder; 027import org.apache.commons.lang3.builder.HashCodeBuilder; 028import org.slf4j.Logger; 029import org.slf4j.LoggerFactory; 030 031import java.sql.SQLException; 032import java.util.List; 033import java.util.Set; 034 035public class InitializeSchemaTask extends BaseTask { 036 public static final String DESCRIPTION_PREFIX = "Initialize schema for "; 037 private static final Logger ourLog = LoggerFactory.getLogger(InitializeSchemaTask.class); 038 private final ISchemaInitializationProvider mySchemaInitializationProvider; 039 private boolean myInitializedSchema; 040 041 public InitializeSchemaTask(String theProductVersion, String theSchemaVersion, ISchemaInitializationProvider theSchemaInitializationProvider) { 042 super(theProductVersion, theSchemaVersion); 043 mySchemaInitializationProvider = theSchemaInitializationProvider; 044 setDescription(DESCRIPTION_PREFIX + mySchemaInitializationProvider.getSchemaDescription()); 045 } 046 047 @Override 048 public boolean isRunDuringSchemaInitialization() { 049 return true; 050 } 051 052 @Override 053 public void validate() { 054 // nothing 055 } 056 057 @Override 058 public void doExecute() throws SQLException { 059 DriverTypeEnum driverType = getDriverType(); 060 061 Set<String> tableNames = JdbcUtils.getTableNames(getConnectionProperties()); 062 String schemaExistsIndicatorTable = mySchemaInitializationProvider.getSchemaExistsIndicatorTable(); 063 if (tableNames.contains(schemaExistsIndicatorTable)) { 064 logInfo(ourLog, "The table {} already exists. Skipping schema initialization for {}", schemaExistsIndicatorTable, driverType); 065 return; 066 } 067 068 logInfo(ourLog, "Initializing {} schema for {}", driverType, mySchemaInitializationProvider.getSchemaDescription()); 069 070 List<String> sqlStatements = mySchemaInitializationProvider.getSqlStatements(driverType); 071 072 for (String nextSql : sqlStatements) { 073 executeSql(null, nextSql); 074 } 075 076 if (mySchemaInitializationProvider.canInitializeSchema()) { 077 myInitializedSchema = true; 078 } 079 080 logInfo(ourLog, "{} schema for {} initialized successfully", driverType, mySchemaInitializationProvider.getSchemaDescription()); 081 } 082 083 @Override 084 public boolean initializedSchema() { 085 return myInitializedSchema; 086 } 087 088 @Override 089 protected void generateEquals(EqualsBuilder theBuilder, BaseTask theOtherObject) { 090 InitializeSchemaTask otherObject = (InitializeSchemaTask) theOtherObject; 091 theBuilder.append(mySchemaInitializationProvider, otherObject.mySchemaInitializationProvider); 092 } 093 094 @Override 095 protected void generateHashCode(HashCodeBuilder theBuilder) { 096 theBuilder.append(mySchemaInitializationProvider); 097 } 098 099 public ISchemaInitializationProvider getSchemaInitializationProvider() { 100 return mySchemaInitializationProvider; 101 } 102}