import java.io.FileOutputStream;
import java.io.PrintStream;
import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet;

import sun.security.action.GetLongAction;

import com.hp.hpl.jena.ontology.OntClass;
import com.hp.hpl.jena.ontology.OntModel;
import com.hp.hpl.jena.ontology.OntProperty;
import com.hp.hpl.jena.rdf.model.ModelFactory;
import com.hp.hpl.jena.rdf.model.Property;
import com.hp.hpl.jena.util.iterator.ExtendedIterator;


public class ListOfClass {
	private static String Fonto;
	private static String POonto;
	
	public static void main(String[]args){
		Fonto = "file:"+args[0];
		POonto = "file:"+args[1];
		
		// models creation
		OntModel m = ModelFactory.createOntologyModel(); 
		OntModel mTO = ModelFactory.createOntologyModel();
		
		//Reading models
		m.read(Fonto, "RDF/XML"); 
		mTO.read(POonto, "RDF/XML");
		System.out.println("model 1 size "+m.size());
		System.out.println("model 2 size "+mTO.size());
		System.out.println("-------------------");
		//Instanciate list of classes and properties for each ontologies
		 ExtendedIterator<OntClass> classeIt = m.listClasses();
	     ExtendedIterator<OntClass> classeTOIt = mTO.listClasses();
	       
	     ExtendedIterator<OntProperty> propIt = m.listAllOntProperties();
	     ExtendedIterator<OntProperty> propTOIt = mTO.listAllOntProperties();  
	     
//	     System.out.println( m.listClasses().next());
//	     System.out.println( m.listAllOntProperties().next());
//	     System.out.println(mTO.listClasses().next());
//	     System.out.println(mTO.listAllOntProperties().next());
	     
	     Set <String> classeName = new TreeSet <String> ();
	     while(classeIt.hasNext()){
	    	 OntClass classe = classeIt.next();
	    	 if(classe.getLabel(null) != null){
	    		 classeName.add(classe.getLabel(null));
	    	 }else if (classe.getLocalName()!=null){
	    		 classeName.add(classe.getLocalName());
	    	 } 
	     }
	     System.out.println("cl nb onto 1 = "+classeName.size());
	     
	     Set <String> propName = new TreeSet <String> ();
	     while(propIt.hasNext()){
	    	 OntProperty prop = propIt.next();
	    	 propName.add(prop.getLocalName());
	     }
	     System.out.println("prop nb onto 1 = "+propName.size());
	     System.out.println("-------------------");
	     
	     Set <String> classeNameTO = new TreeSet <String> ();
	     while(classeTOIt.hasNext()){
	    	 OntClass classe = classeTOIt.next();
	    	 if(classe.getLabel(null) != null){
	    		 classeNameTO.add(classe.getLabel(null));
	    	 }else if (classe.getLocalName()!=null){
	    		 classeNameTO.add(classe.getLocalName());
	    	 } 
	     }
	     System.out.println("cl nb onto 2 = "+classeNameTO.size());
	     
	     Set <String> propNameTO = new TreeSet <String> ();
	     while(propTOIt.hasNext()){
	    	 OntProperty prop = propTOIt.next();
	    	 propNameTO.add(prop.getLocalName());
	     }
	     System.out.println("prop nb onto 2 = "+propNameTO.size());
	     
	     //output in csv
	     try {
	    	 	String tmp = "";
				PrintStream l_out = new PrintStream(new FileOutputStream("ontoinfo.csv"));
				l_out.println("Onto 1 : ,classes = "+classeName.size()+", properties = "+ propName.size());
				tmp = classeName.toString().replace("[", "");
				tmp = tmp.replace("]", "");
				l_out.println(tmp);
				tmp = propName.toString().replace("[", "");
				tmp = tmp.replace("]", "");
				l_out.println(tmp);
				
				l_out.println("Onto 2 : ,classes = "+classeNameTO.size()+", properties = "+ propNameTO.size());
				tmp = classeNameTO.toString().replace("[", "");
				tmp = tmp.replace("]", "");
				l_out.println(tmp);
				tmp = propNameTO.toString().replace("[", "");
				tmp = tmp.replace("]", "");
				l_out.println(tmp);
				
				
				//on ferme le fichier :
				l_out.flush();
				l_out.close();
				l_out=null;
				}
				catch(Exception e){System.out.println(e.toString());}

	}
}
