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 org.apache.commons.discovery.ResourceNameDiscover;
020 import org.apache.commons.discovery.ResourceNameIterator;
021
022
023 /**
024 * Helper class for methods implementing the ResourceNameDiscover interface.
025 *
026 * @author Richard A. Sitze
027 */
028 public abstract class ResourceNameDiscoverImpl implements ResourceNameDiscover
029 {
030 /**
031 * Locate names of resources that are bound to <code>resourceName</code>.
032 *
033 * @return ResourceNameIterator
034 */
035 public abstract ResourceNameIterator findResourceNames(String resourceName);
036
037 /**
038 * Locate names of resources that are bound to <code>resourceName</code>.
039 *
040 * @return ResourceNameIterator
041 */
042 public ResourceNameIterator findResourceNames(final ResourceNameIterator inputNames) {
043 return new ResourceNameIterator() {
044 private ResourceNameIterator resourceNames = null;
045 private String resourceName = null;
046
047 public boolean hasNext() {
048 if (resourceName == null) {
049 resourceName = getNextResourceName();
050 }
051 return resourceName != null;
052 }
053
054 public String nextResourceName() {
055 String name = resourceName;
056 resourceName = null;
057 return name;
058 }
059
060 private String getNextResourceName() {
061 while (inputNames.hasNext() && (resourceNames == null || !resourceNames.hasNext())) {
062 resourceNames =
063 findResourceNames(inputNames.nextResourceName());
064 }
065
066 return (resourceNames != null && resourceNames.hasNext())
067 ? resourceNames.nextResourceName()
068 : null;
069 }
070 };
071 }
072 }