/*******************************************************************************
 * Copyright (c) 2008, 2019 Mia-Software and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v2.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v20.html
 *
 * Contributors:
 *    Gabriel Barbier (Mia-Software) - initial API and implementation
 *******************************************************************************/

package org.eclipse.modisco.infra.common.core.internal.amwpropparser;

import java.util.ArrayList;
import java.util.List;

import org.xml.sax.Attributes;
import org.xml.sax.ContentHandler;
import org.xml.sax.Locator;
import org.xml.sax.SAXException;

/**
 * @author Gabriel Barbier
 *
 */
public class AmwPropContentHandler implements ContentHandler {

	public void characters(final char[] value, final int offset, final int count)
			throws SAXException {
		if (this.startModelPath) {
			String path = new String(value, offset, count);
			this.weavedModelsPaths.add(path);
		}
	}

	public void endDocument() throws SAXException {
		// Nothing
	}

	public void endElement(final String uri, final String localName, final String qName)
			throws SAXException {
		if (localName.equals(AmwPropContentHandler.MODEL_PATH)) {
			this.startModelPath = false;
		}
	}

	public void endPrefixMapping(final String arg0) throws SAXException {
		// Nothing
	}

	public void ignorableWhitespace(final char[] arg0, final int arg1, final int arg2)
			throws SAXException {
		// Nothing
	}

	public void processingInstruction(final String arg0, final String arg1) throws SAXException {
		// Nothing
	}

	public void setDocumentLocator(final Locator arg0) {
		// Nothing
	}

	public void skippedEntity(final String arg0) throws SAXException {
		// Nothing
	}

	public void startDocument() throws SAXException {
		// Nothing
	}

	public void startElement(final String uri, final String localName, final String qName,
			final Attributes attributes) throws SAXException {
		if (localName.equals(AmwPropContentHandler.MODEL_PATH)) {
			this.startModelPath = true;
		}
	}

	public void startPrefixMapping(final String arg0, final String arg1) {
		// Nothing
	}

	private boolean startModelPath = false;
	private static final String MODEL_PATH = "model-relative-path"; //$NON-NLS-1$
	private final List<String> weavedModelsPaths = new ArrayList<String>();

	public List<String> getWeavedModelsPaths() {
		return this.weavedModelsPaths;
	}
}
