/*
 * Copyright 2008 Google Inc.
 * 
 * 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.google.gwt.user.tools.util;

import com.google.gwt.util.tools.ArgHandlerString;

import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;

/**
 * Parse the -addToClassPath argument. Appends a .jar or classpath to the
 * generated launch scripts.
 */
public class ArgHandlerAddToClassPath extends ArgHandlerString {
  private List<String> extraClassPathList = new ArrayList<String>();

  public List<String> getExtraClassPathList() {
    return extraClassPathList;
  }

  @Override
  public String getPurpose() {
    return "Adds extra elements to the class path.";
  }

  @Override
  public String getTag() {
    return "-addToClassPath";
  }

  @Override
  public String[] getTagArgs() {
    return new String[] {"classPathEntry"};
  }

  @Override
  public boolean setString(String str) {
    
    StringTokenizer st = new StringTokenizer(str, ",");
    while (st.hasMoreTokens()) {
      extraClassPathList.add(st.nextToken().trim());
    }
    return true;
  }
}
