/*
 * 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.
 */
/*
 * $Id:  $
 */
package org.apache.xml.serializer.dom3;

import java.util.Vector;

//import org.apache.xerces.dom3.DOMStringList;
import org.w3c.dom.DOMStringList;

/**
 * This class implemets the DOM Level 3 Core interface DOMStringList.
 * 
 * @xsl.usage internal
 */
final class DOMStringListImpl implements DOMStringList {
    
    //A collection of DOMString values
    private Vector fStrings;
    
    /** 
     * Construct an empty list of DOMStringListImpl
     */ 
    DOMStringListImpl() {
        fStrings = new Vector();    
    }
    
    /** 
     * Construct an empty list of DOMStringListImpl
     */ 
    DOMStringListImpl(Vector params) {
        fStrings = params;    
    }
    
    /** 
     * Construct an empty list of DOMStringListImpl
     */ 
    DOMStringListImpl(String[] params ) {
        fStrings = new Vector();
        if (params != null) {
            for (int i=0; i < params.length; i++) {
                fStrings.add(params[i]);    
            }
        }
    }
    
    /**
     * @see org.apache.xerces.dom3.DOMStringList#item(int)
     */
    public String item(int index) {
        try {
            return (String) fStrings.elementAt(index);
        } catch (ArrayIndexOutOfBoundsException e) {
            return null;
        }
    }
    
    /**
     * @see org.apache.xerces.dom3.DOMStringList#getLength()
     */
    public int getLength() {
        return fStrings.size();
    }
    
    /**
     * @see org.apache.xerces.dom3.DOMStringList#contains(String)
     */
    public boolean contains(String param) {
        return fStrings.contains(param) ;
    }
    
    /**
     * DOM Internal:
     * Add a <code>DOMString</code> to the list.
     * 
     * @param domString A string to add to the list
     */
    public void add(String param) {
        fStrings.add(param);
    }
    
}
