/*******************************************************************************
* Copyright 2012 University of Southern California
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* This code was developed by the Information Integration Group as part
* of the Karma project at the Information Sciences Institute of the
* University of Southern California. For more information, publications,
* and related projects, please see: http://www.isi.edu/integration
******************************************************************************/
package edu.isi.karma.controller.command.alignment;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import org.apache.http.Header;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.FileEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import edu.isi.karma.controller.command.CommandType;
import edu.isi.karma.controller.command.WorksheetCommand;
import edu.isi.karma.controller.command.selection.SuperSelectionManager;
import edu.isi.karma.controller.update.ErrorUpdate;
import edu.isi.karma.controller.update.UpdateContainer;
import edu.isi.karma.controller.update.WorksheetListUpdate;
import edu.isi.karma.controller.update.WorksheetUpdateFactory;
import edu.isi.karma.imp.Import;
import edu.isi.karma.imp.csv.CSVFileImport;
import edu.isi.karma.imp.json.JsonImport;
import edu.isi.karma.rep.Worksheet;
import edu.isi.karma.rep.Workspace;
import edu.isi.karma.webserver.ContextParametersRegistry;
import edu.isi.karma.webserver.ServletContextParameterMap;
import edu.isi.karma.webserver.ServletContextParameterMap.ContextParameter;
/**
* @author shri
* */
public class InvokeDataMiningServiceCommand extends WorksheetCommand {
private static Logger logger = LoggerFactory.getLogger(InvokeDataMiningServiceCommand.class);
private final String csvFileName;
private String dataMiningURL;
public String getDataMiningURL() {
return dataMiningURL;
}
public void setDataMiningURL(String dataMiningURL) {
this.dataMiningURL = dataMiningURL;
}
/**
* @param id
* @param worksheetId
* @param miningUrl
* @param csvFileName
* @param isTesting A boolean flag to identify if it is the training or testing phase
* */
protected InvokeDataMiningServiceCommand(String id, String model, String worksheetId, String miningUrl, String fileName) {
super(id, model, worksheetId);
this.dataMiningURL = miningUrl;
this.csvFileName = fileName;
}
@Override
public String getCommandName() {
return InvokeDataMiningServiceCommand.class.getName();
}
@Override
public String getTitle() {
return "Invoke Data Mining Service";
}
@Override
public String getDescription() {
return null;
}
@Override
public CommandType getCommandType() {
return CommandType.notUndoable;
}
private UpdateContainer processCSV(HttpEntity entity, Workspace workspace) {
UpdateContainer uc = null;
final ServletContextParameterMap contextParameters = ContextParametersRegistry.getInstance().getContextParameters(workspace.getContextId());
try {
BufferedInputStream buf;
byte[] buffer = new byte[10240];
SimpleDateFormat sdf = new SimpleDateFormat("dd-MMM-yyyy_HmsS");
String ts = sdf.format(Calendar.getInstance().getTime());
final String fName = "table_service_results_"+ts;
final String fileName = contextParameters.getParameterValue(ContextParameter.CSV_PUBLISH_DIR) + fName;
FileOutputStream fw = new FileOutputStream(fileName);
// get the file from the service
buf = new BufferedInputStream(entity.getContent());
for (int length = 0; (length = buf.read(buffer)) > 0;) {
fw.write(buffer, 0, length);
}
fw.close();
buf.close();
logger.info("Created : " + fileName + " by worksheet Id : " + this.worksheetId) ;
Import impCSV = new CSVFileImport(1, 2, ',', ' ', "UTF-8", -1, new File(fileName), workspace, null);
Worksheet wsht = impCSV.generateWorksheet();
uc = new UpdateContainer();
uc.append(WorksheetUpdateFactory.createWorksheetHierarchicalAndCleaningResultsUpdates(wsht.getId(), SuperSelectionManager.DEFAULT_SELECTION, workspace.getContextId()));
new File(fileName).delete();
} catch (Exception e1) {
logger.error(e1.getMessage(), e1);
uc = new UpdateContainer(new ErrorUpdate(e1.getMessage()));
}
return uc;
}
private UpdateContainer processJSON(HttpEntity entity, Workspace workspace) {
final ServletContextParameterMap contextParameters = ContextParametersRegistry.getInstance().getContextParameters(workspace.getContextId());
UpdateContainer uc = null;
try {
BufferedInputStream buf;
byte[] buffer = new byte[10240];
SimpleDateFormat sdf = new SimpleDateFormat("dd-MMM-yyyy_HmsS");
String ts = sdf.format(Calendar.getInstance().getTime());
final String fName = "table_service_results_"+ts;
final String fileName = contextParameters.getParameterValue(ContextParameter.CSV_PUBLISH_DIR) + fName;
FileOutputStream fw = new FileOutputStream(fileName);
// get the file from the service
buf = new BufferedInputStream(entity.getContent());
for (int length = 0; (length = buf.read(buffer)) > 0;) {
fw.write(buffer, 0, length);
}
fw.close();
buf.close();
Import impJson = new JsonImport(new File(fileName), fName, workspace, "UTF-8", -1, null,false);
Worksheet wsht = impJson.generateWorksheet();
// Worksheet wsht2, wsht3;
logger.info("Creating worksheet with json : " + wsht.getId());
uc = new UpdateContainer();
uc.add(new WorksheetListUpdate());
uc.append(WorksheetUpdateFactory.createWorksheetHierarchicalAndCleaningResultsUpdates(wsht.getId(), SuperSelectionManager.DEFAULT_SELECTION, workspace.getContextId()));
logger.info("Created : " + fileName);
new File(fileName).delete();
} catch (Exception e1) {
logger.error(e1.getMessage(), e1);
uc = new UpdateContainer(new ErrorUpdate(e1.getMessage()));
}
return uc;
}
@Override
public UpdateContainer doIt(Workspace workspace) {
final ServletContextParameterMap contextParameters = ContextParametersRegistry.getInstance().getContextParameters(workspace.getContextId());
final String csvFileLocalPath = contextParameters.getParameterValue(ContextParameter.CSV_PUBLISH_DIR) +
this.csvFileName;
UpdateContainer uc = new UpdateContainer();
try {
// Prepare the headers
HttpPost httpPost = new HttpPost(this.dataMiningURL);
FileEntity file = new FileEntity(new File(csvFileLocalPath));
httpPost.setEntity(file);
HttpClient httpClient = new DefaultHttpClient();
httpPost.setHeader("Content-Type", "application/x-www-form-urlencoded");
// Execute the request
HttpResponse response = httpClient.execute(httpPost);
// Parse the response and store it in a String
HttpEntity entity = response.getEntity();
Header contentTypeHeader = entity.getContentType();
String contentType = contentTypeHeader.getValue();
if(contentType.equalsIgnoreCase("application/json")) {
uc = processJSON(entity, workspace);
} else if(contentType.equalsIgnoreCase("text/csv")) {
uc = processCSV(entity, workspace);
} else {
uc = new UpdateContainer(new ErrorUpdate("Could not parse content type : " + contentType));
}
} catch (Exception e) {
logger.error(e.getMessage());
uc = new UpdateContainer(new ErrorUpdate("Error ! " + e.getMessage()));
}
return uc;
}
@Override
public UpdateContainer undoIt(Workspace workspace) {
return null;
}
}