* @return Only for test cases.
*/
public XStreamSavingConverter restoreDatabase(final Reader reader)
{
final List<AbstractPlugin> plugins = PluginsRegistry.instance().getPlugins();
final XStreamSavingConverter xstreamSavingConverter = new XStreamSavingConverter() {
@Override
protected Serializable getOriginalIdentifierValue(final Object obj)
{
return HibernateUtils.getIdentifier(obj);
}
@Override
public Serializable onBeforeSave(final Session session, final Object obj)
{
log.info("Object " + obj);
if (obj instanceof PFUserDO) {
final PFUserDO user = (PFUserDO) obj;
return save(user, user.getRights());
} else if (obj instanceof AbstractRechnungDO< ? >) {
final AbstractRechnungDO< ? extends AbstractRechnungsPositionDO> rechnung = (AbstractRechnungDO< ? >) obj;
final List< ? extends AbstractRechnungsPositionDO> positions = rechnung.getPositionen();
final KontoDO konto = rechnung.getKonto();
if (konto != null) {
save(konto);
rechnung.setKonto(null);
}
rechnung.setPositionen(null); // Need to nullable positions first (otherwise insert fails).
final Serializable id = save(rechnung);
if (konto != null) {
rechnung.setKonto(konto);
}
if (positions != null) {
for (final AbstractRechnungsPositionDO pos : positions) {
if (pos.getKostZuweisungen() != null) {
final List<KostZuweisungDO> zuweisungen = pos.getKostZuweisungen();
pos.setKostZuweisungen(null); // Need to nullable first (otherwise insert fails).
save(pos);
if (pos instanceof RechnungsPositionDO) {
((RechnungDO) rechnung).addPosition((RechnungsPositionDO) pos);
} else {
((EingangsrechnungDO) rechnung).addPosition((EingangsrechnungsPositionDO) pos);
}
if (zuweisungen != null) {
for (final KostZuweisungDO zuweisung : zuweisungen) {
pos.addKostZuweisung(zuweisung);
save(zuweisung);
}
}
}
}
}
return id;
} else if (obj instanceof AuftragDO) {
final AuftragDO auftrag = (AuftragDO) obj;
return save(auftrag, auftrag.getPositionen());
}
if (plugins != null) {
for (final AbstractPlugin plugin : plugins) {
try {
plugin.onBeforeRestore(this, obj);
} catch (final Exception ex) {
log.error("Error in Plugin while restoring object: " + ex.getMessage(), ex);
}
}
}
for (final XmlDumpHook xmlDumpHook : xmlDumpHooks) {
try {
xmlDumpHook.onBeforeRestore(this, obj);
} catch (final Exception ex) {
log.error("Error in XmlDumpHook while restoring object: " + ex.getMessage(), ex);
}
}
return super.onBeforeSave(session, obj);
}
/**
* @see org.projectforge.database.xstream.XStreamSavingConverter#onAfterSave(java.lang.Object, java.io.Serializable)
*/
@Override
public void onAfterSave(final Object obj, final Serializable id)
{
if (plugins != null) {
for (final AbstractPlugin plugin : plugins) {
plugin.onAfterRestore(this, obj, id);
}
}
}
};
// UserRightDO is inserted on cascade while inserting PFUserDO.
xstreamSavingConverter.appendIgnoredObjects(embeddedClasses);
xstreamSavingConverter.appendOrderedType(PFUserDO.class, GroupDO.class, TaskDO.class, KundeDO.class, ProjektDO.class, Kost1DO.class,
Kost2ArtDO.class, Kost2DO.class, AuftragDO.class, //
RechnungDO.class, EingangsrechnungDO.class, EmployeeSalaryDO.class, KostZuweisungDO.class,//
UserPrefEntryDO.class, UserPrefDO.class, //
AccessEntryDO.class, GroupTaskAccessDO.class, ConfigurationDO.class);
if (plugins != null) {
for (final AbstractPlugin plugin : plugins) {
xstreamSavingConverter.appendOrderedType(plugin.getPersistentEntities());
}
}
Session session = null;
try {
final SessionFactory sessionFactory = hibernate.getSessionFactory();
session = sessionFactory.openSession(EmptyInterceptor.INSTANCE);
session.setFlushMode(FlushMode.AUTO);
final XStream xstream = XStreamHelper.createXStream();
xstream.setMode(XStream.ID_REFERENCES);
xstreamSavingConverter.setSession(session);
xstream.registerConverter(xstreamSavingConverter, 10);
xstream.registerConverter(new UserRightIdSingleValueConverter(), 20);
xstream.registerConverter(new UserPrefAreaSingleValueConverter(), 19);
// alle Objekte Laden und speichern
xstream.fromXML(reader);
xstreamSavingConverter.saveObjects();
} catch (final Exception ex) {
log.error(ex.getMessage(), ex);
throw new RuntimeException(ex);
} finally {
IOUtils.closeQuietly(reader);