/**
* Copyright (c) 2010-2012 Kenn Hussey 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:
* Kenn Hussey - Initial API and implementation
*/
package org.eclipse.emf.oda.ecore.impl;
import java.util.Map;
import java.util.Properties;
import org.eclipse.datatools.connectivity.oda.IConnection;
import org.eclipse.datatools.connectivity.oda.IDataSetMetaData;
import org.eclipse.datatools.connectivity.oda.IQuery;
import org.eclipse.datatools.connectivity.oda.OdaException;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.eclipse.emf.oda.ecore.util.StringUtil;
import com.ibm.icu.util.ULocale;
/**
* Implementation of IConnection for EMF ODA runtime driver.
*/
public class Connection implements IConnection
{
public static final String RESOURCE_PROPERTY_NAME = "resource"; //$NON-NLS-1$
public static final String RESOURCE_SET_PROPERTY_NAME = ResourceSet.class.getName();
/*
* @since 1.1
*/
public static final String SUPPRESS_UNLOAD_PROPERTY_NAME = "suppress.unload"; //$NON-NLS-1$
protected Map< ? , ? > appContext = null;
protected ResourceSet resourceSet = null;
protected boolean suppressUnload = false;
public void open(Properties connProperties) throws OdaException
{
if (appContext != null)
{
try
{
resourceSet = (ResourceSet)appContext.get(RESOURCE_SET_PROPERTY_NAME);
suppressUnload = appContext.get(SUPPRESS_UNLOAD_PROPERTY_NAME) == Boolean.TRUE;
}
catch (Exception e)
{
throw new OdaException(e);
}
}
if (resourceSet == null)
{
resourceSet = createResourceSet();
String uri = connProperties.getProperty(RESOURCE_PROPERTY_NAME);
if (!StringUtil.isEmpty(uri))
{
try
{
resourceSet.getResource(URI.createURI(uri), true);
}
catch (Exception e)
{
throw new OdaException(e);
}
}
}
}
protected ResourceSet createResourceSet()
{
return new ResourceSetImpl();
}
/**
* Returns the resource set for this connection.
* @return the resource set
*/
public ResourceSet getResourceSet()
{
return resourceSet;
}
public void setAppContext(Object context) throws OdaException
{
if (context == null && appContext != null)
{
if (appContext.containsKey(RESOURCE_SET_PROPERTY_NAME))
{
resourceSet = null;
}
appContext = null;
}
else if (context instanceof Map< ? , ? >)
{
appContext = (Map< ? , ? >)context;
}
}
public void close() throws OdaException
{
if (isOpen())
{
if (!suppressUnload)
{
for (Resource resource : resourceSet.getResources())
{
resource.unload();
}
}
resourceSet = null;
}
}
public boolean isOpen() throws OdaException
{
return resourceSet != null;
}
public IDataSetMetaData getMetaData(String dataSetType) throws OdaException
{
// only one type of data set supported
return new DataSetMetaData(this);
}
public IQuery newQuery(String dataSetType) throws OdaException
{
if (!isOpen())
{
throw new OdaException(new IllegalStateException());
}
// only one type of data set supported
return new Query(this);
}
public int getMaxQueries() throws OdaException
{
return 0; // no limit
}
public void commit() throws OdaException
{
// do nothing; no transaction support provided
}
public void rollback() throws OdaException
{
// do nothing; no transaction support provided
}
public void setLocale(ULocale locale) throws OdaException
{
// do nothing; no locale support provided
}
}