You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

DefaultManagedRepositoriesService.java 12KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301
  1. package org.apache.archiva.rest.services;
  2. /*
  3. * Licensed to the Apache Software Foundation (ASF) under one
  4. * or more contributor license agreements. See the NOTICE file
  5. * distributed with this work for additional information
  6. * regarding copyright ownership. The ASF licenses this file
  7. * to you under the Apache License, Version 2.0 (the
  8. * "License"); you may not use this file except in compliance
  9. * with the License. You may obtain a copy of the License at
  10. *
  11. * http://www.apache.org/licenses/LICENSE-2.0
  12. *
  13. * Unless required by applicable law or agreed to in writing,
  14. * software distributed under the License is distributed on an
  15. * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  16. * KIND, either express or implied. See the License for the
  17. * specific language governing permissions and limitations
  18. * under the License.
  19. */
  20. import org.apache.archiva.admin.model.RepositoryAdminException;
  21. import org.apache.archiva.admin.model.RepositoryCommonValidator;
  22. import org.apache.archiva.admin.model.beans.ManagedRepository;
  23. import org.apache.archiva.metadata.repository.MetadataRepository;
  24. import org.apache.archiva.metadata.repository.MetadataRepositoryException;
  25. import org.apache.archiva.metadata.repository.RepositorySession;
  26. import org.apache.archiva.metadata.repository.stats.model.RepositoryStatistics;
  27. import org.apache.archiva.metadata.repository.stats.model.RepositoryStatisticsManager;
  28. import org.apache.archiva.rest.api.model.ArchivaRepositoryStatistics;
  29. import org.apache.archiva.rest.api.services.ArchivaRestServiceException;
  30. import org.apache.archiva.rest.api.services.ManagedRepositoriesService;
  31. import org.apache.commons.lang.StringEscapeUtils;
  32. import org.apache.commons.lang.StringUtils;
  33. import org.springframework.stereotype.Service;
  34. import javax.inject.Inject;
  35. import javax.ws.rs.core.Response;
  36. import java.nio.file.Files;
  37. import java.nio.file.Paths;
  38. import java.text.SimpleDateFormat;
  39. import java.util.Collections;
  40. import java.util.List;
  41. import java.util.Locale;
  42. /**
  43. * @author Olivier Lamy
  44. * @since 1.4-M1
  45. */
  46. @Service( "managedRepositoriesService#rest" )
  47. public class DefaultManagedRepositoriesService
  48. extends AbstractRestService
  49. implements ManagedRepositoriesService
  50. {
  51. @Inject
  52. private RepositoryCommonValidator repositoryCommonValidator;
  53. @Inject
  54. private RepositoryStatisticsManager repositoryStatisticsManager;
  55. @Override
  56. public List<ManagedRepository> getManagedRepositories()
  57. throws ArchivaRestServiceException
  58. {
  59. try
  60. {
  61. List<org.apache.archiva.admin.model.beans.ManagedRepository> repos =
  62. managedRepositoryAdmin.getManagedRepositories();
  63. return repos == null ? Collections.<ManagedRepository>emptyList() : repos;
  64. }
  65. catch ( RepositoryAdminException e )
  66. {
  67. throw new ArchivaRestServiceException( e.getMessage(), e );
  68. }
  69. }
  70. @Override
  71. public ManagedRepository getManagedRepository( String repositoryId )
  72. throws ArchivaRestServiceException
  73. {
  74. List<ManagedRepository> repos = getManagedRepositories();
  75. for ( ManagedRepository repo : repos )
  76. {
  77. if ( StringUtils.equals( repo.getId(), repositoryId ) )
  78. {
  79. return repo;
  80. }
  81. }
  82. return null;
  83. }
  84. @Override
  85. public Boolean deleteManagedRepository( String repoId, boolean deleteContent )
  86. throws ArchivaRestServiceException
  87. {
  88. try
  89. {
  90. return managedRepositoryAdmin.deleteManagedRepository( repoId, getAuditInformation(), deleteContent );
  91. }
  92. catch ( RepositoryAdminException e )
  93. {
  94. log.error( e.getMessage(), e );
  95. throw new ArchivaRestServiceException( e.getMessage(), e.getFieldName(), e );
  96. }
  97. }
  98. @Override
  99. public ManagedRepository addManagedRepository( ManagedRepository managedRepository )
  100. throws ArchivaRestServiceException
  101. {
  102. try
  103. {
  104. boolean res =
  105. managedRepositoryAdmin.addManagedRepository( managedRepository, managedRepository.isStageRepoNeeded(),
  106. getAuditInformation() );
  107. if ( res )
  108. {
  109. return getManagedRepository( managedRepository.getId() );
  110. }
  111. throw new ArchivaRestServiceException( "fail to created managed Repository", null );
  112. }
  113. catch ( RepositoryAdminException e )
  114. {
  115. throw new ArchivaRestServiceException( e.getMessage(), e.getFieldName(), e );
  116. }
  117. }
  118. @Override
  119. public Boolean updateManagedRepository( ManagedRepository managedRepository )
  120. throws ArchivaRestServiceException
  121. {
  122. try
  123. {
  124. return managedRepositoryAdmin.updateManagedRepository( managedRepository,
  125. managedRepository.isStageRepoNeeded(),
  126. getAuditInformation(),
  127. managedRepository.isResetStats() );
  128. }
  129. catch ( RepositoryAdminException e )
  130. {
  131. throw new ArchivaRestServiceException( e.getMessage(), e.getFieldName(), e );
  132. }
  133. }
  134. @Override
  135. public Boolean fileLocationExists( String fileLocation )
  136. throws ArchivaRestServiceException
  137. {
  138. String location = repositoryCommonValidator.removeExpressions( fileLocation );
  139. return Files.exists( Paths.get( location ));
  140. }
  141. @Override
  142. public ArchivaRepositoryStatistics getManagedRepositoryStatistics( String repositoryId, String lang )
  143. throws ArchivaRestServiceException
  144. {
  145. RepositorySession repositorySession = repositorySessionFactory.createSession();
  146. SimpleDateFormat sdf = new SimpleDateFormat( "EEE, d MMM yyyy HH:mm:ss Z", new Locale( lang ) );
  147. try
  148. {
  149. MetadataRepository metadataRepository = repositorySession.getRepository();
  150. RepositoryStatistics stats = null;
  151. try
  152. {
  153. stats = repositoryStatisticsManager.getLastStatistics( metadataRepository, repositoryId );
  154. }
  155. catch ( MetadataRepositoryException e )
  156. {
  157. log.warn( "Error retrieving repository statistics: {}", e.getMessage(), e );
  158. }
  159. if ( stats != null )
  160. {
  161. ArchivaRepositoryStatistics archivaRepositoryStatistics =
  162. getModelMapper().map( stats, ArchivaRepositoryStatistics.class );
  163. archivaRepositoryStatistics.setDuration( archivaRepositoryStatistics.getScanEndTime().getTime()
  164. - archivaRepositoryStatistics.getScanStartTime().getTime() );
  165. archivaRepositoryStatistics.setLastScanDate(
  166. sdf.format( archivaRepositoryStatistics.getScanEndTime() ) );
  167. return archivaRepositoryStatistics;
  168. }
  169. }
  170. finally
  171. {
  172. if ( repositorySession != null )
  173. {
  174. repositorySession.close();
  175. }
  176. }
  177. return null;
  178. }
  179. @Override
  180. public String getPomSnippet( String repositoryId )
  181. throws ArchivaRestServiceException
  182. {
  183. return createSnippet( getManagedRepository( repositoryId ) );
  184. }
  185. private String createSnippet( ManagedRepository repo )
  186. throws ArchivaRestServiceException
  187. {
  188. try
  189. {
  190. StringBuilder snippet = new StringBuilder();
  191. snippet.append( "<project>\n" );
  192. snippet.append( " ...\n" );
  193. snippet.append( " <distributionManagement>\n" );
  194. String distRepoName = "repository";
  195. if ( repo.isSnapshots() )
  196. {
  197. distRepoName = "snapshotRepository";
  198. }
  199. snippet.append( " <" ).append( distRepoName ).append( ">\n" );
  200. snippet.append( " <id>" ).append( repo.getId() ).append( "</id>\n" );
  201. snippet.append( " <url>" );
  202. snippet.append( getBaseUrl( ) + "/repository" );
  203. snippet.append( "/" ).append( repo.getId() ).append( "/" ).append( "</url>\n" );
  204. if ( !"default".equals( repo.getLayout() ) )
  205. {
  206. snippet.append( " <layout>" ).append( repo.getLayout() ).append( "</layout>" );
  207. }
  208. snippet.append( " </" ).append( distRepoName ).append( ">\n" );
  209. snippet.append( " </distributionManagement>\n" );
  210. snippet.append( "\n" );
  211. snippet.append( " <repositories>\n" );
  212. snippet.append( " <repository>\n" );
  213. snippet.append( " <id>" ).append( repo.getId() ).append( "</id>\n" );
  214. snippet.append( " <name>" ).append( repo.getName() ).append( "</name>\n" );
  215. snippet.append( " <url>" );
  216. snippet.append( getBaseUrl( ) + "/repository" );
  217. snippet.append( "/" ).append( repo.getId() ).append( "/" );
  218. snippet.append( "</url>\n" );
  219. if ( !"default".equals( repo.getLayout() ) )
  220. {
  221. snippet.append( " <layout>" ).append( repo.getLayout() ).append( "</layout>\n" );
  222. }
  223. snippet.append( " <releases>\n" );
  224. snippet.append( " <enabled>" ).append( Boolean.valueOf( repo.isReleases() ) ).append(
  225. "</enabled>\n" );
  226. snippet.append( " </releases>\n" );
  227. snippet.append( " <snapshots>\n" );
  228. snippet.append( " <enabled>" ).append( Boolean.valueOf( repo.isSnapshots() ) ).append(
  229. "</enabled>\n" );
  230. snippet.append( " </snapshots>\n" );
  231. snippet.append( " </repository>\n" );
  232. snippet.append( " </repositories>\n" );
  233. snippet.append( " <pluginRepositories>\n" );
  234. snippet.append( " <pluginRepository>\n" );
  235. snippet.append( " <id>" ).append( repo.getId() ).append( "</id>\n" );
  236. snippet.append( " <name>" ).append( repo.getName() ).append( "</name>\n" );
  237. snippet.append( " <url>" );
  238. snippet.append( getBaseUrl( ) + "/repository" );
  239. snippet.append( "/" ).append( repo.getId() ).append( "/" );
  240. snippet.append( "</url>\n" );
  241. if ( !"default".equals( repo.getLayout() ) )
  242. {
  243. snippet.append( " <layout>" ).append( repo.getLayout() ).append( "</layout>\n" );
  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( " </pluginRepository>\n" );
  254. snippet.append( " </pluginRepositories>\n" );
  255. snippet.append( " ...\n" );
  256. snippet.append( "</project>\n" );
  257. return StringEscapeUtils.escapeXml( snippet.toString() );
  258. }
  259. catch ( RepositoryAdminException e )
  260. {
  261. throw new ArchivaRestServiceException( e.getMessage(),
  262. Response.Status.INTERNAL_SERVER_ERROR.getStatusCode(), e );
  263. }
  264. }
  265. }