]> source.dussan.org Git - archiva.git/blob
5b9e3a73937a95398c073169ab88e70b7f049dc5
[archiva.git] /
1 package org.apache.archiva.repository.base.managed;
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  * Unless required by applicable law or agreed to in writing,
13  * software distributed under the License is distributed on an
14  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15  * KIND, either express or implied.  See the License for the
16  * specific language governing permissions and limitations
17  * under the License.
18  */
19
20 import org.apache.archiva.components.registry.Registry;
21 import org.apache.archiva.repository.base.ConfigurationHandler;
22 import org.apache.archiva.repository.validation.AbstractRepositoryValidator;
23 import org.apache.archiva.repository.ManagedRepository;
24 import org.apache.archiva.repository.RepositoryRegistry;
25 import org.apache.archiva.repository.validation.RepositoryValidator;
26 import org.apache.archiva.repository.validation.ValidationError;
27 import org.apache.archiva.repository.validation.ValidationResponse;
28 import org.apache.commons.lang3.StringUtils;
29 import org.springframework.stereotype.Service;
30 import org.apache.archiva.components.scheduler.CronExpressionValidator;
31
32
33 import java.util.List;
34 import java.util.Map;
35 import java.util.regex.Pattern;
36
37 import static org.apache.archiva.repository.validation.ErrorKeys.*;
38
39 /**
40  * Validator for managed repository data.
41  *
42  * @author Martin Stockhammer <martin_s@apache.org>
43  */
44 @Service( "repositoryValidator#common#managed" )
45 public class BasicManagedRepositoryValidator extends AbstractRepositoryValidator<ManagedRepository> implements RepositoryValidator<ManagedRepository>
46 {
47     RepositoryRegistry repositoryRegistry;
48     private static final String CATEGORY = "managed_repository";
49     private static final Pattern REPOSITORY_ID_VALID_EXPRESSION_PATTERN = Pattern.compile( REPOSITORY_ID_VALID_EXPRESSION );
50     private static final Pattern REPOSITORY_NAME_VALID_EXPRESSION_PATTERN = Pattern.compile( REPOSITORY_NAME_VALID_EXPRESSION );
51     private static final Pattern REPOSITORY_LOCATION_VALID_EXPRESSION_PATTERN = Pattern.compile( REPOSITORY_LOCATION_VALID_EXPRESSION );
52
53     private final ConfigurationHandler configurationHandler;
54
55
56     public BasicManagedRepositoryValidator( ConfigurationHandler configurationHandler)
57     {
58         super( CATEGORY );
59         this.configurationHandler = configurationHandler;
60     }
61
62     @Override
63     public ValidationResponse<ManagedRepository> apply( ManagedRepository managedRepository, boolean update )
64     {
65         Map<String, List<ValidationError>> errors = null;
66         if (managedRepository==null) {
67             errors = appendError( errors, "id", ISNULL );
68         }
69         final String repoId = managedRepository.getId( );
70         if ( StringUtils.isBlank( repoId ) ) {
71             errors = appendError( errors, "id", ISEMPTY );
72         }
73
74         if (!update)
75         {
76             if ( repositoryRegistry.hasManagedRepository( managedRepository.getId( ) ) )
77             {
78                 errors = appendError( errors, "id", MANAGED_REPOSITORY_EXISTS, repoId );
79             }
80             else if ( repositoryRegistry.hasRemoteRepository( repoId ) )
81             {
82                 errors = appendError( errors, "id", REMOTE_REPOSITORY_EXISTS, repoId );
83             }
84             else if ( repositoryRegistry.hasRepositoryGroup( repoId ) )
85             {
86                 errors = appendError( errors, "id", REPOSITORY_GROUP_EXISTS, repoId );
87             }
88         }
89
90         if ( !REPOSITORY_ID_VALID_EXPRESSION_PATTERN.matcher( repoId ).matches( ) )
91         {
92             errors = appendError( errors, "id", INVALID_CHARS, repoId, new String[]{"alphanumeric", "_", ".", "-"} );
93         }
94         if ( StringUtils.isBlank( managedRepository.getName() ) )
95         {
96             errors = appendError( errors, "name", ISEMPTY );
97         }
98
99         if ( !REPOSITORY_NAME_VALID_EXPRESSION_PATTERN.matcher( managedRepository.getName() ).matches( ) )
100         {
101             errors = appendError( errors, "name", INVALID_CHARS, managedRepository.getName( ), new String[]{"alphanumeric", "whitespace", "/", "(", ")", "_", ".", "-"} );
102         }
103
104         String cronExpression = managedRepository.getSchedulingDefinition( );
105         if ( StringUtils.isNotBlank( cronExpression ) )
106         {
107             CronExpressionValidator validator = new CronExpressionValidator( );
108
109             if ( !validator.validate( cronExpression ) )
110             {
111                 errors = appendError( errors, "scheduling_definition", INVALID_SCHEDULING_EXPRESSION, cronExpression );
112             }
113         }
114         // Cron expression may be empty
115
116         String repoLocation = interpolateVars( managedRepository.getLocation( ).toString() );
117
118         if ( !REPOSITORY_LOCATION_VALID_EXPRESSION_PATTERN.matcher( repoLocation ).matches() )
119         {
120             errors = appendError( errors, "location", INVALID_LOCATION, repoLocation, new String[]{"alphanumeric", "=", "?", "!", "&", "/", "\\", "_", ".", ":", "~", "-"} );
121         }
122
123         return new ValidationResponse<>( managedRepository, errors );
124     }
125
126     public String interpolateVars( String directory )
127     {
128         Registry registry = configurationHandler.getArchivaConfiguration( ).getRegistry( );
129         String value = StringUtils.replace( directory, "${appserver.base}",
130             registry.getString( "appserver.base", "${appserver.base}" ) );
131         value = StringUtils.replace( value, "${appserver.home}",
132             registry.getString( "appserver.home", "${appserver.home}" ) );
133         return value;
134     }
135
136
137     @Override
138     public void setRepositoryRegistry( RepositoryRegistry repositoryRegistry )
139     {
140         this.repositoryRegistry = repositoryRegistry;
141     }
142
143     @Override
144     public Class<ManagedRepository> getFlavour( )
145     {
146         return ManagedRepository.class;
147     }
148
149 }