Allow to conditionally bootstrap the default persistence unit
Closes #12662
This commit is contained in:
parent
c5d5659100
commit
c972ec4383
10 changed files with 120 additions and 2 deletions
|
@ -3,6 +3,7 @@ package org.keycloak.config;
|
|||
public enum OptionCategory {
|
||||
// ordered by name asc
|
||||
CLUSTERING("Cluster", 10),
|
||||
STORAGE("Storage", 15),
|
||||
DATABASE("Database", 20),
|
||||
TRANSACTION("Transaction",30),
|
||||
FEATURE("Feature", 40),
|
||||
|
|
|
@ -0,0 +1,29 @@
|
|||
/*
|
||||
* Copyright 2022 Red Hat, Inc. and/or its affiliates
|
||||
* and other contributors as indicated by the @author tags.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
package org.keycloak.config;
|
||||
|
||||
public class StorageOptions {
|
||||
|
||||
public static final Option<Boolean> DEFAULT_PERSISTENCE_UNIT_ENABLED = new OptionBuilder<>("storage-default-persistence-unit-enabled", Boolean.class)
|
||||
.category(OptionCategory.STORAGE)
|
||||
.defaultValue(true)
|
||||
.runtimes(Option.Runtime.OPERATOR)
|
||||
.buildTime(true)
|
||||
.build();
|
||||
|
||||
}
|
|
@ -58,7 +58,10 @@ public class JpaUtils {
|
|||
|
||||
public static EntityManagerFactory createEntityManagerFactory(KeycloakSession session, String unitName, Map<String, Object> properties, boolean jta) {
|
||||
PersistenceUnitTransactionType txType = jta ? PersistenceUnitTransactionType.JTA : PersistenceUnitTransactionType.RESOURCE_LOCAL;
|
||||
List<ParsedPersistenceXmlDescriptor> persistenceUnits = PersistenceXmlParser.locatePersistenceUnits(properties);
|
||||
List<ParsedPersistenceXmlDescriptor> persistenceUnits = new ArrayList<>(PersistenceXmlParser.locatePersistenceUnits(properties));
|
||||
|
||||
persistenceUnits.add(PersistenceXmlParser.locateIndividualPersistenceUnit(JpaUtils.class.getClassLoader().getResource("default-persistence.xml")));
|
||||
|
||||
for (ParsedPersistenceXmlDescriptor persistenceUnit : persistenceUnits) {
|
||||
if (persistenceUnit.getName().equals(unitName)) {
|
||||
List<Class<?>> providedEntities = getProvidedEntities(session);
|
||||
|
|
0
model/jpa/src/main/resources/META-INF/persistence.xml → model/jpa/src/main/resources/default-persistence.xml
Executable file → Normal file
0
model/jpa/src/main/resources/META-INF/persistence.xml → model/jpa/src/main/resources/default-persistence.xml
Executable file → Normal file
|
@ -0,0 +1,32 @@
|
|||
/*
|
||||
* Copyright 2022 Red Hat, Inc. and/or its affiliates
|
||||
* and other contributors as indicated by the @author tags.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
package org.keycloak.quarkus.deployment;
|
||||
|
||||
import static org.keycloak.quarkus.runtime.configuration.Configuration.getOptionalBooleanValue;
|
||||
|
||||
import java.util.function.BooleanSupplier;
|
||||
import org.keycloak.quarkus.runtime.Environment;
|
||||
|
||||
public class IsDefaultPersistenceUnitEnabled implements BooleanSupplier {
|
||||
|
||||
@Override
|
||||
public boolean getAsBoolean() {
|
||||
return getOptionalBooleanValue("kc.storage-default-persistence-unit-enabled").get();
|
||||
}
|
||||
|
||||
}
|
|
@ -79,6 +79,7 @@ import io.vertx.core.Handler;
|
|||
import io.vertx.ext.web.RoutingContext;
|
||||
import org.hibernate.cfg.AvailableSettings;
|
||||
import org.hibernate.jpa.boot.internal.ParsedPersistenceXmlDescriptor;
|
||||
import org.hibernate.jpa.boot.internal.PersistenceXmlParser;
|
||||
import org.jboss.jandex.AnnotationInstance;
|
||||
import org.jboss.jandex.AnnotationTarget;
|
||||
import org.jboss.jandex.DotName;
|
||||
|
@ -227,6 +228,14 @@ class KeycloakProcessor {
|
|||
}
|
||||
}
|
||||
|
||||
@BuildStep(onlyIf = IsDefaultPersistenceUnitEnabled.class)
|
||||
void produceDefaultPersistenceUnit(BuildProducer<PersistenceXmlDescriptorBuildItem> producer) {
|
||||
ParsedPersistenceXmlDescriptor descriptor = PersistenceXmlParser.locateIndividualPersistenceUnit(
|
||||
Thread.currentThread().getContextClassLoader().getResource("default-persistence.xml"));
|
||||
|
||||
producer.produce(new PersistenceXmlDescriptorBuildItem(descriptor));
|
||||
}
|
||||
|
||||
private void configureJpaProperties(ParsedPersistenceXmlDescriptor descriptor, HibernateOrmConfig config,
|
||||
List<JdbcDataSourceBuildItem> jdbcDataSources) {
|
||||
Properties unitProperties = descriptor.getProperties();
|
||||
|
|
|
@ -431,6 +431,10 @@ public final class Picocli {
|
|||
argGroupBuilder.addArg(optBuilder.build());
|
||||
}
|
||||
|
||||
if (argGroupBuilder.args().isEmpty()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
cSpec.addArgGroup(argGroupBuilder.build());
|
||||
}
|
||||
}
|
||||
|
|
|
@ -32,6 +32,7 @@ public final class PropertyMappers {
|
|||
MAPPERS.addAll(FeaturePropertyMappers.getMappers());
|
||||
MAPPERS.addAll(LoggingPropertyMappers.getMappers());
|
||||
MAPPERS.addAll(TransactionPropertyMappers.getTransactionPropertyMappers());
|
||||
MAPPERS.addAll(StoragePropertyMappers.getMappers());
|
||||
}
|
||||
|
||||
public static ConfigValue getValue(ConfigSourceInterceptorContext context, String name) {
|
||||
|
|
|
@ -0,0 +1,39 @@
|
|||
/*
|
||||
* Copyright 2022 Red Hat, Inc. and/or its affiliates
|
||||
* and other contributors as indicated by the @author tags.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
package org.keycloak.quarkus.runtime.configuration.mappers;
|
||||
|
||||
import static org.keycloak.quarkus.runtime.configuration.mappers.PropertyMapper.fromOption;
|
||||
|
||||
import org.keycloak.config.StorageOptions;
|
||||
import org.keycloak.quarkus.runtime.configuration.Configuration;
|
||||
|
||||
import io.smallrye.config.ConfigSourceInterceptorContext;
|
||||
|
||||
final class StoragePropertyMappers {
|
||||
|
||||
private StoragePropertyMappers(){}
|
||||
|
||||
public static PropertyMapper[] getMappers() {
|
||||
return new PropertyMapper[] {
|
||||
fromOption(StorageOptions.DEFAULT_PERSISTENCE_UNIT_ENABLED)
|
||||
.to("kc.spi-connections-jpa-quarkus-enabled")
|
||||
.paramLabel(Boolean.TRUE + "|" + Boolean.FALSE)
|
||||
.build()
|
||||
};
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue