From 2691ee50d7659dff9a6d9d96a51f2b552f133b94 Mon Sep 17 00:00:00 2001 From: Stefano Mazzocchi Date: Wed, 3 Mar 2010 02:53:07 +0000 Subject: [PATCH] adding OS-specific data paths git-svn-id: http://google-refine.googlecode.com/svn/trunk@173 7d457c2a-affb-35e4-300a-418c747d4874 --- .classpath | 1 + build.xml | 11 ++-- gridworks | 29 +++++++--- gridworks.bat | 2 +- lib-src/jdatapath-alpha2-sources.jar | Bin 0 -> 8388 bytes lib/jdatapath-alpha2.jar | Bin 0 -> 9629 bytes lib/native/windows/jdatapath.dll | Bin 0 -> 41472 bytes .../java/com/metaweb/gridworks/Gridworks.java | 22 ++++---- .../metaweb/gridworks/GridworksServlet.java | 25 +++------ .../com/metaweb/gridworks/ProjectManager.java | 50 ++++++++++++++++-- .../commands/edit/AnnotateOneRowCommand.java | 2 +- .../commands/edit/CreateProjectCommand.java | 7 +-- .../commands/edit/DoTextTransformCommand.java | 1 - .../commands/edit/FacetBasedEditCommand.java | 1 - .../util/GuessTypesOfColumnCommand.java | 1 - .../util/PreviewExpressionCommand.java | 1 - .../gridworks/expr/ExpressionUtils.java | 2 +- .../gridworks/gel/controls/IsTest.java | 2 +- .../metaweb/gridworks/gel/controls/With.java | 2 +- .../gridworks/model/recon/ReconConfig.java | 2 +- .../MultiValuedCellJoinOperation.java | 2 +- .../MultiValuedCellSplitOperation.java | 2 +- 22 files changed, 101 insertions(+), 64 deletions(-) create mode 100644 lib-src/jdatapath-alpha2-sources.jar create mode 100644 lib/jdatapath-alpha2.jar create mode 100755 lib/native/windows/jdatapath.dll diff --git a/.classpath b/.classpath index 48811b68a..4fde3ef69 100644 --- a/.classpath +++ b/.classpath @@ -13,5 +13,6 @@ + diff --git a/build.xml b/build.xml index 51d4b57bf..d9a49fd17 100644 --- a/build.xml +++ b/build.xml @@ -96,10 +96,10 @@ dontWrapJar="true" icon="${graphics.dir}/icon/gridworks.ico"> - ${lib.dir}/*.jar + lib/*.jar - - ${java.version} + + -Djava.library.path=lib/native/windows + + + + + diff --git a/gridworks b/gridworks index d16583314..eb99cfc86 100755 --- a/gridworks +++ b/gridworks @@ -32,10 +32,13 @@ where [options] include: -w path to the webapp default: src/main/webapp - - -d enable JVM debugging (on port 8000) + + -d path to the data directory + default: OS dependent + + --debug enable JVM debugging (on port 8000) - -x enable JMX monitoring (for jconsole) + --jmx enable JMX monitoring (for jconsole) and is one of @@ -89,7 +92,8 @@ ant_prepare() { } ant() { - ant_prepare + ant_prepare + echo $NUM_VERSION $ANT -f build.xml -Dbuild.dir="$GRIDWORKS_BUILD_DIR" -Ddist.dir="$GRIDWORKS_DIST_DIR" -Dversion="$VERSION" -Dnum_version="$NUM_VERSION" -Djava.options="$JAVA_OPTIONS" $1 || exit 1 } @@ -114,7 +118,7 @@ get_version() { fail "Must specify a version number" fi - NUM_VERSION=`echo $VERSION | sed 's/\a//g'` + NUM_VERSION=`echo $VERSION | sed 's/[a-zA-Z]//g'` } make_exe() { @@ -182,10 +186,18 @@ run() { ant build echo "" fi + + if [ "$SYSTEM" == 'Darwin' ] ; then + OPTS="-Xdock:name=Gridworks -Xdock:icon=src/graphics/icon/gridworks.icns $OPTS" + fi + + if [ "$GRIDWORKS_DATA_DIR" != "" ] ; then + OPTS="-Dgridworks.data_dir=$GRIDWORKS_DATA_DIR $OPTS" + fi CLASSPATH="$GRIDWORKS_BUILD_DIR/classes:$GRIDWORKS_LIB_DIR/*" - RUN_CMD="$JAVA -cp $CLASSPATH $OPTS -Xdock:name=Gridworks -Xdock:icon=src/graphics/icon/gridworks.icns com.metaweb.gridworks.Gridworks" + RUN_CMD="$JAVA -cp $CLASSPATH $OPTS com.metaweb.gridworks.Gridworks" echo "Starting Gridworks at 'http://${GRIDWORKS_HOST}:${GRIDWORKS_PORT}/'" echo "" @@ -230,8 +242,9 @@ while [ $# -ne 0 ] ; do -p) shift; GRIDWORKS_PORT="$1"; shift; continue;; -i) shift; GRIDWORKS_HOST="$1"; shift; continue;; -w) shift; GRIDWORKS_WEBAPP="$1"; shift; continue;; - -d) shift; add_option '-Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n'; continue;; - -x) shift; add_option '-Dcom.sun.management.jmxremote'; continue;; + -d) shift; GRIDWORKS_DATA_DIR="$1"; shift; continue;; + --debug) shift; add_option '-Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n'; continue;; + --jmx) shift; add_option '-Dcom.sun.management.jmxremote'; continue;; -*) fail "Invalid option: $1";; *) break;; esac diff --git a/gridworks.bat b/gridworks.bat index 55b123bba..988e89587 100644 --- a/gridworks.bat +++ b/gridworks.bat @@ -140,7 +140,7 @@ goto usage :doRun set CLASSPATH="%GRIDWORKS_BUILD_DIR%\classes;%GRIDWORKS_LIB_DIR%\*" -"%JAVA_HOME%\bin\java.exe" -cp %CLASSPATH% %OPTS% com.metaweb.gridworks.Gridworks +"%JAVA_HOME%\bin\java.exe" -cp %CLASSPATH% %OPTS% -Djava.library.path=lib/native/windows com.metaweb.gridworks.Gridworks goto end :doAnt diff --git a/lib-src/jdatapath-alpha2-sources.jar b/lib-src/jdatapath-alpha2-sources.jar new file mode 100644 index 0000000000000000000000000000000000000000..d4264d8437c8fef781f0aa33cb590e37379bbf32 GIT binary patch literal 8388 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

^UA~B@`Fj0D<)fq7G(MYEC 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 literal 0 HcmV?d00001 diff --git a/lib/native/windows/jdatapath.dll b/lib/native/windows/jdatapath.dll new file mode 100755 index 0000000000000000000000000000000000000000..894dbe4770c26870f44350682acc8d1d71f329d7 GIT binary patch literal 41472 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 ZJCaA9)Rjsgl|U+iR0634QVIMcfj@?+^TPlD literal 0 HcmV?d00001 diff --git a/src/main/java/com/metaweb/gridworks/Gridworks.java b/src/main/java/com/metaweb/gridworks/Gridworks.java index a9cec0105..ac5349703 100644 --- a/src/main/java/com/metaweb/gridworks/Gridworks.java +++ b/src/main/java/com/metaweb/gridworks/Gridworks.java @@ -28,6 +28,9 @@ import com.metaweb.util.threads.ThreadPoolExecutorAdapter; public class Gridworks extends Server { + private static Logger root = Logger.getRootLogger(); + private static Logger logger = Logger.getLogger("com.metaweb.gridworks"); + public static void main(String[] args) throws Exception { // tell jetty to use SLF4J for logging instead of its own stuff @@ -36,14 +39,12 @@ public class Gridworks extends Server { // initialize the log4j system Appender console = new ConsoleAppender(new IndentingLayout()); - - Logger root = Logger.getRootLogger(); root.setLevel(Level.ALL); root.addAppender(console); Logger jetty_logger = Logger.getLogger("org.mortbay.log"); - jetty_logger.setLevel(Level.INFO); - + jetty_logger.setLevel(Level.WARN); + // get main configurations int port = Configurations.getInteger("gridworks.port",3333); String host = Configurations.get("gridworks.host","127.0.0.1"); @@ -65,6 +66,10 @@ public class Gridworks extends Server { server.join(); } + public static void log(String message) { + logger.info(message); + } + /* -------------- Gridworks HTTP server ----------------- */ private ThreadPoolExecutor threadPool; @@ -80,15 +85,6 @@ public class Gridworks extends Server { threadPool = new ThreadPoolExecutor(maxThreads, maxQueue, keepAliveTime, TimeUnit.SECONDS, queue); this.setThreadPool(new ThreadPoolExecutorAdapter(threadPool)); - - // NOTE(SM): we use a BIO connector instead of the NIO connector - // because NIO can't deal with thread deaths: if the execution - // of a script is taking too long and acre kills it, that automatically - // shuts down the I/O channel to the user and we can't communicate - // that error back to the user (which also causes the I/O channel - // to be abruptly terminated and causes all sorts of proxy errors - // down the line). This is a performance penalty, but not severe - // enough to compensate for this problem. Connector connector = new SocketConnector(); connector.setPort(port); diff --git a/src/main/java/com/metaweb/gridworks/GridworksServlet.java b/src/main/java/com/metaweb/gridworks/GridworksServlet.java index d22480330..263fcc5af 100644 --- a/src/main/java/com/metaweb/gridworks/GridworksServlet.java +++ b/src/main/java/com/metaweb/gridworks/GridworksServlet.java @@ -1,6 +1,5 @@ package com.metaweb.gridworks; -import java.io.File; import java.io.IOException; import java.util.HashMap; import java.util.Map; @@ -10,10 +9,6 @@ import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import org.json.JSONException; -import org.json.JSONObject; -import org.json.JSONTokener; - import com.metaweb.gridworks.commands.Command; import com.metaweb.gridworks.commands.edit.AddColumnCommand; import com.metaweb.gridworks.commands.edit.AnnotateOneRowCommand; @@ -30,17 +25,17 @@ import com.metaweb.gridworks.commands.edit.UndoRedoCommand; import com.metaweb.gridworks.commands.info.ComputeFacetsCommand; import com.metaweb.gridworks.commands.info.ExportRowsCommand; import com.metaweb.gridworks.commands.info.GetAllProjectMetadataCommand; -import com.metaweb.gridworks.commands.info.GetModelsCommand; import com.metaweb.gridworks.commands.info.GetHistoryCommand; +import com.metaweb.gridworks.commands.info.GetModelsCommand; import com.metaweb.gridworks.commands.info.GetOperationsCommand; import com.metaweb.gridworks.commands.info.GetProcessesCommand; import com.metaweb.gridworks.commands.info.GetProjectMetadataCommand; import com.metaweb.gridworks.commands.info.GetRowsCommand; -import com.metaweb.gridworks.commands.recon.ReconMarkNewTopicsCommand; -import com.metaweb.gridworks.commands.recon.ReconMatchBestCandidatesCommand; import com.metaweb.gridworks.commands.recon.ReconDiscardJudgmentsCommand; import com.metaweb.gridworks.commands.recon.ReconJudgeOneCellCommand; import com.metaweb.gridworks.commands.recon.ReconJudgeSimilarCellsCommand; +import com.metaweb.gridworks.commands.recon.ReconMarkNewTopicsCommand; +import com.metaweb.gridworks.commands.recon.ReconMatchBestCandidatesCommand; import com.metaweb.gridworks.commands.recon.ReconMatchSpecificTopicCommand; import com.metaweb.gridworks.commands.recon.ReconcileCommand; import com.metaweb.gridworks.commands.util.CancelProcessesCommand; @@ -50,6 +45,7 @@ import com.metaweb.gridworks.commands.util.PreviewExpressionCommand; import com.metaweb.gridworks.commands.util.PreviewProtographCommand; public class GridworksServlet extends HttpServlet { + private static final long serialVersionUID = 2386057901503517403L; static protected Map _commands = new HashMap(); @@ -116,7 +112,7 @@ public class GridworksServlet extends HttpServlet { } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { - ProjectManager.initialize(new File("./data")); + ProjectManager.initialize(); String commandName = request.getPathInfo().substring(1); Command command = _commands.get(commandName); @@ -126,7 +122,7 @@ public class GridworksServlet extends HttpServlet { } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { - ProjectManager.initialize(new File("./data")); + ProjectManager.initialize(); String commandName = request.getPathInfo().substring(1); Command command = _commands.get(commandName); @@ -135,13 +131,4 @@ public class GridworksServlet extends HttpServlet { } } - static public JSONObject evaluateJsonStringToObject(String s) throws JSONException { - JSONTokener t = new JSONTokener(s); - JSONObject o = (JSONObject) t.nextValue(); - return o; - } - - protected String encodeString(String s) { - return s.replace("\"", "\\\""); - } } diff --git a/src/main/java/com/metaweb/gridworks/ProjectManager.java b/src/main/java/com/metaweb/gridworks/ProjectManager.java index 2c5dcc03a..0e6980ffa 100644 --- a/src/main/java/com/metaweb/gridworks/ProjectManager.java +++ b/src/main/java/com/metaweb/gridworks/ProjectManager.java @@ -10,10 +10,13 @@ import java.io.Serializable; import java.util.HashMap; import java.util.Map; +import com.codeberry.jdatapath.DataPath; +import com.codeberry.jdatapath.JDataPathSystem; import com.metaweb.gridworks.model.Project; public class ProjectManager implements Serializable { - private static final long serialVersionUID = -2967415873336723962L; + + private static final long serialVersionUID = -2967415873336723962L; protected File _dir; protected Map _projectsMetadata; @@ -22,18 +25,57 @@ public class ProjectManager implements Serializable { static public ProjectManager singleton; - static public void initialize(File dir) { + static public void initialize() { if (singleton == null) { + File dir = getProjectLocation(); + Gridworks.log("Using data directory: " + dir.getAbsolutePath()); File file = new File(dir, "projects"); if (file.exists()) { singleton = load(file); - } - if (singleton == null) { + } else { singleton = new ProjectManager(dir); } } } + static protected File getProjectLocation() { + String data_dir = Configurations.get("gridworks.data_dir"); + if (data_dir != null) { + return new File(data_dir); + } + + String os = Configurations.get("os.name").toLowerCase(); + if (os.contains("windows")) { + // NOTE(SM): finding the "local data app" in windows from java is actually a PITA + // see http://stackoverflow.com/questions/1198911/how-to-get-local-application-data-folder-in-java + // so we're using a library that uses JNI to ask directly the win32 APIs, + // it's not elegant but it's the safest bet + DataPath localDataPath = JDataPathSystem.getLocalSystem().getLocalDataPath("Gridworks"); + File data = new File(localDataPath.getPath()); + data.mkdirs(); + return data; + } else if (os.contains("mac os x")) { + // on macosx, use "~/Library/Application Support" + String home = System.getProperty("user.home"); + String data_home = (home != null) ? home + "/Library/Application Support/Gridworks" : ".gridworks"; + File data = new File(data_home); + data.mkdirs(); + return data; + } else { // most likely a UNIX flavor + // start with the XDG environment + // see http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html + String data_home = System.getenv("XDG_DATA_HOME"); + if (data_home == null) { // if not found, default back to ~/.local/share + String home = System.getProperty("user.home"); + if (home == null) home = "."; + data_home = home + "/.local/share"; + } + File data = new File(data_home + "/gridworks"); + data.mkdirs(); + return data; + } + } + static protected ProjectManager load(File file) { ProjectManager pm = null; FileInputStream fis = null; diff --git a/src/main/java/com/metaweb/gridworks/commands/edit/AnnotateOneRowCommand.java b/src/main/java/com/metaweb/gridworks/commands/edit/AnnotateOneRowCommand.java index b454a029f..97cb0e7eb 100644 --- a/src/main/java/com/metaweb/gridworks/commands/edit/AnnotateOneRowCommand.java +++ b/src/main/java/com/metaweb/gridworks/commands/edit/AnnotateOneRowCommand.java @@ -1,6 +1,6 @@ package com.metaweb.gridworks.commands.edit; -import java.io.IOException; +import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; diff --git a/src/main/java/com/metaweb/gridworks/commands/edit/CreateProjectCommand.java b/src/main/java/com/metaweb/gridworks/commands/edit/CreateProjectCommand.java index d9c9e834e..7f39dcb3d 100644 --- a/src/main/java/com/metaweb/gridworks/commands/edit/CreateProjectCommand.java +++ b/src/main/java/com/metaweb/gridworks/commands/edit/CreateProjectCommand.java @@ -15,10 +15,9 @@ import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import org.apache.log4j.Logger; - import com.ibm.icu.text.CharsetDetector; import com.ibm.icu.text.CharsetMatch; +import com.metaweb.gridworks.Gridworks; import com.metaweb.gridworks.ProjectManager; import com.metaweb.gridworks.ProjectMetadata; import com.metaweb.gridworks.commands.Command; @@ -34,8 +33,6 @@ import com.oreilly.servlet.multipart.Part; public class CreateProjectCommand extends Command { - private final static Logger logger = Logger.getLogger("gridworks"); - @Override public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { @@ -131,7 +128,7 @@ public class CreateProjectCommand extends Command { CharsetMatch charsetMatch = detector.setText(enforceMarking(filePart.getInputStream())).detect(); options.setProperty("encoding", charsetMatch.getName()); options.setProperty("encoding_confidence", Integer.toString(charsetMatch.getConfidence())); - logger.info("Best encoding guess: " + charsetMatch.getName() + " [confidence: " + charsetMatch.getConfidence() + "]"); + Gridworks.log("Best encoding guess: " + charsetMatch.getName() + " [confidence: " + charsetMatch.getConfidence() + "]"); Reader reader = charsetMatch.getReader(); try { importer.read(charsetMatch.getReader(), project, options, skip, limit); diff --git a/src/main/java/com/metaweb/gridworks/commands/edit/DoTextTransformCommand.java b/src/main/java/com/metaweb/gridworks/commands/edit/DoTextTransformCommand.java index cbef0c650..321df800c 100644 --- a/src/main/java/com/metaweb/gridworks/commands/edit/DoTextTransformCommand.java +++ b/src/main/java/com/metaweb/gridworks/commands/edit/DoTextTransformCommand.java @@ -4,7 +4,6 @@ import javax.servlet.http.HttpServletRequest; import org.json.JSONObject; - import com.metaweb.gridworks.commands.EngineDependentCommand; import com.metaweb.gridworks.model.AbstractOperation; import com.metaweb.gridworks.operations.TextTransformOperation; diff --git a/src/main/java/com/metaweb/gridworks/commands/edit/FacetBasedEditCommand.java b/src/main/java/com/metaweb/gridworks/commands/edit/FacetBasedEditCommand.java index ffe236f19..6dae079fd 100644 --- a/src/main/java/com/metaweb/gridworks/commands/edit/FacetBasedEditCommand.java +++ b/src/main/java/com/metaweb/gridworks/commands/edit/FacetBasedEditCommand.java @@ -4,7 +4,6 @@ import javax.servlet.http.HttpServletRequest; import org.json.JSONObject; - import com.metaweb.gridworks.commands.EngineDependentCommand; import com.metaweb.gridworks.model.AbstractOperation; import com.metaweb.gridworks.operations.FacetBasedEditOperation; diff --git a/src/main/java/com/metaweb/gridworks/commands/util/GuessTypesOfColumnCommand.java b/src/main/java/com/metaweb/gridworks/commands/util/GuessTypesOfColumnCommand.java index a71a5740c..aaecfd495 100644 --- a/src/main/java/com/metaweb/gridworks/commands/util/GuessTypesOfColumnCommand.java +++ b/src/main/java/com/metaweb/gridworks/commands/util/GuessTypesOfColumnCommand.java @@ -22,7 +22,6 @@ import org.json.JSONArray; import org.json.JSONObject; import org.json.JSONWriter; - import com.metaweb.gridworks.commands.Command; import com.metaweb.gridworks.expr.ExpressionUtils; import com.metaweb.gridworks.model.Column; diff --git a/src/main/java/com/metaweb/gridworks/commands/util/PreviewExpressionCommand.java b/src/main/java/com/metaweb/gridworks/commands/util/PreviewExpressionCommand.java index 1d588c2ec..fdd599b58 100644 --- a/src/main/java/com/metaweb/gridworks/commands/util/PreviewExpressionCommand.java +++ b/src/main/java/com/metaweb/gridworks/commands/util/PreviewExpressionCommand.java @@ -10,7 +10,6 @@ import javax.servlet.http.HttpServletResponse; import org.json.JSONArray; import org.json.JSONWriter; - import com.metaweb.gridworks.commands.Command; import com.metaweb.gridworks.expr.EvalError; import com.metaweb.gridworks.expr.Evaluable; diff --git a/src/main/java/com/metaweb/gridworks/expr/ExpressionUtils.java b/src/main/java/com/metaweb/gridworks/expr/ExpressionUtils.java index 9bcfef8b7..9aed29b30 100644 --- a/src/main/java/com/metaweb/gridworks/expr/ExpressionUtils.java +++ b/src/main/java/com/metaweb/gridworks/expr/ExpressionUtils.java @@ -1,6 +1,6 @@ package com.metaweb.gridworks.expr; -import java.util.Properties; +import java.util.Properties; import com.metaweb.gridworks.model.Cell; import com.metaweb.gridworks.model.Project; diff --git a/src/main/java/com/metaweb/gridworks/gel/controls/IsTest.java b/src/main/java/com/metaweb/gridworks/gel/controls/IsTest.java index e02afa8b0..1a9e568ba 100644 --- a/src/main/java/com/metaweb/gridworks/gel/controls/IsTest.java +++ b/src/main/java/com/metaweb/gridworks/gel/controls/IsTest.java @@ -1,6 +1,6 @@ package com.metaweb.gridworks.gel.controls; -import java.util.Properties; +import java.util.Properties; import org.json.JSONException; import org.json.JSONWriter; diff --git a/src/main/java/com/metaweb/gridworks/gel/controls/With.java b/src/main/java/com/metaweb/gridworks/gel/controls/With.java index 8eafd1319..08ab60f3a 100644 --- a/src/main/java/com/metaweb/gridworks/gel/controls/With.java +++ b/src/main/java/com/metaweb/gridworks/gel/controls/With.java @@ -1,6 +1,6 @@ package com.metaweb.gridworks.gel.controls; -import java.util.Properties; +import java.util.Properties; import org.json.JSONException; import org.json.JSONWriter; diff --git a/src/main/java/com/metaweb/gridworks/model/recon/ReconConfig.java b/src/main/java/com/metaweb/gridworks/model/recon/ReconConfig.java index 1659b2dbd..c36bb45e4 100644 --- a/src/main/java/com/metaweb/gridworks/model/recon/ReconConfig.java +++ b/src/main/java/com/metaweb/gridworks/model/recon/ReconConfig.java @@ -1,6 +1,6 @@ package com.metaweb.gridworks.model.recon; -import java.io.Serializable; +import java.io.Serializable; import java.util.List; import org.json.JSONObject; diff --git a/src/main/java/com/metaweb/gridworks/operations/MultiValuedCellJoinOperation.java b/src/main/java/com/metaweb/gridworks/operations/MultiValuedCellJoinOperation.java index a983f5431..a220fd745 100644 --- a/src/main/java/com/metaweb/gridworks/operations/MultiValuedCellJoinOperation.java +++ b/src/main/java/com/metaweb/gridworks/operations/MultiValuedCellJoinOperation.java @@ -1,6 +1,6 @@ package com.metaweb.gridworks.operations; -import java.util.ArrayList; +import java.util.ArrayList; import java.util.List; import java.util.Properties; diff --git a/src/main/java/com/metaweb/gridworks/operations/MultiValuedCellSplitOperation.java b/src/main/java/com/metaweb/gridworks/operations/MultiValuedCellSplitOperation.java index 132d300d2..f25f5408d 100644 --- a/src/main/java/com/metaweb/gridworks/operations/MultiValuedCellSplitOperation.java +++ b/src/main/java/com/metaweb/gridworks/operations/MultiValuedCellSplitOperation.java @@ -1,6 +1,6 @@ package com.metaweb.gridworks.operations; - import java.util.ArrayList; + import java.util.ArrayList; import java.util.List; import java.util.Properties;