/*
 * XMLRulesLoader.java
 *
 * Created on 13 de marzo de 2007, 10:31 PM
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package com.fidufosyga.xml;

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

import org.xml.sax.Attributes;
import org.xml.sax.helpers.DefaultHandler;

import com.fidufosyga.context.Context;
import com.fidufosyga.exception.GeneralException;
import com.fidufosyga.model.ArchivoModel;
import com.fidufosyga.model.CampoValidaciones;
import com.fidufosyga.rules.Validable;

/**
 * 
 * @author Julian
 */
public class XMLRulesLoader extends DefaultHandler {

	private ArchivoModel archivo;

	/** Creates a new instance of XMLRulesLoader */
	public XMLRulesLoader() {
		archivo = new ArchivoModel();

	}

	public void startElement(String uri, String localName, String qName,
			Attributes atts) {
		manejarArhivo(localName, atts);
		manejarCampo(localName, atts);
		manejarValidacion(localName, atts);
	}

	public void endElement(String uri, String localName, String qName) {

	}

	public void characters(char[] chars, int start, int length) {

	}

	private void manejarArhivo(String localName, Attributes atts) {
		if (localName.equalsIgnoreCase("ARCHIVO")) {
			int length = atts.getLength();
			if (length > 0) {
				for (int i = 0; i < length; i++) {
					// System.out.println(" "+atts.getQName(i)+" =
					// "+atts.getValue(i));
					// JARB.04-07-20008. PRIMER RELEASE. INI
					if (atts.getQName(i).equalsIgnoreCase("version")) {
						archivo.setVersion(atts.getValue(i));
					}
					// JARB.04-07-20008. PRIMER RELEASE. FIN
					if (atts.getQName(i).equalsIgnoreCase("tipo")) {
						archivo.setTipoArchivo(atts.getValue(i));
					} else if (atts.getQName(i).equalsIgnoreCase("Campos")) {
						archivo.setLongitudCampos(new Integer(atts.getValue(i))
								.intValue());
					}
				}
			}
			Context ctx = Context.getContext();
			ctx.addAttribute(archivo.getTipoArchivo(), archivo);

		}
	}

	private void manejarCampo(String localName, Attributes atts) {
		if (localName.equalsIgnoreCase("Campo")) {
			CampoValidaciones campoNuevo = new CampoValidaciones();
			archivo.getCamposValidacion().add(campoNuevo);
			int length = atts.getLength();
			if (length > 0) {
				for (int i = 0; i < length; i++) {
					// System.out.println(" "+atts.getQName(i)+" =
					// "+atts.getValue(i));
					if (atts.getQName(i).equalsIgnoreCase("orden")) {
						campoNuevo.setNumeroCampo(new Integer(atts.getValue(i))
								.intValue());
					}
				}
			}

		}
	}

	@SuppressWarnings({ "rawtypes", "unchecked" })
	private void manejarValidacion(String localName, Attributes atts)
			throws GeneralException {
		if (localName.equalsIgnoreCase("validacion")) {
			CampoValidaciones campoActual = archivo.getCamposValidacion().get(
					archivo.getCamposValidacion().size() - 1);
			ArrayList<Validable> listaValidaciones = (ArrayList<Validable>) campoActual
					.getListaValidaciones();
			int length = atts.getLength();
			if (length > 0) {
				Validable val = null;
				String glosa = null;
				Object[] params = null;
				for (int i = 0; i < length; i++) {

					// System.out.println(" "+atts.getQName(i)+" =
					// "+atts.getValue(i));
					if (atts.getQName(i).equalsIgnoreCase("class")) {
						Class cl;
						try {
							cl = Class
									.forName("com.fidufosyga.rules."
											+ atts.getValue(i));
							java.lang.reflect.Constructor co;
							co = cl.getConstructor(new Class[0]);
							val = (Validable)co.newInstance();

						} catch (Exception e) {
							GeneralException ex = new GeneralException(
									"No se encuentra la regla "
											+ atts.getValue(i)
											+ " verifique la version de esta aplicación",
									e);
							ex.printStackTrace();
							throw ex;

						}
					} else if (atts.getQName(i).equalsIgnoreCase("glosa")) {
						glosa = new String(atts.getValue(i));
					} else if (atts.getQName(i).equalsIgnoreCase("params")) {
						if (atts.getValue(i).length() == 0) {
							params = new String[0];
						} else {
							ArrayList<String> listaString = new ArrayList<String>();
							StringTokenizer st = new StringTokenizer(
									atts.getValue(i), ",");
							while (st.hasMoreTokens()) {
								listaString.add(st.nextToken().replaceAll("#",
										","));
							}
							params = listaString.toArray();
						}

					}
				}
				val.setGlosa(glosa);
				val.setParams(params);
				listaValidaciones.add(val);
			}

		}
	}
}
