blob: 42de1b9bdf31242efeee959c0393d781002e0653 [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.xslt.deployment;
import java.io.IOException;
import java.net.URL;
import javax.xml.transform.Source;
import javax.xml.transform.stream.StreamSource;
import org.apache.camel.support.ResourceHelper;
import org.apache.camel.util.FileUtil;
import org.apache.camel.util.StringHelper;
public class BuildTimeUriResolver {
public ResolutionResult resolve(String templateUri) {
if (templateUri == null) {
throw new RuntimeException("href parameter cannot be null");
}
templateUri = templateUri.trim();
final String scheme = ResourceHelper.getScheme(templateUri);
final String effectiveScheme = scheme == null ? "classpath:" : scheme;
if (!"classpath:".equals(effectiveScheme)) {
throw new RuntimeException("URI scheme '" + effectiveScheme
+ "' not supported for build time compilation of XSL templates. Only 'classpath:' URIs are supported");
}
final String compacted = compact(templateUri, scheme);
final String transletName = toTransletName(compacted);
final URL url = Thread.currentThread().getContextClassLoader().getResource(compacted);
if (url == null) {
throw new IllegalStateException("Could not find the XSLT resource " + compacted + " in the classpath");
}
try {
final Source src = new StreamSource(url.openStream());
// TODO: if the XSLT file is under target/classes of the current project we should mark it for exclusion
// from the application archive. See https://github.com/apache/camel-quarkus/issues/438
return new ResolutionResult(templateUri, transletName, src);
} catch (IOException e) {
throw new RuntimeException("Could not read the class path resource " + templateUri, e);
}
}
private String toTransletName(final String compacted) {
final String fileName = FileUtil.stripPath(compacted);
final String name = FileUtil.stripExt(fileName, true);
return StringHelper.capitalize(name, true);
}
private static String compact(String href, String scheme) {
final String afterScheme = scheme != null ? StringHelper.after(href, scheme) : href;
final String compacted = FileUtil.compactPath(afterScheme, '/');
return compacted;
}
static final class ResolutionResult {
final String templateUri;
final String transletClassName;
final Source source;
public ResolutionResult(String templateUri, String transletClassName, Source source) {
this.templateUri = templateUri;
this.transletClassName = transletClassName;
this.source = source;
}
public UriResolverEntryBuildItem toBuildItem() {
return new UriResolverEntryBuildItem(templateUri, transletClassName);
}
}
}