001package org.apache.archiva.metadata.repository.jcr; 002 003/* 004 * Licensed to the Apache Software Foundation (ASF) under one 005 * or more contributor license agreements. See the NOTICE file 006 * distributed with this work for additional information 007 * regarding copyright ownership. The ASF licenses this file 008 * to you under the Apache License, Version 2.0 (the 009 * "License"); you may not use this file except in compliance 010 * with the License. You may obtain a copy of the License at 011 * 012 * http://www.apache.org/licenses/LICENSE-2.0 013 * 014 * Unless required by applicable law or agreed to in writing, 015 * software distributed under the License is distributed on an 016 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 017 * KIND, either express or implied. See the License for the 018 * specific language governing permissions and limitations 019 * under the License. 020 */ 021 022import org.apache.archiva.metadata.model.MetadataFacet; 023import org.apache.archiva.metadata.model.MetadataFacetFactory; 024import org.apache.archiva.metadata.repository.*; 025import org.apache.commons.lang3.StringUtils; 026import org.apache.commons.lang3.time.StopWatch; 027import org.apache.jackrabbit.oak.segment.file.InvalidFileStoreVersionException; 028import org.slf4j.Logger; 029import org.slf4j.LoggerFactory; 030import org.springframework.context.ApplicationContext; 031import org.springframework.stereotype.Service; 032 033import javax.annotation.PreDestroy; 034import javax.inject.Inject; 035import javax.jcr.Repository; 036import javax.jcr.RepositoryException; 037import java.io.IOException; 038import java.nio.file.Path; 039import java.nio.file.Paths; 040import java.util.HashMap; 041import java.util.Map; 042 043/** 044 * 045 */ 046@Service( "repositorySessionFactory#jcr" ) 047public class JcrRepositorySessionFactory extends AbstractRepositorySessionFactory 048 implements RepositorySessionFactory 049{ 050 051 private Logger logger = LoggerFactory.getLogger( getClass() ); 052 053 private Repository repository; 054 055 // Lazy evaluation to avoid problems with circular dependencies during initialization 056 private MetadataResolver metadataResolver; 057 058 @Inject 059 private RepositorySessionFactoryBean repositorySessionFactoryBean; 060 061 @Inject 062 private MetadataService metadataService; 063 064 private OakRepositoryFactory repositoryFactory; 065 066 private JcrMetadataRepository jcrMetadataRepository; 067 068 @Override 069 public RepositorySession createSession() throws MetadataRepositoryException 070 { 071 try 072 { 073 return new JcrRepositorySession( jcrMetadataRepository, getMetadataResolver() ); 074 } 075 catch ( RepositoryException e ) 076 { 077 // FIXME: a custom exception requires refactoring for callers to handle it 078 throw new RuntimeException( e ); 079 } 080 } 081 082 private MetadataResolver getMetadataResolver() { 083 return metadataService.getMetadataResolver( ); 084 } 085 086 protected void initialize() 087 { 088 089 // skip initialisation if not jcr 090 if ( repositorySessionFactoryBean!=null && !StringUtils.equals( repositorySessionFactoryBean.getId(), "jcr" ) ) 091 { 092 return; 093 } 094 095 StopWatch stopWatch = new StopWatch(); 096 stopWatch.start(); 097 098 try 099 { 100 101 repositoryFactory = new OakRepositoryFactory(); 102 // FIXME this need to be configurable 103 Path directoryPath = Paths.get( System.getProperty( "appserver.base" ), "data/jcr" ); 104 repositoryFactory.setRepositoryPath( directoryPath ); 105 try { 106 repository = repositoryFactory.createRepository(); 107 } catch (InvalidFileStoreVersionException | IOException e) { 108 logger.error("Repository creation failed {}", e.getMessage()); 109 throw new RuntimeException("Fatal error. Could not create metadata repository."); 110 } 111 jcrMetadataRepository = new JcrMetadataRepository( metadataService, repository ); 112 try ( JcrRepositorySession session = new JcrRepositorySession( jcrMetadataRepository, metadataResolver )) { 113 JcrMetadataRepository.initializeNodeTypes( session.getJcrSession() ); 114 // Saves automatically with close 115 } 116 } 117 catch ( RepositoryException e ) 118 { 119 throw new RuntimeException( e.getMessage(), e ); 120 } 121 122 stopWatch.stop(); 123 logger.info( "time to initialize JcrRepositorySessionFactory: {}", stopWatch.getTime() ); 124 } 125 126 @Override 127 protected void shutdown() { 128 logger.info( "Shutting down JcrRepositorySessionFactory" ); 129 repositoryFactory.close(); 130 } 131 132 @PreDestroy 133 public void close() 134 { 135 super.close(); 136 } 137 138 public void setMetadataResolver(MetadataResolver metadataResolver) { 139 this.metadataResolver = metadataResolver; 140 } 141 142 public JcrMetadataRepository getMetadataRepository() { 143 return jcrMetadataRepository; 144 } 145 146 147 public MetadataService getMetadataService( ) 148 { 149 return metadataService; 150 } 151 152 public void setMetadataService( MetadataService metadataService ) 153 { 154 this.metadataService = metadataService; 155 } 156}