/*
* Copyright (c) 2010-2013, 2016 Eike Stepper (Berlin, Germany) 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:
* Victor Roldan Betancort - initial API and implementation
*/
package org.eclipse.emf.cdo.server.internal.db4o;
import org.eclipse.emf.cdo.common.model.CDOModelUtil;
import org.eclipse.emf.cdo.common.model.CDOPackageRegistry;
import org.eclipse.emf.cdo.common.model.CDOPackageUnit;
import org.eclipse.emf.cdo.common.model.EMFUtil;
import org.eclipse.emf.cdo.server.IStore;
import org.eclipse.emf.cdo.spi.common.model.InternalCDOPackageInfo;
import org.eclipse.emf.cdo.spi.common.model.InternalCDOPackageUnit;
import org.eclipse.net4j.util.collection.Pair;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import java.util.ArrayList;
import java.util.List;
/**
* @author Victor Roldan Betancort
*/
public class DB4OPackageUnit
{
private String id;
private Integer ordinalType;
private Long timeStamp;
private List<Byte> ePackageBytes;
private List<Pair<String, String>> packageInfos;
public DB4OPackageUnit(String id, Integer ordinalType, Long timeStamp, List<Byte> ePackageBytes, List<Pair<String, String>> packageInfos)
{
setId(id);
setOrdinalType(ordinalType);
setTimeStamp(timeStamp);
setEPackageBytes(ePackageBytes);
setPackageInfos(packageInfos);
}
public void setId(String id)
{
this.id = id;
}
public String getId()
{
return id;
}
public void setOrdinalType(Integer ordinalType)
{
this.ordinalType = ordinalType;
}
public Integer getOrdinalType()
{
return ordinalType;
}
public void setTimeStamp(Long timeStamp)
{
this.timeStamp = timeStamp;
}
public Long getTimeStamp()
{
return timeStamp;
}
public void setEPackageBytes(List<Byte> ePackageBytes)
{
this.ePackageBytes = ePackageBytes;
}
public List<Byte> getEPackageBytes()
{
return ePackageBytes;
}
public static DB4OPackageUnit getPrimitivePackageUnit(IStore store, InternalCDOPackageUnit packageUnit)
{
return new DB4OPackageUnit(new String(packageUnit.getID()), new Integer(packageUnit.getOriginalType().ordinal()), new Long(packageUnit.getTimeStamp()),
getEPackageBytes(store, packageUnit), getPackageInfosAsPair(packageUnit.getPackageInfos()));
}
public static InternalCDOPackageUnit getPackageUnit(DB4OPackageUnit packageUnit)
{
InternalCDOPackageUnit cdoPackageUnit = (InternalCDOPackageUnit)CDOModelUtil.createPackageUnit();
CDOPackageUnit.Type type = CDOPackageUnit.Type.values()[packageUnit.getOrdinalType()];
cdoPackageUnit.setOriginalType(type);
cdoPackageUnit.setTimeStamp(packageUnit.getTimeStamp());
cdoPackageUnit.setPackageInfos(getPackageInfos(packageUnit));
return cdoPackageUnit;
}
private static InternalCDOPackageInfo[] getPackageInfos(DB4OPackageUnit packageUnit)
{
List<InternalCDOPackageInfo> list = new ArrayList<InternalCDOPackageInfo>();
for (Pair<String, String> infoPair : packageUnit.getPackageInfos())
{
InternalCDOPackageInfo packageInfo = (InternalCDOPackageInfo)CDOModelUtil.createPackageInfo();
packageInfo.setParentURI(infoPair.getElement1());
packageInfo.setPackageURI(infoPair.getElement2());
list.add(packageInfo);
}
return list.toArray(new InternalCDOPackageInfo[list.size()]);
}
private static List<Byte> getEPackageBytes(IStore store, InternalCDOPackageUnit packageUnit)
{
EPackage ePackage = packageUnit.getTopLevelPackageInfo().getEPackage();
CDOPackageRegistry packageRegistry = store.getRepository().getPackageRegistry();
byte[] bytes = EMFUtil.getEPackageBytes(ePackage, true, packageRegistry);
List<Byte> bytesObject = new ArrayList<Byte>();
for (byte bt : bytes)
{
bytesObject.add(new Byte(bt));
}
return bytesObject;
}
private static EPackage getEPackageFromBytes(List<Byte> ePackageBytesList)
{
ResourceSet rSet = new ResourceSetImpl();
byte[] packageBytes = new byte[ePackageBytesList.size()];
for (int i = 0; i < packageBytes.length; i++)
{
packageBytes[i] = ePackageBytesList.get(i);
}
EPackage ePackage = EMFUtil.createEPackage("", packageBytes, true, rSet, false);
return ePackage;
}
public EPackage getEPackage()
{
return getEPackageFromBytes(getEPackageBytes());
}
private static List<Pair<String, String>> getPackageInfosAsPair(InternalCDOPackageInfo[] packageInfos)
{
List<Pair<String, String>> infos = new ArrayList<Pair<String, String>>();
for (InternalCDOPackageInfo info : packageInfos)
{
Pair<String, String> pair = Pair.create(info.getParentURI(), info.getPackageURI());
infos.add(pair);
}
return infos;
}
public void setPackageInfos(List<Pair<String, String>> packageInfos)
{
this.packageInfos = packageInfos;
}
public List<Pair<String, String>> getPackageInfos()
{
return packageInfos;
}
}