View Javadoc

1   package org.apache.continuum.dao;
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 org.apache.maven.continuum.model.project.BuildDefinition;
23  import org.apache.maven.continuum.model.project.Project;
24  import org.apache.maven.continuum.model.project.ProjectGroup;
25  import org.apache.maven.continuum.store.ContinuumObjectNotFoundException;
26  import org.apache.maven.continuum.store.ContinuumStoreException;
27  import org.codehaus.plexus.jdo.PlexusJdoUtils;
28  import org.springframework.stereotype.Repository;
29  
30  import java.util.ArrayList;
31  import java.util.Arrays;
32  import java.util.Collection;
33  import java.util.Collections;
34  import java.util.Iterator;
35  import java.util.List;
36  import javax.annotation.Resource;
37  import javax.jdo.Extent;
38  import javax.jdo.PersistenceManager;
39  import javax.jdo.Query;
40  import javax.jdo.Transaction;
41  
42  /**
43   * @author <a href="mailto:evenisse@apache.org">Emmanuel Venisse</a>
44   * @version $Id: ProjectGroupDaoImpl.java 1372260 2012-08-13 04:29:09Z brett $
45   * @plexus.component role="org.apache.continuum.dao.ProjectGroupDao"
46   */
47  @Repository( "projectGroupDao" )
48  public class ProjectGroupDaoImpl
49      extends AbstractDao
50      implements ProjectGroupDao
51  {
52      /**
53       * @plexus.requirement role=org.apache.continuum.dao.ProjectDao"
54       */
55      @Resource
56      private ProjectDao projectDao;
57  
58      public ProjectGroup addProjectGroup( ProjectGroup group )
59      {
60          return (ProjectGroup) addObject( group );
61      }
62  
63      public void removeProjectGroup( ProjectGroup projectGroup )
64      {
65          ProjectGroup pg = null;
66          try
67          {
68              pg = getProjectGroupWithBuildDetailsByProjectGroupId( projectGroup.getId() );
69          }
70          catch ( Exception e )
71          {
72              // Do nothing
73          }
74  
75          if ( pg != null )
76          {
77              // TODO: why do we need to do this? if not - build results are not
78              // removed and a integrity constraint is violated. I assume its
79              // because of the fetch groups
80              for ( Project p : (List<Project>) pg.getProjects() )
81              {
82                  projectDao.removeProject( p );
83              }
84  
85              List<BuildDefinition> buildDefs = new ArrayList<BuildDefinition>();
86              Iterator<BuildDefinition> it = pg.getBuildDefinitions().listIterator();
87              boolean template = false;
88              while ( it.hasNext() )
89              {
90                  BuildDefinition bd = it.next();
91                  if ( bd.isTemplate() )
92                  {
93                      template = true;
94                  }
95                  else
96                  {
97                      buildDefs.add( bd );
98                  }
99              }
100             if ( template )
101             {
102                 try
103                 {
104                     pg.setBuildDefinitions( buildDefs );
105                     updateProjectGroup( pg );
106                 }
107                 catch ( ContinuumStoreException e )
108                 {
109                     // Do nothing
110                 }
111             }
112 
113             removeObject( pg );
114         }
115     }
116 
117     public ProjectGroup getProjectGroup( int projectGroupId )
118         throws ContinuumStoreException
119     {
120         return (ProjectGroup) getObjectById( ProjectGroup.class, projectGroupId );
121     }
122 
123     public ProjectGroup getProjectGroupByGroupId( String groupId )
124         throws ContinuumStoreException
125     {
126         return (ProjectGroup) getObjectFromQuery( ProjectGroup.class, "groupId", groupId, null );
127     }
128 
129     public ProjectGroup getProjectGroupByGroupIdWithBuildDetails( String groupId )
130         throws ContinuumStoreException
131     {
132         return (ProjectGroup) getObjectFromQuery( ProjectGroup.class, "groupId", groupId,
133                                                   PROJECT_BUILD_DETAILS_FETCH_GROUP );
134     }
135 
136     public ProjectGroup getProjectGroupByGroupIdWithProjects( String groupId )
137         throws ContinuumStoreException
138     {
139         return (ProjectGroup) getObjectFromQuery( ProjectGroup.class, "groupId", groupId,
140                                                   PROJECTGROUP_PROJECTS_FETCH_GROUP );
141     }
142 
143     public ProjectGroup getProjectGroupByProjectId( int projectId )
144         throws ContinuumObjectNotFoundException
145     {
146         try
147         {
148             return projectDao.getProject( projectId ).getProjectGroup();
149         }
150         catch ( ContinuumStoreException e )
151         {
152             throw new ContinuumObjectNotFoundException(
153                 "unable to find project group containing project with id: " + projectId );
154 
155         }
156     }
157 
158     public ProjectGroup getProjectGroupByProject( Project project )
159         throws ContinuumObjectNotFoundException
160     {
161         return getProjectGroupByProjectId( project.getId() );
162     }
163 
164     public void updateProjectGroup( ProjectGroup group )
165         throws ContinuumStoreException
166     {
167         updateObject( group );
168     }
169 
170     public ProjectGroup getProjectGroupWithProjects( int projectGroupId )
171         throws ContinuumStoreException
172     {
173         return (ProjectGroup) getObjectById( ProjectGroup.class, projectGroupId, PROJECTGROUP_PROJECTS_FETCH_GROUP );
174     }
175 
176     public Collection<ProjectGroup> getAllProjectGroupsWithProjects()
177     {
178         return getAllObjectsDetached( ProjectGroup.class, "name ascending", PROJECTGROUP_PROJECTS_FETCH_GROUP );
179     }
180 
181     public List<ProjectGroup> getAllProjectGroupsWithBuildDetails()
182     {
183         return getAllObjectsDetached( ProjectGroup.class, "name ascending", PROJECT_BUILD_DETAILS_FETCH_GROUP );
184     }
185 
186     public List<ProjectGroup> getAllProjectGroups()
187     {
188         return getAllObjectsDetached( ProjectGroup.class, "name ascending", null );
189     }
190 
191     public List<ProjectGroup> getAllProjectGroupsWithTheLot()
192     {
193         List fetchGroups = Arrays.asList(
194             new String[]{PROJECT_WITH_BUILDS_FETCH_GROUP, PROJECTGROUP_PROJECTS_FETCH_GROUP,
195                 BUILD_RESULT_WITH_DETAILS_FETCH_GROUP, PROJECT_WITH_CHECKOUT_RESULT_FETCH_GROUP,
196                 PROJECT_ALL_DETAILS_FETCH_GROUP, PROJECT_BUILD_DETAILS_FETCH_GROUP} );
197         return PlexusJdoUtils.getAllObjectsDetached( getPersistenceManager(), ProjectGroup.class, "name ascending",
198                                                      fetchGroups );
199     }
200 
201     public ProjectGroup getProjectGroupWithBuildDetailsByProjectGroupId( int projectGroupId )
202         throws ContinuumStoreException
203     {
204         return (ProjectGroup) getObjectById( ProjectGroup.class, projectGroupId, PROJECT_BUILD_DETAILS_FETCH_GROUP );
205     }
206 
207     public List<ProjectGroup> getProjectGroupByRepository( int repositoryId )
208     {
209         PersistenceManager pm = getPersistenceManager();
210 
211         Transaction tx = pm.currentTransaction();
212 
213         try
214         {
215             tx.begin();
216 
217             Extent extent = pm.getExtent( ProjectGroup.class, true );
218 
219             Query query = pm.newQuery( extent );
220 
221             query.declareParameters( "int repositoryId" );
222 
223             query.setFilter( "this.localRepository.id == repositoryId" );
224 
225             List result = (List) query.execute( repositoryId );
226 
227             return result == null ? Collections.EMPTY_LIST : (List) pm.detachCopyAll( result );
228         }
229         finally
230         {
231             tx.commit();
232 
233             rollback( tx );
234         }
235     }
236 
237 }