/*******************************************************************************
 * Copyright (c) 1998, 2008 IBM Corporation and Others
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *    Goh KONDOH - initial API and implementation
 *******************************************************************************/

package org.eclipse.actf.model.dom.sgml.util;

import java.net.URL;
import java.net.MalformedURLException;
import java.util.*;

import org.eclipse.actf.model.dom.sgml.errorhandler.IErrorHandler;

/**
 * For JDK1.2 or later
 */
public class ErrorHandlerTableImpl extends Hashtable<URL, IErrorHandler[]> implements
		IErrorHandlerTable {
	public ErrorHandlerTableImpl() {
		init();
	}

	private void init() {
		Properties prop = new Properties();
		try {
			prop.load(getClass()
					.getResourceAsStream("errorhandlers.properties"));
		} catch (Exception e) {
			e.printStackTrace();
		}
		for (Enumeration e = prop.keys(); e.hasMoreElements();) {
			String urlStr = (String) e.nextElement();
			URL url;
			try {
				url = new URL(urlStr);
			} catch (MalformedURLException ex) {
				ex.printStackTrace();
				continue;
			}
			put(url, createErrorHandlers((String) prop.get(urlStr)));
		}
	}

	private String errorHandlerNameArray[] = new String[128];

	private IErrorHandler[] createErrorHandlers(String errorHandlerNames) {
		int lastComma = 0;
		int errorHandlerNum = 0;
		for (int i = 0; i < errorHandlerNames.length(); i++) {
			if (errorHandlerNames.charAt(i) == ',') {
				errorHandlerNameArray[errorHandlerNum++] = errorHandlerNames
						.substring(lastComma, i);
				lastComma = i + 1;
			}
		}
		errorHandlerNameArray[errorHandlerNum++] = errorHandlerNames
				.substring(lastComma);

		IErrorHandler ret[] = new IErrorHandler[errorHandlerNum];
		for (int i = 0; i < errorHandlerNum; i++) {
			try {
				Class errorHandlerClass = Class
						.forName(errorHandlerNameArray[i]);
				ret[i] = (IErrorHandler) errorHandlerClass.newInstance();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return ret;
	}

	public IErrorHandler[] getErrorHandlers(URL url) {
		return (IErrorHandler[]) get(url);
	}
}
