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}