/* * Copyright 2005 Philipp Erlacher * * 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.exolab.castor.xml.parsing; import java.util.Stack; import org.exolab.castor.xml.UnmarshalState; /** * This class helps to access a stack in that {@link UnmarshalState}s are stored. * * @author <a href="mailto:philipp DOT erlacher AT gmail DOT com">Philipp * Erlacher</a> * */ public class UnmarshalStateStack { /** * The stack to store {@link UnmarshalState}s. */ private Stack<UnmarshalState> _unmarshalStates = new Stack<UnmarshalState>(); /** * This index denotes the position of the parent state. */ private Integer parentStateIndex = null; /** * Peeks the stack for the top {@link UnmarshalState}, without removing * it. * * @return Top {@link UnmarshalState}, without removing it. */ public UnmarshalState getLastState() { return _unmarshalStates.peek(); } /** * Pops the top {@link UnmarshalState} off the stack. * * @return Top {@link UnmarshalState} instance, removing it from the stack as well. */ public UnmarshalState removeLastState() { return _unmarshalStates.pop(); } /** * Checks if the stack is empty. * * @return True if there is no element on the stack. */ public boolean isEmpty() { return _unmarshalStates.empty(); } /** * Pushes a {@link UnmarshalState} instance onto the stack- * * @param state The {@link UnmarshalState} instance to be pushed onto the stack. */ public void pushState(UnmarshalState state) { _unmarshalStates.push(state); } /** * Checks if there is a parent state on the stack. * * @return True of there's a parent state. */ public boolean hasAnotherParentState() { if (parentStateIndex == null) { parentStateIndex = _unmarshalStates.size() - 2; } return parentStateIndex >= 0; } /** * Removes a parent state from the stack. * * @return UnmarshalState that is a parent state */ public UnmarshalState removeParentState() { Integer tmpParentIndex = parentStateIndex; parentStateIndex--; return _unmarshalStates.elementAt(tmpParentIndex); } }