package bndtools.launch.sourcelookup.containers;

import org.eclipse.core.runtime.CoreException;
import org.eclipse.debug.core.sourcelookup.ISourceContainer;
import org.eclipse.debug.core.sourcelookup.ISourceContainerTypeDelegate;
import org.eclipse.debug.core.sourcelookup.containers.AbstractSourceContainerTypeDelegate;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.ServiceScope;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;

@Component(scope = ServiceScope.PROTOTYPE, service = ISourceContainerTypeDelegate.class)
public class BndDependencySourceContainerType extends AbstractSourceContainerTypeDelegate {

	private static final String ELEMENT_NAME = "bnd";

	/*
	 * (non-Javadoc)
	 * @see org.eclipse.debug.internal.core.sourcelookup.ISourceContainerType#
	 * getMemento
	 * (org.eclipse.debug.internal.core.sourcelookup.ISourceContainer)
	 */
	@Override
	public String getMemento(ISourceContainer container) throws CoreException {
		Document document = newDocument();
		Element element = document.createElement(ELEMENT_NAME);
		document.appendChild(element);
		return serializeDocument(document);
	}

	/*
	 * (non-Javadoc)
	 * @see org.eclipse.debug.internal.core.sourcelookup.ISourceContainerType#
	 * createSourceContainer(java.lang.String)
	 */
	@Override
	public ISourceContainer createSourceContainer(String memento) throws CoreException {
		Node node = parseDocument(memento);
		if (node.getNodeType() == Node.ELEMENT_NODE) {
			Element element = (Element) node;
			if (ELEMENT_NAME.equals(element.getNodeName())) {
				return new BndDependencySourceContainer();
			} else if ("default".equals(element.getNodeName())) { // try to
																	// gracefully
																	// handle
																	// old
																	// serialized
																	// element
																	// name
				return new BndDependencySourceContainer();
			}
			abort("Unable to restore Bnd Dependencies source lookup path - expecting bnd element.", null);
		}
		abort("Unable to restore Bnd Dependencies source lookup path - invalid memento.", null);
		return null;
	}

}
