// ClassInfoNodeList.java

package parser.ServletParser.library;

import java.lang.*;

/** 이 클래스는 클래스 정보를 관리하는 ClassInfoNode 객체의 컨테이너 역할을 담당한다. 
 */
public final
class ClassInfoNodeList extends List 
{
	/** 버전 제어를 위한 시리얼 넘버이다.
	 */
	public static final long serialVersionUID = -1799582890646412574L;
	/** 생성자이다.
	 */
	public ClassInfoNodeList() {
		super();
	}
	/** 이 리스트의 마지막에 새로운 객체를 insert 하는 함수이다.
	 */
	public void insert(ClassInfoNode ptr) {
		if (inList(ptr.className())) return;
		super._insert((Object)ptr,0);
	}
	/** 이 리스트의 마지막에 새로운 객체를 insert 하는 함수이다.
	 * 리스트에 이미 객체가 있으면 insert 하지 않는다.
	 */
	public void insert(String ptr) {
		if (inList(ptr)) return;
		super._insert((Object)ptr,0);
	}
	/** 이 리스트에서 주어진 패키지 이름을 갖는 특정 클래스의 노드를 찾는 함수이다.
	 */
	public ClassInfoNode getClassInfoNode(String packName,String className) {
		Object obj = getFirst();
		while (obj != null) {
			if (obj.getClass().getName().equals("parser.ServletParser.library.ClassInfoNode")) {
				ClassInfoNode classNode = (ClassInfoNode)obj;
				if (classNode.packageName().compareTo(packName) == 0 &&
					classNode.className().compareTo(className) == 0) {
					return classNode;
				}
			}
			obj = getNext();
		}
		obj = getFirst();
		while (obj != null) {
			if (obj.getClass().getName().equals("parser.ServletParser.library.ClassInfoNode")) {
				ClassInfoNode classNode = (ClassInfoNode)obj;
				// 최악의 경우 클래스 이름만 같더라도 인정
				if (classNode.className().compareTo(className) == 0) {
					return classNode;
				}
			}
			obj = getNext();
		}
		return null;
	}
	/** 이 리스트에서 특정 클래스의 노드를 찾는 함수이다.
	 */
	public ClassInfoNode getClassInfoNode(String className) {
		Object obj = getFirst();
		while (obj != null) {
			if (obj.getClass().getName().equals("parser.ServletParser.library.ClassInfoNode")) {
				ClassInfoNode classNode = (ClassInfoNode)obj;
				if (classNode.className().compareTo(className) == 0) {
					return classNode;
				}
			}
			obj = getNext();
		}
		return null;
	}
	/** 이 리스트에 스트링 객체가 존재하는지 확인하는 함수이다.
	 */
	public boolean inList(String name) {
		Object obj = getFirst();
		while (obj != null) {
			if (obj.getClass().getName().equals("java.lang.String")) {
				if (((String)obj).compareTo(name) == 0) {
					return true;
				}
			} else if (obj.getClass().getName().equals("parser.ServletParser.library.ClassInfoNode")) {
				if (((ClassInfoNode)obj).className().compareTo(name) == 0) {
					return true;
				}
			} else {
				System.out.println("Something wrong in ClassInfoNodeList.inList().");
			}
			obj = getNext();
		}
		return false;
	}
	/** 리스트의 포인터를 변경하는 함수이다. from은 실제로 스트링이고 to는 ClassInfoNode이다.
	 */
	public void replaceStringToNodeRef(Object from,Object to) {
		_replacePtr(from,to);
	}
	/** 이 리스트를 비우는 함수이다.
	 */
	public void clear() {
		super._clear();
	}
	/** 리스트의 객체들을 traverse 할 때 맨 첫번째 객체를 찾아오는 함수이다.
	 * 만약 리스트가 비어있게되면 null 값을 리턴한다.
	 * 이 함수 사용 시에는 type checking이 필요하다.
	 */
	public Object getFirst() {
		return super._getFirst();
	}
	/** 리스트의 객체들을 반대 방향으로 traverse 하기위해 맨 마지막 객체를 찾아오는 함수이다.
	 * 만약 리스트가 비어있게되면 null 값을 리턴한다.
	 * 이 함수 사용 시에는 type checking이 필요하다.
	 */
	public Object getLast() {
		return super._getLast();
	}
	/** 리스트의 객체들을 traverse 할 때 다음 객체를 찾아오는 함수이다.
	 * 만약 리스트의 끝에 도달하면 null 값을 리턴한다.
	 * 이 함수 사용 시에는 type checking이 필요하다.
	 */
	public Object getNext() {
		return super._getNext();
	}
	/** 리스트의 객체들을 반대 방향으로 traverse 할 때 다음 객체를 찾아오는 함수이다.
	 * 만약 리스트의 앞에 도달하면 null 값을 리턴한다.
	 * 이 함수 사용 시에는 type checking이 필요하다.
	 */
	public Object getPrevious() {
		return super._getPrevious();
	}
}
