/*
 * (c) Copyright IBM Corp. 2000, 2001.
 * All Rights Reserved.
 */
package org.eclipse.compare.internal.patch;

import java.io.*;

import org.eclipse.swt.graphics.Image;

import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.*;

import org.eclipse.compare.*;


/* package */ class PatchedResource implements ITypedElement, IStreamContentAccessor {
	
	private Diff fDiff;
	private IStreamContentAccessor fCurrent;
	private IPath fPath;
	private byte[] fContent;
	private Patcher fPatcher;
	
	/* package */ PatchedResource(IStreamContentAccessor current, Diff diff, IPath path, Patcher patcher) {
		fDiff= diff;
		fCurrent= current;
		fPath= path;
		fPatcher= patcher;
	}
	
	public InputStream getContents() throws CoreException {
		if (fContent == null) {
			InputStream is= null;
			
			try {
				is= fCurrent.getContents();
			} catch (CoreException ex) {
				is= new ByteArrayInputStream(new byte[0]);
			}
			if (is != null) {
				
				try {
					String encoding= ResourcesPlugin.getEncoding();
					BufferedReader br= new BufferedReader(new InputStreamReader(is, encoding));
					String s= fPatcher.patch(fDiff,br, null);
					if (s != null)
						fContent= s.getBytes(encoding);
				} catch (UnsupportedEncodingException e) {
					throw new CoreException(new Status(IStatus.ERROR, CompareUI.PLUGIN_ID, Platform.PLUGIN_ERROR, e.getMessage(), e));
				}
					
				try {
					is.close();
				} catch (IOException ex) {
				}
			}
		}
		return new ByteArrayInputStream(fContent);
	}
	
	public Image getImage() {
		return CompareUI.getImage(getType());
	}
	
	public String getName() {
		return fPath.toOSString();
	}
	
	public String getType() {
		String type= fPath.getFileExtension();
		if (type != null)
			return type;
		return ITypedElement.UNKNOWN_TYPE;
	}
}

