001/*
002 * Licensed to DuraSpace under one or more contributor license agreements.
003 * See the NOTICE file distributed with this work for additional information
004 * regarding copyright ownership.
005 *
006 * DuraSpace licenses this file to you under the Apache License,
007 * Version 2.0 (the "License"); you may not use this file except in
008 * compliance with the License.  You may obtain a copy of the License at
009 *
010 *     http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing, software
013 * distributed under the License is distributed on an "AS IS" BASIS,
014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015 * See the License for the specific language governing permissions and
016 * limitations under the License.
017 */
018package org.fcrepo.kernel.modeshape.services;
019
020import static org.fcrepo.kernel.modeshape.FedoraRepositoryImpl.getJcrRepository;
021import static org.fcrepo.kernel.modeshape.FedoraSessionImpl.getJcrSession;
022import static org.fcrepo.kernel.modeshape.services.ServiceHelpers.getRepositoryCount;
023import static org.slf4j.LoggerFactory.getLogger;
024
025import org.fcrepo.kernel.api.FedoraSession;
026import org.fcrepo.kernel.api.FedoraRepository;
027import org.fcrepo.kernel.api.exception.RepositoryRuntimeException;
028
029import java.io.File;
030import java.util.ArrayList;
031import java.util.Collection;
032
033
034import javax.inject.Inject;
035import javax.jcr.Repository;
036import javax.jcr.RepositoryException;
037import javax.jcr.Session;
038
039import org.fcrepo.kernel.api.services.RepositoryService;
040import org.modeshape.jcr.api.RepositoryManager;
041import org.slf4j.Logger;
042import org.springframework.stereotype.Component;
043
044/**
045 * Service for repository-wide management and querying
046 *
047 * @author Chris Beer
048 * @since Mar 11, 2013
049 */
050@Component
051public class RepositoryServiceImpl extends AbstractService implements RepositoryService {
052
053    @Inject
054    private FedoraRepository repository;
055
056    private static final Logger LOGGER = getLogger(RepositoryServiceImpl.class);
057
058    /**
059     * Calculate the total size of all the binary properties in the repository
060     *
061     * @return size in bytes
062     */
063    @Override
064    public Long getRepositorySize() {
065        try {
066
067            LOGGER.debug("Calculating repository size from index");
068            final Repository repo = getJcrRepository(repository);
069
070            // Differentiating between the local getRepositorySize and
071            // ServiceHelpers
072            return ServiceHelpers.getRepositorySize(repo);
073        } catch (final RepositoryException e) {
074            throw new RepositoryRuntimeException(e);
075        }
076    }
077
078    /*
079     * (non-Javadoc)
080     * @see
081     * org.fcrepo.kernel.api.services.RepositoryService#getRepositoryObjectCount()
082     */
083    @Override
084    public Long getRepositoryObjectCount() {
085        final Repository repo = getJcrRepository(repository);
086        try {
087            return getRepositoryCount(repo);
088        } catch (final RepositoryException e) {
089            throw new RepositoryRuntimeException(e);
090        }
091    }
092
093    /*
094     * (non-Javadoc)
095     * @see
096     * org.fcrepo.kernel.api.services.RepositoryService#backupRepository(javax.jcr
097     * .Session, java.io.File)
098     */
099    @Override
100    public Collection<Throwable> backupRepository(final FedoraSession session,
101                                     final File backupDirectory) {
102        final Session jcrSession = getJcrSession(session);
103        try {
104            final RepositoryManager repoMgr = ((org.modeshape.jcr.api.Session) jcrSession)
105                    .getWorkspace()
106                    .getRepositoryManager();
107
108            final Collection<Throwable> problems = new ArrayList<>();
109
110            repoMgr.backupRepository(backupDirectory).forEach(x -> problems.add(x.getThrowable()));
111
112            return problems;
113        } catch (final RepositoryException e) {
114            throw new RepositoryRuntimeException(e);
115        }
116    }
117
118    /*
119     * (non-Javadoc)
120     * @see
121     * org.fcrepo.kernel.api.services.RepositoryService#restoreRepository(javax.
122     * jcr.Session, java.io.File)
123     */
124    @Override
125    public Collection<Throwable> restoreRepository(final FedoraSession session,
126                                      final File backupDirectory) {
127        final Session jcrSession = getJcrSession(session);
128        try {
129            final RepositoryManager repoMgr = ((org.modeshape.jcr.api.Session) jcrSession)
130                    .getWorkspace()
131                    .getRepositoryManager();
132
133            final Collection<Throwable> problems = new ArrayList<>();
134
135            repoMgr.restoreRepository(backupDirectory).forEach(x -> problems.add(x.getThrowable()));
136
137            return problems;
138        } catch (final RepositoryException e) {
139            throw new RepositoryRuntimeException(e);
140        }
141    }
142
143}