Coverage Report - org.codehaus.plexus.configuration.PlexusComponentDescriptorMerger
 
Classes in this File Line Coverage Branch Coverage Complexity
PlexusComponentDescriptorMerger
0 %
0/41
0 %
0/18
6
 
 1  
 package org.codehaus.plexus.configuration;
 2  
 
 3  
 import java.io.IOException;
 4  
 import java.io.StringReader;
 5  
 import java.util.ArrayList;
 6  
 import java.util.List;
 7  
 
 8  
 import org.codehaus.plexus.component.repository.ComponentDescriptor;
 9  
 import org.codehaus.plexus.component.repository.ComponentRequirement;
 10  
 import org.codehaus.plexus.configuration.xml.XmlPlexusConfiguration;
 11  
 import org.codehaus.plexus.util.xml.Xpp3Dom;
 12  
 import org.codehaus.plexus.util.xml.Xpp3DomBuilder;
 13  
 import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
 14  
 
 15  
 /**
 16  
  *
 17  
  * @author <a href="mailto:kenney@apache.org">Kenney Westerhof</a>
 18  
  *
 19  
  */
 20  0
 public class PlexusComponentDescriptorMerger
 21  
 {
 22  
     /**
 23  
      * Merges override and target, where target is updated with override.
 24  
      */
 25  
     public static void merge( ComponentDescriptor<?> override, ComponentDescriptor<?> target )
 26  
     {
 27  0
         if ( override.getImplementation() != null )
 28  
         {
 29  0
             target.setImplementation( override.getImplementation() );
 30  
         }
 31  
 
 32  0
         mergeRequirements( override, target );
 33  
 
 34  0
         mergeConfiguration( override, target );
 35  
 
 36  
         // TODO: other getters/setters.
 37  0
     }
 38  
 
 39  
     private static void mergeConfiguration( ComponentDescriptor<?> override, ComponentDescriptor<?> target )
 40  
     {
 41  
         // try to parse the override dom. If this fails, do not update anything and keep
 42  
         // the original target configuration.
 43  
         Xpp3Dom overrideDom;
 44  
 
 45  
         try
 46  
         {
 47  
 
 48  0
             overrideDom = Xpp3DomBuilder.build( new StringReader( override.getConfiguration().toString() ) );
 49  
         }
 50  0
         catch ( XmlPullParserException e1 )
 51  
         {
 52  0
             return;
 53  
         }
 54  0
         catch ( IOException e1 )
 55  
         {
 56  0
             return;
 57  0
         }
 58  
 
 59  
         // try to parse the target dom. if this fails, replace it with the override configuration,
 60  
         // dom, otherwise merge it.
 61  
 
 62  0
         Xpp3Dom targetDom = null;
 63  
 
 64  0
         if ( target.getConfiguration() != null )
 65  
         {
 66  
             try
 67  
             {
 68  0
                 targetDom = Xpp3DomBuilder.build( new StringReader( target.getConfiguration().toString() ) );
 69  
             }
 70  0
             catch ( XmlPullParserException e1 )
 71  
             {
 72  
             }
 73  0
             catch ( IOException e1 )
 74  
             {
 75  0
             }
 76  
         }
 77  
 
 78  0
         if ( targetDom != null )
 79  
         {
 80  0
             Xpp3Dom.mergeXpp3Dom( overrideDom, targetDom );
 81  
         }
 82  
         else
 83  
         {
 84  0
             targetDom = overrideDom;
 85  
         }
 86  
 
 87  0
         target.setConfiguration( new XmlPlexusConfiguration( targetDom ) );
 88  0
     }
 89  
 
 90  
     private static void mergeRequirements( ComponentDescriptor<?> override, ComponentDescriptor<?> target )
 91  
     {
 92  0
         List<ComponentRequirement> toAdd = new ArrayList<ComponentRequirement>();
 93  0
         List<ComponentRequirement> toRemove = new ArrayList<ComponentRequirement>();
 94  
 
 95  0
         for ( ComponentRequirement sourceReq : override.getRequirements() )
 96  
         {
 97  0
             for ( ComponentRequirement targetReq : target.getRequirements() )
 98  
             {
 99  
                 // if a fieldName is specified, only override target requirements
 100  
                 // that also have a fieldname.
 101  0
                 if ( sourceReq.getFieldName() != null )
 102  
                 {
 103  0
                     if ( sourceReq.getFieldName().equals( targetReq.getFieldName() ) )
 104  
                     {
 105  0
                         toRemove.add( targetReq );
 106  0
                         toAdd.add( sourceReq );
 107  0
                         break;
 108  
                     }
 109  
                 }
 110  0
                 else if ( targetReq.getFieldName() == null )
 111  
                 {
 112  
                     // no fieldnames specified - just check for the role; hints may be
 113  
                     // overriden too.
 114  
 
 115  0
                     if ( sourceReq.getRole().equals( targetReq.getRole() ) )
 116  
                     {
 117  0
                         toRemove.add( targetReq );
 118  0
                         toAdd.add( sourceReq );
 119  
                     }
 120  
                 }
 121  0
             }
 122  0
         }
 123  
 
 124  0
         target.removeRequirements( toRemove );
 125  0
         target.addRequirements( toAdd );
 126  0
     }
 127  
 
 128  
 }