# Generate a JavaClass::ClassList, which contains all class 
# names with version numbers when introduced. The list is created 
# iterating all JDKs, opening the RT.jars and loading all classes.
# Author::          Peter Kofler
# Copyright::       Copyright (c) 2009, Peter Kofler.
# License::         {BSD License}[link:/files/license_txt.html]
#
# === Usage
#  
#  require 'javaclass/classlist/jar_searcher'
#  require 'javaclass/classpath/jar_classpath'
#  require 'javaclass/classlist/list'
#  
# Struct to keep configuration what kind of JDK classes should be searched and added.
#  JDK_CONFIG = Struct.new(:version, :label, :paths)
#  
# configuration for some JDKs
#  JDKS = [ JDK_CONFIG.new(...), ... ]
#  
# 1) create a JavaClass::ClassList::JarSearcher
#  JavaClass.unpack_jars!(:unpack)
#  searcher = JavaClass::ClassList::JarSearcher.new
#  searcher.skip_inner_classes = false
#  searcher.skip_package_classes = true
#  
# 2) filter out unwanted classes, e.g. vendor classes
#  searcher.filters = %w[sun/ sunw/ com/oracle/ com/sun/ netscape/ com/rsa/ 
#           quicktime/ com/apple/mrj/macos/carbon/ org/jcp/xml/dsig/internal/
#           oracle/jrockit/ jdk/internal/ jdk/nashorn/internal/
#           jdk/dynalink/internal/ jdk/incubator/http.internal/ jdk/javadoc/internal/ jdk/tools/jlink/internal/ ]
#  
# 3) create a new JavaClass::ClassList::List to contain the classes
#  list = JavaClass::ClassList::List.new
#  
#  
# Work on all lists defined in +JDKS+, add to the list and write list files.
#  JDKS.each do |conf|
#    # 4) iterate JARs and compile a list
#    conf.paths.each { |p| list = searcher.compile_list(conf.version, p, list) }
#  
#    # 5) save various kind of lists
#    basename = "./ClassLists/jdk#{conf.label.gsub(/\./, '')}"
#    # File.open("#{basename}_new_package_classes.txt", "w") { |f| f.print list.old_access_list.collect{|m| m.sub(/\s.*$/, '')} }
#    # File.open("#{basename}_all_classes.txt", "w") { |f| f.print list.plain_class_list }
#    File.open("#{basename}_all_packages.txt", "w") { |f| f.print list.to_s }
#    File.open("#{basename}_all_public_classes.txt", "w") { |f| f.print list.plain_class_list { |c| c.public? }.join() }
#    File.open("#{basename}_new_public_classes.txt", "w") { |f| f.print list.plain_class_list { |c| c.public? and c.version.first == conf.version }.join() }
#  
#    baseversion = conf.label.gsub(/\.|-.+$/, '')
#    File.open("./fullClassList#{baseversion}.txt", "w") { |f| f.print list.full_class_list.join() }
#  
#    puts "processed #{conf.label}"
#  end
