/**
* Copyright (c) 2010 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 - Initial API and implementation
*/
package org.eclipse.emf.test.core.ecore;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.URIConverter;
import org.eclipse.emf.ecore.resource.impl.BinaryResourceImpl;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.emf.ecore.xmi.XMLResource;
import org.eclipse.emf.ecore.xmi.impl.XMIResourceImpl;
import org.eclipse.emf.test.models.ppo.Item;
import org.eclipse.emf.test.models.ppo.PPOFactory;
import org.eclipse.emf.test.models.ppo.PurchaseOrder;
/**
* @since 2.6
*/
public class BinaryResourceTest extends TestCase
{
private URI resourceURI;
private List<EObject> rootObjects;
private EcoreUtil.EqualityHelper equalityHelper;
public BinaryResourceTest(String name)
{
super(name);
}
public static Test suite()
{
TestSuite ts = new TestSuite("BinaryResourceTest");
ts.addTest(new BinaryResourceTest("testSaveAndLoad1"));
ts.addTest(new BinaryResourceTest("testSaveAndLoad2"));
ts.addTest(new BinaryResourceTest("testSaveAndLoadWithXMIResource"));
ts.addTest(new BinaryResourceTest("testSaveWithBinaryResourceAndLoadWithXMIResource"));
ts.addTest(new BinaryResourceTest("testSaveAndLoadNoCache1"));
ts.addTest(new BinaryResourceTest("testSaveAndLoadNoCache2"));
return ts;
}
@Override
protected void setUp() throws Exception
{
File tempDir = new File(System.getProperty("java.io.tmpdir"));
if (!tempDir.exists())
{
assertTrue(tempDir.getAbsolutePath(), tempDir.mkdirs());
}
else
{
assertTrue(tempDir.getAbsolutePath(), tempDir.isDirectory());
assertTrue(tempDir.getAbsolutePath(), tempDir.canWrite());
}
resourceURI = URI.createFileURI(tempDir.getAbsolutePath() + '/' + System.nanoTime() + ".dat");
assertFalse(resourceURI.toString(), URIConverter.INSTANCE.exists(resourceURI, null));
int numberORootObjects = 100;
rootObjects = new ArrayList<EObject>(numberORootObjects);
for (int i = 0; i < numberORootObjects; i++)
{
PurchaseOrder purchaseOrder = PPOFactory.eINSTANCE.createPurchaseOrder();
rootObjects.add(purchaseOrder);
purchaseOrder.setComment("purchase order " + i);
purchaseOrder.setOrderDate(new Date());
for (int j = 0, max = numberORootObjects / 2; j < max; j++)
{
Item item = PPOFactory.eINSTANCE.createItem();
purchaseOrder.getItems().add(item);
item.setProductName("item " + i + "-" + j);
item.setQuantity(i * j);
}
}
equalityHelper = new EcoreUtil.EqualityHelper();
}
@Override
protected void tearDown() throws Exception
{
URIConverter.INSTANCE.delete(resourceURI, null);
assertFalse(resourceURI.toString(), URIConverter.INSTANCE.exists(resourceURI, null));
}
public void testSaveAndLoad1() throws Exception
{
Resource resource = new BinaryResourceImpl(resourceURI);
resource.getContents().addAll(rootObjects);
resource.save(null);
assertTrue(resourceURI.toString(), URIConverter.INSTANCE.exists(resourceURI, null));
resource = new BinaryResourceImpl(resourceURI);
resource.load(null);
assertTrue(equalityHelper.equals(rootObjects, resource.getContents()));
}
public void testSaveAndLoad2() throws Exception
{
Resource resource = new BinaryResourceImpl();
resource.getContents().addAll(rootObjects);
OutputStream outputStream = URIConverter.INSTANCE.createOutputStream(resourceURI);
try
{
resource.save(outputStream, null);
}
finally
{
outputStream.close();
}
assertTrue(resourceURI.toString(), URIConverter.INSTANCE.exists(resourceURI, null));
resource = new BinaryResourceImpl();
InputStream inputStream = URIConverter.INSTANCE.createInputStream(resourceURI);
try
{
resource.load(inputStream, null);
}
finally
{
inputStream.close();
}
assertTrue(equalityHelper.equals(rootObjects, resource.getContents()));
}
public void testSaveAndLoadWithXMIResource() throws Exception
{
Resource savedResource = new BinaryResourceImpl(resourceURI);
savedResource.getContents().addAll(rootObjects);
savedResource.save(null);
assertTrue(resourceURI.toString(), URIConverter.INSTANCE.exists(resourceURI, null));
XMLResource loadedResource = new XMIResourceImpl(resourceURI);
loadedResource.getDefaultLoadOptions().put(XMLResource.OPTION_BINARY, Boolean.TRUE);
loadedResource.load(null);
assertTrue(equalityHelper.equals(rootObjects, loadedResource.getContents()));
for (int i = 0, size = rootObjects.size(); i < size; ++i)
{
String loadedURIFragment = loadedResource.getURIFragment(loadedResource.getContents().get(i));
assertNotNull(loadedURIFragment);
assertEquals(savedResource.getURIFragment(rootObjects.get(i)), loadedURIFragment);
}
}
public void testSaveWithBinaryResourceAndLoadWithXMIResource() throws Exception
{
XMLResource savedResource =
new XMIResourceImpl(resourceURI)
{
@Override
protected boolean useUUIDs()
{
return true;
}
};
savedResource.getDefaultSaveOptions().put(XMLResource.OPTION_BINARY, Boolean.TRUE);
savedResource.getContents().addAll(rootObjects);
savedResource.save(null);
assertTrue(resourceURI.toString(), URIConverter.INSTANCE.exists(resourceURI, null));
XMLResource loadedResource = new XMIResourceImpl(resourceURI);
loadedResource.getDefaultLoadOptions().put(XMLResource.OPTION_BINARY, Boolean.TRUE);
loadedResource.load(null);
assertTrue(equalityHelper.equals(rootObjects, loadedResource.getContents()));
for (int i = 0, size = rootObjects.size(); i < size; ++i)
{
String loadedID = loadedResource.getID(loadedResource.getContents().get(i));
assertNotNull(loadedID);
assertEquals(savedResource.getID(rootObjects.get(i)), loadedID);
}
}
public void testSaveAndLoadNoCache1() throws Exception
{
Map<String, Object> options = new HashMap<String, Object>();
options.put(BinaryResourceImpl.OPTION_BUFFER_CAPACITY, 0);
Resource resource = new BinaryResourceImpl(resourceURI);
resource.getContents().addAll(rootObjects);
resource.save(options);
assertTrue(resourceURI.toString(), URIConverter.INSTANCE.exists(resourceURI, null));
resource = new BinaryResourceImpl(resourceURI);
resource.load(options);
assertTrue(equalityHelper.equals(rootObjects, resource.getContents()));
}
public void testSaveAndLoadNoCache2() throws Exception
{
Resource resource = new BinaryResourceImpl();
resource.getContents().addAll(rootObjects);
OutputStream outputStream = new BufferedOutputStream(URIConverter.INSTANCE.createOutputStream(resourceURI));
try
{
resource.save(outputStream, null);
}
finally
{
outputStream.close();
}
assertTrue(resourceURI.toString(), URIConverter.INSTANCE.exists(resourceURI, null));
resource = new BinaryResourceImpl();
InputStream inputStream = new BufferedInputStream(URIConverter.INSTANCE.createInputStream(resourceURI));
try
{
resource.load(inputStream, null);
}
finally
{
inputStream.close();
}
assertTrue(equalityHelper.equals(rootObjects, resource.getContents()));
}
}