[NPANDAY-505] probe for tlbimp

Refactor, moving resolvers into dotnet-executable to allow that to be used
without a circular dependency.

git-svn-id: https://svn.apache.org/repos/asf/incubator/npanday/trunk@1608767 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/components/dotnet-core/src/main/resources/META-INF/plexus/components.xml b/components/dotnet-core/src/main/resources/META-INF/plexus/components.xml
deleted file mode 100644
index 10175c9..0000000
--- a/components/dotnet-core/src/main/resources/META-INF/plexus/components.xml
+++ /dev/null
@@ -1,95 +0,0 @@
-<!--
-  ~ Licensed to the Apache Software Foundation (ASF) under one
-  ~ or more contributor license agreements.  See the NOTICE file
-  ~ distributed with this work for additional information
-  ~ regarding copyright ownership.  The ASF licenses this file
-  ~ to you under the Apache License, Version 2.0 (the
-  ~ "License"); you may not use this file except in compliance
-  ~ with the License.  You may obtain a copy of the License at
-  ~
-  ~   http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing,
-  ~ software distributed under the License is distributed on an
-  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  ~ KIND, either express or implied.  See the License for the
-  ~ specific language governing permissions and limitations
-  ~ under the License.
-  -->
-<component-set>
-  <components>
-    <component>
-      <role>npanday.resolver.NPandayArtifactResolver</role>
-      <implementation>npanday.resolver.DefaultNPandayArtifactResolver</implementation>
-      <instantiation-strategy>per-lookup</instantiation-strategy>
-      <requirements>
-        <requirement>
-          <role>org.apache.maven.artifact.resolver.ArtifactResolver</role>
-        </requirement>
-      </requirements>
-    </component>
-
-    <component>
-      <role>npanday.resolver.NPandayDependencyResolution</role>
-      <implementation>npanday.resolver.NPandayDependencyResolution</implementation>
-      <instantiation-strategy>per-lookup</instantiation-strategy>
-      <requirements>
-        <requirement>
-          <role>npanday.resolver.NPandayArtifactResolver</role>
-        </requirement>
-        <requirement>
-          <role>org.apache.maven.artifact.factory.ArtifactFactory</role>
-        </requirement>
-        <requirement>
-          <role>org.apache.maven.artifact.metadata.ArtifactMetadataSource</role>
-        </requirement>
-      </requirements>
-    </component>
-
-    <!-- resolving contributors -->
-    <component>
-      <role>npanday.resolver.ArtifactResolvingContributor</role>
-      <role-hint>gac</role-hint>
-      <implementation>npanday.resolver.resolvers.GacResolver</implementation>
-      <requirements>
-        <requirement>
-          <role>npanday.resolver.NPandayResolutionCache</role>
-        </requirement>
-      </requirements>
-    </component>
-
-    <component>
-      <role>npanday.resolver.ArtifactResolvingContributor</role>
-      <role-hint>com</role-hint>
-      <implementation>npanday.resolver.resolvers.ComReferenceResolver</implementation>
-      <requirements>
-        <requirement>
-          <role>npanday.resolver.NPandayResolutionCache</role>
-        </requirement>
-      </requirements>
-    </component>
-    
-     <component>
-      <role>npanday.resolver.ArtifactResolvingContributor</role>
-      <role-hint>pdb</role-hint>
-      <implementation>npanday.resolver.resolvers.PdbAssemblyResolver</implementation>
-      <requirements>
-        <requirement>
-          <role>org.apache.maven.artifact.resolver.ArtifactResolver</role>
-        </requirement>
-        <requirement>
-          <role>org.apache.maven.artifact.factory.ArtifactFactory</role>
-        </requirement>
-        <requirement>
-          <role>npanday.resolver.NPandayResolutionCache</role>
-        </requirement>
-      </requirements>
-    </component>
-
-    <component>
-      <role>npanday.resolver.NPandayResolutionCache</role>
-      <implementation>npanday.resolver.NPandayResolutionCache</implementation>
-    </component>
-
-  </components>
-</component-set>
diff --git a/components/dotnet-core/src/main/java/npanday/resolver/ArtifactResolvingContributor.java b/components/dotnet-executable/src/main/java/npanday/resolver/ArtifactResolvingContributor.java
similarity index 100%
rename from components/dotnet-core/src/main/java/npanday/resolver/ArtifactResolvingContributor.java
rename to components/dotnet-executable/src/main/java/npanday/resolver/ArtifactResolvingContributor.java
diff --git a/components/dotnet-core/src/main/java/npanday/resolver/DefaultNPandayArtifactResolver.java b/components/dotnet-executable/src/main/java/npanday/resolver/DefaultNPandayArtifactResolver.java
similarity index 86%
rename from components/dotnet-core/src/main/java/npanday/resolver/DefaultNPandayArtifactResolver.java
rename to components/dotnet-executable/src/main/java/npanday/resolver/DefaultNPandayArtifactResolver.java
index cd9b45b..958b285 100644
--- a/components/dotnet-core/src/main/java/npanday/resolver/DefaultNPandayArtifactResolver.java
+++ b/components/dotnet-executable/src/main/java/npanday/resolver/DefaultNPandayArtifactResolver.java
@@ -22,7 +22,6 @@
 import com.google.common.base.Predicate;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
-import npanday.resolver.resolvers.GacResolver;
 import org.apache.maven.artifact.Artifact;
 import org.apache.maven.artifact.metadata.ArtifactMetadataSource;
 import org.apache.maven.artifact.repository.ArtifactRepository;
@@ -31,19 +30,10 @@
 import org.apache.maven.artifact.resolver.ArtifactResolutionResult;
 import org.apache.maven.artifact.resolver.ArtifactResolver;
 import org.apache.maven.artifact.resolver.DebugResolutionListener;
-import org.apache.maven.artifact.resolver.ResolutionListener;
 import org.apache.maven.artifact.resolver.WarningResolutionListener;
-import org.apache.maven.artifact.resolver.filter.AndArtifactFilter;
 import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
-import org.codehaus.plexus.PlexusConstants;
-import org.codehaus.plexus.PlexusContainer;
-import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
-import org.codehaus.plexus.context.Context;
-import org.codehaus.plexus.context.ContextException;
 import org.codehaus.plexus.logging.AbstractLogEnabled;
-import org.codehaus.plexus.personality.plexus.lifecycle.phase.Contextualizable;
 import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable;
-import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException;
 
 import java.util.ArrayList;
 import java.util.Collections;
@@ -61,14 +51,12 @@
  */
 public class DefaultNPandayArtifactResolver
     extends AbstractLogEnabled
-    implements NPandayArtifactResolver, Contextualizable, Initializable
+    implements NPandayArtifactResolver, Initializable
 {
-    private ArtifactResolvingContributor[] contributors;
+    private List<ArtifactResolvingContributor> contributors;
 
     ArtifactResolver original;
 
-    private PlexusContainer container;
-
     private Set<Artifact> customResolveCache = Sets.newHashSet();
     private Set<Artifact> customDependenciesCache = Sets.newHashSet();
 
@@ -134,12 +122,7 @@
         return listeners;
     }
 
-    public void contextualize( Context context ) throws ContextException
-    {
-        container = (PlexusContainer) context.get( PlexusConstants.PLEXUS_KEY );
-    }
-    
-    public void runArtifactContributors(Artifact artifact, ArtifactRepository localRepository, 
+    public void runArtifactContributors(Artifact artifact, ArtifactRepository localRepository,
             List remoteRepositories) throws ArtifactNotFoundException 
     {
         if(!artifact.isResolved()) {
@@ -228,26 +211,12 @@
 		customDependenciesCache.addAll(resolvedArtifacts);
     }
 
-    public void initialize() throws InitializationException
-    {
-        try
-        {
-            List list = container.lookupList(
-                ArtifactResolvingContributor.role
-            );
-
-            contributors = (ArtifactResolvingContributor[]) list.toArray( new ArtifactResolvingContributor[0] );
-
-            if (contributors.length == 0) {
-                getLogger().warn( "NPANDAY-147-005: could not find any custom artifact resolving contributors!" );
-            }
-            else{
-                getLogger().debug( "NPANDAY-147-004: resolved " + contributors.length + " contributors: " + list );
-            }
+    public void initialize() {
+        if (contributors.size() == 0) {
+            getLogger().warn( "NPANDAY-147-005: could not find any custom artifact resolving contributors!" );
         }
-        catch ( ComponentLookupException e )
-        {
-            getLogger().error( "NPANDAY-147-003: could not resolve contributors" );
+        else{
+            getLogger().debug( "NPANDAY-147-004: resolved " + contributors.size() + " contributors: " + contributors );
         }
     }
 
diff --git a/components/dotnet-core/src/main/java/npanday/resolver/NPandayArtifactResolver.java b/components/dotnet-executable/src/main/java/npanday/resolver/NPandayArtifactResolver.java
similarity index 100%
rename from components/dotnet-core/src/main/java/npanday/resolver/NPandayArtifactResolver.java
rename to components/dotnet-executable/src/main/java/npanday/resolver/NPandayArtifactResolver.java
diff --git a/components/dotnet-core/src/main/java/npanday/resolver/NPandayDependencyResolution.java b/components/dotnet-executable/src/main/java/npanday/resolver/NPandayDependencyResolution.java
similarity index 97%
rename from components/dotnet-core/src/main/java/npanday/resolver/NPandayDependencyResolution.java
rename to components/dotnet-executable/src/main/java/npanday/resolver/NPandayDependencyResolution.java
index 4eb2a3f..603e88a 100644
--- a/components/dotnet-core/src/main/java/npanday/resolver/NPandayDependencyResolution.java
+++ b/components/dotnet-executable/src/main/java/npanday/resolver/NPandayDependencyResolution.java
@@ -42,12 +42,18 @@
  * resolver logic for GAC, e.g.
  *
  * @author <a href="mailto:me@lcorneliussen.de>Lars Corneliussen, Faktum Software</a>
+ * @plexus.component role="npanday.resolver.NPandayDependencyResolution"
  */
 public class NPandayDependencyResolution
     extends AbstractLogEnabled
 {
+    /** @plexus.requirement */
     private NPandayArtifactResolver artifactResolver;
+
+    /** @plexus.requirement */
     private ArtifactFactory artifactFactory;
+
+    /** @plexus.requirement */
     private ArtifactMetadataSource metaDataSource;
 
     public Set<Artifact> require(MavenProject project, ArtifactRepository localRepository, String scope) throws
diff --git a/components/dotnet-core/src/main/java/npanday/resolver/NPandayResolutionCache.java b/components/dotnet-executable/src/main/java/npanday/resolver/NPandayResolutionCache.java
similarity index 96%
rename from components/dotnet-core/src/main/java/npanday/resolver/NPandayResolutionCache.java
rename to components/dotnet-executable/src/main/java/npanday/resolver/NPandayResolutionCache.java
index 8878e08..4a67984 100644
--- a/components/dotnet-core/src/main/java/npanday/resolver/NPandayResolutionCache.java
+++ b/components/dotnet-executable/src/main/java/npanday/resolver/NPandayResolutionCache.java
@@ -32,6 +32,7 @@
  * Resolving the artifact file once pr. artifact id is enough.

  *

  * @author <a href="mailto:me@lcorneliussen.de>Lars Corneliussen, Faktum Software</a>

+ * @plexus.component role="npanday.resolver.NPandayResolutionCache"

  */

 public class NPandayResolutionCache

         extends AbstractLogEnabled

diff --git a/components/dotnet-core/src/main/java/npanday/resolver/NPandayResolutionListener.java b/components/dotnet-executable/src/main/java/npanday/resolver/NPandayResolutionListener.java
similarity index 100%
rename from components/dotnet-core/src/main/java/npanday/resolver/NPandayResolutionListener.java
rename to components/dotnet-executable/src/main/java/npanday/resolver/NPandayResolutionListener.java
diff --git a/components/dotnet-core/src/main/java/npanday/resolver/filter/DotnetAssemblyArtifactFilter.java b/components/dotnet-executable/src/main/java/npanday/resolver/filter/DotnetAssemblyArtifactFilter.java
similarity index 100%
rename from components/dotnet-core/src/main/java/npanday/resolver/filter/DotnetAssemblyArtifactFilter.java
rename to components/dotnet-executable/src/main/java/npanday/resolver/filter/DotnetAssemblyArtifactFilter.java
diff --git a/components/dotnet-core/src/main/java/npanday/resolver/filter/DotnetExecutableArtifactFilter.java b/components/dotnet-executable/src/main/java/npanday/resolver/filter/DotnetExecutableArtifactFilter.java
similarity index 100%
rename from components/dotnet-core/src/main/java/npanday/resolver/filter/DotnetExecutableArtifactFilter.java
rename to components/dotnet-executable/src/main/java/npanday/resolver/filter/DotnetExecutableArtifactFilter.java
diff --git a/components/dotnet-core/src/main/java/npanday/resolver/filter/DotnetLibraryArtifactFilter.java b/components/dotnet-executable/src/main/java/npanday/resolver/filter/DotnetLibraryArtifactFilter.java
similarity index 100%
rename from components/dotnet-core/src/main/java/npanday/resolver/filter/DotnetLibraryArtifactFilter.java
rename to components/dotnet-executable/src/main/java/npanday/resolver/filter/DotnetLibraryArtifactFilter.java
diff --git a/components/dotnet-core/src/main/java/npanday/resolver/filter/DotnetSymbolsArtifactFilter.java b/components/dotnet-executable/src/main/java/npanday/resolver/filter/DotnetSymbolsArtifactFilter.java
similarity index 100%
rename from components/dotnet-core/src/main/java/npanday/resolver/filter/DotnetSymbolsArtifactFilter.java
rename to components/dotnet-executable/src/main/java/npanday/resolver/filter/DotnetSymbolsArtifactFilter.java
diff --git a/components/dotnet-core/src/main/java/npanday/resolver/filter/OrArtifactFilter.java b/components/dotnet-executable/src/main/java/npanday/resolver/filter/OrArtifactFilter.java
similarity index 100%
rename from components/dotnet-core/src/main/java/npanday/resolver/filter/OrArtifactFilter.java
rename to components/dotnet-executable/src/main/java/npanday/resolver/filter/OrArtifactFilter.java
diff --git a/components/dotnet-core/src/main/java/npanday/resolver/resolvers/ComReferenceResolver.java b/components/dotnet-executable/src/main/java/npanday/resolver/resolvers/ComReferenceResolver.java
similarity index 78%
rename from components/dotnet-core/src/main/java/npanday/resolver/resolvers/ComReferenceResolver.java
rename to components/dotnet-executable/src/main/java/npanday/resolver/resolvers/ComReferenceResolver.java
index be51f04..32977cb 100644
--- a/components/dotnet-core/src/main/java/npanday/resolver/resolvers/ComReferenceResolver.java
+++ b/components/dotnet-executable/src/main/java/npanday/resolver/resolvers/ComReferenceResolver.java
@@ -20,6 +20,10 @@
 package npanday.resolver.resolvers;
 
 import npanday.ArtifactTypeHelper;
+import npanday.executable.ExecutableRequirement;
+import npanday.executable.ExecutionResult;
+import npanday.executable.NetExecutable;
+import npanday.executable.NetExecutableFactory;
 import npanday.resolver.ArtifactResolvingContributor;
 import npanday.resolver.NPandayResolutionCache;
 import org.apache.maven.artifact.Artifact;
@@ -27,11 +31,6 @@
 import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
 import org.codehaus.plexus.logging.AbstractLogEnabled;
 import org.codehaus.plexus.util.Os;
-import org.codehaus.plexus.util.cli.CommandLineException;
-import org.codehaus.plexus.util.cli.CommandLineUtils;
-import org.codehaus.plexus.util.cli.Commandline;
-import org.codehaus.plexus.util.cli.DefaultConsumer;
-import org.codehaus.plexus.util.cli.StreamConsumer;
 import org.w3c.dom.Document;
 import org.w3c.dom.Node;
 import org.w3c.dom.NodeList;
@@ -46,13 +45,18 @@
 
 /**
  * @author <a href="mailto:me@lcorneliussen.de>Lars Corneliussen, Faktum Software</a>
+ * @plexus.component role="npanday.resolver.ArtifactResolvingContributor" role-hint="com"
  */
 public class ComReferenceResolver
     extends AbstractLogEnabled
     implements ArtifactResolvingContributor
 {
+    /** @plexus.requirement */
     NPandayResolutionCache cache;
 
+    /** @plexus.requirement */
+    protected NetExecutableFactory netExecutableFactory;
+
     public void contribute(Artifact artifact, ArtifactRepository localRepository, List remoteRepositories,
                            Set<Artifact> additionalDependenciesCollector, ArtifactFilter filter)
 	{
@@ -73,7 +77,7 @@
             }
 
             String tokenId = artifact.getClassifier();
-            String interopPath = null;
+            String interopPath;
             try
             {
                 interopPath = generateInteropDll( artifact.getArtifactId(), tokenId );
@@ -83,6 +87,7 @@
                 getLogger().error(
                     "NPANDAY-150-002: Error creating interop dll for " + artifact.getId()
                 );
+                return;
             }
 
             File f = new File( interopPath );
@@ -130,7 +135,10 @@
 
         try
         {
-            execute( "tlbimp", params );
+            final NetExecutable executable = netExecutableFactory.getExecutable(
+                    new ExecutableRequirement( "MICROSOFT", null, null, "TLBIMP" ), params, null
+            );
+            executable.execute();
         }
         catch ( Exception e )
         {
@@ -277,13 +285,13 @@
         parameters.add( registryPath );
         parameters.add( "/ve" );
 
-        StreamConsumer outConsumer = new StreamConsumerImpl();
-        StreamConsumer errorConsumer = new StreamConsumerImpl();
-
+        ExecutionResult res;
         try
         {
-            // TODO: investigate why outConsumer ignores newline
-            execute( "reg", parameters, outConsumer, errorConsumer );
+            final NetExecutable executable = netExecutableFactory.getExecutable(
+                    new ExecutableRequirement( "MICROSOFT", null, null, "REG" ), parameters, null
+            );
+            res = executable.execute();
         }
         catch ( Exception e )
         {
@@ -291,8 +299,7 @@
                                      + "] ActiveX component in your system, you need to install this component first to continue." );
         }
 
-        // parse outConsumer
-        String out = outConsumer.toString();
+        String out = res.getStandardOut();
 
         String tokens[] = out.split( "\n" );
 
@@ -312,74 +319,4 @@
 
         return null;
     }
-
-    // can't use dotnet-executable due to cyclic dependency.
-    private void execute( String executable, List<String> commands )
-        throws Exception
-    {
-        execute( executable, commands, null, null );
-    }
-
-    private void execute( String executable, List<String> commands, StreamConsumer systemOut, StreamConsumer systemError )
-        throws Exception
-    {
-        int result = 0;
-        Commandline commandline = new Commandline();
-        commandline.setExecutable( executable );
-        commandline.addArguments( commands.toArray( new String[commands.size()] ) );
-        try
-        {
-            result = CommandLineUtils.executeCommandLine( commandline, systemOut, systemError );
-
-            System.out.println( "NPANDAY-040-000: Executed command: Commandline = " + commandline + ", Result = "
-                                    + result );
-
-            if ( result != 0 )
-            {
-                throw new Exception( "NPANDAY-040-001: Could not execute: Command = " + commandline.toString()
-                                         + ", Result = " + result );
-            }
-        }
-        catch ( CommandLineException e )
-        {
-            throw new Exception( "NPANDAY-040-002: Could not execute: Command = " + commandline.toString(), e);
-        }
-    }
-
-    /**
-     * TODO: refactor this to another class and all methods concerning com_reference StreamConsumer instance that
-     * buffers the entire output
-     */
-    class StreamConsumerImpl
-        implements StreamConsumer
-    {
-
-        private DefaultConsumer consumer;
-
-        private StringBuffer sb = new StringBuffer();
-
-        public StreamConsumerImpl()
-        {
-            consumer = new DefaultConsumer();
-        }
-
-        public void consumeLine( String line )
-        {
-            sb.append( line );
-            if ( getLogger() != null )
-            {
-                consumer.consumeLine( line );
-            }
-        }
-
-        /**
-         * Returns the stream
-         *
-         * @return the stream
-         */
-        public String toString()
-        {
-            return sb.toString();
-        }
-    }
 }
diff --git a/components/dotnet-core/src/main/java/npanday/resolver/resolvers/GacResolver.java b/components/dotnet-executable/src/main/java/npanday/resolver/resolvers/GacResolver.java
similarity index 95%
rename from components/dotnet-core/src/main/java/npanday/resolver/resolvers/GacResolver.java
rename to components/dotnet-executable/src/main/java/npanday/resolver/resolvers/GacResolver.java
index 43bcd9e..26bf501 100644
--- a/components/dotnet-core/src/main/java/npanday/resolver/resolvers/GacResolver.java
+++ b/components/dotnet-executable/src/main/java/npanday/resolver/resolvers/GacResolver.java
@@ -34,10 +34,12 @@
 
 /**
  * @author <a href="mailto:me@lcorneliussen.de>Lars Corneliussen, Faktum Software</a>
+ * @plexus.component role="npanday.resolver.ArtifactResolvingContributor" role-hint="gac"
  */
 public class GacResolver
     implements ArtifactResolvingContributor
 {
+    /** @plexus.requirement */
     NPandayResolutionCache cache;
 
     public void tryResolve(Artifact artifact, Set<Artifact> additionalDependenciesCollector, ArtifactFilter filter) throws
diff --git a/components/dotnet-core/src/main/java/npanday/resolver/resolvers/PdbAssemblyResolver.java b/components/dotnet-executable/src/main/java/npanday/resolver/resolvers/PdbAssemblyResolver.java
similarity index 95%
rename from components/dotnet-core/src/main/java/npanday/resolver/resolvers/PdbAssemblyResolver.java
rename to components/dotnet-executable/src/main/java/npanday/resolver/resolvers/PdbAssemblyResolver.java
index 554affc..12c8439 100644
--- a/components/dotnet-core/src/main/java/npanday/resolver/resolvers/PdbAssemblyResolver.java
+++ b/components/dotnet-executable/src/main/java/npanday/resolver/resolvers/PdbAssemblyResolver.java
@@ -19,12 +19,17 @@
 

 /**

  * PDB assemblies contributor class.

+ * @plexus.component role="npanday.resolver.ArtifactResolvingContributor" role-hint="pdb"

  */

 public class PdbAssemblyResolver extends AbstractLogEnabled implements ArtifactResolvingContributor 

 {

+    /** @plexus.requirement */

     ArtifactResolver mavenResolver;

+

+    /** @plexus.requirement */

     ArtifactFactory artifactFactory;

 

+    /** @plexus.requirement */

     NPandayResolutionCache cache;

 

     /**

diff --git a/components/dotnet-executable/src/main/resources/META-INF/npanday/executable-plugins.xml b/components/dotnet-executable/src/main/resources/META-INF/npanday/executable-plugins.xml
new file mode 100644
index 0000000..1b9834b
--- /dev/null
+++ b/components/dotnet-executable/src/main/resources/META-INF/npanday/executable-plugins.xml
@@ -0,0 +1,73 @@
+<!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one
+  ~ or more contributor license agreements.  See the NOTICE file
+  ~ distributed with this work for additional information
+  ~ regarding copyright ownership.  The ASF licenses this file
+  ~ to you under the Apache License, Version 2.0 (the
+  ~ "License"); you may not use this file except in compliance
+  ~ with the License.  You may obtain a copy of the License at
+  ~
+  ~   http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing,
+  ~ software distributed under the License is distributed on an
+  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  ~ KIND, either express or implied.  See the License for the
+  ~ specific language governing permissions and limitations
+  ~ under the License.
+  -->
+<executablePlugins>
+
+  <executablePlugin>
+    <identifier>TLBIMP</identifier>
+    <pluginClass>npanday.executable.impl.DefaultNetExecutable</pluginClass>
+    <vendor>MICROSOFT</vendor>
+    <executable>tlbimp</executable>
+    <profile>TLBIMP</profile>
+    <frameworkVersions>
+      <frameworkVersion>4.5.1</frameworkVersion>
+      <frameworkVersion>4.5</frameworkVersion>
+      <frameworkVersion>4.0</frameworkVersion>
+      <frameworkVersion>3.5</frameworkVersion>
+      <frameworkVersion>3.0</frameworkVersion>
+      <frameworkVersion>2.0.50727</frameworkVersion>
+      <frameworkVersion>1.1.4322</frameworkVersion>
+    </frameworkVersions>
+    <platforms>
+      <platform>
+        <operatingSystem>Windows</operatingSystem>
+      </platform>
+    </platforms>
+    <probingPaths>
+      <!-- TODO: this should be broken up as XSD is, just means for now you always get newest available tools version, but will target right framework -->
+      <probingPath>${HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSBuild\ToolsVersions\12.0\12.0@SDK40ToolsPath}</probingPath>
+      <probingPath>${HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSBuild\ToolsVersions\12.0\11.0@SDK40ToolsPath}</probingPath>
+      <probingPath>${HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSBuild\ToolsVersions\4.0\11.0@SDK40ToolsPath}</probingPath>
+      <probingPath>${HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSBuild\ToolsVersions\4.0@SDK40ToolsPath}</probingPath>
+      <probingPath>${HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Windows@CurrentInstallFolder}\bin</probingPath>
+      <probingPath>${HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSBuild\ToolsVersions\4.0@SDK35ToolsPath}</probingPath>
+    </probingPaths>
+  </executablePlugin>
+  <executablePlugin>
+    <identifier>REG</identifier>
+    <pluginClass>npanday.executable.impl.DefaultNetExecutable</pluginClass>
+    <vendor>MICROSOFT</vendor>
+    <executable>reg</executable>
+    <profile>REG</profile>
+    <frameworkVersions>
+      <frameworkVersion>4.5.1</frameworkVersion>
+      <frameworkVersion>4.5</frameworkVersion>
+      <frameworkVersion>4.0</frameworkVersion>
+      <frameworkVersion>3.5</frameworkVersion>
+      <frameworkVersion>3.0</frameworkVersion>
+      <frameworkVersion>2.0.50727</frameworkVersion>
+      <frameworkVersion>1.1.4322</frameworkVersion>
+    </frameworkVersions>
+    <platforms>
+      <platform>
+        <operatingSystem>Windows</operatingSystem>
+      </platform>
+    </platforms>
+  </executablePlugin>
+
+</executablePlugins>
diff --git a/components/dotnet-executable/src/main/resources/META-INF/plexus/components.xml b/components/dotnet-executable/src/main/resources/META-INF/plexus/components.xml
index b3b0533..618902c 100644
--- a/components/dotnet-executable/src/main/resources/META-INF/plexus/components.xml
+++ b/components/dotnet-executable/src/main/resources/META-INF/plexus/components.xml
@@ -19,5 +19,18 @@
 <component-set>
   <components>
     <!-- created through annotations -->
+    <component>
+      <role>npanday.resolver.NPandayArtifactResolver</role>
+      <implementation>npanday.resolver.DefaultNPandayArtifactResolver</implementation>
+      <requirements>
+        <requirement>
+          <role>org.apache.maven.artifact.resolver.ArtifactResolver</role>
+        </requirement>
+        <requirement>
+          <role>npanday.resolver.ArtifactResolvingContributor</role>
+          <field-name>contributors</field-name>
+        </requirement>
+      </requirements>
+    </component>
   </components>
 </component-set>