This project has retired. For details please refer to its Attic page.
Source code
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}