package edu.isi.karma.util;

import org.json.JSONArray;
import org.json.JSONObject;

import org.json.JSONException;
import org.apache.commons.cli.BasicParser;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.Option;
import org.apache.commons.cli.Options;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class KarmaStats {

	/* Instance Variables*/
	private String inputFile;
	private String outputFile;
	boolean isPretty;
	
	public KarmaStats(CommandLine cl)
	{
		isPretty = false;
	}
	
	public static void main(String[] args) {
		
		
		Options options = createCommandLineOptions();
		CommandLine cl = parseCommandLine(args, options);
		if(cl==null)
		{
			System.out.println("Error Parsing Command Line Arguments");
			return;
		}
		
		try {
			
			KarmaStats stats = new KarmaStats(cl);
			if(!stats.parseCommandLineOptions(cl)) {
				System.out.println("Parse ERROR");
				return;
			}
			karmaStats(stats.inputFile, stats.outputFile,stats.isPretty);
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		
	}

	public static void karmaStats(String inputFile, String outputFile,boolean isPretty) {
		try {
			FileReader filereader = new FileReader(inputFile);
			BufferedReader bufferedReader = new BufferedReader(filereader);
			String tmpString = null;
			StringBuffer buf = new StringBuffer();
			String[] fileSplit = inputFile.split("/");

			String[] fname = fileSplit[fileSplit.length - 1].split("\\.");
			StringBuffer nameBuf = new StringBuffer();
			/*
			 * If model name has "." in the name.
			 * */
			if(fname.length>2)
			{
				for(int j=0;j<fname.length-1;j++)
				{
					nameBuf.append(fname[j]);
				}

			}
			String modelName = nameBuf.toString();

			final String matchDoublequote = "\\\"";
			final String newDoublequote = "\"";
			final String matchSlash = "\\\\";
			final String newSlash = "\\";
			final String pyTransformCommandName = "SubmitPythonTransformationCommand";
			final String setSemanticCommandName = "SetSemanticTypeCommand";
			final String setPropertyCommandName = "SetMetaPropertyCommand";
			final String addLinkCommandName = "AddLinkCommand";
			final String deleteLinkCommandName = "DeleteLinkCommand";
			final String changeLinkCommandName = "ChangeInternalNodeLinksCommand";
			final String unassignSemeticCommandName = "UnassignSemanticTypeCommand";
			final String selectionCommandName = "OperateSelectionCommand";

			boolean isJSON = false;
			int pyTransformCount = 0;
			int SemanticTypeCount = 0;
			int classCount = 0;
			int linkCount = 0; // Except sementic type links
			int filterCount = 0;

			while ((tmpString = bufferedReader.readLine()) != null) {
				if (isJSON) {
					if (tmpString.contains("]\"\"\"")) {
						buf.append(']');
						break;
					}
					buf.append(tmpString);
				} else {
					if (tmpString.contains("hasWorksheetHistory")) {
						buf.append('[');
						isJSON = true;
					}
				}

			}

			if (isJSON) {
				classCount = countClass(bufferedReader);

				String bufString = buf.toString();
				String removedQuote = bufString.replace(matchDoublequote,
						newDoublequote);
				String removedSlash = removedQuote
						.replace(matchSlash, newSlash);

				JSONArray commands = new JSONArray(removedSlash);

				/*
				 * Compare all commands and classify according to names
				 */
				for (int i = 0; i < commands.length(); i++) {
					JSONObject command = (JSONObject) commands.get(i);
					String commandName = command.getString("commandName");

					if (commandName.equals(pyTransformCommandName)) {
						pyTransformCount++;
					} else if (commandName.equals(setSemanticCommandName)) {
						SemanticTypeCount++;
					} else if (commandName.equals(setPropertyCommandName)) {
						SemanticTypeCount++;
					} else if (commandName.equals(addLinkCommandName)) {
						linkCount++;
					} else if (commandName.equals(deleteLinkCommandName)) {
						linkCount--;
					} else if (commandName.equals(selectionCommandName)) {
						filterCount++;
					} else if (commandName.equals(unassignSemeticCommandName)) {
						SemanticTypeCount--;
					} else if(commandName.equals(changeLinkCommandName)) {
						linkCount++;
					}
				}
			}
			FileWriter out = new FileWriter(outputFile);
			BufferedWriter bufferedWriter = new BufferedWriter(out);

			StringBuffer writeBuffer = new StringBuffer();
			JSONObject output = new JSONObject();
			JSONObject modelStat = new JSONObject();
			modelStat.put("modelName", modelName);
			output.put("pyTransformations", pyTransformCount);
			output.put("semanticTypes", SemanticTypeCount);
			output.put("class", classCount);
			output.put("links", linkCount);
			output.put("filters", filterCount);
			modelStat.put("modelStatistics", output);
			if(isPretty) {
				writeBuffer.append(modelStat.toString(4));
			}
			else {
				writeBuffer.append(modelStat.toString(0));
			}
			bufferedWriter.write(writeBuffer.toString());

			bufferedReader.close();
			bufferedWriter.close();
		} catch (JSONException e) {
			e.printStackTrace();
			System.out.println("Failed to Parse JSON");
		} catch (IOException e) {
			e.printStackTrace();
			System.out.println("Error in reading/writing File");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/*
	 * This method counts number of classes based on rr-class count in TTL file
	 */
	public static int countClass(BufferedReader reader) {
		int classCount = 0;
		try {
			String tmpString = null;
			while ((tmpString = reader.readLine()) != null) {
				if (tmpString.contains("rr:class")) {
					classCount++;
				}
			}
		} catch (IOException e) {
			e.printStackTrace();
		}

		return classCount;
	}
	
	private static CommandLine parseCommandLine(String args[], Options options)
	{
		CommandLineParser parser = new BasicParser();
		CommandLine cl = null;
		try {
			/**
			 * PARSE THE COMMAND LINE ARGUMENTS *
			 */
	        cl = parser.parse(options, args);
	        if (cl == null || cl.getOptions().length == 0) {
	            return null;
	        }
		
	} catch (Exception e) {
		return cl;
	}
		return cl;
	}
	
	private static Options createCommandLineOptions() {

		Options options = new Options();
	
		options.addOption(new Option("inputfile", "inputfile", true, "Input TTL File"));
		options.addOption(new Option("outputfile", "outputfile", true, "location of the output file with name"));
		options.addOption(new Option("pretty", "pretty", false, "JSON or JSONLines selection"));
		
		return options;
	}
	
	private boolean parseCommandLineOptions(CommandLine cl)
	{

		inputFile = (String) cl.getOptionValue("inputfile");
		if(inputFile==null)
		{
			System.out.println("Please provide input File");
			return false;
		}
		
		outputFile = (String) cl.getOptionValue("outputfile","KarmaStats.json");

		if(cl.hasOption("pretty"))
		{
			this.isPretty = true;
		}

		return true;
	}

}

@@ -1039,16 +1039,119 @@
 se ERROR
+. Please use %5C%22java -cp JAR_NAME --inputfile INPUT_FILE  --outputfile OUTPUT_FILE --pretty(optional)%5C%22 
 %22);%0A%09%09%09%09

Change Error message