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