001 /*
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements. See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License. You may obtain a copy of the License at
008 *
009 * http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017 package org.apache.commons.discovery.resource.names;
018
019 import java.util.Dictionary;
020 import java.util.Hashtable;
021
022 import org.apache.commons.discovery.ResourceNameDiscover;
023 import org.apache.commons.discovery.ResourceNameIterator;
024 import org.apache.commons.discovery.log.DiscoveryLogFactory;
025 import org.apache.commons.logging.Log;
026
027
028 /**
029 * Recover resources from a Dictionary. This covers Properties as well,
030 * since <code>Properties extends Hashtable extends Dictionary</code>.
031 *
032 * The recovered value is expected to be either a <code>String</code>
033 * or a <code>String[]</code>.
034 *
035 * @author Richard A. Sitze
036 */
037 public class DiscoverNamesInDictionary
038 extends ResourceNameDiscoverImpl
039 implements ResourceNameDiscover
040 {
041 private static Log log = DiscoveryLogFactory.newLog(DiscoverNamesInDictionary.class);
042 public static void setLog(Log _log) {
043 log = _log;
044 }
045
046 private Dictionary dictionary;
047
048 /** Construct a new resource discoverer
049 */
050 public DiscoverNamesInDictionary() {
051 setDictionary(new Hashtable());
052 }
053
054 /** Construct a new resource discoverer
055 */
056 public DiscoverNamesInDictionary(Dictionary dictionary) {
057 setDictionary(dictionary);
058 }
059
060 protected Dictionary getDictionary() {
061 return dictionary;
062 }
063
064 /**
065 * Specify set of class loaders to be used in searching.
066 */
067 public void setDictionary(Dictionary table) {
068 this.dictionary = table;
069 }
070
071 public void addResource(String resourceName, String resource) {
072 dictionary.put(resourceName, resource);
073 }
074
075 public void addResource(String resourceName, String[] resources) {
076 dictionary.put(resourceName, resources);
077 }
078
079 /**
080 * @return Enumeration of ResourceInfo
081 */
082 public ResourceNameIterator findResourceNames(final String resourceName) {
083 if (log.isDebugEnabled())
084 log.debug("find: resourceName='" + resourceName + "'");
085
086 Object baseResource = dictionary.get(resourceName);
087
088 final String[] resources;
089 if (baseResource instanceof String) {
090 resources = new String[] { (String)baseResource };
091 } else if (baseResource instanceof String[]) {
092 resources = (String[])baseResource;
093 } else {
094 resources = null;
095 }
096
097 return new ResourceNameIterator() {
098 private int idx = 0;
099
100 public boolean hasNext() {
101 if (resources != null) {
102 while (idx < resources.length && resources[idx] == null) {
103 idx++;
104 }
105 return idx < resources.length;
106 }
107 return false;
108 }
109
110 public String nextResourceName() {
111 return hasNext() ? resources[idx++] : null;
112 }
113 };
114 }
115 }