/* * 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.RemoteStorage.RemoteObject; import cz.cas.lib.proarc.common.fedora.relation.RelationEditor; import cz.cas.lib.proarc.common.object.DigitalObjectExistException; import java.util.Collection; import java.util.LinkedHashSet; import java.util.logging.Logger; /** * Manages users stored in the Fedora storage. * * @author Jan Pokorsky */ public class FedoraUserDao extends FedoraDao { public static final String METAMODEL_ID = "proarc:user"; public static final String PID_PREFIX = "user:"; private static final Logger LOG = Logger.getLogger(FedoraUserDao.class.getName()); private final LocalStorage localStorage; public FedoraUserDao() { this.localStorage = new LocalStorage(); } public String add(UserProfile user, String owner, String logMessage) { String pid = user.getUserNameAsPid(); boolean isRemote = user.getRemoteName() != null; LocalObject newObject = newObject(pid, user, isRemote, owner, logMessage); user.setUserName(getUserName(newObject.getPid())); return newObject.getPid(); } public void addMembership(UserProfile user, Collection<Group> groups, String logMessage) throws DigitalObjectException { String pid = user.getUserNameAsPid(); RemoteObject fobject = getRemoteStorage().find(pid); RelationEditor relationEditor = new RelationEditor(fobject); LinkedHashSet<String> memberships = new LinkedHashSet<String>(relationEditor.getMembership()); memberships.addAll(UserUtil.toGroupPid(groups)); relationEditor.setMembership(memberships); relationEditor.write(relationEditor.getLastModified(), logMessage); fobject.flush(); } public void setMembership(UserProfile user, Collection<Group> groups, String logMessage) throws DigitalObjectException { String pid = user.getUserNameAsPid(); RemoteObject fobject = getRemoteStorage().find(pid); RelationEditor relationEditor = new RelationEditor(fobject); relationEditor.setMembership(UserUtil.toGroupPid(groups)); relationEditor.write(relationEditor.getLastModified(), logMessage); fobject.flush(); } static String getUserName(String pid) { return pid.substring(PID_PREFIX.length()); } LocalObject newObject(String pid, UserProfile user, boolean findFreePid, String owner, String logMessage) { LocalObject newObject = newObject(pid, user, owner, logMessage); if (newObject != null) { return newObject; } for (int i = 1; findFreePid && i < 1000; i++) { newObject = newObject(String.format("%s_%s", pid, i), user, owner, logMessage); if (newObject != null) { return newObject; } } throw new IllegalStateException("User exists: " + pid); } LocalObject newObject(String pid, UserProfile user, String owner, String logMessage) { try { LocalObject lobject = localStorage.create(pid); lobject.setLabel(getUserName(pid)); lobject.setOwner(owner); 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; } } }