/*******************************************************************************
 * Copyright (c) 2009 by SAP AG, Walldorf. 
 * 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:
 *     SAP AG - initial API and implementation
 *******************************************************************************/
package org.eclipse.jst.ws.jaxws.dom.runtime.persistence;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Map;
import java.util.zip.ZipEntry;

import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.ecore.resource.impl.ResourceImpl;

public abstract class NonStreamResource extends ResourceImpl {

	/**
	 * Since this Resource is not stream based, this method should never be called.
	 * If called it will throw <c>UnsupportedException</c>
	 * @param arg0 - ignorred
	 */
	@Override
	protected final void doLoad(InputStream inputStream, Map<?,?> options) throws IOException {
		super.doLoad(inputStream, options);
	}
	
	/**
	 * Since this Resource is not stream based, this method should never be called.
	 * If called it will throw <c>UnsupportedException</c>
	 * @param arg0 - ignorred
	 */
	@Override
	protected final void doSave(OutputStream arg0, Map<?,?> arg1) throws IOException {
		super.doSave(arg0, arg1);
	}

	/**
	 * Allwasy throws <c>UnsupportedOperationException</c>. Streams are not supported by this resource.
	 * @return nothing. this method allways throws <c>UnsupportedOperationException</c>
	 */
	@Override
	protected final boolean isContentZipEntry(ZipEntry arg0) {
		throw new UnsupportedOperationException();
	}

	/**
	 * Since this resource doesn't support streams this method should never be called. Allwasy throws <c>UnsupportedOperationException</c>.
	 * @return nothing. this method allways throws <c>UnsupportedOperationException</c>
	 */
	@Override
	protected final ZipEntry newContentZipEntry() {
		throw new UnsupportedOperationException();
	}
	
	/**
	 * Since this resource doesn't support streams this method should never be called. Allwasy throws <c>UnsupportedOperationException</c>.
	 * @return nothing. this method allways throws <c>UnsupportedOperationException</c>
	 */
	@Override
	protected final boolean useZip() {
		throw new UnsupportedOperationException();
	}

	@Override
	public final void load(Map<?,?> options) throws IOException {

		if (!isLoaded()) {
			Notification notification = setLoaded(true);
			isLoading = true;
			if (errors != null) {
				errors.clear();
			}
			if (warnings != null) {
				warnings.clear();
			}
			try {
			    Map<?,?> mergedOptions = mergeMaps(options, defaultLoadOptions);
				doLoad(mergedOptions);
			} finally {
				
				isLoading = false;
				if (notification != null) {
					eNotify(notification);
				}
				setModified(false);
			}
		}
	}
	
	/**
	 * Called to load the resource using no streams.
	 *
	 * @param options - options supplied by the caller. This metod will ignore any options that it doesn't recognize. The keys and the values can be arbitrary objects.
	 * @throws IOException - thrown if error occurred while loading the content of this resource
	 */
	abstract protected void doLoad(Map<?,?> options) throws IOException;
	
	@Override
	public final void save(Map<?,?> options) throws IOException {
	    if (errors != null)
	    {
	      errors.clear();
	    }
	    if (warnings != null)
	    {
	      warnings.clear();
	    }
	    Map<?,?> mergedOptions = mergeMaps(options, defaultSaveOptions);
	    doSave(mergedOptions);
	    setModified(false);
	}
	
	/**
	 * Called to save the resource using no streams.
	 * @param options - options supplied by the caller. This metod will ignore any options that it doesn't recognize. The keys and the values can be arbitrary objects.
	 * @throws IOException - if problem during the saving occurred.
	 */
	protected abstract void doSave(Map<?,?> options) throws IOException;
	

}
