+/*
+ * Copyright 2008 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.wamblee.system.core;
+
+import java.lang.reflect.Array;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * A set of interfaces that cannot be changed with useful added functionality.
+ *
+ * @author Erik Brakkee
+ *
+ * @param <T>
+ */
+public class ReadOnlyNamedInterfaces<T extends NamedInterface> implements Iterable<T> {
+
+ private Class<T> _type;
+ private List<T> _interfaces;
+
+ public ReadOnlyNamedInterfaces(Class<T> aType, List<T> aInterfaces) {
+ _type = aType;
+ _interfaces = Collections.unmodifiableList(aInterfaces);
+ }
+
+ /**
+ * @return Number of interfaces.
+ */
+ public int size() {
+ return _interfaces.size();
+ }
+
+ /**
+ * Gets the interface at a given index.
+ * @param aIndex Index of the interface to return.
+ * @return Interface.
+ */
+ public T get(int aIndex) {
+ return _interfaces.get(aIndex);
+ }
+
+ /**
+ * Gets the interface with a specific name.
+ * @param aName Interface name.
+ * @return Interface.
+ */
+ public T get(String aName) {
+ for (T intf: _interfaces) {
+ if ( intf.getName().equals(aName)) {
+ return intf;
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public Iterator<T> iterator() {
+ return _interfaces.iterator();
+ }
+
+ /**
+ * Converts the interfaces to an array.
+ * @return List of interfaces in an array.
+ */
+ public T[] toArray() {
+ T[] storage = (T[])Array.newInstance(_type, _interfaces.size());
+ return _interfaces.toArray(storage);
+ }
+}