/*******************************************************************************
 * Copyright (c) 2003, 2004 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials 
 * are made available under the terms of the Common Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/cpl-v10.html
 * 
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.osgi.internal.resolver;

import java.io.*;
import java.util.Dictionary;
import org.eclipse.osgi.service.resolver.*;
import org.osgi.framework.BundleException;

public class StateObjectFactoryImpl implements StateObjectFactory {
	public BundleDescription createBundleDescription(Dictionary manifest, String location, long id) throws BundleException {
		BundleDescriptionImpl result;
		result = (BundleDescriptionImpl) StateBuilder.createBundleDescription(manifest, location);
		result.setBundleId(id);
		return result;
	}

	public BundleDescription createBundleDescription(long id, String symbolicName, Version version, String location, BundleSpecification[] required, HostSpecification host, PackageSpecification[] packages, String[] providedPackages, boolean singleton) {
		BundleDescriptionImpl bundle = new BundleDescriptionImpl();
		bundle.setBundleId(id);
		bundle.setUniqueId(symbolicName);
		bundle.setVersion(version);
		bundle.setLocation(location);
		bundle.setRequiredBundles(required);
		bundle.setPackages(packages);
		bundle.setHost(host);
		bundle.setProvidedPackages(providedPackages);
		bundle.setSingleton(singleton);
		return bundle;
	}

	public BundleDescription createBundleDescription(long id, String symbolicName, Version version, String location, BundleSpecification[] required, HostSpecification[] hosts, PackageSpecification[] packages, String[] providedPackages, boolean singleton) {
		HostSpecification host = hosts == null || hosts.length == 0 ? null : hosts[1];
		return createBundleDescription(id, symbolicName, version, location, required, host, packages, providedPackages, singleton);
	}

	public BundleDescription createBundleDescription(BundleDescription original) {
		BundleDescriptionImpl bundle = new BundleDescriptionImpl();
		bundle.setBundleId(original.getBundleId());
		bundle.setUniqueId(original.getUniqueId());
		bundle.setVersion(original.getVersion());
		bundle.setLocation(original.getLocation());
		BundleSpecification[] originalRequired = original.getRequiredBundles();
		BundleSpecification[] newRequired = new BundleSpecification[originalRequired.length];
		for (int i = 0; i < newRequired.length; i++)
			newRequired[i] = createBundleSpecification(originalRequired[i]);
		bundle.setRequiredBundles(newRequired);
		PackageSpecification[] originalPackages = original.getPackages();
		PackageSpecification[] newPackages = new PackageSpecification[originalPackages.length];
		for (int i = 0; i < newPackages.length; i++)
			newPackages[i] = createPackageSpecification(originalPackages[i]);
		bundle.setPackages(newPackages);
		if (original.getHost() != null)
			bundle.setHost(createHostSpecification(original.getHost()));
		String[] originalProvidedPackages = original.getProvidedPackages();
		String[] newProvidedPackages = new String[originalProvidedPackages.length];
		System.arraycopy(originalProvidedPackages, 0, newProvidedPackages, 0, originalProvidedPackages.length);
		bundle.setProvidedPackages(newProvidedPackages);
		bundle.setSingleton(original.isSingleton());
		return bundle;
	}

	public BundleSpecification createBundleSpecification(String requiredSymbolicName, Version requiredVersion, byte matchingRule, boolean export, boolean optional) {
		BundleSpecificationImpl bundleSpec = new BundleSpecificationImpl();
		bundleSpec.setName(requiredSymbolicName);
		bundleSpec.setVersionSpecification(requiredVersion);
		bundleSpec.setMatchingRule(matchingRule);
		bundleSpec.setExported(export);
		bundleSpec.setOptional(optional);
		return bundleSpec;
	}

	public BundleSpecification createBundleSpecification(BundleSpecification original) {
		BundleSpecificationImpl bundleSpec = new BundleSpecificationImpl();
		bundleSpec.setName(original.getName());
		bundleSpec.setVersionSpecification(original.getVersionSpecification());
		bundleSpec.setMatchingRule(original.getMatchingRule());
		bundleSpec.setExported(original.isExported());
		bundleSpec.setOptional(original.isOptional());
		return bundleSpec;
	}

	public HostSpecification createHostSpecification(String hostSymbolicName, Version hostVersion, byte matchingRule, boolean reloadHost) {
		HostSpecificationImpl hostSpec = new HostSpecificationImpl();
		hostSpec.setName(hostSymbolicName);
		hostSpec.setVersionSpecification(hostVersion);
		hostSpec.setMatchingRule(matchingRule);
		hostSpec.setReloadHost(reloadHost);
		return hostSpec;
	}

	public HostSpecification createHostSpecification(HostSpecification original) {
		HostSpecificationImpl hostSpec = new HostSpecificationImpl();
		hostSpec.setName(original.getName());
		hostSpec.setVersionSpecification(original.getVersionSpecification());
		hostSpec.setMatchingRule(original.getMatchingRule());
		hostSpec.setReloadHost(original.reloadHost());
		return hostSpec;
	}

	public PackageSpecification createPackageSpecification(String packageName, Version packageVersion, boolean exported) {
		PackageSpecificationImpl packageSpec = new PackageSpecificationImpl();
		packageSpec.setName(packageName);
		packageSpec.setVersionSpecification(packageVersion);
		packageSpec.setExport(exported);
		return packageSpec;
	}

	public PackageSpecification createPackageSpecification(PackageSpecification original) {
		PackageSpecificationImpl packageSpec = new PackageSpecificationImpl();
		packageSpec.setName(original.getName());
		packageSpec.setVersionSpecification(original.getVersionSpecification());
		packageSpec.setExport(original.isExported());
		return packageSpec;
	}

	public SystemState createSystemState() {
		SystemState state = new SystemState();
		state.setFactory(this);
		return state;
	}

	public State createState() {
		StateImpl state = new UserState();
		state.setFactory(this);
		return state;
	}

	public State createState(State original) {
		StateImpl newState = new UserState();
		newState.setFactory(this);
		newState.setTimeStamp(original.getTimeStamp());
		BundleDescription[] bundles = original.getBundles();
		for (int i = 0; i < bundles.length; i++)
			newState.basicAddBundle(createBundleDescription(bundles[i]));
		newState.setResolved(false);
		return newState;
	}

	public SystemState readSystemState(DataInputStream stream, long expectedTimeStamp) throws IOException {
		StateReader reader = new StateReader();
		SystemState restoredState = new SystemState();
		if (!reader.loadState(restoredState, stream, expectedTimeStamp))
			return null;
		restoredState.setFactory(this);
		return restoredState;
	}

	public State readState(DataInputStream stream) throws IOException {
		StateReader reader = new StateReader();
		StateImpl restoredState = (StateImpl) createState();
		if (!reader.loadState(restoredState, stream))
			return null;
		return restoredState;
	}

	public void writeState(State state, DataOutputStream stream) throws IOException {
		if (state.getFactory() != this)
			throw new IllegalArgumentException();
		StateWriter writer = new StateWriter();
		writer.saveState((StateImpl) state, stream);
	}
}