/*******************************************************************************
* 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.er.helper;
import java.io.File;
import java.io.FilenameFilter;
import org.python.core.PyObject;
import org.python.core.PyType;
import org.python.util.PythonInterpreter;
import edu.isi.karma.controller.command.selection.SuperSelection;
import edu.isi.karma.controller.command.selection.SuperSelectionManager;
import edu.isi.karma.rep.RepFactory;
import edu.isi.karma.rep.Row;
import edu.isi.karma.rep.Table;
import edu.isi.karma.rep.Worksheet;
import edu.isi.karma.webserver.ServletContextParameterMap;
import edu.isi.karma.webserver.ServletContextParameterMap.ContextParameter;
public class PythonTransformationHelper {
private static String valueDefStatement = null;
private static String isEmptyDefStatement = null;
private static String hasSelectedRowsStatement = null;
private static String importStatement = null;
public static String getPyObjectValueAsString(PyObject obj) {
if (obj == null)
return "";
PyType type = obj.getType();
if (type.getName().equals("long"))
return Long.toString(obj.asLong());
else if (type.getName().equals("int"))
return Integer.toString(obj.asInt());
else if (type.getName().equals("bool"))
return obj.asInt() != 0 ? "true" : "false";
return obj.asString();
}
public static boolean getPyObjectValueAsBoolean(PyObject obj) {
if (obj == null)
return false;
PyType type = obj.getType();
if (type.getName().equals("long"))
return (obj.asLong() != 0);
else if (type.getName().equals("int"))
return (obj.asInt() != 0);
else if (type.getName().equals("bool"))
return (obj.asInt() != 0);
else if (type.getName().equals("NoneType"))
return false;
return obj.asString().length() != 0;
}
public String normalizeString(String string) {
return string.replaceAll(" ", "").replaceAll("[^\\p{L}\\p{N}]","");
}
public static String getPythonTransformMethodDefinitionState(Worksheet worksheet, String transformationCode) {
StringBuilder methodStmt = new StringBuilder();
methodStmt.append("def transform(r):\n");
String lines[] = transformationCode.split("\\r?\\n");
for (String line:lines) {
methodStmt.append("\t" + line + "\n");
}
return methodStmt.toString();
}
public static String getImportStatements() {
if(importStatement == null)
{
StringBuilder importStmt = new StringBuilder();
importStmt.append("import re\n");
importStmt.append("import datetime\n");
importStmt.append("import edu.isi.karma.rep.WorkspaceManager\n");
importStmt.append("import edu.isi.karma.rep.Workspace\n");
importStmt.append("import edu.isi.karma.rep.Node\n");
importStmt.append("import edu.isi.karma.rep.Table\n");
importStmt.append("import edu.isi.karma.rep.HTable\n");
importStmt.append("import edu.isi.karma.rep.HNode\n");
importStmt.append("import edu.isi.karma.rep.RepFactory\n");
importStmt.append("import edu.isi.karma.er.helper.PythonTransformationHelper\n");
importStmt.append("import edu.isi.karma.controller.command.transformation.PythonTransformationCommand\n");
importStatement = importStmt.toString();
}
return importStatement;
}
public static String getGetValueDefStatement() {
if(valueDefStatement == null)
{
StringBuilder methodStmt = new StringBuilder();
methodStmt.append("def getValue(columnName):\n");
methodStmt.append(" factory = edu.isi.karma.rep.WorkspaceManager.getInstance().getWorkspace(workspaceid).getFactory()\n");
methodStmt.append(" node = factory.getNode(nodeid)\n");
methodStmt.append(" targetNode = node.getNeighborByColumnName(columnName, factory)\n");
methodStmt.append(" if targetNode is not None:\n");
methodStmt.append(" command.addInputColumns(targetNode.getHNodeId())\n");
methodStmt.append(" value = targetNode.getValue()\n");
methodStmt.append(" if value is not None:\n");
methodStmt.append(" valueAsString = value.asString()\n");
methodStmt.append(" if valueAsString is not None:\n");
methodStmt.append(" return valueAsString\n");
methodStmt.append(" return ''\n");
valueDefStatement = methodStmt.toString();
}
return valueDefStatement;
}
public static String getHasSelectedRowsStatement() {
if(hasSelectedRowsStatement == null)
{
StringBuilder methodStmt = new StringBuilder();
methodStmt.append("def hasSelectedRows(columnName):\n");
methodStmt.append(" factory = edu.isi.karma.rep.WorkspaceManager.getInstance().getWorkspace(workspaceid).getFactory()\n");
methodStmt.append(" node = factory.getNode(nodeid)\n");
methodStmt.append(" targetNode = node.getNeighborByColumnName(columnName, factory)\n");
methodStmt.append(" if targetNode is not None: \n");
methodStmt.append(" if targetNode.hasNestedTable(): \n");
methodStmt.append(" command.addInputColumns(targetNode.getHNodeId())\n");
methodStmt.append(" command.addSelectedRowsColumns(targetNode.getHNodeId())\n");
methodStmt.append(" command.setSelectedRowsMethod(True)\n");
methodStmt.append(" nestedTable = targetNode.getNestedTable()\n");
methodStmt.append(" if edu.isi.karma.er.helper.PythonTransformationHelper.hasSelectedRows(nestedTable, factory, selectionName) :\n");
methodStmt.append(" return True\n");
methodStmt.append(" return False\n");
hasSelectedRowsStatement = methodStmt.toString();
}
return hasSelectedRowsStatement;
}
public static String getIsEmptyDefStatement() {
if(isEmptyDefStatement == null)
{
StringBuilder methodStmt = new StringBuilder();
methodStmt.append("def isEmpty(columnName):\n");
methodStmt.append(" factory = edu.isi.karma.rep.WorkspaceManager.getInstance().getWorkspace(workspaceid).getFactory()\n");
methodStmt.append(" node = factory.getNode(nodeid)\n");
methodStmt.append(" targetNode = node.getNeighborByColumnName(columnName, factory)\n");
methodStmt.append(" if targetNode is not None:\n");
methodStmt.append(" hasNestedTable = targetNode.hasNestedTable()\n");
methodStmt.append(" command.addInputColumns(targetNode.getHNodeId())\n");
methodStmt.append(" if hasNestedTable: \n");
methodStmt.append(" table = targetNode.getNestedTable(); \n");
methodStmt.append(" if table.getNumRows() > 0: \n");
methodStmt.append(" return False \n");
methodStmt.append(" value = targetNode.getValue()\n");
methodStmt.append(" if value is not None:\n");
methodStmt.append(" valueAsString = value.asString()\n");
methodStmt.append(" if ((not valueAsString) and len(valueAsString) > 0) :\n");
methodStmt.append(" return False\n");
methodStmt.append(" return True\n");
isEmptyDefStatement = methodStmt.toString();
}
return isEmptyDefStatement;
}
public static String getVDefStatement()
{
return "def v(columnName):\n\treturn getValue(columnName)\n";
}
public static String getTransformStatement() {
return "transform(nodeid)";
}
public static boolean hasSelectedRows(Table nestedTable, RepFactory factory, String selectionName) {
Worksheet worksheet = factory.getWorksheet(nestedTable.getWorksheetId());
SuperSelection sel = worksheet.getSuperSelectionManager().getSuperSelection(selectionName);
for (Row r : nestedTable.getRows(0, nestedTable.getNumRows(), SuperSelectionManager.DEFAULT_SELECTION)) {
if (sel.isSelected(r))
return true;
}
return false;
}
public void importUserScripts(PythonInterpreter interpreter) {
String dirpathString = ServletContextParameterMap
.getParameterValue(ContextParameter.USER_PYTHON_SCRIPTS_DIRECTORY);
if (dirpathString != null && dirpathString.compareTo("") != 0) {
File f = new File(dirpathString);
String[] scripts = f.list(new FilenameFilter(){
@Override
public boolean accept(File dir, String name) {
return name.endsWith(".py");
}});
for(String script : scripts)
{
interpreter.execfile(dirpathString + File.separator + script);
}
}
}
}