]> source.dussan.org Git - archiva.git/blob
5529d3849a0dbf0baf05caedbde90325e13d0bac
[archiva.git] /
1 package org.apache.maven.archiva.database.project;
2
3 /*
4  * Licensed to the Apache Software Foundation (ASF) under one
5  * or more contributor license agreements.  See the NOTICE file
6  * distributed with this work for additional information
7  * regarding copyright ownership.  The ASF licenses this file
8  * to you under the Apache License, Version 2.0 (the
9  * "License"); you may not use this file except in compliance
10  * with the License.  You may obtain a copy of the License at
11  *
12  *  http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing,
15  * software distributed under the License is distributed on an
16  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17  * KIND, either express or implied.  See the License for the
18  * specific language governing permissions and limitations
19  * under the License.
20  */
21
22 import java.util.List;
23
24 import org.apache.maven.archiva.database.ArchivaDAO;
25 import org.apache.maven.archiva.database.ArchivaDatabaseException;
26 import org.apache.maven.archiva.database.ObjectNotFoundException;
27 import org.apache.maven.archiva.model.ArchivaModelCloner;
28 import org.apache.maven.archiva.model.ArchivaProjectModel;
29 import org.apache.maven.archiva.model.VersionedReference;
30 import org.apache.maven.archiva.repository.project.ProjectModelException;
31 import org.apache.maven.archiva.repository.project.ProjectModelResolver;
32 import org.apache.maven.archiva.repository.project.resolvers.FilesystemBasedResolver;
33 import org.apache.maven.archiva.repository.project.resolvers.ProjectModelResolutionListener;
34 import org.slf4j.Logger;
35 import org.slf4j.LoggerFactory;
36
37 /**
38  * Just in Time save of project models to the database, implemented as a listener
39  * on {@link ProjectModelResolver} objects that implement {@link FilesystemBasedResolver}.
40  *
41  * @version $Id$
42  * 
43  * @plexus.component 
44  *              role="org.apache.maven.archiva.repository.project.resolvers.ProjectModelResolutionListener"
45  *              role-hint="model-to-db"
46  */
47 public class ProjectModelToDatabaseListener
48     implements ProjectModelResolutionListener
49 {
50     private Logger log = LoggerFactory.getLogger( ProjectModelToDatabaseListener.class );
51     
52     /**
53      * @plexus.requirement role-hint="jdo"
54      */
55     private ArchivaDAO dao;
56
57     private void saveInDatabase( ArchivaProjectModel model )
58         throws ProjectModelException
59     {
60         try
61         {
62             dao.getProjectModelDAO().saveProjectModel( model );
63         }
64         catch ( ArchivaDatabaseException e )
65         {
66             throw new ProjectModelException( "Unable to save model to database: " + e.getMessage(), e );
67         }
68     }
69
70     private void removeFromDatabase( ArchivaProjectModel model )
71         throws ProjectModelException
72     {
73         try
74         {
75             dao.getProjectModelDAO().deleteProjectModel( model );
76         }
77         catch ( ArchivaDatabaseException e )
78         {
79             throw new ProjectModelException( "Unable to remove existing model from database: " + e.getMessage(), e );
80         }
81     }
82
83     private boolean existsInDatabase( ArchivaProjectModel model )
84         throws ProjectModelException
85     {
86         try
87         {
88             ArchivaProjectModel dbmodel = dao.getProjectModelDAO().getProjectModel( model.getGroupId(),
89                                                                                     model.getArtifactId(),
90                                                                                     model.getVersion() );
91
92             return ( dbmodel != null );
93         }
94         catch ( ObjectNotFoundException e )
95         {
96             return false;
97         }
98         catch ( ArchivaDatabaseException e )
99         {
100             throw new ProjectModelException( "Unable to check for existing model from database: " + e.getMessage(), e );
101         }
102     }
103
104     public void resolutionAttempting( VersionedReference projectRef, ProjectModelResolver resolver )
105     {
106         /* do nothing */
107     }
108
109     public void resolutionError( VersionedReference projectRef, ProjectModelResolver resolver, Exception cause )
110     {
111         /* do nothing */
112     }
113
114     public void resolutionMiss( VersionedReference projectRef, ProjectModelResolver resolver )
115     {
116         /* do nothing */
117     }
118
119     public void resolutionNotFound( VersionedReference projectRef, List resolverList )
120     {
121         /* do nothing */
122     }
123
124     public void resolutionStart( VersionedReference projectRef, List resolverList )
125     {
126         /* do nothing */
127     }
128
129     public void resolutionSuccess( VersionedReference projectRef, ProjectModelResolver resolver,
130                                    ArchivaProjectModel model )
131     {
132         if ( !( resolver instanceof FilesystemBasedResolver ) )
133         {
134             // Nothing to do. skip it.
135             return;
136         }
137
138         // Clone model, since DAO while detachingCopy resets contents of the model
139         // this changes behaviour of EffectiveProjectModelFilter
140         model = ArchivaModelCloner.clone( model );
141
142         try
143         {
144             // Test if it exists.
145             if ( existsInDatabase( model ) )
146             {
147                 removeFromDatabase( model );
148             }
149
150             saveInDatabase( model );
151         }
152         catch ( ProjectModelException e )
153         {
154             log.warn( e.getMessage(), e );
155         }
156     }
157 }