/**
 *  ServingXML
 *  
 *  Copyright (C) 2006  Daniel Parker
 *    daniel.parker@servingxml.com 
 * 
 * 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 com.servingxml.util.xml;

import java.util.Set;
import java.util.HashSet;

import com.servingxml.util.Name;
import com.servingxml.util.PrefixMap;

/**
 * A <code>ParameterParser</code> parses a string for parameters
 *
 * 
 * @author  Daniel A. Parker
 */

public class ParameterParser {
  private final PrefixMap prefixMap;
  private final Set<Name> parameterNameSet = new HashSet<Name>();
  private final Set<String> parameterQnameSet = new HashSet<String>();

  public ParameterParser(PrefixMap prefixMap) {
    this.prefixMap = prefixMap;
  }

  public void parseParameters(String expression) {

    boolean noMoreParams = false;
    int index = 0;
    while (!noMoreParams) {
      index = expression.indexOf('$',index);
      if (index == -1) {
        noMoreParams = true;
        continue;
      }
      ++index;
      int beginIndex = index;
      if (!Character.isLetter(expression.charAt(index))) {
        continue;
      }
      ++index;

      boolean doneParam = false;
      while (!noMoreParams && !doneParam) {
        if (index >= expression.length()) {
          noMoreParams = true;
          continue;
        }
        char c = expression.charAt(index);
        if (!(Character.isLetterOrDigit(c) || c == '_' || c == '-' || c==':')) {
          doneParam = true;
          continue;
        }
        ++index;
      }
      int endIndex = index;
      String qname = expression.substring(beginIndex,endIndex);
      Name paramName = Name.createName(qname, prefixMap);
      parameterQnameSet.add(qname);
      parameterNameSet.add(paramName);
    }
  }

  public Name[] getNames() {
    Name[] names = new Name[parameterNameSet.size()];
    names = (Name[])parameterNameSet.toArray(names);
    return names;
  }

  public String[] getQnames() {
    String[] qNames = new String[parameterQnameSet.size()];
    qNames = (String[])parameterQnameSet.toArray(qNames);
    return qNames;
  }
}

