View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   http://www.apache.org/licenses/LICENSE-2.0
11   *
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  package org.eclipse.aether.internal.impl;
20  
21  import org.eclipse.aether.RepositorySystemSession;
22  import org.eclipse.aether.artifact.Artifact;
23  import org.eclipse.aether.metadata.Metadata;
24  import org.eclipse.aether.repository.RemoteRepository;
25  import org.eclipse.aether.util.ConfigUtils;
26  
27  /**
28   * Support class for {@link LocalPathPrefixComposerFactory} implementations: it predefines and makes re-usable
29   * common configuration getters, and defines a support class for {@link LocalPathPrefixComposer} carrying same
30   * configuration and providing default implementation for all methods.
31   * <p>
32   * Implementors should extend this class to implement custom split strategies. If one needs to alter default
33   * configuration, they should override any configuration getter from this class.
34   *
35   * @see DefaultLocalPathPrefixComposerFactory
36   * @since 1.8.1
37   */
38  public abstract class LocalPathPrefixComposerFactorySupport implements LocalPathPrefixComposerFactory {
39  
40      /**
41       * Whether LRM should split local and remote artifacts.
42       *
43       * @configurationSource {@link RepositorySystemSession#getConfigProperties()}
44       * @configurationType {@link java.lang.Boolean}
45       * @configurationDefaultValue {@link #DEFAULT_SPLIT}
46       */
47      public static final String CONFIG_PROP_SPLIT = EnhancedLocalRepositoryManagerFactory.CONFIG_PROPS_PREFIX + "split";
48  
49      public static final boolean DEFAULT_SPLIT = false;
50  
51      /**
52       * The prefix to use for locally installed artifacts.
53       *
54       * @configurationSource {@link RepositorySystemSession#getConfigProperties()}
55       * @configurationType {@link java.lang.String}
56       * @configurationDefaultValue {@link #DEFAULT_LOCAL_PREFIX}
57       */
58      public static final String CONFIG_PROP_LOCAL_PREFIX =
59              EnhancedLocalRepositoryManagerFactory.CONFIG_PROPS_PREFIX + "localPrefix";
60  
61      public static final String DEFAULT_LOCAL_PREFIX = "installed";
62  
63      /**
64       * Whether locally installed artifacts should be split by version (release/snapshot).
65       *
66       * @configurationSource {@link RepositorySystemSession#getConfigProperties()}
67       * @configurationType {@link java.lang.Boolean}
68       * @configurationDefaultValue {@link #DEFAULT_SPLIT_LOCAL}
69       */
70      public static final String CONFIG_PROP_SPLIT_LOCAL =
71              EnhancedLocalRepositoryManagerFactory.CONFIG_PROPS_PREFIX + "splitLocal";
72  
73      public static final boolean DEFAULT_SPLIT_LOCAL = false;
74  
75      /**
76       * The prefix to use for remotely cached artifacts.
77       *
78       * @configurationSource {@link RepositorySystemSession#getConfigProperties()}
79       * @configurationType {@link java.lang.String}
80       * @configurationDefaultValue {@link #DEFAULT_REMOTE_PREFIX}
81       */
82      public static final String CONFIG_PROP_REMOTE_PREFIX =
83              EnhancedLocalRepositoryManagerFactory.CONFIG_PROPS_PREFIX + "remotePrefix";
84  
85      public static final String DEFAULT_REMOTE_PREFIX = "cached";
86  
87      /**
88       * Whether cached artifacts should be split by version (release/snapshot).
89       *
90       * @configurationSource {@link RepositorySystemSession#getConfigProperties()}
91       * @configurationType {@link java.lang.Boolean}
92       * @configurationDefaultValue {@link #DEFAULT_SPLIT_REMOTE}
93       */
94      public static final String CONFIG_PROP_SPLIT_REMOTE =
95              EnhancedLocalRepositoryManagerFactory.CONFIG_PROPS_PREFIX + "splitRemote";
96  
97      public static final boolean DEFAULT_SPLIT_REMOTE = false;
98  
99      /**
100      * Whether cached artifacts should be split by origin repository (repository ID).
101      *
102      * @configurationSource {@link RepositorySystemSession#getConfigProperties()}
103      * @configurationType {@link java.lang.Boolean}
104      * @configurationDefaultValue {@link #DEFAULT_SPLIT_REMOTE_REPOSITORY}
105      */
106     public static final String CONFIG_PROP_SPLIT_REMOTE_REPOSITORY =
107             EnhancedLocalRepositoryManagerFactory.CONFIG_PROPS_PREFIX + "splitRemoteRepository";
108 
109     public static final boolean DEFAULT_SPLIT_REMOTE_REPOSITORY = false;
110 
111     /**
112      * For cached artifacts, if both splitRemote and splitRemoteRepository are set to true sets the splitting order:
113      * by default it is repositoryId/version (false) or version/repositoryId (true)
114      *
115      * @configurationSource {@link RepositorySystemSession#getConfigProperties()}
116      * @configurationType {@link java.lang.Boolean}
117      * @configurationDefaultValue {@link #DEFAULT_SPLIT_REMOTE_REPOSITORY_LAST}
118      */
119     public static final String CONFIG_PROP_SPLIT_REMOTE_REPOSITORY_LAST =
120             EnhancedLocalRepositoryManagerFactory.CONFIG_PROPS_PREFIX + "splitRemoteRepositoryLast";
121 
122     public static final boolean DEFAULT_SPLIT_REMOTE_REPOSITORY_LAST = false;
123 
124     /**
125      * The prefix to use for release artifacts.
126      *
127      * @configurationSource {@link RepositorySystemSession#getConfigProperties()}
128      * @configurationType {@link java.lang.String}
129      * @configurationDefaultValue {@link #DEFAULT_RELEASES_PREFIX}
130      */
131     public static final String CONFIG_PROP_RELEASES_PREFIX =
132             EnhancedLocalRepositoryManagerFactory.CONFIG_PROPS_PREFIX + "releasesPrefix";
133 
134     public static final String DEFAULT_RELEASES_PREFIX = "releases";
135 
136     /**
137      * The prefix to use for snapshot artifacts.
138      *
139      * @configurationSource {@link RepositorySystemSession#getConfigProperties()}
140      * @configurationType {@link java.lang.String}
141      * @configurationDefaultValue {@link #DEFAULT_SNAPSHOTS_PREFIX}
142      */
143     public static final String CONFIG_PROP_SNAPSHOTS_PREFIX =
144             EnhancedLocalRepositoryManagerFactory.CONFIG_PROPS_PREFIX + "snapshotsPrefix";
145 
146     public static final String DEFAULT_SNAPSHOTS_PREFIX = "snapshots";
147 
148     protected boolean isSplit(RepositorySystemSession session) {
149         return ConfigUtils.getBoolean(session, DEFAULT_SPLIT, CONFIG_PROP_SPLIT);
150     }
151 
152     protected String getLocalPrefix(RepositorySystemSession session) {
153         return ConfigUtils.getString(session, DEFAULT_LOCAL_PREFIX, CONFIG_PROP_LOCAL_PREFIX);
154     }
155 
156     protected boolean isSplitLocal(RepositorySystemSession session) {
157         return ConfigUtils.getBoolean(session, DEFAULT_SPLIT_LOCAL, CONFIG_PROP_SPLIT_LOCAL);
158     }
159 
160     protected String getRemotePrefix(RepositorySystemSession session) {
161         return ConfigUtils.getString(session, DEFAULT_REMOTE_PREFIX, CONFIG_PROP_REMOTE_PREFIX);
162     }
163 
164     protected boolean isSplitRemote(RepositorySystemSession session) {
165         return ConfigUtils.getBoolean(session, DEFAULT_SPLIT_REMOTE, CONFIG_PROP_SPLIT_REMOTE);
166     }
167 
168     protected boolean isSplitRemoteRepository(RepositorySystemSession session) {
169         return ConfigUtils.getBoolean(session, DEFAULT_SPLIT_REMOTE_REPOSITORY, CONFIG_PROP_SPLIT_REMOTE_REPOSITORY);
170     }
171 
172     protected boolean isSplitRemoteRepositoryLast(RepositorySystemSession session) {
173         return ConfigUtils.getBoolean(
174                 session, DEFAULT_SPLIT_REMOTE_REPOSITORY_LAST, CONFIG_PROP_SPLIT_REMOTE_REPOSITORY_LAST);
175     }
176 
177     protected String getReleasesPrefix(RepositorySystemSession session) {
178         return ConfigUtils.getString(session, DEFAULT_RELEASES_PREFIX, CONFIG_PROP_RELEASES_PREFIX);
179     }
180 
181     protected String getSnapshotsPrefix(RepositorySystemSession session) {
182         return ConfigUtils.getString(session, DEFAULT_SNAPSHOTS_PREFIX, CONFIG_PROP_SNAPSHOTS_PREFIX);
183     }
184 
185     /**
186      * Support class for composers: it defines protected members for all the predefined configuration values and
187      * provides default implementation for methods. Implementors may change it's behaviour by overriding methods.
188      */
189     @SuppressWarnings("checkstyle:parameternumber")
190     protected abstract static class LocalPathPrefixComposerSupport implements LocalPathPrefixComposer {
191         protected final boolean split;
192 
193         protected final String localPrefix;
194 
195         protected final boolean splitLocal;
196 
197         protected final String remotePrefix;
198 
199         protected final boolean splitRemote;
200 
201         protected final boolean splitRemoteRepository;
202 
203         protected final boolean splitRemoteRepositoryLast;
204 
205         protected final String releasesPrefix;
206 
207         protected final String snapshotsPrefix;
208 
209         protected LocalPathPrefixComposerSupport(
210                 boolean split,
211                 String localPrefix,
212                 boolean splitLocal,
213                 String remotePrefix,
214                 boolean splitRemote,
215                 boolean splitRemoteRepository,
216                 boolean splitRemoteRepositoryLast,
217                 String releasesPrefix,
218                 String snapshotsPrefix) {
219             this.split = split;
220             this.localPrefix = localPrefix;
221             this.splitLocal = splitLocal;
222             this.remotePrefix = remotePrefix;
223             this.splitRemote = splitRemote;
224             this.splitRemoteRepository = splitRemoteRepository;
225             this.splitRemoteRepositoryLast = splitRemoteRepositoryLast;
226             this.releasesPrefix = releasesPrefix;
227             this.snapshotsPrefix = snapshotsPrefix;
228         }
229 
230         @Override
231         public String getPathPrefixForLocalArtifact(Artifact artifact) {
232             if (!split) {
233                 return null;
234             }
235             String result = localPrefix;
236             if (splitLocal) {
237                 result += "/" + (artifact.isSnapshot() ? snapshotsPrefix : releasesPrefix);
238             }
239             return result;
240         }
241 
242         @Override
243         public String getPathPrefixForRemoteArtifact(Artifact artifact, RemoteRepository repository) {
244             if (!split) {
245                 return null;
246             }
247             String result = remotePrefix;
248             if (!splitRemoteRepositoryLast && splitRemoteRepository) {
249                 result += "/" + repository.getId();
250             }
251             if (splitRemote) {
252                 result += "/" + (artifact.isSnapshot() ? snapshotsPrefix : releasesPrefix);
253             }
254             if (splitRemoteRepositoryLast && splitRemoteRepository) {
255                 result += "/" + repository.getId();
256             }
257             return result;
258         }
259 
260         @Override
261         public String getPathPrefixForLocalMetadata(Metadata metadata) {
262             if (!split) {
263                 return null;
264             }
265             String result = localPrefix;
266             if (splitLocal) {
267                 result += "/" + (isSnapshot(metadata) ? snapshotsPrefix : releasesPrefix);
268             }
269             return result;
270         }
271 
272         @Override
273         public String getPathPrefixForRemoteMetadata(Metadata metadata, RemoteRepository repository) {
274             if (!split) {
275                 return null;
276             }
277             String result = remotePrefix;
278             if (!splitRemoteRepositoryLast && splitRemoteRepository) {
279                 result += "/" + repository.getId();
280             }
281             if (splitRemote) {
282                 result += "/" + (isSnapshot(metadata) ? snapshotsPrefix : releasesPrefix);
283             }
284             if (splitRemoteRepositoryLast && splitRemoteRepository) {
285                 result += "/" + repository.getId();
286             }
287             return result;
288         }
289 
290         protected boolean isSnapshot(Metadata metadata) {
291             return !metadata.getVersion().isEmpty() && metadata.getVersion().endsWith("-SNAPSHOT");
292         }
293     }
294 }