/*******************************************************************************
* Copyright (c) 2009, 2010 Fraunhofer IWU 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:
* Fraunhofer IWU - initial API and implementation
*******************************************************************************/
package net.enilink.komma.em.internal;
import java.util.Arrays;
import net.enilink.commons.iterator.IExtendedIterator;
import net.enilink.komma.dm.IDataManager;
import net.enilink.komma.core.IReference;
import net.enilink.komma.core.IStatement;
import net.enilink.komma.core.KommaException;
import net.enilink.komma.core.Statement;
import net.enilink.komma.core.URI;
/**
* Manage the statements about a resource.
*
*/
public class ResourceManager {
IDataManager dm;
IReference[] contexts;
public ResourceManager(IDataManager dm, IReference[] contexts) {
this.dm = dm;
this.contexts = contexts;
}
public IReference createResource(URI uri) {
if (uri == null) {
return dm.blankNode();
}
return uri;
}
public void removeResource(IReference resource) {
boolean active = dm.getTransaction().isActive();
try {
if (!active) {
dm.getTransaction().begin();
}
dm.remove(Arrays.asList( //
new Statement(resource, null, null), //
new Statement(null, null, resource)), contexts);
if (!active) {
dm.getTransaction().commit();
}
} catch (Exception e) {
if (!active && dm.getTransaction().isActive()) {
dm.getTransaction().rollback();
}
throw e;
}
}
public void renameResource(IReference before, IReference after) {
boolean active = dm.getTransaction().isActive();
try {
if (!active) {
dm.getTransaction().begin();
}
IExtendedIterator<IStatement> stmts = dm.match(before, null, null,
false, contexts);
try {
while (stmts.hasNext()) {
IStatement stmt = stmts.next();
IReference pred = stmt.getPredicate();
Object obj = stmt.getObject();
dm.remove(new Statement(before, pred, obj), contexts);
dm.add(new Statement(after, pred, obj), contexts);
}
} finally {
stmts.close();
}
stmts = dm.match(null, before, null, false, contexts);
try {
while (stmts.hasNext()) {
IStatement stmt = stmts.next();
IReference subj = stmt.getSubject();
Object obj = stmt.getObject();
dm.remove(new Statement(subj, before, obj), contexts);
dm.add(new Statement(subj, after, obj), contexts);
}
} finally {
stmts.close();
}
stmts = dm.match(null, null, before, false, contexts);
try {
while (stmts.hasNext()) {
IStatement stmt = stmts.next();
IReference subj = stmt.getSubject();
IReference pred = stmt.getPredicate();
dm.remove(new Statement(subj, pred, before), contexts);
dm.add(new Statement(subj, pred, after), contexts);
}
} finally {
stmts.close();
}
if (!active) {
dm.getTransaction().commit();
}
} catch (Exception e) {
if (!active && dm.getTransaction().isActive()) {
dm.getTransaction().rollback();
}
throw new KommaException(e);
}
}
}