blob: 2cd17c4e52aa187dc7c321b7b87802b3f3c56984 [file] [log] [blame]
//
// 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.
//
using System;
using System.Collections.Generic;
using System.IO;
using System.Xml;
using System.Xml.Serialization;
using System.Diagnostics;
using Microsoft.Win32;
using NPanday.Plugin;
using NPanday.Model.Pom;
using NPanday.Model;
using NPanday.Artifact;
using System.Reflection;
namespace NPanday.Plugin.SysRef
{
/// <summary>
/// C# Plugin that will generate the required system reference .dlls
/// </summary>
[ClassAttribute(Phase = "SysRef", Goal = "prepare")]
public sealed class SysRefMojo : AbstractMojo
{
public SysRefMojo()
{
}
[FieldAttribute("repository", Expression = "${settings.localRepository}", Type = "java.lang.String")]
public String localRepository;
[FieldAttribute("mavenProject", Expression = "${project}", Type = "org.apache.maven.project.MavenProject")]
public NPanday.Model.Pom.Model mavenProject;
public override Type GetMojoImplementationType()
{
return this.GetType();
}
private void GenerateDependency(string filename)
{
ProcessStartInfo processStartInfo =
new ProcessStartInfo("tlbimp", filename);
processStartInfo.UseShellExecute = true;
processStartInfo.WindowStyle = ProcessWindowStyle.Hidden;
System.Diagnostics.Process.Start(processStartInfo);
}
private string GetFileName(NPanday.Model.Pom.Dependency dependency)
{
RegistryKey root = Registry.ClassesRoot;
string filename = string.Empty;
try
{
String[] classTokens = dependency.classifier.Split("}".ToCharArray());
String[] versionTokens = classTokens[1].Split("-".ToCharArray());
classTokens[1] = classTokens[1].Replace("-", "\\");
String newClassifier = classTokens[0] + "}" + classTokens[1];
RegistryKey typeLib = root.OpenSubKey("TypeLib");
RegistryKey target = typeLib.OpenSubKey(classTokens[0] + "}").OpenSubKey(versionTokens[1]).OpenSubKey(versionTokens[2]).OpenSubKey("win32");
filename = target.GetValue("").ToString();
}
catch (Exception exe)
{
Console.WriteLine(exe.Message);
}
return filename;
}
private void LocalInstall(NPanday.Model.Pom.Dependency dependency, string fileName)
{
try
{
String[] rawName = GetFileName(dependency).Split("\\".ToCharArray());
string generatedDLL = rawName[rawName.Length - 1];
generatedDLL = generatedDLL.Replace("tlb", "dll");
string directory = localRepository.Replace("\\", "/");
//Creating of Directories
directory = directory + "/" + dependency.groupId;
if (!Directory.Exists(directory))
{
Directory.CreateDirectory(directory);
}
directory = directory + "/" + dependency.artifactId;
if (!Directory.Exists(directory))
{
Directory.CreateDirectory(directory);
}
directory = directory + "/" + dependency.version;
if (!Directory.Exists(directory))
{
Directory.CreateDirectory(directory);
}
string newDll = dependency.artifactId + "-" + dependency.version + "-" + dependency.classifier + "." + dependency.type;
string destinationFile = localRepository + "\\" + dependency.groupId + "\\" + dependency.artifactId + "\\" + dependency.version + "\\" + newDll;
destinationFile = destinationFile.Replace("\\", "/");
string tempDir = "c:/Windows/Temp/NPanday";
if (!Directory.Exists(tempDir))
{
Directory.CreateDirectory(tempDir);
}
fileName = "\"" + fileName + "\"";
fileName = fileName + " /out:" + tempDir + "/" + dependency.artifactId+".dll";
GenerateDependency(fileName);
string sourceFile = tempDir + "/" + dependency.artifactId + ".dll";
bool waiting = true;
while (waiting)
{
if (File.Exists(sourceFile))
{
waiting = false;
}
}
if (!File.Exists(destinationFile))
{
System.Threading.Thread.Sleep(4500);
File.Copy(sourceFile, destinationFile);
}
}
catch (Exception exe)
{
Console.WriteLine("[ERROR] The Reference is not located.\n"+exe.Message);
}
}
public void SystemInstall(NPanday.Model.Pom.Dependency dependency)
{
try
{
if (dependency.systemPath == null || dependency.systemPath == string.Empty)
{
Assembly a = System.Reflection.Assembly.LoadWithPartialName(dependency.artifactId);
dependency.systemPath = a.Location;
}
string sourceFile = dependency.systemPath;
sourceFile = sourceFile.Replace("\\", "/");
string directory = localRepository.Replace("\\", "/");
//Creating of Directories
directory = directory + "/" + dependency.groupId;
if (!Directory.Exists(directory))
{
Directory.CreateDirectory(directory);
}
directory = directory + "/" + dependency.artifactId;
if (!Directory.Exists(directory))
{
Directory.CreateDirectory(directory);
}
directory = directory + "/" + dependency.version;
if (!Directory.Exists(directory))
{
Directory.CreateDirectory(directory);
}
string newDll = dependency.artifactId + "-" + dependency.version + "-" + dependency.classifier + "." + dependency.type;
string destinationFile = localRepository + "\\" + dependency.groupId + "\\" + dependency.artifactId + "\\" + dependency.version + "\\" + newDll;
destinationFile = destinationFile.Replace("\\", "/");
if (!File.Exists(destinationFile))
{
File.Copy(sourceFile, destinationFile);
}
}
catch (Exception exe)
{
Console.WriteLine(exe.Message);
}
}
public override void Execute()
{
try
{
if(mavenProject.dependencies==null)
{
return;
}
foreach (NPanday.Model.Pom.Dependency dependency in mavenProject.dependencies)
{
if (dependency.type.Equals("com_reference"))
{
//GenerateDependency(GetFileName(dependency));
LocalInstall(dependency, GetFileName(dependency));
Console.WriteLine("Successfully Installed : " + dependency.artifactId);
}
if (dependency.type.Contains("gac") || dependency.type.Equals("library") || dependency.type.Equals("dotnet-library"))
{
if (dependency.systemPath != null || dependency.systemPath != string.Empty)
{
SystemInstall(dependency);
Console.WriteLine("Successfully Installed : " + dependency.artifactId);
}
}
}
}
catch (Exception exe)
{
Console.WriteLine(exe.Message);
}
}
}
}