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    *     http://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.mail.resolver;
18  
19  import org.apache.commons.mail.DataSourceResolver;
20  
21  import javax.activation.DataSource;
22  import java.io.IOException;
23  
24  /**
25   * A composite data source resolver. It allows to resolve data sources coming from
26   * multiple locations such as the classpath, the file system or an URL.
27   *
28   * @since 1.3
29   * @version $Id: DataSourceCompositeResolver.java 1420381 2012-12-11 20:18:05Z tn $
30   */
31  public class DataSourceCompositeResolver extends DataSourceBaseResolver
32  {
33      /** the list of resolvers */
34      private final DataSourceResolver[] dataSourceResolvers;
35  
36      /**
37       * Constructor.
38       *
39       * @param dataSourceResolvers a list of of resolvers being used
40       */
41      public DataSourceCompositeResolver(final DataSourceResolver[] dataSourceResolvers)
42      {
43          this.dataSourceResolvers = new DataSourceResolver[dataSourceResolvers.length];
44          System.arraycopy(dataSourceResolvers, 0, this.dataSourceResolvers, 0, dataSourceResolvers.length);
45      }
46  
47      /**
48       * Constructor.
49       *
50       * @param dataSourceResolvers a list of of resolvers being used
51       * @param isLenient shall we ignore resources not found or throw an exception?
52       */
53      public DataSourceCompositeResolver(final DataSourceResolver[] dataSourceResolvers, final boolean isLenient)
54      {
55          super(isLenient);
56          this.dataSourceResolvers = new DataSourceResolver[dataSourceResolvers.length];
57          System.arraycopy(dataSourceResolvers, 0, this.dataSourceResolvers, 0, dataSourceResolvers.length);
58      }
59  
60      /**
61       * Get the underlying data source resolvers.
62       *
63       * @return underlying data source resolvers
64       */
65      public DataSourceResolver[] getDataSourceResolvers()
66      {
67          // clone the internal array to prevent external modification (see EMAIL-116)
68          final DataSourceResolver[] resolvers = new DataSourceResolver[dataSourceResolvers.length];
69          System.arraycopy(dataSourceResolvers, 0, resolvers, 0, dataSourceResolvers.length);
70          return resolvers;
71      }
72  
73      /** {@inheritDoc} */
74      public DataSource resolve(String resourceLocation) throws IOException
75      {
76          DataSource result = resolve(resourceLocation, true);
77  
78          if (isLenient() || result != null)
79          {
80              return result;
81          }
82          else
83          {
84              throw new IOException("The following resource was not found : " + resourceLocation);
85          }
86  
87      }
88  
89      /** {@inheritDoc} */
90      public DataSource resolve(final String resourceLocation, final boolean isLenient) throws IOException
91      {
92          for (int i = 0; i < getDataSourceResolvers().length; i++)
93          {
94              DataSourceResolver dataSourceResolver = getDataSourceResolvers()[i];
95              DataSource dataSource = dataSourceResolver.resolve(resourceLocation, isLenient);
96  
97              if (dataSource != null)
98              {
99                  return dataSource;
100             }
101         }
102 
103         if (isLenient)
104         {
105             return null;
106         }
107         else
108         {
109             throw new IOException("The following resource was not found : " + resourceLocation);
110         }
111     }
112 }