/* * Copyright (C) 2013 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.fedora; import com.yourmediashelf.fedora.generated.foxml.DigitalObject; import cz.cas.lib.proarc.common.fedora.LocalStorage.LocalObject; import cz.cas.lib.proarc.common.object.model.MetaModel; import cz.cas.lib.proarc.common.object.model.MetaModelRepository; import java.net.URL; import java.util.ArrayList; import java.util.Collection; /** * Prepares meta model in Fedora Commons Repository. * * @author Jan Pokorsky */ public final class FedoraStorageInitializer { private final RemoteStorage storage; public FedoraStorageInitializer(RemoteStorage storage) { this.storage = storage; } public void init() { try { String serverVersion = storage.getClient().getServerVersion(); if (!serverVersion.startsWith("3.8")) { throw new IllegalStateException(String.format( "The connected Fedora version is %s. ProArc requires version 3.8.*!", serverVersion)); } checkMetaModels(); } catch (Exception ex) { throw new IllegalStateException("Cannot initialize Fedora Repository!", ex); } } private void checkMetaModels() { MetaModelRepository modelRepo = MetaModelRepository.getInstance(); Collection<MetaModel> models = modelRepo.find(); ArrayList<String> modelPids = new ArrayList<String>(); modelPids.add("model:proarcobject"); modelPids.add("proarc:device"); modelPids.add("proarc:group"); modelPids.add("proarc:user"); for (MetaModel model : models) { modelPids.add(model.getPid()); } for (String modelPid : modelPids) { checkMetaModel(modelPid); } } private void checkMetaModel(String modelPid) { try { if (!storage.exist(modelPid)) { ingestModel(modelPid); } } catch (DigitalObjectException ex) { throw new IllegalStateException(modelPid, ex); } } private LocalObject getModelObjectResource(String modelPid) { String modelFilename = modelPid.replace(':', '_'); String resourcePath = String.format("/metamodel/%s.xml", modelFilename); URL resource = FedoraStorageInitializer.class.getResource(resourcePath); if (resource == null) { throw new IllegalStateException(resourcePath); } DigitalObject modelObj = FoxmlUtils.unmarshal(resource, DigitalObject.class); LocalObject lobject = new LocalStorage().create(modelObj); return lobject; } private void ingestModel(String modelPid) throws DigitalObjectException { LocalObject lobject = getModelObjectResource(modelPid); storage.ingest(lobject, "proarc", "Install " + modelPid); } }