From ad16b7741dce6fb9c738c763e6f9fee2c4242f18 Mon Sep 17 00:00:00 2001 From: Sebastian Hofmann Date: Fri, 16 Feb 2024 16:03:34 +0100 Subject: [PATCH 1/3] MCR-3031 configure the database without persistence xml --- docker-entrypoint.sh | 112 ++++++++---------- .../resources/config/mir/mycore.properties | 2 +- .../java/org/mycore/mir/wizard/MIRWizard.java | 3 +- 3 files changed, 49 insertions(+), 68 deletions(-) diff --git a/docker-entrypoint.sh b/docker-entrypoint.sh index b00e194fd9..450b2eda40 100644 --- a/docker-entrypoint.sh +++ b/docker-entrypoint.sh @@ -4,21 +4,9 @@ set -e MCR_SAVE_DIR="${MCR_CONFIG_DIR}save/" MCR_CONFIG_DIR_ESCAPED=$(echo "$MCR_CONFIG_DIR" | sed 's/\//\\\//g') -MCR_DATA_DIR_ESCAPED=$(echo "$MCR_DATA_DIR" | sed 's/\//\\\//g') -MCR_SAVE_DIR_ESCAPED=$(echo "$MCR_SAVE_DIR" | sed 's/\//\\\//g') -MCR_LOG_DIR_ESCAPED=$(echo "$MCR_LOG_DIR" | sed 's/\//\\\//g') - -SOLR_URL_ESCAPED=$(echo "$SOLR_URL" | sed 's/\//\\\//g') -SOLR_CORE_ESCAPED=$(echo "$SOLR_CORE" | sed 's/\//\\\//g') -SOLR_CLASSIFICATION_CORE_ESCAPED=$(echo "$SOLR_CLASSIFICATION_CORE" | sed 's/\//\\\//g') - -JDBC_NAME_ESCAPED=$(echo "$JDBC_NAME" | sed 's/\//\\\//g') -JDBC_PASSWORD_ESCAPED=$(echo "$JDBC_PASSWORD" | sed 's/\//\\\//g') -JDBC_DRIVER_ESCAPED=$(echo "$JDBC_DRIVER" | sed 's/\//\\\//g') -JDBC_URL_ESCAPED=$(echo "$JDBC_URL" | sed 's/\//\\\//g') -HIBERNATE_SCHEMA_ESCAPED=$(echo "$JDBC_URL" | sed 's/\//\\\//g') MYCORE_PROPERTIES="${MCR_CONFIG_DIR}mycore.properties" + PERSISTENCE_XML="${MCR_CONFIG_DIR}resources/META-INF/persistence.xml" function fixDirectoryRights() { @@ -74,92 +62,77 @@ function migrateC3P0toHikari { rm "${MCR_CONFIG_DIR}lib/h2-1.4.200.jar" rm "${MCR_CONFIG_DIR}lib/mysql-connector-java-8.0.19.jar" - # delete old configuration and add new configuration - if grep -q "hibernate.c3p0" "${PERSISTENCE_XML}"; then - sed -ri "s/.*hibernate.c3p0.*//" "${PERSISTENCE_XML}" - sed -ri "s/()/\1org.hibernate.hikaricp.internal.HikariCPConnectionProvider\3/" "${PERSISTENCE_XML}" - sed -ri "s/(<\/properties>)/\n\n\n\n\n\n\1/" "${PERSISTENCE_XML}" - fi - - /opt/mir/mir/bin/mir.sh reload mappings in jpa configuration file else echo "No c3p0 driver found. Skip migration." fi } -function migrateJavaxPropertiesToJakarta() { - if grep -q "javax.persistence" "${PERSISTENCE_XML}"; then - echo "Migrate properties in persistence.xml from javax to jakarta" - sed -ri "s/()/\1jakarta.persistence\2/" "${PERSISTENCE_XML}" - fi - if grep -q "xmlns.jcp.org" "${PERSISTENCE_XML}"; then - echo "Migrate xmlns in persistence.xml from jcp.org to jakarta.ee" - sed -ri "s/xmlns=\".+persistence\"/xmlns=\"https:\/\/jakarta.ee\/xml\/ns\/persistence\"/" "${PERSISTENCE_XML}" - echo "Migrate schemaLocation in persistence.xml from jcp.org to jakarta.ee" - grep -ri "s/(xsi:schemaLocation=\").*jcp.org.*(\")/\1https:\/\/jakarta.ee\/xml\/ns\/persistence https:\/\/jakarta.ee\/xml\/ns\/persistence\/persistence_3_0.xsd\2/" "${PERSISTENCE_XML}" - fi - if grep -q "version=\"2" "${PERSISTENCE_XML}"; then - echo "Migrate version in persistence.xml from 2.* to 3.0" - sed -ri "s/version=\"2.*\"/version=\"3.0\"/" "${PERSISTENCE_XML}" - fi + +function setOrAddProperty() { + KEY=$1 + VALUE=$2 + + if grep -q "$KEY=" "${MYCORE_PROPERTIES}" ; then + ESCAPED_KEY=$(echo "${KEY}" | sed 's/\//\\\//g') + ESCAPED_VALUE=$(echo "${VALUE}" | sed 's/\//\\\//g') + sed -ri "s/($ESCAPED_KEY=).+/\1$ESCAPED_VALUE/" "${MYCORE_PROPERTIES}" + else + echo "$KEY=$VALUE">>"${MYCORE_PROPERTIES}" + fi } function setDockerValues() { echo "Set Docker Values to Config!" - migrateJavaxPropertiesToJakarta - if [ -n "${SOLR_URL}" ]; then - sed -ri "s/#?(MCR\.Solr\.ServerURL=).+/\1${SOLR_URL_ESCAPED}/" "${MYCORE_PROPERTIES}"; + setOrAddProperty "Solr.ServerURL" "${SOLR_URL}" fi if [ -n "${SOLR_CORE}" ]; then - sed -ri "s/#?(MCR\.Solr\.Core\.main\.Name=).+/\1${SOLR_CORE_ESCAPED}/" "${MYCORE_PROPERTIES}"; + setOrAddProperty "Solr.Core.main.Name" "${SOLR_CORE}" fi if [ -n "${SOLR_CLASSIFICATION_CORE}" ]; then - sed -ri "s/#?(MCR\.Solr\.Core\.classification\.Name=).+/\1${SOLR_CLASSIFICATION_CORE_ESCAPED}/" "${MYCORE_PROPERTIES}" + setOrAddProperty "Solr.Core.classification.Name" "${SOLR_CLASSIFICATION_CORE}" fi if [ -n "${JDBC_NAME}" ]; then - sed -ri "s/(name=\"jakarta.persistence.jdbc.user\" value=\").*(\")/\1${JDBC_NAME_ESCAPED}\2/" "${PERSISTENCE_XML}" + setOrAddProperty "MCR.JPA.User" "${JDBC_NAME}" fi if [ -n "${JDBC_PASSWORD}" ]; then - sed -ri "s/(name=\"jakarta.persistence.jdbc.password\" value=\").*(\")/\1${JDBC_PASSWORD_ESCAPED}\2/" "${PERSISTENCE_XML}" + setOrAddProperty "MCR.JPA.Password" "${JDBC_PASSWORD}" fi if [ -n "${JDBC_DRIVER}" ]; then - sed -ri "s/(name=\"jakarta.persistence.jdbc.driver\" value=\").*(\")/\1${JDBC_DRIVER_ESCAPED}\2/" "${PERSISTENCE_XML}" + setOrAddProperty "MCR.JPA.Driver" "${JDBC_DRIVER}" fi if [ -n "${JDBC_URL}" ]; then - sed -ri "s/(name=\"jakarta.persistence.jdbc.url\" value=\").*(\")/\1${JDBC_URL_ESCAPED}\2/" "${PERSISTENCE_XML}" + setOrAddProperty "MCR.JPA.URL" "${JDBC_URL}" fi - if [ -n "${SOLR_CLASSIFICATION_CORE}" ]; then - sed -ri "s/(name=\"hibernate.default_schema\" value=\").*(\")/\1${HIBERNATE_SCHEMA_ESCAPED}\2/" "${PERSISTENCE_XML}" + if [ -n "${HIBERNATE_SCHEMA}" ]; then + setOrAddProperty "MCR.JPA.DefaultSchema" "${HIBERNATE_SCHEMA}" fi - sed -ri "s/(name=\"hibernate.hbm2ddl.auto\" value=\").*(\")/\1update\2/" "${PERSISTENCE_XML}" + setOrAddProperty "MCR.JPA.Hbm2ddlAuto" "update" + setOrAddProperty "MCR.JPA.PersistenceUnit.mir.Class" "org.mycore.backend.jpa.MCRSimpleConfigPersistenceUnitDescriptor" + setOrAddProperty "MCR.JPA.PersistenceUnitName" "mir" - if grep -q "MCR.datadir=" "${MYCORE_PROPERTIES}" ; then - sed -ri "s/#?(MCR\.datadir=).+/\1${MCR_DATA_DIR_ESCAPED}/" "${MYCORE_PROPERTIES}" - else - echo "MCR.datadir=${MCR_DATA_DIR}">>"${MYCORE_PROPERTIES}" - fi + setOrAddProperty "MCR.datadir" "${MCR_DATA_DIR}" + setOrAddProperty "MCR.Solr.NestedDocuments" "true" + setOrAddProperty "MCR.Save.FileSystem" "${MCR_SAVE_DIR}" - if grep -q "MCR.Solr.NestedDocuments=" "${MYCORE_PROPERTIES}" ; then - sed -ri "s/#?(MCR\.Solr\.NestedDocuments=).+/\1true/" "${MYCORE_PROPERTIES}" - else - echo "MCR.Solr.NestedDocuments=true">>"${MYCORE_PROPERTIES}"; - fi + # s/(<\/properties>)/\n\n\n\n\n + setOrAddProperty "MCR.JPA.Connection.ProviderClass" "org.hibernate.hikaricp.internal.HikariCPConnectionProvider" + setOrAddProperty "MCR.JPA.Connection.MaximumPoolSize" "30" + setOrAddProperty "MCR.JPA.Connection.MinimumIdle" "2" + setOrAddProperty "MCR.JPA.Connection.IdleTimeout" "30000" + setOrAddProperty "MCR.JPA.Connection.MaxLifetime" "180000" + setOrAddProperty "MCR.JPA.Connection.LeakDetectionThreshold" "9000" + setOrAddProperty "MCR.JPA.Connection.RegisterMbeans" "true" - if grep -q "MCR.Save.FileSystem=" "${MYCORE_PROPERTIES}" ; then - sed -ri "s/#?(MCR\.Save\.FileSystem=).+/\1${MCR_SAVE_DIR_ESCAPED}/" "${MYCORE_PROPERTIES}" - else - echo "MCR.Save.FileSystem=${MCR_SAVE_DIR}">>"${MYCORE_PROPERTIES}" - fi migrateC3P0toHikari @@ -173,6 +146,17 @@ function setDockerValues() { mkdir -p "${MCR_CONFIG_DIR}lib" downloadDriver https://repo1.maven.org/maven2/com/zaxxer/HikariCP/5.1.0/HikariCP-5.1.0.jar + + # iterate over all environment variables starting with MCR.JPA. and add them to the mycore.properties + for var in $(env | grep -E "^MCR.JPA."); do + key=$(echo $var | cut -d'=' -f1 | sed 's/MCR.JPA.//g') + value=$(echo $var | cut -d'=' -f2) + complete_key="MCR.JPA.$key" + + setOrAddProperty "$complete_key" "$value" + done + + rm -f "${PERSISTENCE_XML}" } function setUpMyCoRe { @@ -180,8 +164,6 @@ function setUpMyCoRe { /opt/mir/mir/bin/mir.sh create configuration directory setDockerValues setupLog4jConfig - /opt/mir/mir/bin/mir.sh reload mappings in jpa configuration file - sed -ri "s/(<\/properties>)/\n\n\n\n\n\n\1/" "${MCR_CONFIG_DIR}resources/META-INF/persistence.xml" /opt/mir/mir/bin/setup.sh } diff --git a/mir-module/src/main/resources/config/mir/mycore.properties b/mir-module/src/main/resources/config/mir/mycore.properties index ae5d8f3618..2dfc03b4ca 100644 --- a/mir-module/src/main/resources/config/mir/mycore.properties +++ b/mir-module/src/main/resources/config/mir/mycore.properties @@ -111,7 +111,7 @@ MCR.ContentTransformer.mets-dfg.Stylesheet=xsl/mets/mets-dfg.xsl # Configure Hibernate Mappings # ############################################################################## MCR.Hibernate.Mappings=%MCR.Hibernate.Mappings%,org.mycore.mir.authorization.accesskeys.backend.MIRAccessKey,org.mycore.mir.authorization.accesskeys.backend.MIRAccessKeyPair - +MCR.JPA.MappingFileNames=%MCR.JPA.MappingFileNames%,META-INF/mir-module-mappings.xml ############################################################################# # HTMLEditor (for backwards compatibility) # diff --git a/mir-wizard/src/main/java/org/mycore/mir/wizard/MIRWizard.java b/mir-wizard/src/main/java/org/mycore/mir/wizard/MIRWizard.java index 3ddcc25363..7ba4cbf8a2 100644 --- a/mir-wizard/src/main/java/org/mycore/mir/wizard/MIRWizard.java +++ b/mir-wizard/src/main/java/org/mycore/mir/wizard/MIRWizard.java @@ -43,10 +43,9 @@ public class MIRWizard extends MCRServlet { public static boolean isNecessary() { File mcrProps = MCRConfigurationDir.getConfigFile("mycore.properties"); - File jpaCfg = MCRConfigurationDir.getConfigFile("resources/META-INF/persistence.xml"); - return (mcrProps == null || !mcrProps.canRead()) || (jpaCfg == null || !jpaCfg.canRead()); + return (mcrProps == null || !mcrProps.canRead()); } public Element doMagic(Element wizXML) { From 1802653522032c73063a82437540b26370767e82 Mon Sep 17 00:00:00 2001 From: Sebastian Hofmann Date: Wed, 28 Feb 2024 12:36:15 +0100 Subject: [PATCH 2/3] MCR-3031 fixed compile error and the wizard now uses properties instead of persistence.xml --- .env | 1 + .../mycore/mir/wizard/MIRWizardServlet.java | 4 +- .../command/MIRWizardGenerateJPAConfig.java | 120 +++++++++++++++--- .../command/MIRWizardGenerateProperties.java | 4 +- .../wizard/command/MIRWizardInitDatabase.java | 9 +- .../resources/setup/template-persistence.xml | 33 ----- 6 files changed, 112 insertions(+), 59 deletions(-) delete mode 100644 mir-wizard/src/main/resources/setup/template-persistence.xml diff --git a/.env b/.env index b69e5b734c..7be15b2867 100644 --- a/.env +++ b/.env @@ -14,6 +14,7 @@ MIR_DATA=./docker/mir-data/ MIR_LOGS=./docker/mir-logs/ MIR_XMX=1024m MIR_XMS=1024m +MIR_EXTRA_PROPERTIES= SOLR_HTTP=8290 SOLR_DATA=./docker/solr-data/ diff --git a/mir-wizard/src/main/java/org/mycore/mir/wizard/MIRWizardServlet.java b/mir-wizard/src/main/java/org/mycore/mir/wizard/MIRWizardServlet.java index 36de3e55a2..566c16c439 100644 --- a/mir-wizard/src/main/java/org/mycore/mir/wizard/MIRWizardServlet.java +++ b/mir-wizard/src/main/java/org/mycore/mir/wizard/MIRWizardServlet.java @@ -93,7 +93,7 @@ private Element getResult(MCRServletJob job) throws IOException { if (!MIRWizardRequestFilter.isAuthenticated(req)) { final String loginToken = wizXML.getChildTextTrim("login"); - String url = "wizard"; + String url = "wizard/"; if (loginToken != null && MIRWizardRequestFilter.getLoginToken(req).equals(loginToken)) { LOGGER.info("Authenticate with token \"" + loginToken + "\"..."); @@ -102,7 +102,7 @@ private Element getResult(MCRServletJob job) throws IOException { req.getScheme() + "://" + req.getServerName() + ":" + req.getServerPort()); } else { LOGGER.info("Redirect to login..."); - url += "/?action=login" + url += "?action=login" + (!MIRWizardRequestFilter.getLoginToken(req).equals(loginToken) ? "&token=invalid" : ""); // output login token again diff --git a/mir-wizard/src/main/java/org/mycore/mir/wizard/command/MIRWizardGenerateJPAConfig.java b/mir-wizard/src/main/java/org/mycore/mir/wizard/command/MIRWizardGenerateJPAConfig.java index d610d7acd3..c42a38ef49 100644 --- a/mir-wizard/src/main/java/org/mycore/mir/wizard/command/MIRWizardGenerateJPAConfig.java +++ b/mir-wizard/src/main/java/org/mycore/mir/wizard/command/MIRWizardGenerateJPAConfig.java @@ -23,52 +23,132 @@ package org.mycore.mir.wizard.command; import java.io.File; -import java.util.Optional; +import java.io.FileOutputStream; +import java.io.StringWriter; +import java.util.Objects; +import java.util.Properties; +import java.util.function.Predicate; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.jdom2.Element; +import org.mycore.backend.jpa.MCRPersistenceProvider; +import org.mycore.backend.jpa.MCRSimpleConfigPersistenceUnitDescriptor; +import org.mycore.common.config.MCRConfiguration2; import org.mycore.common.config.MCRConfigurationDir; import org.mycore.common.config.MCRConfigurationDirSetup; -import org.mycore.common.content.MCRContent; -import org.mycore.common.content.MCRJDOMContent; -import org.mycore.common.content.transformer.MCRXSLTransformer; import org.mycore.mir.wizard.MIRWizardCommand; +import jakarta.persistence.spi.PersistenceProviderResolverHolder; + public class MIRWizardGenerateJPAConfig extends MIRWizardCommand { private static final Logger LOGGER = LogManager.getLogger(); + public static final String PERSISTENCE_UNIT_NAME = MCRConfiguration2 + .getStringOrThrow("MCR.JPA.PersistenceUnitName"); + + private static final String COMPLEX_DATABASE_PREFIX + = MCRPersistenceProvider.JPA_PERSISTENCE_UNIT_PROPERTY_NAME + PERSISTENCE_UNIT_NAME + "."; + public MIRWizardGenerateJPAConfig() { - this("persistence.xml"); + this("persistence.properties"); } private MIRWizardGenerateJPAConfig(String name) { super(name); } + private static Properties getDefaultProps() { + Properties props = new Properties(); + + props.setProperty(COMPLEX_DATABASE_PREFIX + "Class", + MCRSimpleConfigPersistenceUnitDescriptor.class.getName()); + props.setProperty("MCR.JPA.Connection.MaximumPoolSize", "10"); + props.setProperty(COMPLEX_DATABASE_PREFIX + "Properties.hibernate.auto_quote_keyword", "true"); + + return props; + } + + private static Properties convertDatabaseElement(Element databaseElement) { + Properties props = getDefaultProps(); + if (databaseElement != null) { + String driver = databaseElement.getChildText("driver"); + + if (driver != null && !driver.isBlank()) { + if (driver.contains("mariadb") || driver.contains("mysql")) { + props.setProperty(COMPLEX_DATABASE_PREFIX + "Properties.hibernate.dialect.storage_engine", + "innodb"); + } + props.setProperty("MCR.JPA.Driver", driver); + } + + String url = databaseElement.getChildText("url"); + if (url != null && !url.isBlank()) { + props.setProperty("MCR.JPA.URL", url); + } + + String username = databaseElement.getChildText("username"); + if (username != null && !username.isBlank()) { + props.setProperty("MCR.JPA.User", username); + } + + String password = databaseElement.getChildText("password"); + if (password != null && !password.isBlank()) { + props.setProperty("MCR.JPA.Password", password); + } + + Element extraPropertiesElement = databaseElement.getChild("extra_properties"); + convertExtraPropertiesElement(extraPropertiesElement, props); + } + return props; + } + + private static void convertExtraPropertiesElement(Element extraPropertiesElement, Properties props) { + if (extraPropertiesElement != null) { + extraPropertiesElement.getChildren().stream() + .filter(element -> Objects.equals(element.getName(), "property") && + Objects.equals(element.getAttributeValue("name"), "schema")) + .map(Element::getText) + .filter(Predicate.not(String::isBlank)) + .findFirst() + .ifPresent(schema -> props.setProperty("MCR.JPA.DefaultSchema", schema)); + + extraPropertiesElement.getChildren().stream() + .filter(element -> Objects.equals(element.getName(), "property") && + Objects.equals(element.getAttributeValue("name"), "catalog")) + .map(Element::getText) + .filter(Predicate.not(String::isBlank)) + .findFirst() + .ifPresent(catalog -> props + .setProperty(COMPLEX_DATABASE_PREFIX + "Properties.hibernate.default_catalog", catalog)); + } + } + @Override public void doExecute() { - File resDir = new File(MCRConfigurationDir.getConfigurationDirectory(), "resources/META-INF"); try { - resDir.mkdirs(); - - File file = new File(resDir, "persistence.xml"); - this.result.setAttribute("file", file.getAbsolutePath()); - // set extra engine property for MariaDB and MySQL - Optional.ofNullable(getInputXML().getChild("database")) - .map(c -> c.getChildText("driver")).filter(d -> d.contains("mariadb") || d.contains("mysql")) - .ifPresent(s -> System.setProperty("hibernate.dialect.storage_engine", "innodb")); + Element xml = getInputXML(); + Element databaseElement = xml.getChild("database"); - MCRContent source = new MCRJDOMContent(getInputXML().clone()); - MCRXSLTransformer transformer = new MCRXSLTransformer("xsl/" + source.getDocType() + "-persistence.xsl"); - MCRContent pXML = transformer.transform(source); + Properties props = convertDatabaseElement(databaseElement); + MCRConfigurationDirSetup.loadExternalLibs(); - pXML.sendTo(file); + File file = MCRConfigurationDir.getConfigFile("mycore.properties"); + try (FileOutputStream out = new FileOutputStream(file, true)) { + props.store(out, "Generated by MIR Wizard."); + } + props.forEach((key, value) -> MCRConfiguration2.set(key.toString(), value.toString())); - MCRConfigurationDirSetup.loadExternalLibs(); + StringWriter stringWriter = new StringWriter(); + props.store(stringWriter, "Generated by MIR Wizard."); + String propertiesAsString = stringWriter.toString(); + + PersistenceProviderResolverHolder.getPersistenceProviderResolver() + .clearCachedProviders(); - this.result.setResult(pXML.asXML().getRootElement().clone()); + this.result.setResult(propertiesAsString); this.result.setSuccess(true); } catch (Exception ex) { LOGGER.error("Exception while generating JPA config.", ex); diff --git a/mir-wizard/src/main/java/org/mycore/mir/wizard/command/MIRWizardGenerateProperties.java b/mir-wizard/src/main/java/org/mycore/mir/wizard/command/MIRWizardGenerateProperties.java index 689ea2f404..3b19fcb045 100644 --- a/mir-wizard/src/main/java/org/mycore/mir/wizard/command/MIRWizardGenerateProperties.java +++ b/mir-wizard/src/main/java/org/mycore/mir/wizard/command/MIRWizardGenerateProperties.java @@ -65,7 +65,9 @@ public void doExecute() { MCRConfiguration2.set(name, value); } } - mcrProps.store(new FileOutputStream(file), "Generated by MIR Wizard."); + try(FileOutputStream out = new FileOutputStream(file)){ + mcrProps.store(out, "Generated by MIR Wizard."); + } Scanner scanner = new Scanner(file, StandardCharsets.ISO_8859_1.name()); this.result.setResult(scanner.useDelimiter("\\Z").next()); diff --git a/mir-wizard/src/main/java/org/mycore/mir/wizard/command/MIRWizardInitDatabase.java b/mir-wizard/src/main/java/org/mycore/mir/wizard/command/MIRWizardInitDatabase.java index 67f2b7a7ea..48e889f43c 100644 --- a/mir-wizard/src/main/java/org/mycore/mir/wizard/command/MIRWizardInitDatabase.java +++ b/mir-wizard/src/main/java/org/mycore/mir/wizard/command/MIRWizardInitDatabase.java @@ -33,6 +33,7 @@ import org.apache.logging.log4j.Logger; import org.mycore.backend.jpa.MCREntityManagerProvider; import org.mycore.backend.jpa.MCRJPABootstrapper; +import org.mycore.common.config.MCRConfiguration2; import org.mycore.mir.wizard.MIRWizardCommand; import jakarta.persistence.EntityManager; @@ -46,7 +47,9 @@ public class MIRWizardInitDatabase extends MIRWizardCommand { private static final Logger LOGGER = LogManager.getLogger(); private final static String ACTION = "create"; - + public static final String PERSISTENCE_UNIT_NAME = MCRConfiguration2 + .getStringOrThrow("MCR.JPA.PersistenceUnitName"); + public MIRWizardInitDatabase() { this("init.database"); } @@ -62,7 +65,7 @@ public void doExecute() { HashMap initProps = new HashMap(); initProps.put("hibernate.hbm2ddl.auto", "create"); - MCRJPABootstrapper.initializeJPA(MCRJPABootstrapper.PERSISTENCE_UNIT_NAME, initProps); + MCRJPABootstrapper.initializeJPA(PERSISTENCE_UNIT_NAME, initProps); doSchemaOperation(schema -> "create schema " + schema); @@ -71,7 +74,7 @@ public void doExecute() { try (StringWriter output = new StringWriter()) { schemaProperties.put("javax.persistence.schema-generation.scripts.action", ACTION); schemaProperties.put("javax.persistence.schema-generation.scripts." + ACTION + "-target", output); - Persistence.generateSchema(MCRJPABootstrapper.PERSISTENCE_UNIT_NAME, schemaProperties); + Persistence.generateSchema(PERSISTENCE_UNIT_NAME, schemaProperties); res.append(output.toString()); } diff --git a/mir-wizard/src/main/resources/setup/template-persistence.xml b/mir-wizard/src/main/resources/setup/template-persistence.xml deleted file mode 100644 index fd446cbe64..0000000000 --- a/mir-wizard/src/main/resources/setup/template-persistence.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - - META-INF/mycore-base-mappings.xml - META-INF/mycore-iview2-mappings.xml - META-INF/mycore-pi-mappings.xml - META-INF/mycore-user2-mappings.xml - META-INF/mycore-acl-mappings.xml - META-INF/mycore-jobqueue-mappings.xml - - META-INF/mir-module-mappings.xml - - - - - - - - - - - - - - - - - - - From 28383e1df4f5351d3c2f5ac0f5da1170860bd734 Mon Sep 17 00:00:00 2001 From: Sebastian Hofmann Date: Wed, 28 Feb 2024 12:37:09 +0100 Subject: [PATCH 3/3] MIR-1282 improve expandability of configuration of docker images --- README.md | 1 + docker-compose.prod.yml | 1 + docker-entrypoint.sh | 23 ++++++++++++----------- 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 33b041a3a5..6d155d56d1 100644 --- a/README.md +++ b/README.md @@ -62,6 +62,7 @@ The docker container has its own install script which uses the environment varia | XMS | 1g | The value of the -Xms parameter for Tomcat. | | FIX_FILE_SYSTEM_RIGHTS | false | If true the file system rights of the mounted volumes get corrected to be owned by the right user. | | MIR_OPTS | | Additional options which will be passed as JAVA_OPTS to the tomcat process | +| MIR_EXTRA_PROPERTIES | | A Path to a additional property file which will be included in to the default mycore.properties. | ### Mount Points diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml index 284297ee80..2df15980f5 100644 --- a/docker-compose.prod.yml +++ b/docker-compose.prod.yml @@ -37,6 +37,7 @@ services: - XMX=${MIR_XMX} - XMS=${MIR_XMS} - FIX_FILE_SYSTEM_RIGHTS=false + - EXTRA_PROPERTIES=${MIR_EXTRA_PROPERTIES} volumes: - ${MIR_HOME}:/mcr/home/ - ${MIR_DATA}:/mcr/data/ diff --git a/docker-entrypoint.sh b/docker-entrypoint.sh index 450b2eda40..1a257ef232 100644 --- a/docker-entrypoint.sh +++ b/docker-entrypoint.sh @@ -7,6 +7,8 @@ MCR_CONFIG_DIR_ESCAPED=$(echo "$MCR_CONFIG_DIR" | sed 's/\//\\\//g') MYCORE_PROPERTIES="${MCR_CONFIG_DIR}mycore.properties" +DOCKER_PROPERTIES="${MCR_CONFIG_DIR}docker.properties" + PERSISTENCE_XML="${MCR_CONFIG_DIR}resources/META-INF/persistence.xml" function fixDirectoryRights() { @@ -71,17 +73,19 @@ function migrateC3P0toHikari { function setOrAddProperty() { KEY=$1 VALUE=$2 + PROPERTIES_FILE=${3:-$DOCKER_PROPERTIES} - if grep -q "$KEY=" "${MYCORE_PROPERTIES}" ; then + if grep -q "$KEY=" "${PROPERTIES_FILE}" ; then ESCAPED_KEY=$(echo "${KEY}" | sed 's/\//\\\//g') ESCAPED_VALUE=$(echo "${VALUE}" | sed 's/\//\\\//g') - sed -ri "s/($ESCAPED_KEY=).+/\1$ESCAPED_VALUE/" "${MYCORE_PROPERTIES}" + sed -ri "s/($ESCAPED_KEY=).+/\1$ESCAPED_VALUE/" "${PROPERTIES_FILE}" else - echo "$KEY=$VALUE">>"${MYCORE_PROPERTIES}" + echo "$KEY=$VALUE">>"${PROPERTIES_FILE}" fi } function setDockerValues() { + rm -f "${DOCKER_PROPERTIES}" echo "Set Docker Values to Config!" if [ -n "${SOLR_URL}" ]; then @@ -147,14 +151,11 @@ function setDockerValues() { downloadDriver https://repo1.maven.org/maven2/com/zaxxer/HikariCP/5.1.0/HikariCP-5.1.0.jar - # iterate over all environment variables starting with MCR.JPA. and add them to the mycore.properties - for var in $(env | grep -E "^MCR.JPA."); do - key=$(echo $var | cut -d'=' -f1 | sed 's/MCR.JPA.//g') - value=$(echo $var | cut -d'=' -f2) - complete_key="MCR.JPA.$key" - - setOrAddProperty "$complete_key" "$value" - done + if [[ -z "${EXTRA_PROPERTIES}" ]]; then + setOrAddProperty "MCR.Configuration.Include" "${DOCKER_PROPERTIES}" "${MYCORE_PROPERTIES}" + else + setOrAddProperty "MCR.Configuration.Include" "${DOCKER_PROPERTIES} ${EXTRA_PROPERTIES}" "${MYCORE_PROPERTIES}" + fi rm -f "${PERSISTENCE_XML}" }