View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *     https://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  package org.apache.commons.configuration2.io;
18  
19  import java.io.File;
20  import java.net.URL;
21  
22  import org.apache.commons.lang3.StringUtils;
23  
24  /**
25   * A specialized implementation of {@code FileLocationStrategy} which checks whether the provided file name is already
26   * an absolute file name.
27   * <p>
28   * This strategy ignores the URL and the base path stored in the passed in {@link FileLocator}. It is only triggered by
29   * absolute names in the locator's {@code fileName} component.
30   * </p>
31   * <p>
32   * See {@link AbstractFileLocationStrategy} learn how to grant an deny URL schemes and hosts.
33   * </p>
34   *
35   * @see AbstractFileLocationStrategy
36   * @since 2.0
37   */
38  public class AbsoluteNameLocationStrategy extends AbstractFileLocationStrategy {
39  
40      /**
41       * Builds new instances of {@link ProvidedURLLocationStrategy}.
42       *
43       * @return a new builder.
44       * @since 2.15.0
45       */
46      public static StrategyBuilder<AbsoluteNameLocationStrategy> builder() {
47          return new StrategyBuilder<>(AbsoluteNameLocationStrategy::new);
48      }
49  
50      /**
51       * Constructs a new instance where URL resources are bound by {@link AbstractFileLocationStrategy.AbstractBuilder}.
52       */
53      public AbsoluteNameLocationStrategy() {
54          // empty
55      }
56  
57      /**
58       * Constructs a new instance where URL resources are bound by {@link AbstractFileLocationStrategy.AbstractBuilder}.
59       *
60       * @param builder How to build the instance.
61       * @since 2.15.0
62       */
63      public AbsoluteNameLocationStrategy(final AbstractBuilder<?, ?> builder) {
64          super(builder);
65      }
66  
67      /**
68       * {@inheritDoc}
69       * <p>
70       * This implementation constructs a {@code File} object from the locator's file name (if defined). If this
71       * results in an absolute file name pointing to an existing file, the corresponding URL is returned.
72       * </p>
73       */
74      @Override
75      public URL locate(final FileSystem fileSystem, final FileLocator locator) {
76          if (StringUtils.isNotEmpty(locator.getFileName())) {
77              final File file = new File(locator.getFileName());
78              if (file.isAbsolute() && file.exists()) {
79                  return check(FileLocatorUtils.convertFileToURL(file));
80              }
81          }
82          return null;
83      }
84  }