/*******************************************************************************
 * Copyright (c) 2007, 2008 IBM Corporation and others.
 * 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:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.jdt.internal.corext.refactoring.reorg;

import org.eclipse.core.runtime.Assert;

import org.eclipse.core.resources.IResource;

import org.eclipse.jdt.core.IJavaElement;

public class ReorgDestinationFactory {

	private static class Destination implements IReorgDestination {

		private final Object fDestination;
		private final int fLocation;

		public Destination(Object destination, int location) {
			Assert.isNotNull(destination);
			Assert.isLegal(location == LOCATION_AFTER || location == LOCATION_BEFORE || location == LOCATION_ON);

			fDestination= destination;
			fLocation= location;
		}

		/**
		 * {@inheritDoc}
		 */
		public Object getDestination() {
			return fDestination;
		}

		/**
		 * {@inheritDoc}
		 */
		public int getLocation() {
			return fLocation;
		}

	}

	static final class ResourceDestination extends Destination {

		private ResourceDestination(IResource destination, int location) {
			super(destination, location);
		}

		public IResource getResource() {
			return (IResource) getDestination();
		}

	}

	static final class JavaElementDestination extends Destination {

		private JavaElementDestination(IJavaElement destination, int location) {
			super(destination, location);
		}

		public IJavaElement getJavaElement() {
			return (IJavaElement) getDestination();
		}

	}

	/**
	 * Wrap the given object into a destination
	 * @param destination the object to wrap
	 * @return a reorg destination if possible reorg destination or <b>null</b> otherwise
	 */
	public static IReorgDestination createDestination(Object destination) {
		return createDestination(destination, IReorgDestination.LOCATION_ON);
	}

	public static IReorgDestination createDestination(Object destination, int location) {
		if (destination instanceof IJavaElement) {
			return new JavaElementDestination((IJavaElement) destination, location);
		} if (destination instanceof IResource) {
			return new ResourceDestination((IResource) destination, location);
		}

		return null;
	}

}
