/*
* Copyright (C) 2014 Jan Pokorsky
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package cz.cas.lib.proarc.common.user;
import cz.cas.lib.proarc.common.fedora.DigitalObjectException;
import cz.cas.lib.proarc.common.fedora.FedoraDao;
import cz.cas.lib.proarc.common.fedora.LocalStorage;
import cz.cas.lib.proarc.common.fedora.LocalStorage.LocalObject;
import cz.cas.lib.proarc.common.fedora.relation.RelationEditor;
import cz.cas.lib.proarc.common.object.DigitalObjectExistException;
/**
* Manages user groups stored in the Fedora storage.
*
* <p>Groups are referenced by digital objects with {@code <proarc-rels:hasOwner>}
* RDF relations and {@code <dc.rights>} properties. It allows to query
* digital objects that belongs to a given user or an user group.
* <p>Groups are reference by user objects with {@code <fedora-rels-ext:isMemberOf>}
* RDF relations.
*
* @author Jan Pokorsky
*/
public final class FedoraGroupDao extends FedoraDao {
public static final String METAMODEL_ID = "proarc:group";
public static final String PID_PREFIX = "group:";
private final LocalStorage localStorage;
public FedoraGroupDao() {
this.localStorage = new LocalStorage();
}
public String addNewGroup(Group group, String owner, String logMessage) {
return addGroup(group, true, owner, logMessage);
}
public String addGroup(Group group, String owner, String logMessage) {
boolean isRemote = group.getRemoteName() != null;
return addGroup(group, isRemote, owner, logMessage);
}
String addGroup(Group group, boolean findFreePid, String owner, String logMessage) {
String pid = group.getName();
LocalObject lobject = newGroup(pid, group, findFreePid, owner, logMessage);
group.setName(lobject.getPid());
if (group.getTitle() == null) {
group.setTitle(lobject.getLabel());
}
return lobject.getPid();
}
LocalObject newGroup(String pid, Group group, boolean findFreePid, String owner, String logMessage) {
LocalObject newObject = newGroup(pid, group, owner, logMessage);
if (newObject != null) {
return newObject;
}
for (int i = 1; findFreePid && i < 1000; i++) {
newObject = newGroup(String.format("%s_%s", pid, i), group, owner, logMessage);
if (newObject != null) {
return newObject;
}
}
throw new IllegalStateException("Group exists: " + pid);
}
private LocalObject newGroup(String pid, Group group, String owner, String logMessage) {
try {
LocalObject lobject = localStorage.create(pid);
lobject.setOwner(owner);
lobject.setLabel(group.getTitle() == null ? toGroupName(pid) : group.getTitle());
RelationEditor relationEditor = new RelationEditor(lobject);
relationEditor.setModel(METAMODEL_ID);
relationEditor.write(relationEditor.getLastModified(), logMessage);
lobject.flush();
return ingets(lobject, owner, logMessage);
} catch (DigitalObjectException ex) {
throw new IllegalStateException(pid, ex);
}
}
LocalObject ingets(LocalObject lobject, String owner, String logMessage) throws DigitalObjectException {
try {
getRemoteStorage().ingest(lobject, owner, logMessage);
tx.addPid(lobject.getPid());
return lobject;
} catch (DigitalObjectExistException ex) {
return null;
}
}
static String toGroupName(String pid) {
return pid.substring(PID_PREFIX.length());
}
}