1
2
3
4
5 package org.apache.maven.settings.v4;
6
7 import java.io.ObjectStreamException;
8 import java.util.AbstractList;
9 import java.util.ArrayList;
10 import java.util.Collection;
11 import java.util.HashMap;
12 import java.util.Iterator;
13 import java.util.LinkedHashMap;
14 import java.util.List;
15 import java.util.Map;
16 import java.util.Objects;
17 import java.util.function.BinaryOperator;
18 import java.util.function.Function;
19 import java.util.stream.Collectors;
20
21 import org.apache.maven.api.annotations.Generated;
22 import org.apache.maven.api.xml.XmlNode;
23 import org.apache.maven.api.settings.TrackableBase;
24 import org.apache.maven.api.settings.IdentifiableBase;
25 import org.apache.maven.api.settings.Settings;
26 import org.apache.maven.api.settings.Proxy;
27 import org.apache.maven.api.settings.Server;
28 import org.apache.maven.api.settings.Mirror;
29 import org.apache.maven.api.settings.Profile;
30 import org.apache.maven.api.settings.Activation;
31 import org.apache.maven.api.settings.RepositoryBase;
32 import org.apache.maven.api.settings.Repository;
33 import org.apache.maven.api.settings.RepositoryPolicy;
34 import org.apache.maven.api.settings.ActivationProperty;
35 import org.apache.maven.api.settings.ActivationOS;
36 import org.apache.maven.api.settings.ActivationFile;
37
38 @Generated
39 public class SettingsMerger
40 {
41
42 private final boolean deepMerge;
43
44 public SettingsMerger() {
45 this(true);
46 }
47
48 public SettingsMerger(boolean deepMerge) {
49 this.deepMerge = deepMerge;
50 }
51
52
53
54
55
56
57
58
59
60
61
62
63
64 public Settings merge( Settings target, Settings source, boolean sourceDominant, Map<?, ?> hints )
65 {
66 Objects.requireNonNull( target, "target cannot be null" );
67 if ( source == null )
68 {
69 return target;
70 }
71 Map<Object, Object> context = new HashMap<>();
72 if ( hints != null )
73 {
74 context.putAll( hints );
75 }
76 return mergeSettings( target, source, sourceDominant, context );
77 }
78
79 protected TrackableBase mergeTrackableBase( TrackableBase target, TrackableBase source, boolean sourceDominant, Map<Object, Object> context )
80 {
81 TrackableBase.Builder builder = TrackableBase.newBuilder( target );
82 mergeTrackableBase( builder, target, source, sourceDominant, context );
83 return builder.build();
84 }
85
86 protected void mergeTrackableBase( TrackableBase.Builder builder, TrackableBase target, TrackableBase source, boolean sourceDominant, Map<Object, Object> context )
87 {
88 }
89
90
91 protected IdentifiableBase mergeIdentifiableBase( IdentifiableBase target, IdentifiableBase source, boolean sourceDominant, Map<Object, Object> context )
92 {
93 IdentifiableBase.Builder builder = IdentifiableBase.newBuilder( target );
94 mergeIdentifiableBase( builder, target, source, sourceDominant, context );
95 return builder.build();
96 }
97
98 protected void mergeIdentifiableBase( IdentifiableBase.Builder builder, IdentifiableBase target, IdentifiableBase source, boolean sourceDominant, Map<Object, Object> context )
99 {
100 mergeTrackableBase( builder, target ,source, sourceDominant, context );
101 mergeIdentifiableBase_Id( builder, target, source, sourceDominant, context );
102 }
103
104 protected void mergeIdentifiableBase_Id( IdentifiableBase.Builder builder, IdentifiableBase target, IdentifiableBase source, boolean sourceDominant, Map<Object, Object> context )
105 {
106 String src = source.getId();
107 String tgt = target.getId();
108 if ( src != null && ( sourceDominant || tgt == null ) )
109 {
110 builder.id( src );
111 }
112 }
113
114 protected Settings mergeSettings( Settings target, Settings source, boolean sourceDominant, Map<Object, Object> context )
115 {
116 Settings.Builder builder = Settings.newBuilder( target );
117 mergeSettings( builder, target, source, sourceDominant, context );
118 return builder.build();
119 }
120
121 protected void mergeSettings( Settings.Builder builder, Settings target, Settings source, boolean sourceDominant, Map<Object, Object> context )
122 {
123 mergeTrackableBase( builder, target ,source, sourceDominant, context );
124 mergeSettings_LocalRepository( builder, target, source, sourceDominant, context );
125 mergeSettings_InteractiveMode( builder, target, source, sourceDominant, context );
126 mergeSettings_UsePluginRegistry( builder, target, source, sourceDominant, context );
127 mergeSettings_Offline( builder, target, source, sourceDominant, context );
128 mergeSettings_Proxies( builder, target, source, sourceDominant, context );
129 mergeSettings_Servers( builder, target, source, sourceDominant, context );
130 mergeSettings_Mirrors( builder, target, source, sourceDominant, context );
131 mergeSettings_Profiles( builder, target, source, sourceDominant, context );
132 mergeSettings_ActiveProfiles( builder, target, source, sourceDominant, context );
133 mergeSettings_PluginGroups( builder, target, source, sourceDominant, context );
134 }
135
136 protected void mergeSettings_LocalRepository( Settings.Builder builder, Settings target, Settings source, boolean sourceDominant, Map<Object, Object> context )
137 {
138 String src = source.getLocalRepository();
139 String tgt = target.getLocalRepository();
140 if ( src != null && ( sourceDominant || tgt == null ) )
141 {
142 builder.localRepository( src );
143 }
144 }
145 protected void mergeSettings_InteractiveMode( Settings.Builder builder, Settings target, Settings source, boolean sourceDominant, Map<Object, Object> context )
146 {
147 if ( sourceDominant )
148 {
149 builder.interactiveMode( source.isInteractiveMode() );
150 }
151 }
152 protected void mergeSettings_UsePluginRegistry( Settings.Builder builder, Settings target, Settings source, boolean sourceDominant, Map<Object, Object> context )
153 {
154 if ( sourceDominant )
155 {
156 builder.usePluginRegistry( source.isUsePluginRegistry() );
157 }
158 }
159 protected void mergeSettings_Offline( Settings.Builder builder, Settings target, Settings source, boolean sourceDominant, Map<Object, Object> context )
160 {
161 if ( sourceDominant )
162 {
163 builder.offline( source.isOffline() );
164 }
165 }
166 protected void mergeSettings_Proxies( Settings.Builder builder, Settings target, Settings source, boolean sourceDominant, Map<Object, Object> context )
167 {
168 if (deepMerge) {
169 builder.proxies( merge( target.getProxies(), source.getProxies(), getProxyKey(),
170 ( t, s ) -> mergeProxy( t, s, sourceDominant, context ) ) );
171 } else {
172 builder.proxies( merge( target.getProxies(), source.getProxies(), sourceDominant, getProxyKey() ) );
173 }
174 }
175 protected void mergeSettings_Servers( Settings.Builder builder, Settings target, Settings source, boolean sourceDominant, Map<Object, Object> context )
176 {
177 if (deepMerge) {
178 builder.servers( merge( target.getServers(), source.getServers(), getServerKey(),
179 ( t, s ) -> mergeServer( t, s, sourceDominant, context ) ) );
180 } else {
181 builder.servers( merge( target.getServers(), source.getServers(), sourceDominant, getServerKey() ) );
182 }
183 }
184 protected void mergeSettings_Mirrors( Settings.Builder builder, Settings target, Settings source, boolean sourceDominant, Map<Object, Object> context )
185 {
186 if (deepMerge) {
187 builder.mirrors( merge( target.getMirrors(), source.getMirrors(), getMirrorKey(),
188 ( t, s ) -> mergeMirror( t, s, sourceDominant, context ) ) );
189 } else {
190 builder.mirrors( merge( target.getMirrors(), source.getMirrors(), sourceDominant, getMirrorKey() ) );
191 }
192 }
193 protected void mergeSettings_Profiles( Settings.Builder builder, Settings target, Settings source, boolean sourceDominant, Map<Object, Object> context )
194 {
195 if (deepMerge) {
196 builder.profiles( merge( target.getProfiles(), source.getProfiles(), getProfileKey(),
197 ( t, s ) -> mergeProfile( t, s, sourceDominant, context ) ) );
198 } else {
199 builder.profiles( merge( target.getProfiles(), source.getProfiles(), sourceDominant, getProfileKey() ) );
200 }
201 }
202 protected void mergeSettings_ActiveProfiles( Settings.Builder builder, Settings target, Settings source, boolean sourceDominant, Map<Object, Object> context )
203 {
204 builder.activeProfiles( merge( target.getActiveProfiles(), source.getActiveProfiles(), sourceDominant, e -> e ) );
205 }
206 protected void mergeSettings_PluginGroups( Settings.Builder builder, Settings target, Settings source, boolean sourceDominant, Map<Object, Object> context )
207 {
208 builder.pluginGroups( merge( target.getPluginGroups(), source.getPluginGroups(), sourceDominant, e -> e ) );
209 }
210
211 protected Proxy mergeProxy( Proxy target, Proxy source, boolean sourceDominant, Map<Object, Object> context )
212 {
213 Proxy.Builder builder = Proxy.newBuilder( target );
214 mergeProxy( builder, target, source, sourceDominant, context );
215 return builder.build();
216 }
217
218 protected void mergeProxy( Proxy.Builder builder, Proxy target, Proxy source, boolean sourceDominant, Map<Object, Object> context )
219 {
220 mergeIdentifiableBase( builder, target ,source, sourceDominant, context );
221 mergeProxy_Active( builder, target, source, sourceDominant, context );
222 mergeProxy_Protocol( builder, target, source, sourceDominant, context );
223 mergeProxy_Username( builder, target, source, sourceDominant, context );
224 mergeProxy_Password( builder, target, source, sourceDominant, context );
225 mergeProxy_Port( builder, target, source, sourceDominant, context );
226 mergeProxy_Host( builder, target, source, sourceDominant, context );
227 mergeProxy_NonProxyHosts( builder, target, source, sourceDominant, context );
228 }
229
230 protected void mergeProxy_Id( Proxy.Builder builder, Proxy target, Proxy source, boolean sourceDominant, Map<Object, Object> context )
231 {
232 String src = source.getId();
233 String tgt = target.getId();
234 if ( src != null && ( sourceDominant || tgt == null ) )
235 {
236 builder.id( src );
237 }
238 }
239 protected void mergeProxy_Active( Proxy.Builder builder, Proxy target, Proxy source, boolean sourceDominant, Map<Object, Object> context )
240 {
241 if ( sourceDominant )
242 {
243 builder.active( source.isActive() );
244 }
245 }
246 protected void mergeProxy_Protocol( Proxy.Builder builder, Proxy target, Proxy source, boolean sourceDominant, Map<Object, Object> context )
247 {
248 String src = source.getProtocol();
249 String tgt = target.getProtocol();
250 if ( src != null && ( sourceDominant || tgt == null ) )
251 {
252 builder.protocol( src );
253 }
254 }
255 protected void mergeProxy_Username( Proxy.Builder builder, Proxy target, Proxy source, boolean sourceDominant, Map<Object, Object> context )
256 {
257 String src = source.getUsername();
258 String tgt = target.getUsername();
259 if ( src != null && ( sourceDominant || tgt == null ) )
260 {
261 builder.username( src );
262 }
263 }
264 protected void mergeProxy_Password( Proxy.Builder builder, Proxy target, Proxy source, boolean sourceDominant, Map<Object, Object> context )
265 {
266 String src = source.getPassword();
267 String tgt = target.getPassword();
268 if ( src != null && ( sourceDominant || tgt == null ) )
269 {
270 builder.password( src );
271 }
272 }
273 protected void mergeProxy_Port( Proxy.Builder builder, Proxy target, Proxy source, boolean sourceDominant, Map<Object, Object> context )
274 {
275 if ( sourceDominant )
276 {
277 builder.port( source.getPort() );
278 }
279 }
280 protected void mergeProxy_Host( Proxy.Builder builder, Proxy target, Proxy source, boolean sourceDominant, Map<Object, Object> context )
281 {
282 String src = source.getHost();
283 String tgt = target.getHost();
284 if ( src != null && ( sourceDominant || tgt == null ) )
285 {
286 builder.host( src );
287 }
288 }
289 protected void mergeProxy_NonProxyHosts( Proxy.Builder builder, Proxy target, Proxy source, boolean sourceDominant, Map<Object, Object> context )
290 {
291 String src = source.getNonProxyHosts();
292 String tgt = target.getNonProxyHosts();
293 if ( src != null && ( sourceDominant || tgt == null ) )
294 {
295 builder.nonProxyHosts( src );
296 }
297 }
298
299 protected Server mergeServer( Server target, Server source, boolean sourceDominant, Map<Object, Object> context )
300 {
301 Server.Builder builder = Server.newBuilder( target );
302 mergeServer( builder, target, source, sourceDominant, context );
303 return builder.build();
304 }
305
306 protected void mergeServer( Server.Builder builder, Server target, Server source, boolean sourceDominant, Map<Object, Object> context )
307 {
308 mergeIdentifiableBase( builder, target ,source, sourceDominant, context );
309 mergeServer_Username( builder, target, source, sourceDominant, context );
310 mergeServer_Password( builder, target, source, sourceDominant, context );
311 mergeServer_PrivateKey( builder, target, source, sourceDominant, context );
312 mergeServer_Passphrase( builder, target, source, sourceDominant, context );
313 mergeServer_FilePermissions( builder, target, source, sourceDominant, context );
314 mergeServer_DirectoryPermissions( builder, target, source, sourceDominant, context );
315 mergeServer_Configuration( builder, target, source, sourceDominant, context );
316 }
317
318 protected void mergeServer_Id( Server.Builder builder, Server target, Server source, boolean sourceDominant, Map<Object, Object> context )
319 {
320 String src = source.getId();
321 String tgt = target.getId();
322 if ( src != null && ( sourceDominant || tgt == null ) )
323 {
324 builder.id( src );
325 }
326 }
327 protected void mergeServer_Username( Server.Builder builder, Server target, Server source, boolean sourceDominant, Map<Object, Object> context )
328 {
329 String src = source.getUsername();
330 String tgt = target.getUsername();
331 if ( src != null && ( sourceDominant || tgt == null ) )
332 {
333 builder.username( src );
334 }
335 }
336 protected void mergeServer_Password( Server.Builder builder, Server target, Server source, boolean sourceDominant, Map<Object, Object> context )
337 {
338 String src = source.getPassword();
339 String tgt = target.getPassword();
340 if ( src != null && ( sourceDominant || tgt == null ) )
341 {
342 builder.password( src );
343 }
344 }
345 protected void mergeServer_PrivateKey( Server.Builder builder, Server target, Server source, boolean sourceDominant, Map<Object, Object> context )
346 {
347 String src = source.getPrivateKey();
348 String tgt = target.getPrivateKey();
349 if ( src != null && ( sourceDominant || tgt == null ) )
350 {
351 builder.privateKey( src );
352 }
353 }
354 protected void mergeServer_Passphrase( Server.Builder builder, Server target, Server source, boolean sourceDominant, Map<Object, Object> context )
355 {
356 String src = source.getPassphrase();
357 String tgt = target.getPassphrase();
358 if ( src != null && ( sourceDominant || tgt == null ) )
359 {
360 builder.passphrase( src );
361 }
362 }
363 protected void mergeServer_FilePermissions( Server.Builder builder, Server target, Server source, boolean sourceDominant, Map<Object, Object> context )
364 {
365 String src = source.getFilePermissions();
366 String tgt = target.getFilePermissions();
367 if ( src != null && ( sourceDominant || tgt == null ) )
368 {
369 builder.filePermissions( src );
370 }
371 }
372 protected void mergeServer_DirectoryPermissions( Server.Builder builder, Server target, Server source, boolean sourceDominant, Map<Object, Object> context )
373 {
374 String src = source.getDirectoryPermissions();
375 String tgt = target.getDirectoryPermissions();
376 if ( src != null && ( sourceDominant || tgt == null ) )
377 {
378 builder.directoryPermissions( src );
379 }
380 }
381 protected void mergeServer_Configuration( Server.Builder builder, Server target, Server source, boolean sourceDominant, Map<Object, Object> context )
382 {
383 XmlNode src = source.getConfiguration();
384 if ( src != null )
385 {
386 XmlNode tgt = target.getConfiguration();
387 if ( tgt == null )
388 {
389 builder.configuration( src );
390 }
391 else if ( sourceDominant )
392 {
393 builder.configuration( src.merge( tgt ) );
394 }
395 else
396 {
397 builder.configuration( tgt.merge( src ) );
398 }
399 }
400 }
401
402 protected Mirror mergeMirror( Mirror target, Mirror source, boolean sourceDominant, Map<Object, Object> context )
403 {
404 Mirror.Builder builder = Mirror.newBuilder( target );
405 mergeMirror( builder, target, source, sourceDominant, context );
406 return builder.build();
407 }
408
409 protected void mergeMirror( Mirror.Builder builder, Mirror target, Mirror source, boolean sourceDominant, Map<Object, Object> context )
410 {
411 mergeIdentifiableBase( builder, target ,source, sourceDominant, context );
412 mergeMirror_MirrorOf( builder, target, source, sourceDominant, context );
413 mergeMirror_Name( builder, target, source, sourceDominant, context );
414 mergeMirror_Url( builder, target, source, sourceDominant, context );
415 mergeMirror_Layout( builder, target, source, sourceDominant, context );
416 mergeMirror_MirrorOfLayouts( builder, target, source, sourceDominant, context );
417 mergeMirror_Blocked( builder, target, source, sourceDominant, context );
418 }
419
420 protected void mergeMirror_Id( Mirror.Builder builder, Mirror target, Mirror source, boolean sourceDominant, Map<Object, Object> context )
421 {
422 String src = source.getId();
423 String tgt = target.getId();
424 if ( src != null && ( sourceDominant || tgt == null ) )
425 {
426 builder.id( src );
427 }
428 }
429 protected void mergeMirror_MirrorOf( Mirror.Builder builder, Mirror target, Mirror source, boolean sourceDominant, Map<Object, Object> context )
430 {
431 String src = source.getMirrorOf();
432 String tgt = target.getMirrorOf();
433 if ( src != null && ( sourceDominant || tgt == null ) )
434 {
435 builder.mirrorOf( src );
436 }
437 }
438 protected void mergeMirror_Name( Mirror.Builder builder, Mirror target, Mirror source, boolean sourceDominant, Map<Object, Object> context )
439 {
440 String src = source.getName();
441 String tgt = target.getName();
442 if ( src != null && ( sourceDominant || tgt == null ) )
443 {
444 builder.name( src );
445 }
446 }
447 protected void mergeMirror_Url( Mirror.Builder builder, Mirror target, Mirror source, boolean sourceDominant, Map<Object, Object> context )
448 {
449 String src = source.getUrl();
450 String tgt = target.getUrl();
451 if ( src != null && ( sourceDominant || tgt == null ) )
452 {
453 builder.url( src );
454 }
455 }
456 protected void mergeMirror_Layout( Mirror.Builder builder, Mirror target, Mirror source, boolean sourceDominant, Map<Object, Object> context )
457 {
458 String src = source.getLayout();
459 String tgt = target.getLayout();
460 if ( src != null && ( sourceDominant || tgt == null ) )
461 {
462 builder.layout( src );
463 }
464 }
465 protected void mergeMirror_MirrorOfLayouts( Mirror.Builder builder, Mirror target, Mirror source, boolean sourceDominant, Map<Object, Object> context )
466 {
467 String src = source.getMirrorOfLayouts();
468 String tgt = target.getMirrorOfLayouts();
469 if ( src != null && ( sourceDominant || tgt == null ) )
470 {
471 builder.mirrorOfLayouts( src );
472 }
473 }
474 protected void mergeMirror_Blocked( Mirror.Builder builder, Mirror target, Mirror source, boolean sourceDominant, Map<Object, Object> context )
475 {
476 if ( sourceDominant )
477 {
478 builder.blocked( source.isBlocked() );
479 }
480 }
481
482 protected Profile mergeProfile( Profile target, Profile source, boolean sourceDominant, Map<Object, Object> context )
483 {
484 Profile.Builder builder = Profile.newBuilder( target );
485 mergeProfile( builder, target, source, sourceDominant, context );
486 return builder.build();
487 }
488
489 protected void mergeProfile( Profile.Builder builder, Profile target, Profile source, boolean sourceDominant, Map<Object, Object> context )
490 {
491 mergeIdentifiableBase( builder, target ,source, sourceDominant, context );
492 mergeProfile_Activation( builder, target, source, sourceDominant, context );
493 mergeProfile_Properties( builder, target, source, sourceDominant, context );
494 mergeProfile_Repositories( builder, target, source, sourceDominant, context );
495 mergeProfile_PluginRepositories( builder, target, source, sourceDominant, context );
496 }
497
498 protected void mergeProfile_Id( Profile.Builder builder, Profile target, Profile source, boolean sourceDominant, Map<Object, Object> context )
499 {
500 String src = source.getId();
501 String tgt = target.getId();
502 if ( src != null && ( sourceDominant || tgt == null ) )
503 {
504 builder.id( src );
505 }
506 }
507 protected void mergeProfile_Activation( Profile.Builder builder, Profile target, Profile source, boolean sourceDominant, Map<Object, Object> context )
508 {
509 Activation src = source.getActivation();
510 if ( src != null )
511 {
512 Activation tgt = target.getActivation();
513 if ( tgt == null )
514 {
515 tgt = Activation.newInstance( false );
516 }
517 Activation merged = mergeActivation( tgt, src, sourceDominant, context );
518 if ( merged == src )
519 {
520 builder.activation( merged );
521 }
522 else if ( merged != tgt )
523 {
524 builder.activation( merged );
525 }
526 }
527 }
528 protected void mergeProfile_Properties( Profile.Builder builder, Profile target, Profile source, boolean sourceDominant, Map<Object, Object> context )
529 {
530 Map<String, String> src = source.getProperties();
531 if ( !src.isEmpty() )
532 {
533 Map<String, String> tgt = target.getProperties();
534 if ( tgt.isEmpty() )
535 {
536 builder.properties( src );
537 }
538 else
539 {
540 Map<String, String> merged = new HashMap<>();
541 merged.putAll( sourceDominant ? target.getProperties() : source.getProperties() );
542 merged.putAll( sourceDominant ? source.getProperties() : target.getProperties() );
543 builder.properties( merged );
544 }
545 }
546 }
547 protected void mergeProfile_Repositories( Profile.Builder builder, Profile target, Profile source, boolean sourceDominant, Map<Object, Object> context )
548 {
549 if (deepMerge) {
550 builder.repositories( merge( target.getRepositories(), source.getRepositories(), getRepositoryKey(),
551 ( t, s ) -> mergeRepository( t, s, sourceDominant, context ) ) );
552 } else {
553 builder.repositories( merge( target.getRepositories(), source.getRepositories(), sourceDominant, getRepositoryKey() ) );
554 }
555 }
556 protected void mergeProfile_PluginRepositories( Profile.Builder builder, Profile target, Profile source, boolean sourceDominant, Map<Object, Object> context )
557 {
558 if (deepMerge) {
559 builder.pluginRepositories( merge( target.getPluginRepositories(), source.getPluginRepositories(), getRepositoryKey(),
560 ( t, s ) -> mergeRepository( t, s, sourceDominant, context ) ) );
561 } else {
562 builder.pluginRepositories( merge( target.getPluginRepositories(), source.getPluginRepositories(), sourceDominant, getRepositoryKey() ) );
563 }
564 }
565
566 protected Activation mergeActivation( Activation target, Activation source, boolean sourceDominant, Map<Object, Object> context )
567 {
568 Activation.Builder builder = Activation.newBuilder( target );
569 mergeActivation( builder, target, source, sourceDominant, context );
570 return builder.build();
571 }
572
573 protected void mergeActivation( Activation.Builder builder, Activation target, Activation source, boolean sourceDominant, Map<Object, Object> context )
574 {
575 mergeActivation_ActiveByDefault( builder, target, source, sourceDominant, context );
576 mergeActivation_Jdk( builder, target, source, sourceDominant, context );
577 mergeActivation_Os( builder, target, source, sourceDominant, context );
578 mergeActivation_Property( builder, target, source, sourceDominant, context );
579 mergeActivation_File( builder, target, source, sourceDominant, context );
580 }
581
582 protected void mergeActivation_ActiveByDefault( Activation.Builder builder, Activation target, Activation source, boolean sourceDominant, Map<Object, Object> context )
583 {
584 if ( sourceDominant )
585 {
586 builder.activeByDefault( source.isActiveByDefault() );
587 }
588 }
589 protected void mergeActivation_Jdk( Activation.Builder builder, Activation target, Activation source, boolean sourceDominant, Map<Object, Object> context )
590 {
591 String src = source.getJdk();
592 String tgt = target.getJdk();
593 if ( src != null && ( sourceDominant || tgt == null ) )
594 {
595 builder.jdk( src );
596 }
597 }
598 protected void mergeActivation_Os( Activation.Builder builder, Activation target, Activation source, boolean sourceDominant, Map<Object, Object> context )
599 {
600 ActivationOS src = source.getOs();
601 if ( src != null )
602 {
603 ActivationOS tgt = target.getOs();
604 if ( tgt == null )
605 {
606 tgt = ActivationOS.newInstance( false );
607 }
608 ActivationOS merged = mergeActivationOS( tgt, src, sourceDominant, context );
609 if ( merged == src )
610 {
611 builder.os( merged );
612 }
613 else if ( merged != tgt )
614 {
615 builder.os( merged );
616 }
617 }
618 }
619 protected void mergeActivation_Property( Activation.Builder builder, Activation target, Activation source, boolean sourceDominant, Map<Object, Object> context )
620 {
621 ActivationProperty src = source.getProperty();
622 if ( src != null )
623 {
624 ActivationProperty tgt = target.getProperty();
625 if ( tgt == null )
626 {
627 tgt = ActivationProperty.newInstance( false );
628 }
629 ActivationProperty merged = mergeActivationProperty( tgt, src, sourceDominant, context );
630 if ( merged == src )
631 {
632 builder.property( merged );
633 }
634 else if ( merged != tgt )
635 {
636 builder.property( merged );
637 }
638 }
639 }
640 protected void mergeActivation_File( Activation.Builder builder, Activation target, Activation source, boolean sourceDominant, Map<Object, Object> context )
641 {
642 ActivationFile src = source.getFile();
643 if ( src != null )
644 {
645 ActivationFile tgt = target.getFile();
646 if ( tgt == null )
647 {
648 tgt = ActivationFile.newInstance( false );
649 }
650 ActivationFile merged = mergeActivationFile( tgt, src, sourceDominant, context );
651 if ( merged == src )
652 {
653 builder.file( merged );
654 }
655 else if ( merged != tgt )
656 {
657 builder.file( merged );
658 }
659 }
660 }
661
662 protected RepositoryBase mergeRepositoryBase( RepositoryBase target, RepositoryBase source, boolean sourceDominant, Map<Object, Object> context )
663 {
664 RepositoryBase.Builder builder = RepositoryBase.newBuilder( target );
665 mergeRepositoryBase( builder, target, source, sourceDominant, context );
666 return builder.build();
667 }
668
669 protected void mergeRepositoryBase( RepositoryBase.Builder builder, RepositoryBase target, RepositoryBase source, boolean sourceDominant, Map<Object, Object> context )
670 {
671 mergeRepositoryBase_Id( builder, target, source, sourceDominant, context );
672 mergeRepositoryBase_Name( builder, target, source, sourceDominant, context );
673 mergeRepositoryBase_Url( builder, target, source, sourceDominant, context );
674 mergeRepositoryBase_Layout( builder, target, source, sourceDominant, context );
675 }
676
677 protected void mergeRepositoryBase_Id( RepositoryBase.Builder builder, RepositoryBase target, RepositoryBase source, boolean sourceDominant, Map<Object, Object> context )
678 {
679 String src = source.getId();
680 String tgt = target.getId();
681 if ( src != null && ( sourceDominant || tgt == null ) )
682 {
683 builder.id( src );
684 }
685 }
686 protected void mergeRepositoryBase_Name( RepositoryBase.Builder builder, RepositoryBase target, RepositoryBase source, boolean sourceDominant, Map<Object, Object> context )
687 {
688 String src = source.getName();
689 String tgt = target.getName();
690 if ( src != null && ( sourceDominant || tgt == null ) )
691 {
692 builder.name( src );
693 }
694 }
695 protected void mergeRepositoryBase_Url( RepositoryBase.Builder builder, RepositoryBase target, RepositoryBase source, boolean sourceDominant, Map<Object, Object> context )
696 {
697 String src = source.getUrl();
698 String tgt = target.getUrl();
699 if ( src != null && ( sourceDominant || tgt == null ) )
700 {
701 builder.url( src );
702 }
703 }
704 protected void mergeRepositoryBase_Layout( RepositoryBase.Builder builder, RepositoryBase target, RepositoryBase source, boolean sourceDominant, Map<Object, Object> context )
705 {
706 String src = source.getLayout();
707 String tgt = target.getLayout();
708 if ( src != null && ( sourceDominant || tgt == null ) )
709 {
710 builder.layout( src );
711 }
712 }
713
714 protected Repository mergeRepository( Repository target, Repository source, boolean sourceDominant, Map<Object, Object> context )
715 {
716 Repository.Builder builder = Repository.newBuilder( target );
717 mergeRepository( builder, target, source, sourceDominant, context );
718 return builder.build();
719 }
720
721 protected void mergeRepository( Repository.Builder builder, Repository target, Repository source, boolean sourceDominant, Map<Object, Object> context )
722 {
723 mergeRepositoryBase( builder, target ,source, sourceDominant, context );
724 mergeRepository_Releases( builder, target, source, sourceDominant, context );
725 mergeRepository_Snapshots( builder, target, source, sourceDominant, context );
726 }
727
728 protected void mergeRepository_Id( Repository.Builder builder, Repository target, Repository source, boolean sourceDominant, Map<Object, Object> context )
729 {
730 String src = source.getId();
731 String tgt = target.getId();
732 if ( src != null && ( sourceDominant || tgt == null ) )
733 {
734 builder.id( src );
735 }
736 }
737 protected void mergeRepository_Name( Repository.Builder builder, Repository target, Repository source, boolean sourceDominant, Map<Object, Object> context )
738 {
739 String src = source.getName();
740 String tgt = target.getName();
741 if ( src != null && ( sourceDominant || tgt == null ) )
742 {
743 builder.name( src );
744 }
745 }
746 protected void mergeRepository_Url( Repository.Builder builder, Repository target, Repository source, boolean sourceDominant, Map<Object, Object> context )
747 {
748 String src = source.getUrl();
749 String tgt = target.getUrl();
750 if ( src != null && ( sourceDominant || tgt == null ) )
751 {
752 builder.url( src );
753 }
754 }
755 protected void mergeRepository_Layout( Repository.Builder builder, Repository target, Repository source, boolean sourceDominant, Map<Object, Object> context )
756 {
757 String src = source.getLayout();
758 String tgt = target.getLayout();
759 if ( src != null && ( sourceDominant || tgt == null ) )
760 {
761 builder.layout( src );
762 }
763 }
764 protected void mergeRepository_Releases( Repository.Builder builder, Repository target, Repository source, boolean sourceDominant, Map<Object, Object> context )
765 {
766 RepositoryPolicy src = source.getReleases();
767 if ( src != null )
768 {
769 RepositoryPolicy tgt = target.getReleases();
770 if ( tgt == null )
771 {
772 tgt = RepositoryPolicy.newInstance( false );
773 }
774 RepositoryPolicy merged = mergeRepositoryPolicy( tgt, src, sourceDominant, context );
775 if ( merged == src )
776 {
777 builder.releases( merged );
778 }
779 else if ( merged != tgt )
780 {
781 builder.releases( merged );
782 }
783 }
784 }
785 protected void mergeRepository_Snapshots( Repository.Builder builder, Repository target, Repository source, boolean sourceDominant, Map<Object, Object> context )
786 {
787 RepositoryPolicy src = source.getSnapshots();
788 if ( src != null )
789 {
790 RepositoryPolicy tgt = target.getSnapshots();
791 if ( tgt == null )
792 {
793 tgt = RepositoryPolicy.newInstance( false );
794 }
795 RepositoryPolicy merged = mergeRepositoryPolicy( tgt, src, sourceDominant, context );
796 if ( merged == src )
797 {
798 builder.snapshots( merged );
799 }
800 else if ( merged != tgt )
801 {
802 builder.snapshots( merged );
803 }
804 }
805 }
806
807 protected RepositoryPolicy mergeRepositoryPolicy( RepositoryPolicy target, RepositoryPolicy source, boolean sourceDominant, Map<Object, Object> context )
808 {
809 RepositoryPolicy.Builder builder = RepositoryPolicy.newBuilder( target );
810 mergeRepositoryPolicy( builder, target, source, sourceDominant, context );
811 return builder.build();
812 }
813
814 protected void mergeRepositoryPolicy( RepositoryPolicy.Builder builder, RepositoryPolicy target, RepositoryPolicy source, boolean sourceDominant, Map<Object, Object> context )
815 {
816 mergeRepositoryPolicy_Enabled( builder, target, source, sourceDominant, context );
817 mergeRepositoryPolicy_UpdatePolicy( builder, target, source, sourceDominant, context );
818 mergeRepositoryPolicy_ChecksumPolicy( builder, target, source, sourceDominant, context );
819 }
820
821 protected void mergeRepositoryPolicy_Enabled( RepositoryPolicy.Builder builder, RepositoryPolicy target, RepositoryPolicy source, boolean sourceDominant, Map<Object, Object> context )
822 {
823 if ( sourceDominant )
824 {
825 builder.enabled( source.isEnabled() );
826 }
827 }
828 protected void mergeRepositoryPolicy_UpdatePolicy( RepositoryPolicy.Builder builder, RepositoryPolicy target, RepositoryPolicy source, boolean sourceDominant, Map<Object, Object> context )
829 {
830 String src = source.getUpdatePolicy();
831 String tgt = target.getUpdatePolicy();
832 if ( src != null && ( sourceDominant || tgt == null ) )
833 {
834 builder.updatePolicy( src );
835 }
836 }
837 protected void mergeRepositoryPolicy_ChecksumPolicy( RepositoryPolicy.Builder builder, RepositoryPolicy target, RepositoryPolicy source, boolean sourceDominant, Map<Object, Object> context )
838 {
839 String src = source.getChecksumPolicy();
840 String tgt = target.getChecksumPolicy();
841 if ( src != null && ( sourceDominant || tgt == null ) )
842 {
843 builder.checksumPolicy( src );
844 }
845 }
846
847 protected ActivationProperty mergeActivationProperty( ActivationProperty target, ActivationProperty source, boolean sourceDominant, Map<Object, Object> context )
848 {
849 ActivationProperty.Builder builder = ActivationProperty.newBuilder( target );
850 mergeActivationProperty( builder, target, source, sourceDominant, context );
851 return builder.build();
852 }
853
854 protected void mergeActivationProperty( ActivationProperty.Builder builder, ActivationProperty target, ActivationProperty source, boolean sourceDominant, Map<Object, Object> context )
855 {
856 mergeActivationProperty_Name( builder, target, source, sourceDominant, context );
857 mergeActivationProperty_Value( builder, target, source, sourceDominant, context );
858 }
859
860 protected void mergeActivationProperty_Name( ActivationProperty.Builder builder, ActivationProperty target, ActivationProperty source, boolean sourceDominant, Map<Object, Object> context )
861 {
862 String src = source.getName();
863 String tgt = target.getName();
864 if ( src != null && ( sourceDominant || tgt == null ) )
865 {
866 builder.name( src );
867 }
868 }
869 protected void mergeActivationProperty_Value( ActivationProperty.Builder builder, ActivationProperty target, ActivationProperty source, boolean sourceDominant, Map<Object, Object> context )
870 {
871 String src = source.getValue();
872 String tgt = target.getValue();
873 if ( src != null && ( sourceDominant || tgt == null ) )
874 {
875 builder.value( src );
876 }
877 }
878
879 protected ActivationOS mergeActivationOS( ActivationOS target, ActivationOS source, boolean sourceDominant, Map<Object, Object> context )
880 {
881 ActivationOS.Builder builder = ActivationOS.newBuilder( target );
882 mergeActivationOS( builder, target, source, sourceDominant, context );
883 return builder.build();
884 }
885
886 protected void mergeActivationOS( ActivationOS.Builder builder, ActivationOS target, ActivationOS source, boolean sourceDominant, Map<Object, Object> context )
887 {
888 mergeActivationOS_Name( builder, target, source, sourceDominant, context );
889 mergeActivationOS_Family( builder, target, source, sourceDominant, context );
890 mergeActivationOS_Arch( builder, target, source, sourceDominant, context );
891 mergeActivationOS_Version( builder, target, source, sourceDominant, context );
892 }
893
894 protected void mergeActivationOS_Name( ActivationOS.Builder builder, ActivationOS target, ActivationOS source, boolean sourceDominant, Map<Object, Object> context )
895 {
896 String src = source.getName();
897 String tgt = target.getName();
898 if ( src != null && ( sourceDominant || tgt == null ) )
899 {
900 builder.name( src );
901 }
902 }
903 protected void mergeActivationOS_Family( ActivationOS.Builder builder, ActivationOS target, ActivationOS source, boolean sourceDominant, Map<Object, Object> context )
904 {
905 String src = source.getFamily();
906 String tgt = target.getFamily();
907 if ( src != null && ( sourceDominant || tgt == null ) )
908 {
909 builder.family( src );
910 }
911 }
912 protected void mergeActivationOS_Arch( ActivationOS.Builder builder, ActivationOS target, ActivationOS source, boolean sourceDominant, Map<Object, Object> context )
913 {
914 String src = source.getArch();
915 String tgt = target.getArch();
916 if ( src != null && ( sourceDominant || tgt == null ) )
917 {
918 builder.arch( src );
919 }
920 }
921 protected void mergeActivationOS_Version( ActivationOS.Builder builder, ActivationOS target, ActivationOS source, boolean sourceDominant, Map<Object, Object> context )
922 {
923 String src = source.getVersion();
924 String tgt = target.getVersion();
925 if ( src != null && ( sourceDominant || tgt == null ) )
926 {
927 builder.version( src );
928 }
929 }
930
931 protected ActivationFile mergeActivationFile( ActivationFile target, ActivationFile source, boolean sourceDominant, Map<Object, Object> context )
932 {
933 ActivationFile.Builder builder = ActivationFile.newBuilder( target );
934 mergeActivationFile( builder, target, source, sourceDominant, context );
935 return builder.build();
936 }
937
938 protected void mergeActivationFile( ActivationFile.Builder builder, ActivationFile target, ActivationFile source, boolean sourceDominant, Map<Object, Object> context )
939 {
940 mergeActivationFile_Missing( builder, target, source, sourceDominant, context );
941 mergeActivationFile_Exists( builder, target, source, sourceDominant, context );
942 }
943
944 protected void mergeActivationFile_Missing( ActivationFile.Builder builder, ActivationFile target, ActivationFile source, boolean sourceDominant, Map<Object, Object> context )
945 {
946 String src = source.getMissing();
947 String tgt = target.getMissing();
948 if ( src != null && ( sourceDominant || tgt == null ) )
949 {
950 builder.missing( src );
951 }
952 }
953 protected void mergeActivationFile_Exists( ActivationFile.Builder builder, ActivationFile target, ActivationFile source, boolean sourceDominant, Map<Object, Object> context )
954 {
955 String src = source.getExists();
956 String tgt = target.getExists();
957 if ( src != null && ( sourceDominant || tgt == null ) )
958 {
959 builder.exists( src );
960 }
961 }
962
963
964 protected KeyComputer<TrackableBase> getTrackableBaseKey()
965 {
966 return v -> v;
967 }
968 protected KeyComputer<IdentifiableBase> getIdentifiableBaseKey()
969 {
970 return v -> v;
971 }
972 protected KeyComputer<Settings> getSettingsKey()
973 {
974 return v -> v;
975 }
976 protected KeyComputer<Proxy> getProxyKey()
977 {
978 return v -> v;
979 }
980 protected KeyComputer<Server> getServerKey()
981 {
982 return v -> v;
983 }
984 protected KeyComputer<Mirror> getMirrorKey()
985 {
986 return v -> v;
987 }
988 protected KeyComputer<Profile> getProfileKey()
989 {
990 return v -> v;
991 }
992 protected KeyComputer<Activation> getActivationKey()
993 {
994 return v -> v;
995 }
996 protected KeyComputer<RepositoryBase> getRepositoryBaseKey()
997 {
998 return v -> v;
999 }
1000 protected KeyComputer<Repository> getRepositoryKey()
1001 {
1002 return v -> v;
1003 }
1004 protected KeyComputer<RepositoryPolicy> getRepositoryPolicyKey()
1005 {
1006 return v -> v;
1007 }
1008 protected KeyComputer<ActivationProperty> getActivationPropertyKey()
1009 {
1010 return v -> v;
1011 }
1012 protected KeyComputer<ActivationOS> getActivationOSKey()
1013 {
1014 return v -> v;
1015 }
1016 protected KeyComputer<ActivationFile> getActivationFileKey()
1017 {
1018 return v -> v;
1019 }
1020
1021
1022
1023
1024
1025 @FunctionalInterface
1026 public interface KeyComputer<T> extends Function<T, Object>
1027 {
1028 }
1029
1030
1031
1032
1033 public static <T> List<T> merge( List<T> tgt, List<T> src, boolean sourceDominant, KeyComputer<T> computer )
1034 {
1035 return merge( tgt, src, computer, ( t, s ) -> sourceDominant ? s : t );
1036 }
1037
1038 public static <T> List<T> merge( List<T> tgt, List<T> src, KeyComputer<T> computer, BinaryOperator<T> remapping )
1039 {
1040 if ( src.isEmpty() )
1041 {
1042 return tgt;
1043 }
1044
1045 MergingList<T> list;
1046 if ( tgt instanceof MergingList )
1047 {
1048 list = (MergingList<T>) tgt;
1049 }
1050 else
1051 {
1052 list = new MergingList<>( computer, src.size() + tgt.size() );
1053 list.mergeAll( tgt, ( t, s ) -> s );
1054 }
1055
1056 list.mergeAll( src, remapping );
1057 return list;
1058 }
1059
1060
1061
1062
1063
1064 private static class MergingList<V> extends AbstractList<V> implements java.io.Serializable
1065 {
1066
1067 private final KeyComputer<V> keyComputer;
1068 private Map<Object, V> map;
1069 private List<V> list;
1070
1071 MergingList( KeyComputer<V> keyComputer, int initialCapacity )
1072 {
1073 this.map = new LinkedHashMap<>( initialCapacity );
1074 this.keyComputer = keyComputer;
1075 }
1076
1077 Object writeReplace() throws ObjectStreamException
1078 {
1079 return new ArrayList<>( this );
1080 }
1081
1082 @Override
1083 public Iterator<V> iterator()
1084 {
1085 if ( map != null )
1086 {
1087 return map.values().iterator();
1088 }
1089 else
1090 {
1091 return list.iterator();
1092 }
1093 }
1094
1095 void mergeAll( Collection<V> vs, BinaryOperator<V> remapping )
1096 {
1097 if ( map == null )
1098 {
1099 map = list.stream().collect( Collectors.toMap( keyComputer,
1100 Function.identity(),
1101 null,
1102 LinkedHashMap::new ) );
1103
1104 list = null;
1105 }
1106
1107 if ( vs instanceof MergingList && ( (MergingList<V>) vs ).map != null )
1108 {
1109 for ( Map.Entry<Object, V> e : ( (MergingList<V>) vs ).map.entrySet() )
1110 {
1111 Object key = e.getKey();
1112 V v = e.getValue();
1113 map.merge( key, v, remapping );
1114 }
1115 }
1116 else
1117 {
1118 for ( V v : vs )
1119 {
1120 Object key = keyComputer.apply( v );
1121
1122 map.merge( key, v, remapping );
1123 }
1124 }
1125 }
1126
1127 @Override
1128 public boolean contains( Object o )
1129 {
1130 if ( map != null )
1131 {
1132 return map.containsValue( o );
1133 }
1134 else
1135 {
1136 return list.contains( o );
1137 }
1138 }
1139
1140 private List<V> asList()
1141 {
1142 if ( list == null )
1143 {
1144 list = new ArrayList<>( map.values() );
1145 map = null;
1146 }
1147 return list;
1148 }
1149
1150 @Override
1151 public void add( int index, V element )
1152 {
1153 asList().add( index, element );
1154 }
1155
1156 @Override
1157 public V remove( int index )
1158 {
1159 return asList().remove( index );
1160 }
1161
1162 @Override
1163 public V get( int index )
1164 {
1165 return asList().get( index );
1166 }
1167
1168 @Override
1169 public int size()
1170 {
1171 if ( map != null )
1172 {
1173 return map.size();
1174 }
1175 else
1176 {
1177 return list.size();
1178 }
1179 }
1180 }
1181 }