/*******************************************************************************
 * Copyright (c) 2008, 2009 Oracle. 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:
 *     Oracle - initial API and implementation
 ******************************************************************************/
package org.eclipse.jpt.eclipselink.core.context;


/**
 * 
 * 
 * Provisional API: This interface is part of an interim API that is still
 * under development and expected to change significantly before reaching
 * stability. It is available at this early stage to solicit feedback from
 * pioneering adopters on the understanding that any code that uses this API
 * will almost certainly be broken (repeatedly) as the API evolves.
 * 
 * @version 2.1
 * @since 2.1
 */
public enum EclipseLinkCacheCoordinationType {

	SEND_OBJECT_CHANGES,
	INVALIDATE_CHANGED_OBJECTS,
	SEND_NEW_OBJECTS_WITH_CHANGES,
	NONE;
	

	public static EclipseLinkCacheCoordinationType fromJavaResourceModel(org.eclipse.jpt.eclipselink.core.resource.java.CacheCoordinationType javaCacheCoordinationType) {
		if (javaCacheCoordinationType == null) {
			return null;
		}
		switch (javaCacheCoordinationType) {
			case SEND_OBJECT_CHANGES:
				return SEND_OBJECT_CHANGES;
			case INVALIDATE_CHANGED_OBJECTS:
				return INVALIDATE_CHANGED_OBJECTS;
			case SEND_NEW_OBJECTS_WITH_CHANGES:
				return SEND_NEW_OBJECTS_WITH_CHANGES;
			case NONE:
				return NONE;
			default:
				throw new IllegalArgumentException("unknown cache coordination type: " + javaCacheCoordinationType); //$NON-NLS-1$
		}
	}

	public static org.eclipse.jpt.eclipselink.core.resource.java.CacheCoordinationType toJavaResourceModel(EclipseLinkCacheCoordinationType cacheCoordinationType) {
		if (cacheCoordinationType == null) {
			return null;
		}
		switch (cacheCoordinationType) {
			case SEND_OBJECT_CHANGES:
				return org.eclipse.jpt.eclipselink.core.resource.java.CacheCoordinationType.SEND_OBJECT_CHANGES;
			case INVALIDATE_CHANGED_OBJECTS:
				return org.eclipse.jpt.eclipselink.core.resource.java.CacheCoordinationType.INVALIDATE_CHANGED_OBJECTS;
			case SEND_NEW_OBJECTS_WITH_CHANGES:
				return org.eclipse.jpt.eclipselink.core.resource.java.CacheCoordinationType.SEND_NEW_OBJECTS_WITH_CHANGES;
			case NONE:
				return org.eclipse.jpt.eclipselink.core.resource.java.CacheCoordinationType.NONE;
			default:
				throw new IllegalArgumentException("unknown cache coordination type: " + cacheCoordinationType); //$NON-NLS-1$
		}
	}
	

	public static EclipseLinkCacheCoordinationType fromOrmResourceModel(org.eclipse.jpt.eclipselink.core.resource.orm.CacheCoordinationType ormCacheCoordinationType) {
		if (ormCacheCoordinationType == null) {
			return null;
		}
		switch (ormCacheCoordinationType) {
			case SEND_OBJECT_CHANGES:
				return SEND_OBJECT_CHANGES;
			case INVALIDATE_CHANGED_OBJECTS:
				return INVALIDATE_CHANGED_OBJECTS;
			case SEND_NEW_OBJECTS_WITH_CHANGES:
				return SEND_NEW_OBJECTS_WITH_CHANGES;
			case NONE:
				return NONE;
			default:
				throw new IllegalArgumentException("unknown cache coordination type: " + ormCacheCoordinationType); //$NON-NLS-1$
		}
	}
	
	public static org.eclipse.jpt.eclipselink.core.resource.orm.CacheCoordinationType toOrmResourceModel(EclipseLinkCacheCoordinationType cacheCoordinationType) {
		if (cacheCoordinationType == null) {
			return null;
		}
		switch (cacheCoordinationType) {
			case SEND_OBJECT_CHANGES:
				return org.eclipse.jpt.eclipselink.core.resource.orm.CacheCoordinationType.SEND_OBJECT_CHANGES;
			case INVALIDATE_CHANGED_OBJECTS:
				return org.eclipse.jpt.eclipselink.core.resource.orm.CacheCoordinationType.INVALIDATE_CHANGED_OBJECTS;
			case SEND_NEW_OBJECTS_WITH_CHANGES:
				return org.eclipse.jpt.eclipselink.core.resource.orm.CacheCoordinationType.SEND_NEW_OBJECTS_WITH_CHANGES;
			case NONE:
				return org.eclipse.jpt.eclipselink.core.resource.orm.CacheCoordinationType.NONE;
			default:
				throw new IllegalArgumentException("unknown cache coordination type: " + cacheCoordinationType); //$NON-NLS-1$
		}
	}

}
