Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refactor EngineDependentCommand & Command hierarchy. Fixes #6443 #6452

Draft
wants to merge 4 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions main/src/com/google/refine/RefineServlet.java
Original file line number Diff line number Diff line change
Expand Up @@ -218,6 +218,7 @@ public void service(HttpServletRequest request, HttpServletResponse response) th
}
}

// TODO: Hoist to Butterfly? Or convert to initParameter or other data on HttpServlet?
public ButterflyModule getModule(String name) {
return _modulesByName.get(name);
}
Expand Down
16 changes: 16 additions & 0 deletions main/src/com/google/refine/commands/Command.java
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,9 @@ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT

/**
* The super class of all calls that the client side can invoke, most of which are AJAX calls.
*
* TODO: There are probably better designs for this than an abstract class using more modern Java capabilities like
* interfaces with default methods.
*/
public abstract class Command {

Expand Down Expand Up @@ -217,6 +220,19 @@ static protected int getIntegerParameter(HttpServletRequest request, String name
return def;
}

// TODO: Do we have another implementation of this now that we can use?
static protected boolean getBooleanParameter(HttpServletRequest request, String name) {
if (request == null) {
throw new IllegalArgumentException("parameter 'request' should not be null");
}
try {
return Boolean.parseBoolean(request.getParameter(name));
} catch (Exception e) {
// ignore
}
return false;
}

/**
* Utility method for retrieving the CSRF token stored in the "csrf_token" parameter of the request, and checking
* that it is valid.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,10 +58,12 @@ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* Note that there are interactions on the client side that change only individual cells or individual rows (such as
* starring one row or editing the text of one cell). These interactions do not depend on the faceted browsing engine's
* configuration, and so they don't invoke commands that subclass this class. See AnnotateOneRowCommand and
* EditOneCellCommand as examples.
* EditOneCellCommand as examples. Conversely, there are commands like GetRowsCommand and ExportRowsCommand which use
* the engine config, but don't modify the project, which don't subclass this.
*/
abstract public class EngineDependentCommand extends Command {

// TODO: This duplicates OperationCommand.doPost, but we need to figure out a way to introduce it compatibly
@Override
public void doPost(HttpServletRequest request, HttpServletResponse response)
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Probably need to keep this and mark it as deprecated for compatibility

throws ServletException, IOException {
Expand Down
40 changes: 40 additions & 0 deletions main/src/com/google/refine/commands/OperationCommand.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@

package com.google.refine.commands;

import java.io.IOException;
import java.util.Properties;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.google.refine.model.AbstractOperation;
import com.google.refine.model.Project;
import com.google.refine.process.Process;

abstract public class OperationCommand extends Command {

@Override
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
if (!hasValidCSRFToken(request)) {
respondCSRFError(response);
return;
}

try {
Project project = getProject(request);

AbstractOperation op = createOperation(project, request);
Process process = op.createProcess(project, new Properties());

performProcessAndRespond(request, response, project, process);
} catch (Exception e) {
respondException(response, e);
}
}

abstract protected AbstractOperation createOperation(
Project project, HttpServletRequest request) throws Exception;

}
Original file line number Diff line number Diff line change
Expand Up @@ -33,42 +33,21 @@ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT

package com.google.refine.commands.cell;

import java.io.IOException;
import java.util.Properties;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.google.refine.commands.Command;
import com.google.refine.commands.OperationCommand;
import com.google.refine.model.AbstractOperation;
import com.google.refine.model.Project;
import com.google.refine.operations.cell.MultiValuedCellJoinOperation;
import com.google.refine.process.Process;

public class JoinMultiValueCellsCommand extends Command {
public class JoinMultiValueCellsCommand extends OperationCommand {

@Override
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
if (!hasValidCSRFToken(request)) {
respondCSRFError(response);
return;
}

try {
Project project = getProject(request);

String columnName = request.getParameter("columnName");
String keyColumnName = request.getParameter("keyColumnName");
String separator = request.getParameter("separator");

AbstractOperation op = new MultiValuedCellJoinOperation(columnName, keyColumnName, separator);
Process process = op.createProcess(project, new Properties());
protected AbstractOperation createOperation(Project project, HttpServletRequest request) throws Exception {
String columnName = request.getParameter("columnName");
String keyColumnName = request.getParameter("keyColumnName");
String separator = request.getParameter("separator");

performProcessAndRespond(request, response, project, process);
} catch (Exception e) {
respondException(response, e);
}
return new MultiValuedCellJoinOperation(columnName, keyColumnName, separator);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -33,44 +33,22 @@ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT

package com.google.refine.commands.cell;

import java.io.IOException;
import java.util.Properties;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.google.refine.commands.Command;
import com.google.refine.commands.OperationCommand;
import com.google.refine.model.AbstractOperation;
import com.google.refine.model.Project;
import com.google.refine.operations.cell.KeyValueColumnizeOperation;
import com.google.refine.process.Process;

public class KeyValueColumnizeCommand extends Command {
public class KeyValueColumnizeCommand extends OperationCommand {

@Override
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
if (!hasValidCSRFToken(request)) {
respondCSRFError(response);
return;
}

try {
Project project = getProject(request);

String keyColumnName = request.getParameter("keyColumnName");
String valueColumnName = request.getParameter("valueColumnName");
String noteColumnName = request.getParameter("noteColumnName");

AbstractOperation op = new KeyValueColumnizeOperation(
keyColumnName, valueColumnName, noteColumnName);

Process process = op.createProcess(project, new Properties());
protected AbstractOperation createOperation(Project project, HttpServletRequest request) throws Exception {
String keyColumnName = request.getParameter("keyColumnName");
String valueColumnName = request.getParameter("valueColumnName");
String noteColumnName = request.getParameter("noteColumnName");

performProcessAndRespond(request, response, project, process);
} catch (Exception e) {
respondException(response, e);
}
return new KeyValueColumnizeOperation(
keyColumnName, valueColumnName, noteColumnName);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -33,63 +33,43 @@ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT

package com.google.refine.commands.cell;

import java.io.IOException;
import java.util.Properties;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.fasterxml.jackson.core.type.TypeReference;

import com.google.refine.commands.Command;
import com.google.refine.commands.OperationCommand;
import com.google.refine.model.AbstractOperation;
import com.google.refine.model.Project;
import com.google.refine.operations.cell.MultiValuedCellSplitOperation;
import com.google.refine.process.Process;
import com.google.refine.util.ParsingUtilities;

public class SplitMultiValueCellsCommand extends Command {
public class SplitMultiValueCellsCommand extends OperationCommand {

@Override
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
if (!hasValidCSRFToken(request)) {
respondCSRFError(response);
return;
}

try {
Project project = getProject(request);

String columnName = request.getParameter("columnName");
String keyColumnName = request.getParameter("keyColumnName");
String separator = request.getParameter("separator");
String mode = request.getParameter("mode");
Boolean regex = Boolean.parseBoolean(request.getParameter("regex"));

AbstractOperation op;

if ("lengths".equals(mode)) {
String s = request.getParameter("fieldLengths");

int[] fieldLengths = ParsingUtilities.mapper.readValue(s, new TypeReference<int[]>() {
});

op = new MultiValuedCellSplitOperation(columnName,
keyColumnName,
fieldLengths);

} else {
op = new MultiValuedCellSplitOperation(columnName,
keyColumnName,
separator,
regex);
}
Process process = op.createProcess(project, new Properties());
performProcessAndRespond(request, response, project, process);
} catch (Exception e) {
respondException(response, e);
protected AbstractOperation createOperation(Project project, HttpServletRequest request) throws Exception {
String columnName = request.getParameter("columnName");
String keyColumnName = request.getParameter("keyColumnName");
String separator = request.getParameter("separator");
String mode = request.getParameter("mode");
Boolean regex = getBooleanParameter(request, "regex");

AbstractOperation op;

if ("lengths".equals(mode)) {
String s = request.getParameter("fieldLengths");

int[] fieldLengths = ParsingUtilities.mapper.readValue(s, new TypeReference<int[]>() {
});

return new MultiValuedCellSplitOperation(columnName,
keyColumnName,
fieldLengths);

} else {
return new MultiValuedCellSplitOperation(columnName,
keyColumnName,
separator,
regex);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -33,61 +33,38 @@ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT

package com.google.refine.commands.cell;

import java.io.IOException;
import java.util.Properties;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.google.refine.commands.Command;
import com.google.refine.commands.OperationCommand;
import com.google.refine.model.AbstractOperation;
import com.google.refine.model.Project;
import com.google.refine.operations.cell.TransposeColumnsIntoRowsOperation;
import com.google.refine.process.Process;

public class TransposeColumnsIntoRowsCommand extends Command {
public class TransposeColumnsIntoRowsCommand extends OperationCommand {

@Override
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
if (!hasValidCSRFToken(request)) {
respondCSRFError(response);
return;
}

try {
Project project = getProject(request);
AbstractOperation op;

String startColumnName = request.getParameter("startColumnName");
int columnCount = Integer.parseInt(request.getParameter("columnCount"));
boolean ignoreBlankCells = Boolean.parseBoolean(request.getParameter("ignoreBlankCells"));
boolean fillDown = Boolean.parseBoolean(request.getParameter("fillDown"));

String combinedColumnName = request.getParameter("combinedColumnName");
if (combinedColumnName != null) {
boolean prependColumnName = Boolean.parseBoolean(request.getParameter("prependColumnName"));
String separator = request.getParameter("separator");
op = new TransposeColumnsIntoRowsOperation(
startColumnName, columnCount,
ignoreBlankCells, fillDown,
combinedColumnName, prependColumnName, separator);
} else {
String keyColumnName = request.getParameter("keyColumnName");
String valueColumnName = request.getParameter("valueColumnName");

op = new TransposeColumnsIntoRowsOperation(
startColumnName, columnCount,
ignoreBlankCells, fillDown,
keyColumnName, valueColumnName);
}

Process process = op.createProcess(project, new Properties());

performProcessAndRespond(request, response, project, process);
} catch (Exception e) {
respondException(response, e);
protected AbstractOperation createOperation(Project project, HttpServletRequest request) throws Exception {
String startColumnName = request.getParameter("startColumnName");
int columnCount = getIntegerParameter(request, "columnCount", 0);
boolean ignoreBlankCells = getBooleanParameter(request, "ignoreBlankCells");
boolean fillDown = getBooleanParameter(request, "fillDown");

String combinedColumnName = request.getParameter("combinedColumnName");
if (combinedColumnName != null) {
boolean prependColumnName = getBooleanParameter(request, "prependColumnName");
String separator = request.getParameter("separator");
return new TransposeColumnsIntoRowsOperation(
startColumnName, columnCount,
ignoreBlankCells, fillDown,
combinedColumnName, prependColumnName, separator);
} else {
String keyColumnName = request.getParameter("keyColumnName");
String valueColumnName = request.getParameter("valueColumnName");

return new TransposeColumnsIntoRowsOperation(
startColumnName, columnCount,
ignoreBlankCells, fillDown,
keyColumnName, valueColumnName);
}
}
}
Loading