]> source.dussan.org Git - archiva.git/blob
47d4fadd3fa292b64a96d47533076668bc363bcb
[archiva.git] /
1 package org.apache.maven.archiva.repository.metadata;
2
3 /*
4  * Licensed to the Apache Software Foundation (ASF) under one
5  * or more contributor license agreements.  See the NOTICE file
6  * distributed with this work for additional information
7  * regarding copyright ownership.  The ASF licenses this file
8  * to you under the Apache License, Version 2.0 (the
9  * "License"); you may not use this file except in compliance
10  * with the License.  You may obtain a copy of the License at
11  *
12  *  http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing,
15  * software distributed under the License is distributed on an
16  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17  * KIND, either express or implied.  See the License for the
18  * specific language governing permissions and limitations
19  * under the License.
20  */
21
22 import java.util.ArrayList;
23 import org.apache.maven.archiva.model.ArchivaModelCloner;
24 import org.apache.maven.archiva.model.ArchivaRepositoryMetadata;
25 import org.apache.maven.archiva.model.SnapshotVersion;
26
27 import java.util.Iterator;
28 import java.util.List;
29 import org.apache.commons.lang.StringUtils;
30 import org.apache.maven.archiva.model.Plugin;
31
32 /**
33  * RepositoryMetadataMerge 
34  *
35  * @version $Id$
36  */
37 public class RepositoryMetadataMerge
38 {
39     public static ArchivaRepositoryMetadata merge( final ArchivaRepositoryMetadata mainMetadata,
40                                                    final ArchivaRepositoryMetadata sourceMetadata )
41         throws RepositoryMetadataException
42     {
43         if ( mainMetadata == null )
44         {
45             throw new RepositoryMetadataException( "Cannot merge a null main project." );
46         }
47
48         if ( sourceMetadata == null )
49         {
50             throw new RepositoryMetadataException( "Cannot copy to a null parent project." );
51         }
52
53         ArchivaRepositoryMetadata merged = new ArchivaRepositoryMetadata();
54
55         merged.setGroupId( merge( mainMetadata.getGroupId(), sourceMetadata.getGroupId() ) );
56         merged.setArtifactId(  merge(mainMetadata.getArtifactId(), sourceMetadata.getArtifactId()));
57         merged.setVersion( merge(mainMetadata.getVersion(), sourceMetadata.getVersion()) );
58         merged.setReleasedVersion( merge( mainMetadata.getReleasedVersion(), sourceMetadata.getReleasedVersion() ) );
59         merged.setSnapshotVersion( merge( mainMetadata.getSnapshotVersion(), sourceMetadata.getSnapshotVersion() ) );
60         merged.setAvailableVersions( mergeAvailableVersions( mainMetadata.getAvailableVersions(), sourceMetadata.getAvailableVersions() ) );
61         merged.setPlugins( mergePlugins( mainMetadata.getPlugins(), sourceMetadata.getPlugins() ) );
62         
63         //Don't set if merge was not possible
64         long lastUpdated = mergeTimestamp( mainMetadata.getLastUpdated(), sourceMetadata.getLastUpdated());
65         if (lastUpdated > -1)
66         {
67             merged.setLastUpdated(  Long.toString(lastUpdated) );
68         }
69         
70         return merged;
71     }
72
73     private static boolean empty( String val )
74     {
75         if ( val == null )
76         {
77             return true;
78         }
79
80         return ( val.trim().length() <= 0 );
81     }
82     
83     private static long mergeTimestamp(String mainTimestamp, String sourceTimestamp)
84     {
85         if (sourceTimestamp == null && mainTimestamp != null)
86         {
87             return convertTimestampToLong(mainTimestamp);
88         }
89         
90         if (mainTimestamp == null && sourceTimestamp != null)
91         {
92             return convertTimestampToLong(sourceTimestamp);
93         }
94         
95         if (sourceTimestamp == null && mainTimestamp == null)
96         {
97             return -1;
98         }
99         
100         return mergeTimestamp(convertTimestampToLong(mainTimestamp), convertTimestampToLong(sourceTimestamp));
101     }
102     
103     private static long mergeTimestamp(long mainTimestamp, long sourceTimestamp)
104     { 
105         return Math.max( mainTimestamp, sourceTimestamp );
106     }
107
108     private static SnapshotVersion merge( SnapshotVersion mainSnapshotVersion, SnapshotVersion sourceSnapshotVersion )
109     {
110         if ( sourceSnapshotVersion == null )
111         {
112             return mainSnapshotVersion;
113         }
114
115         if ( mainSnapshotVersion == null )
116         {
117             return ArchivaModelCloner.clone( sourceSnapshotVersion );
118         }
119
120         SnapshotVersion merged = new SnapshotVersion();
121        
122         long mainSnapshotLastUpdated = convertTimestampToLong(mainSnapshotVersion.getTimestamp());
123         long sourceSnapshotLastUpdated = convertTimestampToLong(sourceSnapshotVersion.getTimestamp());
124                         
125         long lastUpdated = mergeTimestamp(mainSnapshotLastUpdated, sourceSnapshotLastUpdated);
126         
127         if (lastUpdated == mainSnapshotLastUpdated)
128         {
129             merged.setTimestamp(mainSnapshotVersion.getTimestamp());
130             merged.setBuildNumber(mainSnapshotVersion.getBuildNumber());
131         }
132         else
133         {
134             merged.setTimestamp(sourceSnapshotVersion.getTimestamp());
135             merged.setBuildNumber(sourceSnapshotVersion.getBuildNumber());
136         }
137
138         return merged;
139     }
140     
141     private static long convertTimestampToLong(String timestamp)
142     {
143         if (timestamp == null)
144         {
145             return -1;
146         }
147         
148         return getLongFromTimestampSafely(StringUtils.replace(timestamp, ".", ""));
149     }
150     
151     private static long getLongFromTimestampSafely( String timestampString )
152     {
153         try
154         {
155             return Long.parseLong(timestampString);
156         }
157         catch (NumberFormatException e)
158         {
159             return -1;
160         }
161     }
162
163     private static String merge( String main, String source )
164     {
165         if ( empty( main ) && !empty( source ) )
166         {
167             return source;
168         }
169
170         return main;
171     }
172     
173     private static List mergePlugins(List mainPlugins, List sourcePlugins)
174     {
175         if ( sourcePlugins == null )
176         {
177             return mainPlugins;
178         }
179         
180         if ( mainPlugins == null )
181         {
182             return clonePlugins( sourcePlugins );
183         }
184         
185         List merged = clonePlugins( mainPlugins );
186         
187         Iterator it = sourcePlugins.iterator();
188         while ( it.hasNext() )
189         {
190             Plugin plugin = (Plugin) it.next();
191             if ( !merged.contains( plugin ) )
192             {
193                 merged.add( plugin );
194             }
195         }
196
197         return merged;
198     }
199     
200     /**
201      * Clones a list of plugins.
202      * 
203      * This method exists because ArchivaModelCloner.clonePlugins() 
204      * only works with artifact references.
205      * 
206      * @param plugins
207      * @return list of cloned plugins
208      */
209     private static List<Plugin> clonePlugins(List<Plugin> plugins)
210     {
211         if (plugins == null)
212         {
213             return null;
214         }
215         
216         ArrayList result = new ArrayList();
217         
218         for (Plugin plugin : plugins)
219         {
220             Plugin clonedPlugin = new Plugin();
221             clonedPlugin.setArtifactId(plugin.getArtifactId());
222             clonedPlugin.setName(plugin.getName());
223             clonedPlugin.setPrefix(plugin.getPrefix());
224             result.add(plugin);
225         }
226         
227         return result;
228     }
229
230     private static List mergeAvailableVersions( List mainAvailableVersions, List sourceAvailableVersions )
231     {
232         if ( sourceAvailableVersions == null )
233         {
234             return mainAvailableVersions;
235         }
236
237         if ( mainAvailableVersions == null )
238         {
239             return ArchivaModelCloner.cloneAvailableVersions( sourceAvailableVersions );
240         }
241
242         List merged = ArchivaModelCloner.cloneAvailableVersions( mainAvailableVersions );
243
244         Iterator it = sourceAvailableVersions.iterator();
245         while ( it.hasNext() )
246         {
247             String sourceVersion = (String) it.next();
248             if ( !merged.contains( sourceVersion ) )
249             {
250                 merged.add( sourceVersion );
251             }
252         }
253
254         return merged;
255     }
256 }