/*******************************************************************************
 * Copyright (c) 2008 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 CacheCoordinationType {

	SEND_OBJECT_CHANGES,
	INVALIDATE_CHANGED_OBJECTS,
	SEND_NEW_OBJECTS_WITH_CHANGES,
	NONE;
	

	public static CacheCoordinationType 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);
		}
	}

	public static org.eclipse.jpt.eclipselink.core.resource.java.CacheCoordinationType toJavaResourceModel(CacheCoordinationType 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 type: " + cacheCoordinationType);
		}
	}
	

//	public static CacheType fromOrmResourceModel(org.eclipse.jpt.core.resource.orm.FetchType ormCacheType) {
//		if (ormCacheType == null) {
//			return null;
//		}
//		switch (ormCacheType) {
//			case FULL:
//				return FULL;
//			case WEAK:
//				return WEAK;
//			case SOFT:
//				return SOFT;
//			case SOFT_WEAK:
//				return SOFT_WEAK;
//			case HARD_WEAK:
//				return HARD_WEAK;
//			case CACHE:
//				return CACHE;
//			case NONE:
//				return NONE;
//			default:
//				throw new IllegalArgumentException("unknown cache type: " + ormCacheType);
//		}
//	}
//	
//	public static org.eclipse.jpt.core.resource.orm.FetchType toOrmResourceModel(CacheType cacheType) {
//		if (cacheType == null) {
//			return null;
//		}
//		switch (cacheType) {
//			case FULL:
//				return org.eclipse.jpt.core.resource.orm.FetchType.FULL;
//			case WEAK:
//				return org.eclipse.jpt.core.resource.orm.FetchType.WEAK;
//			case SOFT:
//				return org.eclipse.jpt.core.resource.orm.FetchType.SOFT;
//			case SOFT_WEAK:
//				return org.eclipse.jpt.core.resource.orm.FetchType.SOFT_WEAK;
//			case HARD_WEAK:
//				return org.eclipse.jpt.core.resource.orm.FetchType.HARD_WEAK;
//			case CACHE:
//				return org.eclipse.jpt.core.resource.orm.FetchType.CACHE;
//			case NONE:
//				return org.eclipse.jpt.core.resource.orm.FetchType.NONE;
//			default:
//				throw new IllegalArgumentException("unknown cache type: " + cacheType);
//		}
//	}

}
