package edu.neu.ccs.demeter.aplib.cd;

import java.util.*;
import java.io.*;
import edu.neu.ccs.demeter.dj.Visitor;
import java.util.jar.*;

public class Test 
{
	static edu.neu.ccs.demeter.dj.ClassGraph cg;
	public static void main(String args[]) throws Exception{
		Test test =new Test();
	    cg = test.createClassGraph();
	    //System.out.println(cg);
	    ClassGraph m = ClassGraph.parse("A = B. B = [X] D C.X = B F G.C = .X= .");
	    System.out.println(m);	   
		System.out.println(test.getlhs(cg,m));
		System.out.println(test.getrhs(cg,m));
	   
     }
   
   List lhs=new Vector();
   List rhs=new Vector();

   	   public List getlhs(edu.neu.ccs.demeter.dj.ClassGraph cg, ClassGraph c){
		     cg.traverse(c,"from edu.neu.ccs.demeter.aplib.cd.ClassGraph via edu.neu.ccs.demeter.aplib.cd.ParamClassName to edu.neu.ccs.demeter.Ident",
		                new Visitor(){	
		       public void before (edu.neu.ccs.demeter.Ident host){
		              lhs.add(host);
			  }
			});
		        return lhs;
		   }
		   public  List getrhs(edu.neu.ccs.demeter.dj.ClassGraph cg, ClassGraph c){
		     cg.traverse(c,"from edu.neu.ccs.demeter.aplib.cd.ClassGraph via edu.neu.ccs.demeter.aplib.cd.ClassParts to edu.neu.ccs.demeter.Ident", 
		                   new Visitor(){	
		        public void before (edu.neu.ccs.demeter.Ident host){
		              rhs.add(host);
		        }
		      });
		      return rhs;
	    }
    /*
	public edu.neu.ccs.demeter.dj.ClassGraph createClassGraph() {		
		cg = new edu.neu.ccs.demeter.dj.ClassGraph("edu.neu.ccs.demeter.aplib.cd",true, false);
		//sg_path must contain a valid path to the DJ.jar file. 
		//String sg_path="";
		//String classpath = System.getProperty("java.class.path");		
		//String[] classpaths=classpath.split(File.pathSeparator);	
		//for(int i=0; i<classpaths.length;i++){
		//	if(classpaths[i].indexOf("aplib.jar")!=-1){
		//	     sg_path=classpaths[i];
		//		 break;
		//	}
	    //}
		//int last_slash = classpaths[0].lastIndexOf("\\");
		//String sg_path = classpaths[0].substring(0,last_slash)+"\\aplib.jar";

		//System.out.println(sg_path);
		try{
			JarFile jf = new JarFile("d:/demeterj/aplib.jar");
			Enumeration enu = jf.entries();
			while(enu.hasMoreElements()){
				String entry = enu.nextElement().toString();
				if(entry.indexOf("cd")!=-1 && entry.indexOf("class")!=-1){
					entry = entry.replace('/', '.');
					int last_dot = entry.lastIndexOf(".class");
					entry = entry.substring(0, last_dot);

					Class cl = Class.forName(entry);
					cg.addClass(cl);					
				}
			}
		}
		catch(Exception e){
			e.printStackTrace(System.err);
		}

		return cg;
	}*/

	public static edu.neu.ccs.demeter.dj.ClassGraph createClassGraph() {
        edu.neu.ccs.demeter.dj.ClassGraph cg = new
edu.neu.ccs.demeter.dj.ClassGraph("edu.neu.ccs.demeter.aplib.cd",
true, false);

        cg.addClass(AlternationClass.class);
        cg.addClass(BeginVisitors.class);
        cg.addClass(ClassDef.class);
        cg.addClass(ClassDefVisitor.class);
        cg.addClass(ClassGraph.class);
        cg.addClass(ClassGraphEntry.class);
        cg.addClass(ClassGraphEntry_SList.class);
        cg.addClass(ClassKeyword.class);
        cg.addClass(ClassKeyword_List.class);
        cg.addClass(ClassName.class);
        cg.addClass(ClassNameAccessor.class);
        cg.addClass(ClassName_Commalist.class);
        cg.addClass(ClassParents.class);
        cg.addClass(ClassParts.class);
        cg.addClass(ClassSpec.class);
        cg.addClass(ClassSpec_Commalist.class);
        cg.addClass(ClassType.class);
        cg.addClass(CommonIdent.class);
        cg.addClass(CommonKeyword.class);
        cg.addClass(ConstOrAltClass.class);
        cg.addClass(ConstructionClass.class);
        cg.addClass(CopyVisitor.class);
        cg.addClass(Definition.class);
        cg.addClass(DerivedIdent.class);
        cg.addClass(DerivedPart.class);
        cg.addClass(Directive.class);
        cg.addClass(DisplayVisitor.class);
        cg.addClass(DoParse.class);
        cg.addClass(DontParse.class);
        cg.addClass(EOFtoken.class);
        cg.addClass(EdgeVisitor.class);
        cg.addClass(EndVisitors.class);
        cg.addClass(EndVisitorsIdent.class);
        cg.addClass(EqualVisitor.class);
        cg.addClass(ExtendsKeyword.class);
        cg.addClass(FinalClass.class);
        cg.addClass(FinalPart.class);
        cg.addClass(IdentOrKeyword.class);
        cg.addClass(ImplementsKeyword.class);
        cg.addClass(Import.class);
        cg.addClass(ImportAllClasses.class);
        cg.addClass(Import_SList.class);
        cg.addClass(InitIdent.class);
        cg.addClass(Interface.class);
        cg.addClass(InterfaceClass.class);
        cg.addClass(Interface_Commalist.class);
        cg.addClass(Interfaces.class);
        cg.addClass(JavaCharStream.class);
        cg.addClass(JavaCode.class);
        cg.addClass(LocalImports.class);
        cg.addClass(LocalLookahead.class);
        cg.addClass(LookaheadIdent.class);
        cg.addClass(LookaheadKeyword.class);
        cg.addClass(Main.class);
        cg.addClass(Name.class);
        cg.addClass(NoParseIdent.class);
        cg.addClass(Nonempty_ClassGraphEntry_SList.class);
        cg.addClass(Nonempty_ClassKeyword_List.class);
        cg.addClass(Nonempty_ClassName_Commalist.class);
        cg.addClass(Nonempty_ClassSpec_Commalist.class);
        cg.addClass(Nonempty_Import_SList.class);
        cg.addClass(Nonempty_Interface_Commalist.class);
        cg.addClass(Nonempty_Name.class);
        cg.addClass(Nonempty_PackageName.class);
        cg.addClass(Nonempty_PartKeyword_List.class);
        cg.addClass(Nonempty_PartOrSyntax_List.class);
        cg.addClass(Nonempty_Parts.class);
        cg.addClass(Nonempty_Subclass_Barlist.class);
        cg.addClass(Nonempty_Superclass_Commalist.class);
        cg.addClass(Nonempty_Syntax_List.class);
        cg.addClass(NotParsedClass.class);
        cg.addClass(NotParsedIdent.class);
        cg.addClass(OpenBrace.class);
        cg.addClass(OptionalPart.class);
        cg.addClass(OtherIdent.class);
        cg.addClass(Package.class);
        cg.addClass(PackageName.class);
        cg.addClass(ParamClassName.class);
        cg.addClass(ParseDirective.class);
        cg.addClass(ParseException.class);
        cg.addClass(ParseIdent.class);
        cg.addClass(ParseKeyword.class);
        cg.addClass(Parser.class);
        cg.addClass(ParserConstants.class);
        cg.addClass(ParserTokenManager.class);
        cg.addClass(Part.class);
        cg.addClass(PartInit.class);
        cg.addClass(PartInitKeyword.class);
        cg.addClass(PartKeyword.class);
        cg.addClass(PartKeyword_List.class);
        cg.addClass(PartName.class);
        cg.addClass(PartOrSyntax.class);
        cg.addClass(PartOrSyntax_List.class);
        cg.addClass(PartType.class);
        cg.addClass(PartVisitor.class);
        cg.addClass(Part_Sandwich.class);
        cg.addClass(Parts.class);
        cg.addClass(PlainSyntax.class);
        cg.addClass(Preamble.class);
        cg.addClass(PrintCommand.class);
        cg.addClass(PrintIndent.class);
        cg.addClass(PrintSkip.class);
        cg.addClass(PrintSpace.class);
        cg.addClass(PrintUnindent.class);
        cg.addClass(PrintVisitor.class);
        cg.addClass(PrivatePart.class);
        cg.addClass(PublicClass.class);
        cg.addClass(ReadOnlyPart.class);
        cg.addClass(RepeatedElement.class);
        cg.addClass(RepeatedElement_Sandwich.class);
        cg.addClass(RepeatedPart.class);
        cg.addClass(RepeatedPart_Sandwich.class);
        cg.addClass(RepetitionClass.class);
        cg.addClass(StaticPart.class);
        cg.addClass(Subclass.class);
        cg.addClass(Subclass_Barlist.class);
        cg.addClass(SubgraphVisitor.class);
        cg.addClass(Superclass.class);
        cg.addClass(Superclass_Commalist.class);
        cg.addClass(Superclasses.class);
        cg.addClass(Syntax.class);
        cg.addClass(SyntaxVisitor.class);
        cg.addClass(Syntax_List.class);
        cg.addClass(Token.class);
        cg.addClass(TokenMgrError.class);
        cg.addClass(TraceVisitor.class);
        cg.addClass(UniversalVisitor.class);
        cg.addClass(VisitorClass.class);
        cg.addClass(VisitorDirective.class);
        cg.addClass(VisitorIdent.class);
        cg.addClass(VisitorKeyword.class);
        cg.addClass(VisitorsIdent.class);
        cg.addClass(__Subtraversal.class);
        cg.addClass(__V_ClassDef_addAlternation.class);
        cg.addClass(__V_ClassDef_addInterface.class);
        cg.addClass(__V_ClassDef_addPart.class);
        cg.addClass(__V_ClassDef_addSuperclass.class);
        cg.addClass(__V_ClassDef_getClassType.class);
        cg.addClass(__V_ClassDef_get_parameters.class);
        cg.addClass(__V_ClassDef_get_superclass_name.class);
        cg.addClass(__V_ClassDef_printTraversalEdges.class);
        cg.addClass(__V_ClassDef_replaceParams.class);
        cg.addClass(__V_ClassDef_set_classname.class);
        cg.addClass(__V_ClassGraph_buildClassDefTable.class);
        cg.addClass(__V_ClassGraph_convertRepetition.class);
        cg.addClass(__V_ClassGraph_expandParamDefs.class);
        cg.addClass(__V_ClassGraph_fillInPartNames.class);
        cg.addClass(__V_ClassGraph_removeParamDefs.class);
        cg.addClass(__V_ClassGraph_setBackLinks.class);
        cg.addClass(__V_ClassGraph_setInheritanceLinks.class);
        cg.addClass(__V_ClassSpec_Commalist_concatenateNames.class);
        cg.addClass(__V_Part_getPartType.class);
        cg.addClass(__V_Part_set_classname.class);
        cg.addClass(__V_RepeatedPart_set_classname.class);
        return cg;
	}
	
}



