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 }