/* * Copyright (c) 2009-2012, 2015 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: * Martin Taal - initial API and implementation * Eike Stepper - maintenance */ package org.eclipse.emf.cdo.server.internal.hibernate; import org.eclipse.emf.cdo.common.model.CDOModelUtil; import org.eclipse.emf.cdo.common.model.CDOPackageInfo; import org.eclipse.emf.cdo.common.model.CDOPackageUnit; import org.eclipse.emf.cdo.spi.common.model.InternalCDOPackageInfo; import org.eclipse.emf.cdo.spi.common.model.InternalCDOPackageRegistry; import org.eclipse.emf.cdo.spi.common.model.InternalCDOPackageUnit; import org.eclipse.net4j.util.WrappedException; import org.eclipse.net4j.util.io.IOUtil; import org.hibernate.Session; import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.sql.Blob; /** * A DTO for convenience of storing a CDOPackageUnit in the db. * * @author Martin Taal */ public class HibernateCDOPackageUnitDTO { private CDOPackageUnit.Type originalType; private long timeStamp; private InternalCDOPackageInfo[] packageInfos; private byte[] ePackageByteArray; private Blob ePackageBlob; public HibernateCDOPackageUnitDTO() { } public HibernateCDOPackageUnitDTO(CDOPackageUnit cdoPackageUnit) { setPackageInfos((InternalCDOPackageInfo[])cdoPackageUnit.getPackageInfos()); setOriginalType(cdoPackageUnit.getOriginalType()); setTimeStamp(cdoPackageUnit.getTimeStamp()); } public CDOPackageUnit.Type getOriginalType() { return originalType; } public void setOriginalType(CDOPackageUnit.Type originalType) { this.originalType = originalType; } public long getTimeStamp() { return timeStamp; } public void setTimeStamp(long timeStamp) { this.timeStamp = timeStamp; } public InternalCDOPackageInfo[] getPackageInfos() { return packageInfos; } public void setPackageInfos(InternalCDOPackageInfo[] packageInfos) { this.packageInfos = packageInfos; } public byte[] getEPackageByteArray() { return ePackageByteArray; } public void setEPackageByteArray(Session session, byte[] ePackageByteArray) { this.ePackageByteArray = ePackageByteArray; ePackageBlob = session.getLobHelper().createBlob(ePackageByteArray); } public void setEPackageBlob(Blob ePackageBlob) { ePackageByteArray = toByteArray(ePackageBlob); } private byte[] toByteArray(Blob blob) { try { final InputStream is = blob.getBinaryStream(); final ByteArrayOutputStream bos = new ByteArrayOutputStream(); int dataSize; final byte[] buffer = new byte[4000]; try { while ((dataSize = is.read(buffer)) != -1) { bos.write(buffer, 0, dataSize); } } finally { IOUtil.close(is); } return bos.toByteArray(); } catch (Exception e) { throw WrappedException.wrap(e); } } /** * NOTE: should not be called directly only by Hibernate when persisting * use {@link #setEPackageByteArray(Session, byte[])} */ public Blob getEPackageBlob() { return ePackageBlob; } public InternalCDOPackageUnit createCDOPackageUnit(InternalCDOPackageRegistry packageRegistry) { InternalCDOPackageUnit packageUnit = (InternalCDOPackageUnit)CDOModelUtil.createPackageUnit(); packageUnit.setOriginalType(originalType); packageUnit.setTimeStamp(timeStamp); packageUnit.setPackageRegistry(packageRegistry); packageUnit.setPackageInfos(packageInfos); for (CDOPackageInfo packageInfo : packageInfos) { ((InternalCDOPackageInfo)packageInfo).setPackageUnit(packageUnit); } return packageUnit; } public String getNsUri() { return getPackageInfos()[0].getPackageURI(); } public void setNsUri(String nsUri) { // ignore } }