View Javadoc
1   // =================== DO NOT EDIT THIS FILE ====================
2   //  Generated by Modello Velocity from merger.vm
3   //  template, any modifications will be overwritten.
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       * Merges the specified source object into the given target object.
54       *
55       * @param target The target object whose existing contents should be merged with the source, must not be
56       *            <code>null</code>.
57       * @param source The (read-only) source object that should be merged into the target object, may be
58       *            <code>null</code>.
59       * @param sourceDominant A flag indicating whether either the target object or the source object provides the
60       *            dominant data.
61       * @param hints A set of key-value pairs that customized merger implementations can use to carry domain-specific
62       *            information along, may be <code>null</code>.
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      * Use to compute keys for data structures
1023      * @param <T> the data structure type
1024      */
1025     @FunctionalInterface
1026     public interface KeyComputer<T> extends Function<T, Object>
1027     {
1028     }
1029 
1030     /**
1031      * Merge two lists
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      * Merging list
1062      * @param <V>
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 }