content: /*
   * 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);
          }
  
      }
  
  }
  