/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.apache.uima.aae.error;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class ErrorResultComponentPathImpl implements ErrorResultComponentPath {
  private static final long serialVersionUID = 100262915217554060L;

  private List pathList = new ArrayList();

  public void add(String aPath) {
    this.add(aPath, pathList.size());
  }

  public void add(String aPath, int anInsertPosition) {
    pathList.add(anInsertPosition, aPath);
  }

  public String get(int aPosition) {
    if (aPosition >= 0 && aPosition <= pathList.size()) {
      return (String) pathList.get(aPosition);
    }
    return null;
  }

  public Iterator iterator() {
    return pathList.iterator();
  }
}
