#!/usr/bin/python

import os
import sys
import string

import xml.dom
import xml.dom.minidom

if (sys.platform == "win32"):
	mavenRepo = os.path.expandvars("${USERPROFILE}/.maven/repository")
else:
	mavenRepo = os.path.expanduser("~/.maven/repository")

print "Using Maven repo: %s" % mavenRepo
print	

#--------------------------------------------------------------------
#
#--------------------------------------------------------------------
def getProjectDirs(root, path, result):

#    print "getProjectDirs(%s,%s)" % (root,path)
    
    if (path[:9] == "./sandbox"): return

    rootPath = "%s/%s" % (root,path)

    entries = os.listdir(rootPath)

    for entry in entries:
        rootPathEntry = "%s/%s" % (rootPath,entry)
        pathEntry     = "%s/%s" % (path,entry)

        if (os.path.isdir(rootPathEntry)):
            getProjectDirs(root,pathEntry,result)
            continue

        if (entry == "project.xml"):
            srcJavaPath = "%s/src/java" % rootPath
            if (os.path.exists(srcJavaPath)):
                result.append(os.path.normpath(path).replace("\\","/"))

#--------------------------------------------------------------------
#
#--------------------------------------------------------------------
def getXmlBeansDirs(root, path, result):

    rootPath = "%s/%s" % (root,path)

    entries = os.listdir(rootPath)

    for entry in entries:
        rootPathEntry = "%s/%s" % (rootPath,entry)
        pathEntry     = "%s/%s" % (path,entry)

        if (os.path.exists("%s/%s/target/xmlbeans" % (rootPath,entry))):
            result.append(os.path.normpath("%s/%s" % (path,entry)).replace("\\","/"))

        if (os.path.isdir(rootPathEntry)):
            getXmlBeansDirs(root,pathEntry,result)
            continue

#--------------------------------------------------------------------
#
#--------------------------------------------------------------------
def getXmlText(element,subElementName):

    subElements = element.getElementsByTagName(subElementName)
    if (len(subElements) == 0): return ""

    result      = ""
    subElement  = subElements[0]

    for child in subElement.childNodes:
        if (child.nodeType == xml.dom.Node.TEXT_NODE):
            result = result + child.data

    return result

#--------------------------------------------------------------------
#
#--------------------------------------------------------------------
def getMavenDependencies(dom,projectDir,mavenDependencies):

    # ~/.maven/repository/commons-logging/jars/commons-logging-1.0.3.jar
    # ${repo}/${groupId}/${type}s/${artifactId}-${version}.${type}

#   print "Dependencies for %s" % projectDir

    dependencyElements = dom.getElementsByTagName("dependency")
    for dependencyElement in dependencyElements:
        elementId         = getXmlText(dependencyElement,"id")
        elementVersion    = getXmlText(dependencyElement,"version")
        elementGroupId    = getXmlText(dependencyElement,"groupId")
        elementArtifactId = getXmlText(dependencyElement,"artifactId")
        elementType       = getXmlText(dependencyElement,"type")
        elementUrl        = getXmlText(dependencyElement,"url")

        if (elementType == ""): elementType = "jar"

#       print "   dependency: "
#       print "      id:         %s" % elementId
#       print "      version:    %s" % elementVersion
#       print "      groupId:    %s" % elementGroupId
#       print "      artifactId: %s" % elementArtifactId

        if (elementGroupId != ""):
            testFile = "%s/%ss/%s-%s.%s" % (elementGroupId,elementType,elementArtifactId,elementVersion,elementType)
        elif (elementArtifactId != ""):
            testFile = "%s/%ss/%s-%s.%s" % (elementId,elementType,elementArtifactId,elementVersion,elementType)
        elif (-1 != elementId.find("+")):
            repoDir  = elementId.split("+")[0]
            repoName = elementId.replace("+","-")
            testFile = "%s/%ss/%s-%s.%s" % (repoDir,elementType,repoName,elementVersion,elementType)
        else:
            testFile = "%s/%ss/%s-%s.%s" % (elementId,elementType,elementId,elementVersion,elementType)

        testAbsFile = "%s/%s" % (mavenRepo,testFile)

        if (elementVersion == "DEV"):
            print "Skipping %s for %s since it's probably a subproject" % (testFile,projectDir)
            pass

        elif (elementVersion == "${pom.currentVersion}"):
            print "Skipping %s for %s since it's probably a subproject" % (testFile,projectDir)
            pass

        elif (os.path.exists(testAbsFile)):
            if (testFile not in mavenDependencies):
                mavenDependencies.append(testFile)

        else:
            print "Unable to find file in maven repo: %s for %s" % (testFile,projectDir)
            print "   dependency: for %s" % projectDir
            print "      id:         %s" % elementId
            print "      version:    %s" % elementVersion
            print "      groupId:    %s" % elementGroupId
            print "      artifactId: %s" % elementArtifactId
            print "      url:        %s" % elementUrl
            print

#--------------------------------------------------------------------
#
#--------------------------------------------------------------------

thisFile = sys.argv[0]

igPath = "%s/../incubator-geronimo" % os.path.dirname(os.path.abspath(thisFile))

projectDirs       = []
xmlBeansDirs      = []
mavenDependencies = []
projectDoms       = {}

getProjectDirs(igPath,".",projectDirs)
getXmlBeansDirs(igPath,".",xmlBeansDirs)

#print "Found the following project dirs:"
#for projectDir in projectDirs:
#   print "   %s" % projectDir
#print

for projectDir in projectDirs:
    dom = xml.dom.minidom.parse("%s/%s/project.xml" % (igPath,projectDir))
    projectDoms[projectDir] = dom

    getMavenDependencies(dom,projectDir,mavenDependencies)

classpathFileName = "%s/.classpath" % igPath

print "Rewriting %s" % classpathFileName

classpathFile = open(classpathFileName,"w")

print >>classpathFile, '<?xml version="1.0" encoding="UTF-8"?>'
print >>classpathFile, '<!-- generated by %s -->' % os.path.basename(thisFile)
print >>classpathFile, '<classpath>'
print >>classpathFile, '    <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>'

for projectDir in projectDirs:
    print "Adding source folder for %s" % projectDir
    print >>classpathFile, '    <classpathentry kind="src" path="%s/src/java" out="%s/target/classes" />' % (projectDir,projectDir)

for projectDir in projectDirs:
    testPath = "%s/%s/src/test" % (igPath,projectDir)
    if (not os.path.exists(testPath)): continue
    
    print "Adding source folder for %s (test)" % projectDir
    print >>classpathFile, '    <classpathentry kind="src" path="%s/src/test" out="%s/target/test-classes" />' % (projectDir,projectDir)

for xmlBeansDir in xmlBeansDirs:
    print "Adding source folder for %s (xmlbeans)" % xmlBeansDir
    print >>classpathFile, '    <classpathentry kind="src" path="%s/target/xmlbeans" out="%s/target/classes" />' % (xmlBeansDir,xmlBeansDir)

for mavenDependency in mavenDependencies:
    print "Adding jar reference for %s" % mavenDependency
    print >>classpathFile, '    <classpathentry exported="true" kind="var" path="MAVEN_REPO/%s"/>' % mavenDependency

print >>classpathFile,     '    <classpathentry exported="true" kind="var" path="MAVEN_REPO/junit/jars/junit-3.8.1.jar"/>'

print >>classpathFile, '</classpath>'

classpathFile.close()

#<?xml version="1.0" encoding="UTF-8"?>
#<classpath>
#   <classpathentry kind="src" path="specs/ejb/src/java" out="specs/ejb/target" />
#   <classpathentry kind="src" path="specs/jta/src/java" out="specs/jta/target" />
#   <classpathentry kind="src" path="specs/j2ee-connector/src/java" out="specs/j2ee-connector/target" />
#   <classpathentry kind="src" path="specs/j2ee-deployment/src/java" out="specs/j2ee-deployment/target" />
#   <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
#</classpath>

#--------------------------------------------------------------------
#
#--------------------------------------------------------------------

projectFileName = "%s/.project" % igPath

print "Rewriting %s" % projectFileName

projectFile = open(projectFileName,"w")

print >>projectFile, '<?xml version="1.0" encoding="UTF-8"?>'
print >>projectFile, '<!-- generated by %s -->' % os.path.basename(thisFile)
print >>projectFile, '<projectDescription>'
print >>projectFile, '  <name>incubator-geronimo</name>'
print >>projectFile, '  <comment></comment>'
print >>projectFile, '  <projects>'
print >>projectFile, '  </projects>'
print >>projectFile, '  <buildSpec>'
print >>projectFile, '      <buildCommand>'
print >>projectFile, '          <name>org.eclipse.jdt.core.javabuilder</name>'
print >>projectFile, '          <arguments>'
print >>projectFile, '          </arguments>'
print >>projectFile, '      </buildCommand>'
print >>projectFile, '  </buildSpec>'
print >>projectFile, '  <natures>'
print >>projectFile, '      <nature>org.eclipse.jdt.core.javanature</nature>'
print >>projectFile, '  </natures>'
print >>projectFile, '</projectDescription>'

projectFile.close()
