/* * Licensed to DuraSpace under one or more contributor license agreements. * See the NOTICE file distributed with this work for additional information * regarding copyright ownership. * * DuraSpace licenses this file to you under the Apache License, * Version 2.0 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.fcrepo.kernel.modeshape.services; import static com.codahale.metrics.MetricRegistry.name; import static org.fcrepo.kernel.modeshape.FedoraRepositoryImpl.getJcrRepository; import static org.fcrepo.kernel.modeshape.FedoraSessionImpl.getJcrSession; import static org.fcrepo.kernel.modeshape.services.ServiceHelpers.getRepositoryCount; import static org.slf4j.LoggerFactory.getLogger; import org.fcrepo.kernel.api.FedoraSession; import org.fcrepo.kernel.api.FedoraRepository; import org.fcrepo.kernel.api.exception.RepositoryRuntimeException; import org.fcrepo.metrics.RegistryService; import java.io.File; import java.util.ArrayList; import java.util.Collection; import javax.inject.Inject; import javax.jcr.Repository; import javax.jcr.RepositoryException; import javax.jcr.Session; import org.fcrepo.kernel.api.services.RepositoryService; import org.modeshape.jcr.api.RepositoryManager; import org.slf4j.Logger; import org.springframework.stereotype.Component; import com.codahale.metrics.Timer; /** * Service for repository-wide management and querying * * @author Chris Beer * @since Mar 11, 2013 */ @Component public class RepositoryServiceImpl extends AbstractService implements RepositoryService { @Inject private FedoraRepository repository; private static final Logger LOGGER = getLogger(RepositoryServiceImpl.class); private final Timer objectSizeCalculationTimer = RegistryService.getInstance().getMetrics().timer( name(RepositoryService.class, "objectSizeCalculation")); /** * Calculate the total size of all the binary properties in the repository * * @return size in bytes */ @Override public Long getRepositorySize() { try { LOGGER.debug("Calculating repository size from index"); final Repository repo = getJcrRepository(repository); try (final Timer.Context context = objectSizeCalculationTimer.time()) { // Differentiating between the local getRepositorySize and // ServiceHelpers return ServiceHelpers.getRepositorySize(repo); } } catch (final RepositoryException e) { throw new RepositoryRuntimeException(e); } } /* * (non-Javadoc) * @see * org.fcrepo.kernel.api.services.RepositoryService#getRepositoryObjectCount() */ @Override public Long getRepositoryObjectCount() { final Repository repo = getJcrRepository(repository); try { return getRepositoryCount(repo); } catch (final RepositoryException e) { throw new RepositoryRuntimeException(e); } } /* * (non-Javadoc) * @see * org.fcrepo.kernel.api.services.RepositoryService#backupRepository(javax.jcr * .Session, java.io.File) */ @Override public Collection<Throwable> backupRepository(final FedoraSession session, final File backupDirectory) { final Session jcrSession = getJcrSession(session); try { final RepositoryManager repoMgr = ((org.modeshape.jcr.api.Session) jcrSession) .getWorkspace() .getRepositoryManager(); final Collection<Throwable> problems = new ArrayList<>(); repoMgr.backupRepository(backupDirectory).forEach(x -> problems.add(x.getThrowable())); return problems; } catch (final RepositoryException e) { throw new RepositoryRuntimeException(e); } } /* * (non-Javadoc) * @see * org.fcrepo.kernel.api.services.RepositoryService#restoreRepository(javax. * jcr.Session, java.io.File) */ @Override public Collection<Throwable> restoreRepository(final FedoraSession session, final File backupDirectory) { final Session jcrSession = getJcrSession(session); try { final RepositoryManager repoMgr = ((org.modeshape.jcr.api.Session) jcrSession) .getWorkspace() .getRepositoryManager(); final Collection<Throwable> problems = new ArrayList<>(); repoMgr.restoreRepository(backupDirectory).forEach(x -> problems.add(x.getThrowable())); return problems; } catch (final RepositoryException e) { throw new RepositoryRuntimeException(e); } } }