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}