View Javadoc
1   /*
2    * #%L
3    * settings4j
4    * ===============================================================
5    * Copyright (C) 2008 - 2015 Brabenetz Harald, Austria
6    * ===============================================================
7    * Licensed under the Apache License, Version 2.0 (the "License");
8    * you may not use this file except in compliance with the License.
9    * You may obtain a copy of the License at
10   * 
11   *      http://www.apache.org/licenses/LICENSE-2.0
12   * 
13   * Unless required by applicable law or agreed to in writing, software
14   * distributed under the License is distributed on an "AS IS" BASIS,
15   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16   * See the License for the specific language governing permissions and
17   * limitations under the License.
18   * #L%
19   */
20  package org.settings4j.connector;
21  
22  import java.nio.charset.Charset;
23  
24  import org.apache.commons.io.Charsets;
25  import org.settings4j.ContentResolver;
26  import org.settings4j.contentresolver.ClasspathContentResolver;
27  import org.settings4j.contentresolver.UnionContentResolver;
28  
29  /**
30   * Connector implementation to read Settings from the Classpath.
31   * <p>
32   * Default Charset "UTF-8" is used to read the content from Classpath.
33   * </p>
34   *
35   * @author Harald.Brabenetz
36   */
37  public class ClasspathConnector extends AbstractConnector {
38  
39      private final ClasspathContentResolver classpathContentResolver;
40      private UnionContentResolver unionContentResolver;
41      private Charset charset = Charsets.UTF_8;
42  
43      /** Default Constructor (e.g. use in settings4j.xml). */
44      public ClasspathConnector() {
45          this(new ClasspathContentResolver());
46      }
47  
48      /**
49       * protected Constructor for extensions and Unit-Tests.
50       *
51       * @param classpathContentResolver
52       *        {@link ClasspathContentResolver}
53       */
54      protected ClasspathConnector(final ClasspathContentResolver classpathContentResolver) {
55          super();
56          this.classpathContentResolver = classpathContentResolver;
57          this.unionContentResolver = new UnionContentResolver(this.classpathContentResolver);
58      }
59  
60      @Override
61      public byte[] getContent(final String key) {
62          return this.classpathContentResolver.getContent(key);
63      }
64  
65      @Override
66      public Object getObject(final String key) {
67          if (getObjectResolver() != null) {
68              return getObjectResolver().getObject(key, this.unionContentResolver);
69          }
70          // else
71          return null;
72  
73      }
74  
75      @Override
76      public String getString(final String key) {
77          final byte[] content = getContent(key);
78          if (content != null) {
79              return new String(this.classpathContentResolver.getContent(key), this.charset);
80          }
81          return null;
82      }
83  
84      public String getCharset() {
85          return this.charset.name();
86      }
87  
88      /**
89       * @param charset
90       *        a valid {@link Charset}
91       * @see Charset#isSupported(String)
92       */
93      public void setCharset(final String charset) {
94          this.charset = Charset.forName(charset);
95      }
96  
97      @Override
98      public void setContentResolver(final ContentResolver contentResolver) {
99          this.unionContentResolver = new UnionContentResolver(this.classpathContentResolver);
100         this.unionContentResolver.addContentResolver(contentResolver);
101     }
102 
103     @Override
104     protected ContentResolver getContentResolver() {
105         if (hasCustomContentResolver()) {
106             return this.unionContentResolver.getContentResolvers()[1];
107         }
108         return null;
109     }
110 
111     private boolean hasCustomContentResolver() {
112         return this.unionContentResolver.getContentResolvers().length > 1;
113     }
114 }