This project has retired. For details please refer to its Attic page.
Source code
001package org.apache.archiva.metadata.repository;
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.slf4j.Logger;
023import org.slf4j.LoggerFactory;
024
025/**
026 * The repository session provides a single interface to accessing Archiva repositories. It provides access to three
027 * resources:
028 * <ul>
029 * <li>{@link MetadataRepository} - the metadata content repository for read/write access, in its current state (no
030 * remote resources will be retrieved in the process</li>
031 * <li>{@link MetadataResolver} - access to resolve metadata content, accommodating metadata not yet stored or up to
032 * date in the content repository (i.e. virtualised repositories, remote proxied content, or metadata in a different
033 * model format in the repository storage)</li>
034 * <li>{@link org.apache.archiva.metadata.repository.storage.RepositoryStorage} - access to the physical storage of a
035 * repository and the source artifacts and project models</li>
036 * </ul>
037 */
038public class RepositorySession
039    implements AutoCloseable
040{
041    private final MetadataRepository repository;
042
043    private final MetadataResolver resolver;
044
045    private boolean dirty;
046
047    private Logger log = LoggerFactory.getLogger( getClass() );
048
049    // FIXME: include storage here too - perhaps a factory based on repository ID, or one per type to retrieve and
050    //        operate on a given repo within the storage API
051
052    public RepositorySession( MetadataRepository metadataRepository, MetadataResolver resolver )
053    {
054        this.repository = metadataRepository;
055        this.resolver = resolver;
056    }
057
058    public MetadataRepository getRepository()
059    {
060        return repository;
061    }
062
063    public MetadataResolver getResolver()
064    {
065        return resolver;
066    }
067
068    protected boolean isDirty() {
069        return dirty;
070    }
071
072    public void save() throws MetadataSessionException
073    {
074        this.dirty = false;
075    }
076
077    public void revert() throws MetadataSessionException
078    {
079        this.dirty = false;
080    }
081
082    /**
083     * Close the session. Required to be called for all open sessions to ensure resources are properly released.
084     * If the session has been marked as dirty, it will be saved. This may save partial changes in the case of a typical
085     * <code>try { ... } finally { ... }</code> approach - if this is a problem, ensure you revert changes when an
086     * exception occurs.
087     * <b>can throw RuntimeException</b>
088     */
089    @Override
090    public void close()
091    {
092        try
093        {
094            if ( isDirty() )
095            {
096                save();
097            }
098        }
099        catch ( MetadataSessionException e )
100        {
101            throw new RuntimeException( "Could not save the session " + e.getMessage( ), e );
102        }
103    }
104
105    /**
106     * ignore RuntimeException when closing repository
107     * @since 1.4-M4
108     */
109    public void closeQuietly()
110    {
111        try
112        {
113            this.close();
114        }
115        catch ( RuntimeException e )
116        {
117            log.warn( "ignore Runtime exception while closing: {}", e.getMessage(), e );
118        }
119    }
120
121
122    public void markDirty()
123    {
124        this.dirty = true;
125    }
126
127    public void refresh() throws MetadataSessionException {
128
129    }
130
131    public void refreshAndDiscard() throws MetadataSessionException {
132
133    }
134}