/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package org.metrapp.sys;
import java.io.File;
import java.io.IOException;
import java.util.LinkedList;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.ImageIcon;
import org.metrapp.basicrcode.InitialRCode;
import org.metrapp.dataModel.DataFrame;
import org.metrapp.dataModel.DataFrameFromCSV;
import org.metrapp.dataModel.StringDataFrame;
import org.metrapp.io.Loader;
import org.metrapp.io.Observer;
import org.metrapp.io.Subject;
import org.metrapp.newJavaFilters.JavaFilterData;
import rcaller.RCaller;
import rcaller.RCode;
/**
*
* @author Ilija
*/
public class Controller implements Subject {
private static Controller instance = null;
private String rScriptExecutablePath = null;
private DataFrame dataFrame;
private LinkedList<Observer> observers;
private StringBuilder rCodeToBeExecuted;
private String selectedFile;
private String solarLongitude;
private File graph;
private String solarLong;
private Controller() {
rScriptExecutablePath = "";
observers = new LinkedList<Observer>();
rCodeToBeExecuted = new StringBuilder();
solarLong = "";
}
public static Controller getInstance() {
if (instance == null) {
instance = new Controller();
}
return instance;
}
public boolean initializeBasic(RCaller caller, RCode code) {
caller.setRscriptExecutable(rScriptExecutablePath);
code.clear();
return true;
}
public boolean updateDataFrame(DataFrame dt) {
dataFrame = dt;
notifyAllObservers();
return true;
}
@Override
public void attachObserver(Observer observer) {
observers.add(observer);
}
@Override
public void notifyAllObservers() {
for (Observer observer : observers) {
observer.update(this);
}
}
@Override
public Object getChange() {
return dataFrame;
}
public LinkedList<Observer> getObservers() {
return observers;
}
public void setObservers(LinkedList<Observer> observers) {
this.observers = observers;
}
public DataFrame getDataFrame() {
return dataFrame;
}
public void setDataFrame(DataFrame dataFrame) {
this.dataFrame = dataFrame;
}
public void addRCode(String code) {
rCodeToBeExecuted.append(code);
}
public void executeRCode(int status, String loadingFile, String rCall) {
JavaFilterData.getInstance().loadData();
RCaller caller = new RCaller();
RCode code = new RCode();
Controller.getInstance().initializeBasic(caller, code);
if (status == 2 || status == 3 || status == 4) {
code.addRCode(InitialRCode.returnInstance().returnAllInitialCode());
}
// code.addRCode(rCodeToBeExecuted.toString());
if (status == 1) {
code.addRCode(rCodeToBeExecuted.toString());
String rCodeFix = "dataset<-data.frame(lapply(dataset2, as.character), stringsAsFactors=FALSE)";
code.addRCode(rCodeFix);
}
if (status == 2) {
// code.addRCode(InitialRCode.returnInstance().returnAllInitialCode());
code.addRCode(loadingFile + "\n");
code.addRCode("\n" + rCall);
String rCodeFix = "result2<-data.frame(lapply(result, as.character), stringsAsFactors=FALSE)";
code.addRCode(rCodeFix);
}
File plotFile = null;
ImageIcon plotImage = null;
if (status == 4) {
code.addRCode(loadingFile + "\n");
try {
plotFile = code.startPlot();
} catch (IOException ex) {
System.out.println("Cannot create plot");
Logger.getLogger(Controller.class.getName()).log(Level.SEVERE, null, ex);
}
code.addRCode("\n" + rCall);
}
if (status == 3) {
code.addRCode(rCall + "\n");
}
caller.setRCode(code);
System.out.println("Kod koji ce da se izvrsi: \n" + code.toString());
System.out.println("-----------------------------------------------------------------------------------");
if (status == 1) {
//we will parse csv from java
//caller.runAndReturnResult("dataset");
DataFrameFromCSV df = new DataFrameFromCSV();
df.createDataFrameAndFillItWithData(new File(selectedFile));
Controller.getInstance().updateDataFrame(df);
caller.runOnly();
}
if (status == 2) {
caller.runOnly();
//caller.runAndReturnResult("result2");
}
if (status == 3) {
caller.runAndReturnResult("result");
DataFrame df = new StringDataFrame();
File xmlDocument = caller.getParser().getXMLFile();
df.createDataFrameAndFillItWithData(xmlDocument);
solarLong = (String) df.getMatrix()[0][0];
}
if (status == 4) {
caller.runOnly();
plotImage = code.getPlot(plotFile);
// code.showPlot(plotFile);
graph = plotFile;
}
if (status != 4 && status != 3 && status != 2 && status != 1) {
DataFrame df = new StringDataFrame();
File xmlDocument = caller.getParser().getXMLFile();
df.createDataFrameAndFillItWithData(xmlDocument);
Controller.getInstance().updateDataFrame(df);
}
deleteRCode();
}
public void deleteRCode() {
rCodeToBeExecuted.setLength(0);
}
public void updateTable() {
}
public void setPath(String path) {
selectedFile = path;
}
public String getPath() {
return selectedFile;
}
public String getrScriptExecutablePath() {
return rScriptExecutablePath;
}
public void setrScriptExecutablePath(String rScriptExecutablePath) {
this.rScriptExecutablePath = rScriptExecutablePath;
}
public String getSolarLongitude() {
return solarLongitude;
}
public void setSolarLongitude(String solarLongitude) {
this.solarLongitude = solarLongitude;
}
public File getGraph() {
return graph;
}
public void setGraph(File graph) {
this.graph = graph;
}
public String getSolarLong() {
return solarLong;
}
public void setSolarLong(String solarLong) {
this.solarLong = solarLong;
}
}