package aQute.bnd.osgi;

import java.io.*;

public abstract class WriteResource implements Resource {
	String			extra;
	volatile long	size	= -1;

	public InputStream openInputStream() throws Exception {
		PipedInputStream pin = new PipedInputStream();
		final PipedOutputStream pout = new PipedOutputStream(pin);
		Thread t = new Thread() {
			@Override
			public void run() {
				try {
					write(pout);
					pout.flush();
				}
				catch (Exception e) {
					e.printStackTrace();
				}
				finally {
					try {
						pout.close();
					}
					catch (IOException e) {
						// Ignore
					}
				}
			}
		};
		t.start();
		return pin;
	}

	public abstract void write(OutputStream out) throws IOException, Exception;

	public abstract long lastModified();

	public String getExtra() {
		return extra;
	}

	public void setExtra(String extra) {
		this.extra = extra;
	}

	static class CountingOutputStream extends OutputStream {
		long	size;

		@Override
		public void write(int var0) throws IOException {
			size++;
		}

		@Override
		public void write(byte[] buffer) throws IOException {
			size += buffer.length;
		}

		@Override
		public void write(byte[] buffer, int start, int length) throws IOException {
			size += length;
		}
	}

	public long size() throws IOException, Exception {
		if (size == -1) {
			CountingOutputStream cout = new CountingOutputStream();
			write(cout);
			size = cout.size;
		}
		return size;
	}
}
