blob: 938699bd8a341ad22f3d3f706cc2b671d3fce5da [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.apache.camel.quarkus.component.dozer.deployment;
import java.io.File;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.sql.Time;
import java.sql.Timestamp;
import java.util.Calendar;
import java.util.Collections;
import java.util.Date;
import com.github.dozermapper.core.DozerBeanMapperBuilder;
import com.github.dozermapper.core.Mapper;
import com.sun.el.ExpressionFactoryImpl;
import io.quarkus.deployment.annotations.BuildProducer;
import io.quarkus.deployment.annotations.BuildStep;
import io.quarkus.deployment.annotations.ExecutionTime;
import io.quarkus.deployment.annotations.Record;
import io.quarkus.deployment.builditem.AdditionalApplicationArchiveMarkerBuildItem;
import io.quarkus.deployment.builditem.FeatureBuildItem;
import io.quarkus.deployment.builditem.nativeimage.NativeImageResourceBuildItem;
import io.quarkus.deployment.builditem.nativeimage.ReflectiveClassBuildItem;
import io.quarkus.jaxb.deployment.JaxbFileRootBuildItem;
import org.apache.camel.converter.dozer.DozerBeanMapperConfiguration;
import org.apache.camel.converter.dozer.DozerThreadContextClassLoader;
import org.apache.camel.quarkus.component.dozer.CamelDozerConfig;
import org.apache.camel.quarkus.component.dozer.CamelDozerRecorder;
import org.apache.camel.quarkus.core.deployment.CamelBeanBuildItem;
import org.apache.camel.quarkus.core.deployment.CamelContextBuildItem;
class DozerProcessor {
private static final String FEATURE = "camel-dozer";
@BuildStep
FeatureBuildItem feature() {
return new FeatureBuildItem(FEATURE);
}
@BuildStep
JaxbFileRootBuildItem dozerJaxbFileRoot() {
return new JaxbFileRootBuildItem("com/github/dozermapper/core/builder/model/jaxb");
}
@BuildStep
AdditionalApplicationArchiveMarkerBuildItem dozerArchiveMarker() {
return new AdditionalApplicationArchiveMarkerBuildItem("com/github/dozermapper/core");
}
@BuildStep(loadsApplicationClasses = true)
void configureCamelDozer(BuildProducer<ReflectiveClassBuildItem> reflectiveClass,
BuildProducer<NativeImageResourceBuildItem> nativeImage,
CamelDozerConfig camelDozerConfig) {
// Add user Dozer mapping files to the image
camelDozerConfig.mappingFiles.orElse(Collections.emptyList())
.stream()
.map(this::mappingPathToURI)
// No scheme means classpath URI
.filter(uri -> uri.getScheme() == null)
.map(uri -> new NativeImageResourceBuildItem(uri.getPath()))
.forEach(nativeImage::produce);
// Add Dozer DTD & XSD resources to the image
nativeImage.produce(new NativeImageResourceBuildItem(
"dtd/bean-mapping.dtd",
"dtd/bean-mapping-6.0.0.dtd",
"dtd/bean-mapping-6.2.0.dtd",
"schema/bean-mapping.xsd",
"schema/bean-mapping-6.0.0.xsd",
"schema/bean-mapping-6.2.0.xsd"));
reflectiveClass.produce(new ReflectiveClassBuildItem(false, false,
BigDecimal[].class,
BigInteger[].class,
Boolean[].class,
Byte[].class,
Calendar[].class,
Character[].class,
Class[].class,
Date[].class,
java.sql.Date[].class,
Double[].class,
File[].class,
Float[].class,
Integer[].class,
Long[].class,
Object[].class,
Short[].class,
String[].class,
Time[].class,
Timestamp[].class,
URL[].class,
DozerThreadContextClassLoader.class,
ExpressionFactoryImpl.class));
reflectiveClass.produce(
new ReflectiveClassBuildItem(false, false,
"com.sun.org.apache.xerces.internal.impl.dv.xs.SchemaDVFactoryImpl"));
reflectiveClass.produce(new ReflectiveClassBuildItem(
true,
false,
DozerBeanMapperConfiguration.class));
if (camelDozerConfig.mappingFiles.isPresent()) {
// Register for reflection any classes participating in Dozer mapping
Mapper mapper = DozerBeanMapperBuilder.create()
.withClassLoader(Thread.currentThread().getContextClassLoader())
.withMappingFiles(camelDozerConfig.mappingFiles.get())
.build();
mapper.getMappingMetadata()
.getClassMappings()
.stream()
.map(metadata -> new ReflectiveClassBuildItem(true, false, metadata.getSourceClassName(),
metadata.getDestinationClassName()))
.forEach(reflectiveClass::produce);
}
}
@Record(ExecutionTime.STATIC_INIT)
@BuildStep
CamelBeanBuildItem configureCamelDozerBeanMappings(CamelDozerConfig camelDozerConfig,
CamelDozerRecorder camelDozerRecorder) {
CamelBeanBuildItem camelBeanBuildItem = null;
if (camelDozerConfig.mappingFiles.isPresent()) {
// Bind DozerBeanMapperConfiguration to the Camel registry for the user provided Dozer mapping files
camelBeanBuildItem = new CamelBeanBuildItem(
"dozerBeanMappingConfiguration",
DozerBeanMapperConfiguration.class.getName(),
camelDozerRecorder.createDozerBeanMapperConfiguration(camelDozerConfig.mappingFiles.get()));
}
return camelBeanBuildItem;
}
@Record(ExecutionTime.STATIC_INIT)
@BuildStep
void configureDozerTypeConverterRegistry(CamelContextBuildItem camelContextBuildItem, CamelDozerConfig camelDozerConfig,
CamelDozerRecorder camelDozerRecorder) {
if (camelDozerConfig.typeConverterEnabled) {
camelDozerRecorder.initializeDozerTypeConverter(camelContextBuildItem.getCamelContext());
}
}
private URI mappingPathToURI(String mappingPath) {
try {
return new URI(mappingPath);
} catch (URISyntaxException e) {
throw new RuntimeException(e);
}
}
}