package org.geotools.data.efeature.tests.unit;
import static org.geotools.data.efeature.tests.unit.EFeatureTestData.newIsEqual;
import java.io.Serializable;
import java.util.Map;
import java.util.logging.Level;
import junit.framework.Test;
import junit.framework.TestSuite;
import junit.textui.TestRunner;
import org.eclipse.emf.common.util.TreeIterator;
import org.eclipse.emf.ecore.EAttribute;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.change.ChangeDescription;
import org.eclipse.emf.ecore.change.util.ChangeRecorder;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.edit.domain.EditingDomain;
import org.eclipse.emf.query.conditions.eobjects.EObjectCondition;
import org.eclipse.emf.query.statements.WHERE;
import org.geotools.data.efeature.EFeatureDataStore;
import org.geotools.data.efeature.EFeatureDataStoreFactory;
import org.geotools.data.efeature.EFeatureFactoryFinder;
import org.geotools.data.efeature.EFeatureIterator;
import org.geotools.data.efeature.EFeaturePackage;
import org.geotools.data.efeature.query.EFeatureFilter;
import org.geotools.data.efeature.query.EFeatureQuery;
import org.geotools.data.efeature.tests.EFeatureTestsPackage;
import org.geotools.data.efeature.tests.impl.EFeatureTestsContextHelper;
/**
*
* @author kengu - 4. mai 2011
*
*/
public class EFeatureHintsTest extends AbstractResourceTest {
private static boolean binary = false;
private int eFeatureCount = 12;
private EFeatureTestData eData;
private ParameterInfoTestData eParams;
private EFeatureDataStoreFactory eStoreFactory;
private EFeatureTestsContextHelper eContextHelper;
// -----------------------------------------------------
// Tests
// -----------------------------------------------------
// @org.junit.Test
// public void testSingletonHint() {
// testSingletonHint(false);
// testSingletonHint(true);
// }
//
// public void testSingletonHint(boolean eDetached) {
// EFeatureDataStore eStore;
// Map<String,Serializable> params;
// try {
// //
// // Measure test duration
// //
// dTime();
// //
// // Prepare store
// //
// params = eParams.createParams(eResourceURI.toString(), null);
// eStore = eStoreFactory.createDataStore(params);
// Hints hints = new Hints();
// hints.put(EFeatureHints.EFEATURE_SINGLETON_FEATURES, false);
// hints.put(EFeatureHints.EFEATURE_VALUES_DETACHED, false);
// //
// // Loop over types
// //
// for(String eType : new String[]{"efeature.EFeatureData","efeature.EFeatureCompatibleData"}) {
// //
// // Prepare loop objects
// //
// Query query = new Query(eType,Filter.INCLUDE);
// query.setHints(hints);
// EFeatureReader eReader = eStore.getFeatureReader(query);
// EFeatureHints eHints = eReader.eHints();
// eHints.eSetValuesDetached(eDetached);
// //
// // -------------------------------------------------------
// // A.1) Test instance ESimpleFeature mode (attached)
// // -------------------------------------------------------
// //
// query.getHints().put(EFeatureHints.EFEATURE_SINGLETON_FEATURES, false);
// ESimpleFeature f1 = eReader.next();
// ESimpleFeature f2 = eReader.next();
// assertNotSame("Features are same instances ["+eType+",detached:="+eDetached+",singleton:=false]", f1,f2);
// assertNotSame("EObjects are same instances ["+eType+",detached:="+eDetached+",singleton:=false]", f1.eObject(),f2.eObject());
// assertNotSame("EFeatures are same instances ["+eType+",detached:="+eDetached+",singleton:=false]", f1.eFeature(),f2.eFeature());
// //
// // -------------------------------------------------------
// // A.2) Test singleton ESimpleFeature mode
// // -------------------------------------------------------
// //
// eHints.eSetSingletonFeatures(true);
// f1 = eReader.next();
// f2 = eReader.next();
// assertSame("Features are not same instances ["+eType+",detached:="+eDetached+",singleton:=true]", f1,f2);
// assertSame("EObjects are not same instances ["+eType+",detached:="+eDetached+",singleton:=true]", f1.eObject(),f2.eObject());
// assertSame("EFeatures are not same instances ["+eType+",detached:="+eDetached+",singleton:=true]", f1.eFeature(),f2.eFeature());
// //
// // -----------------------------------------------------------------------------
// // A.3) Test instance ESimpleFeature mode again, this time ensuring hint resets
// // -----------------------------------------------------------------------------
// //
// eHints.eSetSingletonFeatures(false);
// f1 = eReader.next();
// f2 = eReader.next();
// assertNotSame("Features are same instances [transitive,"+eType+",detached:="+eDetached+",singleton:=false]", f1,f2);
// assertNotSame("EObjects are same instances [transitive,"+eType+",detached:="+eDetached+",singleton:=false]", f1.eObject(),f2.eObject());
// assertNotSame("EFeatures are same instances [transitive,"+eType+",detached:="+eDetached+",singleton:=false]", f1.eFeature(),f2.eFeature());
// //
// // Dispose data store
// //
// eStore.dispose();
// }
// } catch (Exception e) {
// LOGGER.log(Level.SEVERE, e.getMessage(), e);
// fail(e);
// }
// }
//
// @org.junit.Test
// public void testDetachedHint() {
// testDetachedHint(true);
// testDetachedHint(false);
// }
//
// public void testDetachedHint(boolean eSingleton) {
// EFeatureDataStore eStore;
// Map<String,Serializable> params;
// try {
// //
// // Prepare common objects
// //
// params = eParams.createParams(eResourceURI.toString(), null);
// eStore = eStoreFactory.createDataStore(params);
// Hints hints = new Hints();
// hints.put(EFeatureHints.EFEATURE_SINGLETON_FEATURES, false);
// hints.put(EFeatureHints.EFEATURE_VALUES_DETACHED, false);
// //
// // Loop over types
// //
// for(String eType : new String[]{"efeature.EFeatureData","efeature.EFeatureCompatibleData"}) {
// //
// // Prepare loop objects
// //
// Query query = new Query(eType,Filter.INCLUDE);
// query.setHints(hints);
// EFeatureReader eReader = eStore.getFeatureReader(query);
// EFeatureHints eHints = eReader.eHints();
// eHints.eSetSingletonFeatures(eSingleton);
// EAttribute eAttr = ("efeature.EFeatureData".equals(eType) ?
// EFeatureTestsPackage.eINSTANCE.getEFeatureData_Attribute() :
// EFeatureTestsPackage.eINSTANCE.getEFeatureCompatibleData_Attribute());
// //
// // --------------------------------------------------------------------
// // 1) Test attached ESimpleFeature values mode (establishes base line)
// // --------------------------------------------------------------------
// //
// ESimpleFeature feature = eReader.next();
// EFeature eFeature = feature.eFeature();
// EFeatureInfo eStructure = eFeature.getStructure();
// List<Object> eValues = feature.getAttributes();
// assertTrue("Feature and EObject values not same [1,"+eType+",singleton:="+eSingleton+",detached:=false]",
// eValues.equals(EFeatureUtils.eGetFeatureValues(eStructure, eFeature, Transaction.AUTO_COMMIT)));
// //
// // --------------------------------------------------------------------
// // 2) Test that feature and EObject both change values
// // --------------------------------------------------------------------
// //
// Long v = 1L*(int)(Math.random()*10000);
// eFeature.eSet(eAttr, v);
// eValues = feature.getAttributes();
// assertTrue("Feature and EObject values not same [2,"+eType+",singleton:="+eSingleton+",detached:=false]",
// eValues.equals(EFeatureUtils.eGetFeatureValues(eStructure, eFeature, Transaction.AUTO_COMMIT)));
// //
// // ---------------------------------------------------------------------
// // 3) Test detached ESimpleFeature values mode (establishes base line)
// // ---------------------------------------------------------------------
// //
// eHints.eSetValuesDetached(true);
// feature = eReader.next();
// System.out.println(feature);
// eFeature = feature.eFeature();
// System.out.println(eFeature);
// String eID = eFeature.getID();
// System.out.println(eID);
// eStructure = eFeature.getStructure();
// eValues = feature.getAttributes();
// assertTrue("Feature and EObject values not same [3,"+eType+",singleton:="+eSingleton+",detached:=true]",
// eValues.equals(EFeatureUtils.eGetFeatureValues(eStructure, eFeature, Transaction.AUTO_COMMIT)));
// //
// // --------------------------------------------------------------------
// // 4) Test that ESimpleValues values does not change
// // --------------------------------------------------------------------
// //
// v = 1L*(int)(Math.random()*10000);
// eFeature.eSet(eAttr, v);
// eValues = feature.getAttributes();
// assertFalse("Feature and EObject values same [4,"+eType+",singleton:="+eSingleton+",detached:=true]",
// eValues.equals(EFeatureUtils.eGetFeatureValues(eStructure, eFeature, Transaction.AUTO_COMMIT)));
// //
// // Dispose data store
// //
// eStore.dispose();
// }
// } catch (Exception e) {
// LOGGER.log(Level.SEVERE, e.getMessage(), e);
// fail(e);
// }
// }
@org.junit.Test
public void testChangeRecorder() {
try {
//
// Prepare common objects
//
Map<String,Serializable> params = eParams.createParams(eResourceURI.toString(), null);
EFeatureDataStore eStore = eStoreFactory.createDataStore(params);
EAttribute eAttribute = EFeaturePackage.eINSTANCE.getEFeature_ID();
EObjectCondition eCondition = newIsEqual(eAttribute, "F1");
WHERE where = new WHERE(eCondition);
eAttribute = EFeatureTestsPackage.eINSTANCE.getEFeatureData_Attribute();
TreeIterator<EObject> eObjects = eResource.getAllContents();
EFeatureFilter eFilter = new EFeatureFilter(where);
EFeatureQuery eQuery = new EFeatureQuery(eObjects, eFilter);
EFeatureIterator it = eQuery.iterator();
EObject eFeature = it.next();
Object v = 1200L;
System.out.println("V: " + v);
ChangeRecorder r = new ChangeRecorder(eFeature);
Object o1 = eFeature.eGet(eAttribute);
System.out.println("2: " + o1);
Object o2 = eFeature.eGet(eAttribute);
System.out.println("2: " + o2);
eFeature.eSet(eAttribute, v);
ChangeDescription c = r.endRecording();
c.applyAndReverse();
c.apply();
} catch (Exception e) {
LOGGER.log(Level.SEVERE, e.getMessage(), e);
fail(e);
}
}
// -----------------------------------------------------
// TestCase setup
// -----------------------------------------------------
/**
* Main for test runner.
*/
public static void main(String[] args) {
TestRunner.run(suite());
}
/**
* Constructor with test name.
*/
public EFeatureHintsTest(String name) {
super(name, binary ? "bin" : "xmi", true, false);
}
/**
* Required suite builder.
* @return A test suite for this unit test.
*/
public static Test suite() {
return new TestSuite(EFeatureHintsTest.class);
}
@Override
protected void doSetUp() throws Exception {
//
// Initialize commonly used objects
//
eParams = new ParameterInfoTestData();
eContextHelper = new EFeatureTestsContextHelper(true, binary);
eStoreFactory = EFeatureFactoryFinder.getDataStoreFactory();
}
// -----------------------------------------------------
// AbstractStandaloneTest implementation
// -----------------------------------------------------
@Override
protected ResourceSet createResourceSet() {
return eContextHelper.getResourceSet();
}
@Override
protected EditingDomain createEditingDomain(ResourceSet rset) {
return eContextHelper.getEditingDomain();
}
@Override
protected void createTestData(String name, Resource eResource) throws Exception {
//
// Create data used by all tests
//
eData = new EFeatureTestData(eResource);
eData.random(0,eFeatureCount,eFeatureCount);
eData.save();
}
// -----------------------------------------------------
// Helper methods
// -----------------------------------------------------
// -----------------------------------------------------
// Test assertion methods
// -----------------------------------------------------
}