ClassLoaderResourceLoader.java revision 56ed4167b942ec265f9cee70ac4d71d10b3835ce
191bca4244286fb519c93fe92329da96b0e6f32eejvr/*
291bca4244286fb519c93fe92329da96b0e6f32eejvr * Copyright (C) 2010 Google Inc.
305b4b4a27160e90307372f85dd99be69a9d972ffjvr *
41ae29591efbb29492ce05378909ccf4028d7c1eeBehdad Esfahbod * Licensed under the Apache License, Version 2.0 (the "License");
530e691edd056ba22fa8970280e986747817bec3dBehdad Esfahbod * you may not use this file except in compliance with the License.
605b4b4a27160e90307372f85dd99be69a9d972ffjvr * You may obtain a copy of the License at
710de259aec75d3ac0c34b444b2f0423fa86a7709jvr *
891bca4244286fb519c93fe92329da96b0e6f32eejvr * http://www.apache.org/licenses/LICENSE-2.0
991bca4244286fb519c93fe92329da96b0e6f32eejvr *
1091bca4244286fb519c93fe92329da96b0e6f32eejvr * Unless required by applicable law or agreed to in writing, software
1191bca4244286fb519c93fe92329da96b0e6f32eejvr * distributed under the License is distributed on an "AS IS" BASIS,
1291bca4244286fb519c93fe92329da96b0e6f32eejvr * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1391bca4244286fb519c93fe92329da96b0e6f32eejvr * See the License for the specific language governing permissions and
1491bca4244286fb519c93fe92329da96b0e6f32eejvr * limitations under the License.
1591bca4244286fb519c93fe92329da96b0e6f32eejvr */
1691bca4244286fb519c93fe92329da96b0e6f32eejvr
1710de259aec75d3ac0c34b444b2f0423fa86a7709jvrpackage com.google.clearsilver.jsilver.resourceloader;
1805b4b4a27160e90307372f85dd99be69a9d972ffjvr
1905b4b4a27160e90307372f85dd99be69a9d972ffjvrimport com.google.clearsilver.jsilver.exceptions.JSilverTemplateNotFoundException;
2005b4b4a27160e90307372f85dd99be69a9d972ffjvr
21c53569efef1db3270a39ed2ecea89c54d05fc1b7jvrimport java.io.File;
22c53569efef1db3270a39ed2ecea89c54d05fc1b7jvrimport java.io.IOException;
2305b4b4a27160e90307372f85dd99be69a9d972ffjvrimport java.io.InputStream;
2405b4b4a27160e90307372f85dd99be69a9d972ffjvrimport java.io.InputStreamReader;
2591bca4244286fb519c93fe92329da96b0e6f32eejvrimport java.io.Reader;
2691bca4244286fb519c93fe92329da96b0e6f32eejvr
2791bca4244286fb519c93fe92329da96b0e6f32eejvr/**
2891bca4244286fb519c93fe92329da96b0e6f32eejvr * Loads resources from classpath.
2991bca4244286fb519c93fe92329da96b0e6f32eejvr *
3091bca4244286fb519c93fe92329da96b0e6f32eejvr * <p>
3191bca4244286fb519c93fe92329da96b0e6f32eejvr * For example, suppose the classpath contains:
3291bca4244286fb519c93fe92329da96b0e6f32eejvr *
3391bca4244286fb519c93fe92329da96b0e6f32eejvr * <pre>
3491bca4244286fb519c93fe92329da96b0e6f32eejvr * com/foo/my-template.cs
3591bca4244286fb519c93fe92329da96b0e6f32eejvr * com/foo/subdir/another-template.cs
3691bca4244286fb519c93fe92329da96b0e6f32eejvr * </pre>
3791bca4244286fb519c93fe92329da96b0e6f32eejvr *
3891bca4244286fb519c93fe92329da96b0e6f32eejvr * <p>
3991bca4244286fb519c93fe92329da96b0e6f32eejvr * You can access the resources like this:
4091bca4244286fb519c93fe92329da96b0e6f32eejvr *
4191bca4244286fb519c93fe92329da96b0e6f32eejvr * <pre>
4291bca4244286fb519c93fe92329da96b0e6f32eejvr * ResourceLoader loader =
4305b4b4a27160e90307372f85dd99be69a9d972ffjvr *     new ClassPathResourceLoader(getClassLoader(), "com/foo");
4405b4b4a27160e90307372f85dd99be69a9d972ffjvr * loader.open("my-template.cs");
4505b4b4a27160e90307372f85dd99be69a9d972ffjvr * loader.open("subdir/my-template.cs");
4691bca4244286fb519c93fe92329da96b0e6f32eejvr * </pre>
4791bca4244286fb519c93fe92329da96b0e6f32eejvr *
4891bca4244286fb519c93fe92329da96b0e6f32eejvr * @see ResourceLoader
4991bca4244286fb519c93fe92329da96b0e6f32eejvr * @see ClassResourceLoader
5091bca4244286fb519c93fe92329da96b0e6f32eejvr */
5191bca4244286fb519c93fe92329da96b0e6f32eejvrpublic class ClassLoaderResourceLoader extends BufferedResourceLoader {
5291bca4244286fb519c93fe92329da96b0e6f32eejvr
5391bca4244286fb519c93fe92329da96b0e6f32eejvr  private final ClassLoader classLoader;
5491bca4244286fb519c93fe92329da96b0e6f32eejvr  private String basePath;
5591bca4244286fb519c93fe92329da96b0e6f32eejvr
5691bca4244286fb519c93fe92329da96b0e6f32eejvr  public ClassLoaderResourceLoader(ClassLoader classLoader, String basePath) {
5791bca4244286fb519c93fe92329da96b0e6f32eejvr    this.classLoader = classLoader;
5891bca4244286fb519c93fe92329da96b0e6f32eejvr    this.basePath = basePath;
5991bca4244286fb519c93fe92329da96b0e6f32eejvr  }
6091bca4244286fb519c93fe92329da96b0e6f32eejvr
6191bca4244286fb519c93fe92329da96b0e6f32eejvr  public ClassLoaderResourceLoader(ClassLoader classLoader) {
6291bca4244286fb519c93fe92329da96b0e6f32eejvr    this(classLoader, ".");
6391bca4244286fb519c93fe92329da96b0e6f32eejvr  }
6491bca4244286fb519c93fe92329da96b0e6f32eejvr
6591bca4244286fb519c93fe92329da96b0e6f32eejvr  @Override
6691bca4244286fb519c93fe92329da96b0e6f32eejvr  public Reader open(String name) throws IOException {
6791bca4244286fb519c93fe92329da96b0e6f32eejvr    String path = basePath + '/' + name;
6805b4b4a27160e90307372f85dd99be69a9d972ffjvr    InputStream stream = classLoader.getResourceAsStream(path);
6905b4b4a27160e90307372f85dd99be69a9d972ffjvr    return stream == null ? null : buffer(new InputStreamReader(stream, getCharacterSet()));
7005b4b4a27160e90307372f85dd99be69a9d972ffjvr  }
7191bca4244286fb519c93fe92329da96b0e6f32eejvr
7291bca4244286fb519c93fe92329da96b0e6f32eejvr  @Override
7391bca4244286fb519c93fe92329da96b0e6f32eejvr  public Reader openOrFail(String name) throws JSilverTemplateNotFoundException, IOException {
7491bca4244286fb519c93fe92329da96b0e6f32eejvr    Reader reader = open(name);
7591bca4244286fb519c93fe92329da96b0e6f32eejvr    if (reader == null) {
7691bca4244286fb519c93fe92329da96b0e6f32eejvr      throw new JSilverTemplateNotFoundException("No class loader resource '" + name + "' in '"
7791bca4244286fb519c93fe92329da96b0e6f32eejvr          + basePath + "'");
7891bca4244286fb519c93fe92329da96b0e6f32eejvr    } else {
7991bca4244286fb519c93fe92329da96b0e6f32eejvr      return reader;
8091bca4244286fb519c93fe92329da96b0e6f32eejvr    }
8191bca4244286fb519c93fe92329da96b0e6f32eejvr  }
8291bca4244286fb519c93fe92329da96b0e6f32eejvr
8391bca4244286fb519c93fe92329da96b0e6f32eejvr}
8491bca4244286fb519c93fe92329da96b0e6f32eejvr