1 /*
2 * Copyright 2004-2008 the Seasar Foundation and the Others.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
13 * either express or implied. See the License for the specific language
14 * governing permissions and limitations under the License.
15 */
16 package org.seasar.uruma.util.resource;
17
18 import java.net.URL;
19 import java.util.ArrayList;
20 import java.util.List;
21
22 import org.seasar.uruma.util.resource.impl.FileResourceTraverser;
23
24 /**
25 * {@link ResourceTraverser} のためのファクトリクラスです。<br />
26 *
27 * @author y-komori
28 */
29 public class ResourceTraverserFactory {
30 private static final List<ResourceTraverser> traversers = new ArrayList<ResourceTraverser>();
31
32 static {
33 addResourceTraverser(new FileResourceTraverser());
34 }
35
36 private ResourceTraverserFactory() {
37
38 }
39
40 /**
41 * {@link ResourceTraverser} を登録します。<br />
42 * 同じプロトコルの {@link ResourceTraverser} が既に登録されている場合、上書きします。<br />
43 *
44 * @param traverser
45 * {@link ResourceTraverser}
46 */
47 public static void addResourceTraverser(final ResourceTraverser traverser) {
48 ResourceTraverser known = getResourceTraverser(traverser.getProtocol());
49 if (known != null) {
50 traversers.remove(known);
51 }
52 traversers.add(traverser);
53 }
54
55 /**
56 * 指定されたプロトコルに対応した {@link ResourceTraverser} を取得します。<br />
57 *
58 * @param protocol
59 * プロトコル
60 * @return {@link ResourceTraverser} オブジェクト。プロトコルに対応するものが存在しない場合は
61 * <code>null</code>。
62 */
63 public static ResourceTraverser getResourceTraverser(final String protocol) {
64 if (protocol == null) {
65 return null;
66 }
67 int size = traversers.size();
68 for (int i = 0; i < size; i++) {
69 ResourceTraverser traverser = traversers.get(i);
70 if (protocol.equals(traverser.getProtocol())) {
71 return traverser;
72 }
73 }
74 return null;
75 }
76
77 /**
78 * 指定された URL のプロトコルに対応した {@link ResourceTraverser} を取得します。<br />
79 *
80 * @param url
81 * URL
82 * @return {@link ResourceTraverser} オブジェクト。プロトコルに対応するものが存在しない場合は
83 * <code>null</code>。
84 */
85 public static ResourceTraverser getResourceTraverser(final URL url) {
86 if (url == null) {
87 return null;
88 } else {
89 return getResourceTraverser(url.getProtocol());
90 }
91 }
92 }