001    package org.apache.archiva.rest.services;
002    /*
003     * Licensed to the Apache Software Foundation (ASF) under one
004     * or more contributor license agreements.  See the NOTICE file
005     * distributed with this work for additional information
006     * regarding copyright ownership.  The ASF licenses this file
007     * to you under the Apache License, Version 2.0 (the
008     * "License"); you may not use this file except in compliance
009     * with the License.  You may obtain a copy of the License at
010     *
011     *   http://www.apache.org/licenses/LICENSE-2.0
012     *
013     * Unless required by applicable law or agreed to in writing,
014     * software distributed under the License is distributed on an
015     * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
016     * KIND, either express or implied.  See the License for the
017     * specific language governing permissions and limitations
018     * under the License.
019     */
020    
021    import net.sf.beanlib.provider.replicator.BeanReplicator;
022    import org.apache.archiva.admin.model.RepositoryAdminException;
023    import org.apache.archiva.admin.model.RepositoryCommonValidator;
024    import org.apache.archiva.admin.model.beans.ManagedRepository;
025    import org.apache.archiva.metadata.repository.MetadataRepository;
026    import org.apache.archiva.metadata.repository.MetadataRepositoryException;
027    import org.apache.archiva.metadata.repository.RepositorySession;
028    import org.apache.archiva.metadata.repository.stats.RepositoryStatistics;
029    import org.apache.archiva.metadata.repository.stats.RepositoryStatisticsManager;
030    import org.apache.archiva.rest.api.model.ArchivaRepositoryStatistics;
031    import org.apache.archiva.rest.api.services.ArchivaRestServiceException;
032    import org.apache.archiva.rest.api.services.ManagedRepositoriesService;
033    import org.apache.commons.lang.StringEscapeUtils;
034    import org.apache.commons.lang.StringUtils;
035    import org.springframework.stereotype.Service;
036    
037    import javax.inject.Inject;
038    import javax.ws.rs.core.Response;
039    import java.io.File;
040    import java.text.SimpleDateFormat;
041    import java.util.Collections;
042    import java.util.List;
043    import java.util.Locale;
044    
045    /**
046     * @author Olivier Lamy
047     * @since 1.4-M1
048     */
049    @Service( "managedRepositoriesService#rest" )
050    public class DefaultManagedRepositoriesService
051        extends AbstractRestService
052        implements ManagedRepositoriesService
053    {
054    
055        @Inject
056        private RepositoryCommonValidator repositoryCommonValidator;
057    
058        @Inject
059        private RepositoryStatisticsManager repositoryStatisticsManager;
060    
061        public List<ManagedRepository> getManagedRepositories()
062            throws ArchivaRestServiceException
063        {
064            try
065            {
066                List<org.apache.archiva.admin.model.beans.ManagedRepository> repos =
067                    managedRepositoryAdmin.getManagedRepositories();
068                return repos == null ? Collections.<ManagedRepository>emptyList() : repos;
069            }
070            catch ( RepositoryAdminException e )
071            {
072                throw new ArchivaRestServiceException( e.getMessage(), e );
073            }
074        }
075    
076        public ManagedRepository getManagedRepository( String repositoryId )
077            throws ArchivaRestServiceException
078        {
079            List<ManagedRepository> repos = getManagedRepositories();
080            for ( ManagedRepository repo : repos )
081            {
082                if ( StringUtils.equals( repo.getId(), repositoryId ) )
083                {
084                    return repo;
085                }
086            }
087            return null;
088        }
089    
090    
091        public Boolean deleteManagedRepository( String repoId, boolean deleteContent )
092            throws ArchivaRestServiceException
093        {
094    
095            try
096            {
097                return managedRepositoryAdmin.deleteManagedRepository( repoId, getAuditInformation(), deleteContent );
098            }
099            catch ( RepositoryAdminException e )
100            {
101                log.error( e.getMessage(), e );
102                throw new ArchivaRestServiceException( e.getMessage(), e.getFieldName(), e );
103            }
104        }
105    
106        public ManagedRepository addManagedRepository( ManagedRepository managedRepository )
107            throws ArchivaRestServiceException
108        {
109    
110            try
111            {
112                boolean res =
113                    managedRepositoryAdmin.addManagedRepository( managedRepository, managedRepository.isStageRepoNeeded(),
114                                                                 getAuditInformation() );
115                if ( res )
116                {
117                    return getManagedRepository( managedRepository.getId() );
118                }
119                throw new ArchivaRestServiceException( "fail to created managed Repository", null );
120            }
121            catch ( RepositoryAdminException e )
122            {
123                throw new ArchivaRestServiceException( e.getMessage(), e.getFieldName(), e );
124            }
125        }
126    
127    
128        public Boolean updateManagedRepository( ManagedRepository managedRepository )
129            throws ArchivaRestServiceException
130        {
131    
132            try
133            {
134                return managedRepositoryAdmin.updateManagedRepository( managedRepository,
135                                                                       managedRepository.isStageRepoNeeded(),
136                                                                       getAuditInformation(),
137                                                                       managedRepository.isResetStats() );
138            }
139            catch ( RepositoryAdminException e )
140            {
141                throw new ArchivaRestServiceException( e.getMessage(), e.getFieldName(), e );
142            }
143        }
144    
145        public Boolean fileLocationExists( String fileLocation )
146            throws ArchivaRestServiceException
147        {
148            String location = repositoryCommonValidator.removeExpressions( fileLocation );
149            return new File( location ).exists();
150        }
151    
152        public ArchivaRepositoryStatistics getManagedRepositoryStatistics( String repositoryId, String lang )
153            throws ArchivaRestServiceException
154        {
155            RepositorySession repositorySession = repositorySessionFactory.createSession();
156            SimpleDateFormat sdf = new SimpleDateFormat( "EEE, d MMM yyyy HH:mm:ss Z", new Locale( lang ) );
157            try
158            {
159                MetadataRepository metadataRepository = repositorySession.getRepository();
160    
161                RepositoryStatistics stats = null;
162                try
163                {
164                    stats = repositoryStatisticsManager.getLastStatistics( metadataRepository, repositoryId );
165                }
166                catch ( MetadataRepositoryException e )
167                {
168                    log.warn( "Error retrieving repository statistics: " + e.getMessage(), e );
169                }
170                if ( stats != null )
171                {
172                    ArchivaRepositoryStatistics archivaRepositoryStatistics =
173                        new BeanReplicator().replicateBean( stats, ArchivaRepositoryStatistics.class );
174                    archivaRepositoryStatistics.setDuration( archivaRepositoryStatistics.getScanEndTime().getTime()
175                                                                 - archivaRepositoryStatistics.getScanStartTime().getTime() );
176                    archivaRepositoryStatistics.setLastScanDate(
177                        sdf.format( archivaRepositoryStatistics.getScanEndTime() ) );
178                    return archivaRepositoryStatistics;
179                }
180    
181            }
182            finally
183            {
184                if ( repositorySession != null )
185                {
186                    repositorySession.close();
187                }
188            }
189            return null;
190        }
191    
192        public String getPomSnippet( String repositoryId )
193            throws ArchivaRestServiceException
194        {
195            return createSnippet( getManagedRepository( repositoryId ) );
196        }
197    
198        private String createSnippet( ManagedRepository repo )
199            throws ArchivaRestServiceException
200        {
201            try
202            {
203                StringBuilder snippet = new StringBuilder();
204                snippet.append( "<project>\n" );
205                snippet.append( "  ...\n" );
206                snippet.append( "  <distributionManagement>\n" );
207    
208                String distRepoName = "repository";
209                if ( repo.isSnapshots() )
210                {
211                    distRepoName = "snapshotRepository";
212                }
213    
214                snippet.append( "    <" ).append( distRepoName ).append( ">\n" );
215                snippet.append( "      <id>" ).append( repo.getId() ).append( "</id>\n" );
216                snippet.append( "      <url>" );
217                snippet.append( getBaseUrl(  ) + "/repository" );
218                snippet.append( "/" ).append( repo.getId() ).append( "/" ).append( "</url>\n" );
219    
220                if ( !"default".equals( repo.getLayout() ) )
221                {
222                    snippet.append( "      <layout>" ).append( repo.getLayout() ).append( "</layout>" );
223                }
224    
225                snippet.append( "    </" ).append( distRepoName ).append( ">\n" );
226                snippet.append( "  </distributionManagement>\n" );
227                snippet.append( "\n" );
228    
229                snippet.append( "  <repositories>\n" );
230                snippet.append( "    <repository>\n" );
231                snippet.append( "      <id>" ).append( repo.getId() ).append( "</id>\n" );
232                snippet.append( "      <name>" ).append( repo.getName() ).append( "</name>\n" );
233    
234                snippet.append( "      <url>" );
235                snippet.append( getBaseUrl(  ) + "/repository" );
236                snippet.append( "/" ).append( repo.getId() ).append( "/" );
237    
238                snippet.append( "</url>\n" );
239    
240                if ( !"default".equals( repo.getLayout() ) )
241                {
242                    snippet.append( "      <layout>" ).append( repo.getLayout() ).append( "</layout>\n" );
243                }
244    
245                snippet.append( "      <releases>\n" );
246                snippet.append( "        <enabled>" ).append( Boolean.valueOf( repo.isReleases() ) ).append(
247                    "</enabled>\n" );
248                snippet.append( "      </releases>\n" );
249                snippet.append( "      <snapshots>\n" );
250                snippet.append( "        <enabled>" ).append( Boolean.valueOf( repo.isSnapshots() ) ).append(
251                    "</enabled>\n" );
252                snippet.append( "      </snapshots>\n" );
253                snippet.append( "    </repository>\n" );
254                snippet.append( "  </repositories>\n" );
255                snippet.append( "  <pluginRepositories>\n" );
256                snippet.append( "    <pluginRepository>\n" );
257                snippet.append( "      <id>" ).append( repo.getId() ).append( "</id>\n" );
258                snippet.append( "      <name>" ).append( repo.getName() ).append( "</name>\n" );
259    
260                snippet.append( "      <url>" );
261                snippet.append( getBaseUrl(  ) + "/repository" );
262                snippet.append( "/" ).append( repo.getId() ).append( "/" );
263    
264                snippet.append( "</url>\n" );
265    
266                if ( !"default".equals( repo.getLayout() ) )
267                {
268                    snippet.append( "      <layout>" ).append( repo.getLayout() ).append( "</layout>\n" );
269                }
270    
271                snippet.append( "      <releases>\n" );
272                snippet.append( "        <enabled>" ).append( Boolean.valueOf( repo.isReleases() ) ).append(
273                    "</enabled>\n" );
274                snippet.append( "      </releases>\n" );
275                snippet.append( "      <snapshots>\n" );
276                snippet.append( "        <enabled>" ).append( Boolean.valueOf( repo.isSnapshots() ) ).append(
277                    "</enabled>\n" );
278                snippet.append( "      </snapshots>\n" );
279                snippet.append( "    </pluginRepository>\n" );
280                snippet.append( "  </pluginRepositories>\n" );
281    
282                snippet.append( "  ...\n" );
283                snippet.append( "</project>\n" );
284    
285                return StringEscapeUtils.escapeXml( snippet.toString() );
286            }
287            catch ( RepositoryAdminException e )
288            {
289                throw new ArchivaRestServiceException( e.getMessage(),
290                                                       Response.Status.INTERNAL_SERVER_ERROR.getStatusCode(), e );
291            }
292        }
293    }