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 com.codahale.metrics.MetricRegistry.name;
021import static org.fcrepo.kernel.modeshape.FedoraRepositoryImpl.getJcrRepository;
022import static org.fcrepo.kernel.modeshape.FedoraSessionImpl.getJcrSession;
023import static org.fcrepo.kernel.modeshape.services.ServiceHelpers.getRepositoryCount;
024import static org.slf4j.LoggerFactory.getLogger;
025
026import org.fcrepo.kernel.api.FedoraSession;
027import org.fcrepo.kernel.api.FedoraRepository;
028import org.fcrepo.kernel.api.exception.RepositoryRuntimeException;
029import org.fcrepo.metrics.RegistryService;
030
031import java.io.File;
032import java.util.ArrayList;
033import java.util.Collection;
034
035
036import javax.inject.Inject;
037import javax.jcr.Repository;
038import javax.jcr.RepositoryException;
039import javax.jcr.Session;
040
041import org.fcrepo.kernel.api.services.RepositoryService;
042import org.modeshape.jcr.api.RepositoryManager;
043import org.slf4j.Logger;
044import org.springframework.stereotype.Component;
045
046import com.codahale.metrics.Timer;
047
048/**
049 * Service for repository-wide management and querying
050 *
051 * @author Chris Beer
052 * @since Mar 11, 2013
053 */
054@Component
055public class RepositoryServiceImpl extends AbstractService implements RepositoryService {
056
057    @Inject
058    private FedoraRepository repository;
059
060    private static final Logger LOGGER = getLogger(RepositoryServiceImpl.class);
061
062    private final Timer objectSizeCalculationTimer = RegistryService.getInstance().getMetrics().timer(
063            name(RepositoryService.class, "objectSizeCalculation"));
064
065    /**
066     * Calculate the total size of all the binary properties in the repository
067     *
068     * @return size in bytes
069     */
070    @Override
071    public Long getRepositorySize() {
072        try {
073
074            LOGGER.debug("Calculating repository size from index");
075            final Repository repo = getJcrRepository(repository);
076
077            try (final Timer.Context context = objectSizeCalculationTimer.time()) {
078                // Differentiating between the local getRepositorySize and
079                // ServiceHelpers
080                return ServiceHelpers.getRepositorySize(repo);
081
082            }
083        } catch (final RepositoryException e) {
084            throw new RepositoryRuntimeException(e);
085        }
086    }
087
088    /*
089     * (non-Javadoc)
090     * @see
091     * org.fcrepo.kernel.api.services.RepositoryService#getRepositoryObjectCount()
092     */
093    @Override
094    public Long getRepositoryObjectCount() {
095        final Repository repo = getJcrRepository(repository);
096        try {
097            return getRepositoryCount(repo);
098        } catch (final RepositoryException e) {
099            throw new RepositoryRuntimeException(e);
100        }
101    }
102
103    /*
104     * (non-Javadoc)
105     * @see
106     * org.fcrepo.kernel.api.services.RepositoryService#backupRepository(javax.jcr
107     * .Session, java.io.File)
108     */
109    @Override
110    public Collection<Throwable> backupRepository(final FedoraSession session,
111                                     final File backupDirectory) {
112        final Session jcrSession = getJcrSession(session);
113        try {
114            final RepositoryManager repoMgr = ((org.modeshape.jcr.api.Session) jcrSession)
115                    .getWorkspace()
116                    .getRepositoryManager();
117
118            final Collection<Throwable> problems = new ArrayList<>();
119
120            repoMgr.backupRepository(backupDirectory).forEach(x -> problems.add(x.getThrowable()));
121
122            return problems;
123        } catch (final RepositoryException e) {
124            throw new RepositoryRuntimeException(e);
125        }
126    }
127
128    /*
129     * (non-Javadoc)
130     * @see
131     * org.fcrepo.kernel.api.services.RepositoryService#restoreRepository(javax.
132     * jcr.Session, java.io.File)
133     */
134    @Override
135    public Collection<Throwable> restoreRepository(final FedoraSession session,
136                                      final File backupDirectory) {
137        final Session jcrSession = getJcrSession(session);
138        try {
139            final RepositoryManager repoMgr = ((org.modeshape.jcr.api.Session) jcrSession)
140                    .getWorkspace()
141                    .getRepositoryManager();
142
143            final Collection<Throwable> problems = new ArrayList<>();
144
145            repoMgr.restoreRepository(backupDirectory).forEach(x -> problems.add(x.getThrowable()));
146
147            return problems;
148        } catch (final RepositoryException e) {
149            throw new RepositoryRuntimeException(e);
150        }
151    }
152
153}