if ! $(JavaRules_INCLUDED) {
JavaRules_INCLUDED = TRUE ;

include [ FDirName $(SUBDIR) PlatformRules ] ;

rule JavaJarArgs
{
  local jar = $(1) ;
  local java_classes = $(2) ;
  local java_jars_dir = $(3) ;  
  local java_classes_dir = $(4) ;
  local java_src_dir = $(5) ;

  LocalDepends lib : $(jar) ;
  MakeLocate $(jar) : $(java_jars_dir) ;
  local java_class ;
  for java_class in $(java_classes) {
    local classname = [ MATCH "^\\.(.*)" : $(java_class:S) ] ;
    local packagepath = [ FDirName [ FSplit "\\." : $(java_class:S=) ] ] ;
    local classfile = $(classname:S=.class) ;
    local javafile = $(classname:S=.java) ;
    MakeLocate $(classfile) : [ FDirName $(java_classes_dir) $(packagepath) ] ;
    MakeLocate $(javafile) : [ FDirName $(java_src_dir) $(packagepath) ] ;
    JAVA_JARS_DIR on $(classfile) $(jar) = $(java_jars_dir) ;
    JAVA_CLASSES_DIR on $(classfile) $(jar) = $(java_classes_dir) ;
    JAVA_SRC_DIR on $(classfile) $(jar)  = $(java_src_dir) ;
    UpdateJar $(jar) : $(classfile) ;
    Depends $(java_class) : $(classfile) ;
    
    JavaCompile $(classfile) : $(javafile) ;
  }
  JavaClassPath [ FDirName $(java_jars_dir) $(jar) ] ;
}

# JavaJar jarname.jar : package.subpackage.classname ... ;
rule JavaJar
{
  local jar = $(1) ;
  local java_classes = $(2) ;

  LocalDepends lib : $(jar) ;
  MakeLocate $(jar) : $(JAVA_JARS_DIR) ;
  local java_class ;
  for java_class in $(java_classes) {
    local classname = [ MATCH "^\\.(.*)" : $(java_class:S) ] ;
#    Echo JavaJar . $(classname) ;
    local packagepath = [ FDirName [ FSplit "\\." : $(java_class:S=) ] ] ;
    local classfile = $(classname:S=.class) ;
    local javafile = $(classname:S=.java) ;
    MakeLocate $(classfile) : [ FDirName $(JAVA_CLASSES_DIR) $(packagepath) ] ;
    MakeLocate $(javafile) : [ FDirName $(JAVA_SRC_DIR) $(packagepath) ] ;

    UpdateJar $(jar) : $(classfile) ; 
    Depends $(java_class) : $(classfile) ;
    JavaCompile $(classfile) : $(javafile) ;
  }
  JavaClassPath [ FDirName $(JAVA_JARS_DIR) $(jar) ] ;
}

rule UpdateJar
{
  local jar = $(1) ;
  local classfile = $(2) ;

#  Echo UpdateJar $(jar) . $(classfile) ;

  Depends $(jar) : $(classfile) ;
  LocalClean clean : $(jar) ;
}

actions together UpdateJar 
{
  touch $(JAVA_CLASSES_DIR)$(SLASH)dummy.class
  "$(JAR)" cf $(1) -C $(JAVA_CLASSES_DIR) dummy.class $(2)
}
#  $(ZIP) -dq $(1) dummy.class

rule JavaCompile
{
  local classfile = $(classfile) ;
  local javafile = $(javafile) ;

#  Echo JavaCompile $(classfile) . $(javafile) ;

  Depends $(classfile) : $(javafile) ;
  LocalClean clean : $(classfile) ;
}

actions JavaCompile
{
   echo "ECHOING" $(CLASSPATH);
  "$(JAVAC)" -sourcepath $(JAVA_SRC_DIR) -classpath $(CLASSPATH) -d $(JAVA_CLASSES_DIR) $(2) ;
}

rule JavaThirdPartyJar
{
  local jarpath = [ FDirName $(SUBDIR) $(1) ] ;
  JAVA_THIRD_PARTY_JARS += $(jarpath) ;
  JavaClassPath $(jarpath) ;
}

rule JavaClassPath
{
  local path = $(CLASSPATH) $(1) ;
  CLASSPATH = $(path:J=$(CLASSPATH_SEPARATOR)) ;
}

} # JavaRules_INCLUDED
