]> source.dussan.org Git - archiva.git/blob
4b265b6e33bb4c6b450a393b3a4137acd62fce2a
[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.text.ParseException;
23 import java.text.SimpleDateFormat;
24 import java.util.ArrayList;
25 import java.util.Calendar;
26 import java.util.Date;
27 import org.apache.maven.archiva.model.ArchivaModelCloner;
28 import org.apache.maven.archiva.model.ArchivaRepositoryMetadata;
29 import org.apache.maven.archiva.model.SnapshotVersion;
30
31 import java.util.Iterator;
32 import java.util.List;
33 import org.apache.commons.lang.StringUtils;
34 import org.apache.commons.lang.time.DateUtils;
35 import org.apache.maven.archiva.model.Plugin;
36
37 /**
38  * RepositoryMetadataMerge 
39  *
40  * @author <a href="mailto:joakime@apache.org">Joakim Erdfelt</a>
41  * @version $Id$
42  */
43 public class RepositoryMetadataMerge
44 {
45     public static ArchivaRepositoryMetadata merge( final ArchivaRepositoryMetadata mainMetadata,
46                                                    final ArchivaRepositoryMetadata sourceMetadata )
47         throws RepositoryMetadataException
48     {
49         if ( mainMetadata == null )
50         {
51             throw new RepositoryMetadataException( "Cannot merge a null main project." );
52         }
53
54         if ( sourceMetadata == null )
55         {
56             throw new RepositoryMetadataException( "Cannot copy to a null parent project." );
57         }
58
59         ArchivaRepositoryMetadata merged = new ArchivaRepositoryMetadata();
60
61         merged.setGroupId( merge( mainMetadata.getGroupId(), sourceMetadata.getGroupId() ) );
62         merged.setArtifactId(  merge(mainMetadata.getArtifactId(), sourceMetadata.getArtifactId()));
63         merged.setVersion( merge(mainMetadata.getVersion(), sourceMetadata.getVersion()) );
64         merged.setReleasedVersion( merge( mainMetadata.getReleasedVersion(), sourceMetadata.getReleasedVersion() ) );
65         merged.setSnapshotVersion( merge( mainMetadata.getSnapshotVersion(), sourceMetadata.getSnapshotVersion() ) );
66         merged.setAvailableVersions( mergeAvailableVersions( mainMetadata.getAvailableVersions(), sourceMetadata.getAvailableVersions() ) );
67         merged.setPlugins( mergePlugins( mainMetadata.getPlugins(), sourceMetadata.getPlugins() ) );
68         
69         //Don't set if merge was not possible
70         long lastUpdated = mergeTimestamp( mainMetadata.getLastUpdated(), sourceMetadata.getLastUpdated());
71         if (lastUpdated > -1)
72         {
73             merged.setLastUpdated(  Long.toString(lastUpdated) );
74         }
75         
76         return merged;
77     }
78
79     private static boolean empty( String val )
80     {
81         if ( val == null )
82         {
83             return true;
84         }
85
86         return ( val.trim().length() <= 0 );
87     }
88     
89     private static long mergeTimestamp(String mainTimestamp, String sourceTimestamp)
90     {
91         if (sourceTimestamp == null && mainTimestamp != null)
92         {
93             return convertTimestampToLong(mainTimestamp);
94         }
95         
96         if (mainTimestamp == null && sourceTimestamp != null)
97         {
98             return convertTimestampToLong(sourceTimestamp);
99         }
100         
101         if (sourceTimestamp == null && mainTimestamp == null)
102         {
103             return -1;
104         }
105         
106         return mergeTimestamp(convertTimestampToLong(mainTimestamp), convertTimestampToLong(sourceTimestamp));
107     }
108     
109     private static long mergeTimestamp(long mainTimestamp, long sourceTimestamp)
110     { 
111         return Math.max( mainTimestamp, sourceTimestamp );
112     }
113
114     private static SnapshotVersion merge( SnapshotVersion mainSnapshotVersion, SnapshotVersion sourceSnapshotVersion )
115     {
116         if ( sourceSnapshotVersion == null )
117         {
118             return mainSnapshotVersion;
119         }
120
121         if ( mainSnapshotVersion == null )
122         {
123             return ArchivaModelCloner.clone( sourceSnapshotVersion );
124         }
125
126         SnapshotVersion merged = new SnapshotVersion();
127        
128         long mainSnapshotLastUpdated = convertTimestampToLong(mainSnapshotVersion.getTimestamp());
129         long sourceSnapshotLastUpdated = convertTimestampToLong(sourceSnapshotVersion.getTimestamp());
130                         
131         long lastUpdated = mergeTimestamp(mainSnapshotLastUpdated, sourceSnapshotLastUpdated);
132         
133         if (lastUpdated == mainSnapshotLastUpdated)
134         {
135             merged.setTimestamp(mainSnapshotVersion.getTimestamp());
136             merged.setBuildNumber(mainSnapshotVersion.getBuildNumber());
137         }
138         else
139         {
140             merged.setTimestamp(sourceSnapshotVersion.getTimestamp());
141             merged.setBuildNumber(sourceSnapshotVersion.getBuildNumber());
142         }
143
144         return merged;
145     }
146     
147     private static long convertTimestampToLong(String timestamp)
148     {
149         if (timestamp == null)
150         {
151             return -1;
152         }
153         
154         return getLongFromTimestampSafely(StringUtils.replace(timestamp, ".", ""));
155     }
156     
157     private static long getLongFromTimestampSafely( String timestampString )
158     {
159         try
160         {
161             return Long.parseLong(timestampString);
162         }
163         catch (NumberFormatException e)
164         {
165             return -1;
166         }
167     }
168
169     private static String merge( String main, String source )
170     {
171         if ( empty( main ) && !empty( source ) )
172         {
173             return source;
174         }
175
176         return main;
177     }
178     
179     private static List mergePlugins(List mainPlugins, List sourcePlugins)
180     {
181         if ( sourcePlugins == null )
182         {
183             return mainPlugins;
184         }
185         
186         if ( mainPlugins == null )
187         {
188             return clonePlugins( sourcePlugins );
189         }
190         
191         List merged = clonePlugins( mainPlugins );
192         
193         Iterator it = sourcePlugins.iterator();
194         while ( it.hasNext() )
195         {
196             Plugin plugin = (Plugin) it.next();
197             if ( !merged.contains( plugin ) )
198             {
199                 merged.add( plugin );
200             }
201         }
202
203         return merged;
204     }
205     
206     /**
207      * Clones a list of plugins.
208      * 
209      * This method exists because ArchivaModelCloner.clonePlugins() 
210      * only works with artifact references.
211      * 
212      * @param plugins
213      * @return list of cloned plugins
214      */
215     private static List<Plugin> clonePlugins(List<Plugin> plugins)
216     {
217         if (plugins == null)
218         {
219             return null;
220         }
221         
222         ArrayList result = new ArrayList();
223         
224         for (Plugin plugin : plugins)
225         {
226             Plugin clonedPlugin = new Plugin();
227             clonedPlugin.setArtifactId(plugin.getArtifactId());
228             clonedPlugin.setModelEncoding(plugin.getModelEncoding());
229             clonedPlugin.setName(plugin.getName());
230             clonedPlugin.setPrefix(plugin.getPrefix());
231             result.add(plugin);
232         }
233         
234         return result;
235     }
236
237     private static List mergeAvailableVersions( List mainAvailableVersions, List sourceAvailableVersions )
238     {
239         if ( sourceAvailableVersions == null )
240         {
241             return mainAvailableVersions;
242         }
243
244         if ( mainAvailableVersions == null )
245         {
246             return ArchivaModelCloner.cloneAvailableVersions( sourceAvailableVersions );
247         }
248
249         List merged = ArchivaModelCloner.cloneAvailableVersions( mainAvailableVersions );
250
251         Iterator it = sourceAvailableVersions.iterator();
252         while ( it.hasNext() )
253         {
254             String sourceVersion = (String) it.next();
255             if ( !merged.contains( sourceVersion ) )
256             {
257                 merged.add( sourceVersion );
258             }
259         }
260
261         return merged;
262     }
263 }