001package org.apache.archiva.admin.repository.admin; 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 021import org.apache.archiva.admin.model.AuditInformation; 022import org.apache.archiva.admin.model.RepositoryAdminException; 023import org.apache.archiva.admin.model.admin.ArchivaAdministration; 024import org.apache.archiva.admin.model.beans.*; 025import org.apache.archiva.admin.repository.AbstractRepositoryAdmin; 026import org.apache.archiva.configuration.Configuration; 027import org.apache.archiva.configuration.UserInterfaceOptions; 028import org.apache.archiva.configuration.WebappConfiguration; 029import org.apache.archiva.metadata.model.facets.AuditEvent; 030import org.apache.commons.text.StringEscapeUtils; 031import org.apache.commons.lang3.StringUtils; 032import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; 033import org.apache.maven.wagon.providers.http.HttpWagon; 034import org.springframework.stereotype.Service; 035import org.springframework.util.ResourceUtils; 036 037import javax.annotation.PostConstruct; 038import javax.annotation.PreDestroy; 039import java.net.URI; 040import java.net.URISyntaxException; 041import java.util.ArrayList; 042import java.util.Collections; 043import java.util.List; 044 045/** 046 * @author Olivier Lamy 047 */ 048@Service( "archivaAdministration#default" ) 049public class DefaultArchivaAdministration 050 extends AbstractRepositoryAdmin 051 implements ArchivaAdministration 052{ 053 054 private PoolingHttpClientConnectionManager poolingClientConnectionManager; 055 056 @PostConstruct 057 public void initialize() 058 throws RepositoryAdminException 059 { 060 // setup wagon on start with initial values 061 NetworkConfiguration networkConfiguration = getNetworkConfiguration(); 062 setupWagon( networkConfiguration ); 063 } 064 065 @PreDestroy 066 public void shutdown() 067 { 068 if ( this.poolingClientConnectionManager != null ) 069 { 070 this.poolingClientConnectionManager.shutdown(); 071 } 072 } 073 074 075 @Override 076 public List<LegacyArtifactPath> getLegacyArtifactPaths() 077 throws RepositoryAdminException 078 { 079 List<LegacyArtifactPath> legacyArtifactPaths = new ArrayList<>( 080 getArchivaConfiguration().getConfiguration().getLegacyArtifactPaths().size() ); 081 for ( org.apache.archiva.configuration.LegacyArtifactPath legacyArtifactPath : getArchivaConfiguration().getConfiguration().getLegacyArtifactPaths() ) 082 { 083 legacyArtifactPaths.add( 084 getModelMapper().map( legacyArtifactPath, LegacyArtifactPath.class ) ); 085 } 086 return legacyArtifactPaths; 087 } 088 089 @Override 090 public void addLegacyArtifactPath( LegacyArtifactPath legacyArtifactPath, AuditInformation auditInformation ) 091 throws RepositoryAdminException 092 { 093 Configuration configuration = getArchivaConfiguration().getConfiguration(); 094 095 configuration.addLegacyArtifactPath( getModelMapper().map( legacyArtifactPath, 096 org.apache.archiva.configuration.LegacyArtifactPath.class ) ); 097 098 saveConfiguration( configuration ); 099 triggerAuditEvent( "", "", AuditEvent.ADD_LEGACY_PATH, auditInformation ); 100 } 101 102 @Override 103 public void deleteLegacyArtifactPath( String path, AuditInformation auditInformation ) 104 throws RepositoryAdminException 105 { 106 Configuration configuration = getArchivaConfiguration().getConfiguration(); 107 org.apache.archiva.configuration.LegacyArtifactPath legacyArtifactPath = 108 new org.apache.archiva.configuration.LegacyArtifactPath(); 109 110 legacyArtifactPath.setPath( path ); 111 configuration.removeLegacyArtifactPath( legacyArtifactPath ); 112 113 saveConfiguration( configuration ); 114 triggerAuditEvent( "", "", AuditEvent.REMOVE_LEGACY_PATH, auditInformation ); 115 } 116 117 118 @Override 119 public void addFileTypePattern( String fileTypeId, String pattern, AuditInformation auditInformation ) 120 throws RepositoryAdminException 121 { 122 Configuration configuration = getArchivaConfiguration().getConfiguration(); 123 124 org.apache.archiva.configuration.FileType fileType = getFileTypeById( fileTypeId, configuration ); 125 if ( fileType == null ) 126 { 127 return; 128 } 129 130 if ( fileType.getPatterns().contains( pattern ) ) 131 { 132 throw new RepositoryAdminException( 133 "File type [" + fileTypeId + "] already contains pattern [" + pattern + "]" ); 134 } 135 fileType.addPattern( pattern ); 136 137 saveConfiguration( configuration ); 138 triggerAuditEvent( "", "", AuditEvent.ADD_PATTERN, auditInformation ); 139 } 140 141 @Override 142 public void removeFileTypePattern( String fileTypeId, String pattern, AuditInformation auditInformation ) 143 throws RepositoryAdminException 144 { 145 Configuration configuration = getArchivaConfiguration().getConfiguration(); 146 147 org.apache.archiva.configuration.FileType fileType = getFileTypeById( fileTypeId, configuration ); 148 if ( fileType == null ) 149 { 150 return; 151 } 152 fileType.removePattern( pattern ); 153 154 saveConfiguration( configuration ); 155 triggerAuditEvent( "", "", AuditEvent.REMOVE_PATTERN, auditInformation ); 156 } 157 158 @Override 159 public FileType getFileType( String fileTypeId ) 160 throws RepositoryAdminException 161 { 162 org.apache.archiva.configuration.FileType fileType = 163 getFileTypeById( fileTypeId, getArchivaConfiguration().getConfiguration() ); 164 if ( fileType == null ) 165 { 166 return null; 167 } 168 return getModelMapper().map( fileType, FileType.class ); 169 } 170 171 @Override 172 public void addFileType( FileType fileType, AuditInformation auditInformation ) 173 throws RepositoryAdminException 174 { 175 Configuration configuration = getArchivaConfiguration().getConfiguration(); 176 if ( getFileTypeById( fileType.getId(), configuration ) != null ) 177 { 178 throw new RepositoryAdminException( 179 "impossible to FileType with id " + fileType.getId() + " already exists" ); 180 } 181 182 configuration.getRepositoryScanning().addFileType( 183 getModelMapper().map( fileType, org.apache.archiva.configuration.FileType.class ) ); 184 saveConfiguration( configuration ); 185 } 186 187 @Override 188 public void removeFileType( String fileTypeId, AuditInformation auditInformation ) 189 throws RepositoryAdminException 190 { 191 Configuration configuration = getArchivaConfiguration().getConfiguration(); 192 org.apache.archiva.configuration.FileType fileType = new org.apache.archiva.configuration.FileType(); 193 fileType.setId( fileTypeId ); 194 configuration.getRepositoryScanning().removeFileType( fileType ); 195 saveConfiguration( configuration ); 196 } 197 198 @Override 199 public void addKnownContentConsumer( String knownContentConsumer, AuditInformation auditInformation ) 200 throws RepositoryAdminException 201 { 202 Configuration configuration = getArchivaConfiguration().getConfiguration(); 203 if ( configuration.getRepositoryScanning().getKnownContentConsumers().contains( knownContentConsumer ) ) 204 { 205 log.warn( "skip adding knownContentConsumer {} as already here", knownContentConsumer ); 206 return; 207 } 208 configuration.getRepositoryScanning().addKnownContentConsumer( knownContentConsumer ); 209 saveConfiguration( configuration ); 210 triggerAuditEvent( "", "", AuditEvent.ENABLE_REPO_CONSUMER, auditInformation ); 211 } 212 213 @Override 214 public void removeKnownContentConsumer( String knownContentConsumer, AuditInformation auditInformation ) 215 throws RepositoryAdminException 216 { 217 Configuration configuration = getArchivaConfiguration().getConfiguration(); 218 configuration.getRepositoryScanning().removeKnownContentConsumer( knownContentConsumer ); 219 saveConfiguration( configuration ); 220 triggerAuditEvent( "", "", AuditEvent.DISABLE_REPO_CONSUMER, auditInformation ); 221 } 222 223 @Override 224 public void addInvalidContentConsumer( String invalidContentConsumer, AuditInformation auditInformation ) 225 throws RepositoryAdminException 226 { 227 Configuration configuration = getArchivaConfiguration().getConfiguration(); 228 if ( configuration.getRepositoryScanning().getInvalidContentConsumers().contains( invalidContentConsumer ) ) 229 { 230 log.warn( "skip adding invalidContentConsumer {} as already here", invalidContentConsumer ); 231 return; 232 } 233 configuration.getRepositoryScanning().addInvalidContentConsumer( invalidContentConsumer ); 234 saveConfiguration( configuration ); 235 triggerAuditEvent( "", "", AuditEvent.ENABLE_REPO_CONSUMER, auditInformation ); 236 } 237 238 @Override 239 public void removeInvalidContentConsumer( String invalidContentConsumer, AuditInformation auditInformation ) 240 throws RepositoryAdminException 241 { 242 Configuration configuration = getArchivaConfiguration().getConfiguration(); 243 configuration.getRepositoryScanning().removeInvalidContentConsumer( invalidContentConsumer ); 244 saveConfiguration( configuration ); 245 triggerAuditEvent( "", "", AuditEvent.DISABLE_REPO_CONSUMER, auditInformation ); 246 } 247 248 @Override 249 public void setKnownContentConsumers( List<String> knownContentConsumers, AuditInformation auditInformation ) 250 throws RepositoryAdminException 251 { 252 if ( knownContentConsumers == null ) 253 { 254 return; 255 } 256 for ( String knowContentConsumer : knownContentConsumers ) 257 { 258 addKnownContentConsumer( knowContentConsumer, auditInformation ); 259 } 260 } 261 262 @Override 263 public void setInvalidContentConsumers( List<String> invalidContentConsumers, AuditInformation auditInformation ) 264 throws RepositoryAdminException 265 { 266 if ( invalidContentConsumers == null ) 267 { 268 return; 269 } 270 for ( String invalidContentConsumer : invalidContentConsumers ) 271 { 272 addKnownContentConsumer( invalidContentConsumer, auditInformation ); 273 } 274 } 275 276 @Override 277 public List<FileType> getFileTypes() 278 throws RepositoryAdminException 279 { 280 List<org.apache.archiva.configuration.FileType> configFileTypes = 281 getArchivaConfiguration().getConfiguration().getRepositoryScanning().getFileTypes(); 282 if ( configFileTypes == null || configFileTypes.isEmpty() ) 283 { 284 return Collections.emptyList(); 285 } 286 List<FileType> fileTypes = new ArrayList<>( configFileTypes.size() ); 287 for ( org.apache.archiva.configuration.FileType fileType : configFileTypes ) 288 { 289 fileTypes.add( getModelMapper().map( fileType, FileType.class ) ); 290 } 291 return fileTypes; 292 } 293 294 @Override 295 public List<String> getKnownContentConsumers() 296 throws RepositoryAdminException 297 { 298 return new ArrayList<>( 299 getArchivaConfiguration().getConfiguration().getRepositoryScanning().getKnownContentConsumers() ); 300 } 301 302 @Override 303 public List<String> getInvalidContentConsumers() 304 throws RepositoryAdminException 305 { 306 return new ArrayList<>( 307 getArchivaConfiguration().getConfiguration().getRepositoryScanning().getInvalidContentConsumers() ); 308 } 309 310 @Override 311 public OrganisationInformation getOrganisationInformation() 312 throws RepositoryAdminException 313 { 314 org.apache.archiva.configuration.OrganisationInformation organisationInformation = 315 getArchivaConfiguration().getConfiguration().getOrganisationInfo(); 316 if ( organisationInformation == null ) 317 { 318 return null; 319 } 320 return getModelMapper().map( organisationInformation, OrganisationInformation.class ); 321 } 322 323 private String fixUrl(String url, String propertyName) throws RepositoryAdminException { 324 if ( StringUtils.isNotEmpty( url ) ) 325 { 326 if ( !ResourceUtils.isUrl( url ) ) 327 { 328 throw new RepositoryAdminException( "Bad URL in " + propertyName + ": " + url ); 329 } 330 try { 331 URI urlToCheck = new URI(url); 332 return urlToCheck.toString(); 333 } catch (URISyntaxException e) { 334 throw new RepositoryAdminException( "Bad URL in " + propertyName + ": " + url ); 335 } 336 } 337 return url; 338 339 } 340 341 private String convertName(String name) { 342 return StringEscapeUtils.escapeHtml4( StringUtils.trimToEmpty( name ) ); 343 } 344 345 @Override 346 public void setOrganisationInformation( OrganisationInformation organisationInformation ) 347 throws RepositoryAdminException 348 { 349 350 organisationInformation.setUrl(fixUrl(organisationInformation.getUrl(), "url")); 351 organisationInformation.setLogoLocation(fixUrl( organisationInformation.getLogoLocation(), "logoLocation" )); 352 Configuration configuration = getArchivaConfiguration( ).getConfiguration( ); 353 if ( organisationInformation != null ) 354 { 355 organisationInformation.setName( convertName( organisationInformation.getName() )); 356 org.apache.archiva.configuration.OrganisationInformation organisationInformationModel = 357 getModelMapper( ).map( organisationInformation, 358 org.apache.archiva.configuration.OrganisationInformation.class ); 359 configuration.setOrganisationInfo( organisationInformationModel ); 360 } 361 else 362 { 363 configuration.setOrganisationInfo( null ); 364 } 365 saveConfiguration( configuration ); 366 } 367 368 @Override 369 public UiConfiguration getUiConfiguration() 370 throws RepositoryAdminException 371 { 372 WebappConfiguration webappConfiguration = getArchivaConfiguration().getConfiguration().getWebapp(); 373 if ( webappConfiguration == null ) 374 { 375 return null; 376 } 377 UserInterfaceOptions userInterfaceOptions = webappConfiguration.getUi(); 378 if ( userInterfaceOptions == null ) 379 { 380 return null; 381 } 382 return getModelMapper().map( userInterfaceOptions, UiConfiguration.class ); 383 } 384 385 @Override 386 public void updateUiConfiguration( UiConfiguration uiConfiguration ) 387 throws RepositoryAdminException 388 { 389 Configuration configuration = getArchivaConfiguration().getConfiguration(); 390 if ( uiConfiguration != null ) 391 { 392 393 UserInterfaceOptions userInterfaceOptions = 394 getModelMapper().map( uiConfiguration, UserInterfaceOptions.class ); 395 configuration.getWebapp().setUi( userInterfaceOptions ); 396 } 397 else 398 { 399 configuration.getWebapp().setUi( null ); 400 } 401 saveConfiguration( configuration ); 402 403 } 404 405 @Override 406 public NetworkConfiguration getNetworkConfiguration() 407 throws RepositoryAdminException 408 { 409 org.apache.archiva.configuration.NetworkConfiguration networkConfiguration = 410 getArchivaConfiguration().getConfiguration().getNetworkConfiguration(); 411 412 if ( networkConfiguration == null ) 413 { 414 return null; 415 } 416 return getModelMapper().map( networkConfiguration, NetworkConfiguration.class ); 417 } 418 419 @Override 420 public void setNetworkConfiguration( NetworkConfiguration networkConfiguration ) 421 throws RepositoryAdminException 422 { 423 Configuration configuration = getArchivaConfiguration().getConfiguration(); 424 if ( networkConfiguration == null ) 425 { 426 configuration.setNetworkConfiguration( null ); 427 } 428 else 429 { 430 configuration.setNetworkConfiguration( getModelMapper().map( networkConfiguration, 431 org.apache.archiva.configuration.NetworkConfiguration.class ) ); 432 } 433 setupWagon( networkConfiguration ); 434 saveConfiguration( configuration ); 435 } 436 437 protected void setupWagon( NetworkConfiguration networkConfiguration ) 438 { 439 if ( networkConfiguration == null ) 440 { 441 // back to default values 442 HttpWagon.setPersistentPool( true ); 443 poolingClientConnectionManager = new PoolingHttpClientConnectionManager(); 444 poolingClientConnectionManager.setDefaultMaxPerRoute( 30 ); 445 poolingClientConnectionManager.setMaxTotal( 30 ); 446 HttpWagon.setPoolingHttpClientConnectionManager( poolingClientConnectionManager ); 447 448 } 449 else 450 { 451 HttpWagon.setPersistentPool( networkConfiguration.isUsePooling() ); 452 poolingClientConnectionManager = new PoolingHttpClientConnectionManager(); 453 poolingClientConnectionManager.setDefaultMaxPerRoute( networkConfiguration.getMaxTotalPerHost() ); 454 poolingClientConnectionManager.setMaxTotal( networkConfiguration.getMaxTotal() ); 455 HttpWagon.setPoolingHttpClientConnectionManager( poolingClientConnectionManager ); 456 } 457 } 458 459 //------------------------- 460 // 461 //------------------------- 462 463 private org.apache.archiva.configuration.FileType getFileTypeById( String id, Configuration configuration ) 464 { 465 for ( org.apache.archiva.configuration.FileType fileType : configuration.getRepositoryScanning().getFileTypes() ) 466 { 467 if ( StringUtils.equals( id, fileType.getId() ) ) 468 { 469 return fileType; 470 } 471 } 472 return null; 473 } 474 475}