/*
 * Copyright (c) OSGi Alliance (2012). All Rights Reserved.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package aQute.lib.osgi;

import java.io.*;
import java.util.*;

public class CombinedResource extends WriteResource {
	final List<Resource>	resources		= new ArrayList<Resource>();
	long					lastModified	= 0;

	@Override
	public void write(final OutputStream out) throws IOException, Exception {
		OutputStream unclosable = new FilterOutputStream(out) {
			public void close() {
				// Ignore
			}
		};
		for (Resource r : resources) {
			r.write(unclosable);
			unclosable.flush();
		}
	}

	@Override
	public long lastModified() {
		return lastModified;
	}

	public void addResource(Resource r) {
		lastModified = Math.max(lastModified, r.lastModified());
		resources.add(r);
	}

}
