From 64cf62e08140f5efd2fc6e659663bbf8b82ed9bf Mon Sep 17 00:00:00 2001 From: Frank Wennerdahl Date: Thu, 24 Jan 2013 09:39:12 +0100 Subject: [PATCH 1/8] Fixed history and header update in IE Due to Internet Explorer caching GET requests the Undo/Redo list and column headers were not updated, leaving essential parts of the user interface crippled even if Google Frame is installed. Adding Cache-Control headers to the responses fixes this. --- main/src/com/google/refine/commands/Command.java | 1 + .../src/com/google/refine/commands/project/GetModelsCommand.java | 1 + 2 files changed, 2 insertions(+) diff --git a/main/src/com/google/refine/commands/Command.java b/main/src/com/google/refine/commands/Command.java index bca60e07a..d4466c7f4 100644 --- a/main/src/com/google/refine/commands/Command.java +++ b/main/src/com/google/refine/commands/Command.java @@ -303,6 +303,7 @@ public abstract class Command { response.setCharacterEncoding("UTF-8"); response.setHeader("Content-Type", "application/json"); + response.setHeader("Cache-Control", "no-cache"); Writer w = response.getWriter(); JSONWriter writer = new JSONWriter(w); diff --git a/main/src/com/google/refine/commands/project/GetModelsCommand.java b/main/src/com/google/refine/commands/project/GetModelsCommand.java index 7276f9848..e8a2a39f1 100644 --- a/main/src/com/google/refine/commands/project/GetModelsCommand.java +++ b/main/src/com/google/refine/commands/project/GetModelsCommand.java @@ -85,6 +85,7 @@ public class GetModelsCommand extends Command { try { response.setCharacterEncoding("UTF-8"); response.setHeader("Content-Type", "application/json"); + response.setHeader("Cache-Control", "no-cache"); Properties options = new Properties(); JSONWriter writer = new JSONWriter(response.getWriter()); From 2c59a0059f59b2fda27c9b5c727de2ed156d65b6 Mon Sep 17 00:00:00 2001 From: Frank Wennerdahl Date: Thu, 24 Jan 2013 09:59:09 +0100 Subject: [PATCH 2/8] Fixed removal of upload temp files Fixed an issue with an unclosed stream preventing upload temp files from being removed after use. Also removed the use of FileCleaningTracker and instead added manual removal of all tempfiles. By doing this the reaper threads in FileCleaningTracker are avoided and files are removed directly after use. --- .../google/refine/importing/ImportingUtilities.java | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/main/src/com/google/refine/importing/ImportingUtilities.java b/main/src/com/google/refine/importing/ImportingUtilities.java index d908249b0..703023a16 100644 --- a/main/src/com/google/refine/importing/ImportingUtilities.java +++ b/main/src/com/google/refine/importing/ImportingUtilities.java @@ -65,7 +65,6 @@ import org.apache.commons.fileupload.ProgressListener; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; import org.apache.commons.fileupload.util.Streams; -import org.apache.commons.io.FileCleaningTracker; import org.apache.tools.bzip2.CBZip2InputStream; import org.apache.tools.tar.TarEntry; import org.apache.tools.tar.TarInputStream; @@ -187,7 +186,6 @@ public class ImportingUtilities { }; DiskFileItemFactory fileItemFactory = new DiskFileItemFactory(); - fileItemFactory.setFileCleaningTracker(new FileCleaningTracker()); ServletFileUpload upload = new ServletFileUpload(fileItemFactory); upload.setProgressListener(new ProgressListener() { @@ -212,8 +210,10 @@ public class ImportingUtilities { } }); + List tempFiles = upload.parseRequest(request); + progress.setProgress("Uploading data ...", -1); - parts: for (Object obj : upload.parseRequest(request)) { + parts: for (Object obj : tempFiles) { if (progress.isCanceled()) { break; } @@ -355,6 +355,13 @@ public class ImportingUtilities { uploadCount++; } } + + stream.close(); + } + + // Delete all temp files. + for (Object obj : tempFiles) { + ((FileItem)obj).delete(); } JSONUtilities.safePut(retrievalRecord, "uploadCount", uploadCount); From 7dc7bc0ad1f688810aed7f5b8b0ef35fcbd6953f Mon Sep 17 00:00:00 2001 From: Mateja Verlic Date: Fri, 25 Jan 2013 19:57:10 +0100 Subject: [PATCH 3/8] Updated logos with new ones - part of #630 rebranding --- .../core/images/logo-openrefine-30.png | Bin 1083 -> 10572 bytes .../core/images/logo-openrefine-40.png | Bin 1162 -> 15323 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/main/webapp/modules/core/images/logo-openrefine-30.png b/main/webapp/modules/core/images/logo-openrefine-30.png index 031f745d0d314892490c35bdf73225e882b2157b..b5b99df694f0275f46f6b56e32a1850c31113627 100644 GIT binary patch literal 10572 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 delta 1073 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�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 delta 1152 zcmV-`1b_S6cZvy+8Gi!+003^pfK&hg0{~D=R7HlG+k%zaMqxeYP6N@dAG zUB+d6()alM7CE}??Cj&`_Vo1h<>cgjkl5SX+q}HI)6>(;%*^ui`{n8PLTcT_#KgF@ zxTK_|8$7!@b3jUV=IJLkv$V8WhUr6X;;gK!{Hh2*XWUY3%zulV-8){=%C@b<#>qWm z)jww1uDa)(tKu+E!a7^bGETbP$!Ck?W`)|r%iB3idV#BuYXZi_0DtR8!_@VII_Ly_W1mhO;V+^Wc;T zVq5lFR%3Rx(b@Boqu-{gw)?IV%BqhxR>{hekEFZpHB!UOCN{SVCsTdmEK9+pnV8dU zZT`I^rFeIZm8o@$*7L8Z%MvTi6fk*+w%bcry2R?m%74~*n&(w!rg?>@kdBi7!Yup9 zNJm?!+1~V_uj8z+wCp%S;9h46F1C4$$vj!b*N2A0&E)Hq4Bg`O?YmA&X2jF8diC_{ z$%Zy)lkCaZ_C#E@RcpAXzVWzjaO&;&dxMwmQ&Ua7Vd8rN&o)J=6Dif&=4p7U;TSK? z)$sJ#k$A8I7Et>#Fet{xxv%^#yDk`@D5uQYlF)& zM4IX}I}EZVHBGKwlqvr=if+1~T%?f5iN z!d=N{T!Gx3qObU-n>d_Fp`@)JK)u?*lj`mC7k_vo&C$-1qTbVfg5GunnXB9IwKvwL zP|xVo*yH$|BsIB^T6~V!aF5-1k=O5md#P|!Jp`q z%F^zFp62PCCKY5J)7Ia9){FGRRe+Y!c%ksNa4tD?J+afX;^pn$;^{wO&vAy;d5zb$ z!GGzOs^e5|#$L;#2d z9Y_EG0V_#FK~z}7?Uzv!!ypJmxfu7qRwtb{F|rF7wI3b!r%4mwsh~upR4SE9|0sRy z_?h#dOE`Q#It#0s3A4n{`Rr+|)`3pKMt^=5%*P^Mr!}XYpAN-06T{vJi&xUJ-_y~) z0%2Pty-Bi>*j#>ZKLy*<^-)kU0S#I!SsK$uTWTE1oB&gc(B5%KL^W>!o{$lczM>s zvaO4yfrQD%8-TGi7&;UtV09O)dOeLkfR$aaxRKF#Nds8*jZ#}zvPI-4*l`s{0aciW zHAYd>?4H;OShk&|V8w6Z%_G8?;~xwqQ%8DZK!1W&F}C S1l;NX0000 Date: Fri, 25 Jan 2013 21:56:24 +0100 Subject: [PATCH 4/8] Tooltip is updated after changing facet expression - fixed #649 --- main/webapp/modules/core/scripts/facets/list-facet.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/main/webapp/modules/core/scripts/facets/list-facet.js b/main/webapp/modules/core/scripts/facets/list-facet.js index 38656b57e..4df634846 100644 --- a/main/webapp/modules/core/scripts/facets/list-facet.js +++ b/main/webapp/modules/core/scripts/facets/list-facet.js @@ -680,6 +680,7 @@ ListFacet.prototype._editExpression = function() { self._config.expression = expr; self._elmts.expressionDiv.text(self._config.expression); + self._elmts.changeButton.attr("title", "Current Expression: " + self._config.expression); if (self._config.expression == "value" || self._config.expression == "grel:value") { self._elmts.clusterLink.show(); } else { @@ -689,6 +690,7 @@ ListFacet.prototype._editExpression = function() { self.reset(); self._updateRest(); } + self._elmts.expressionDiv.hide(); } ); }; From 29d594ef2f4a4ec9cfca8cab989d3a7478b0eadc Mon Sep 17 00:00:00 2001 From: Jesus Castagnetto Date: Fri, 1 Feb 2013 19:34:50 -0500 Subject: [PATCH 5/8] Added Java 8 to version check --- refine | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/refine b/refine index fb03850b8..feaaa6704 100755 --- a/refine +++ b/refine @@ -854,7 +854,7 @@ if [ ! -x "$JAVA" ] ; then error "Could not find the 'java' executable at '$JAVA', are you sure your JAVA_HOME environment variable is pointing to a proper java installation?" fi -JAVA_VERSION=`$JAVA -version 2>&1 | grep version | cut -d ' ' -f 3 | egrep '^\"1\.(6|7)'` +JAVA_VERSION=`$JAVA -version 2>&1 | grep version | cut -d ' ' -f 3 | egrep '^\"1\.(6|7|8)'` if [ -z "$JAVA_VERSION" ] ; then error "OpenRefine requires Java version 6 or later. If you have multiple versions of Java installed, please set the environment variable JAVA_HOME to the correct version." fi From 473e2f367f1e4640655d03ba6694c594e2e542f7 Mon Sep 17 00:00:00 2001 From: Jesus Castagnetto Date: Fri, 1 Feb 2013 17:59:16 -0800 Subject: [PATCH 6/8] Implementing Xor operation --- .../refine/expr/functions/booleans/Xor.java | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 main/src/com/google/refine/expr/functions/booleans/Xor.java diff --git a/main/src/com/google/refine/expr/functions/booleans/Xor.java b/main/src/com/google/refine/expr/functions/booleans/Xor.java new file mode 100644 index 000000000..7ce081861 --- /dev/null +++ b/main/src/com/google/refine/expr/functions/booleans/Xor.java @@ -0,0 +1,42 @@ +/* + Implementing a naive XOR operation + Copyright 2013, Jesus M. Castagnetto + License: BSD 2-Clause License (http://opensource.org/licenses/BSD-2-Clause) +*/ + +package com.google.refine.expr.functions.booleans; + +import java.util.Properties; + +import org.json.JSONException; +import org.json.JSONWriter; + +import com.google.refine.expr.EvalError; +import com.google.refine.grel.ControlFunctionRegistry; +import com.google.refine.grel.Function; + +public class Xor implements Function { + + @Override + public Object call(Properties bindings, Object[] args) { + if (args.length == 2 && + args[0] != null && args[0] instanceof Boolean && + args[1] != null && args[0] instanceof Boolean) { + boolean o1 = ((Boolean) args[0]).booleanValue(); + boolean o2 = ((Boolean) args[1]).booleanValue(); + return o1 != o2; + } + return new EvalError(ControlFunctionRegistry.getFunctionName(this) + " expects 2 booleans"); + } + + @Override + public void write(JSONWriter writer, Properties options) + throws JSONException { + + writer.object(); + writer.key("description"); writer.value("XORs two boolean values"); + writer.key("params"); writer.value("boolean a, boolean b"); + writer.key("returns"); writer.value("boolean"); + writer.endObject(); + } +} From ebec459cfd89f954169379240e7d59abf39cc43a Mon Sep 17 00:00:00 2001 From: Jesus Castagnetto Date: Fri, 1 Feb 2013 21:00:36 -0500 Subject: [PATCH 7/8] indentation change --- main/src/com/google/refine/expr/functions/booleans/Xor.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/main/src/com/google/refine/expr/functions/booleans/Xor.java b/main/src/com/google/refine/expr/functions/booleans/Xor.java index 7ce081861..27e9ffc4e 100644 --- a/main/src/com/google/refine/expr/functions/booleans/Xor.java +++ b/main/src/com/google/refine/expr/functions/booleans/Xor.java @@ -20,8 +20,8 @@ public class Xor implements Function { @Override public Object call(Properties bindings, Object[] args) { if (args.length == 2 && - args[0] != null && args[0] instanceof Boolean && - args[1] != null && args[0] instanceof Boolean) { + args[0] != null && args[0] instanceof Boolean && + args[1] != null && args[0] instanceof Boolean) { boolean o1 = ((Boolean) args[0]).booleanValue(); boolean o2 = ((Boolean) args[1]).booleanValue(); return o1 != o2; From fec35a8bc6b0d7bf5a6f63248bd45154a17d8a4e Mon Sep 17 00:00:00 2001 From: Jesus Castagnetto Date: Fri, 1 Feb 2013 21:07:42 -0500 Subject: [PATCH 8/8] Update main/src/com/google/refine/expr/functions/booleans/Xor.java --- .../refine/expr/functions/booleans/Xor.java | 42 ------------------- 1 file changed, 42 deletions(-) diff --git a/main/src/com/google/refine/expr/functions/booleans/Xor.java b/main/src/com/google/refine/expr/functions/booleans/Xor.java index 27e9ffc4e..e69de29bb 100644 --- a/main/src/com/google/refine/expr/functions/booleans/Xor.java +++ b/main/src/com/google/refine/expr/functions/booleans/Xor.java @@ -1,42 +0,0 @@ -/* - Implementing a naive XOR operation - Copyright 2013, Jesus M. Castagnetto - License: BSD 2-Clause License (http://opensource.org/licenses/BSD-2-Clause) -*/ - -package com.google.refine.expr.functions.booleans; - -import java.util.Properties; - -import org.json.JSONException; -import org.json.JSONWriter; - -import com.google.refine.expr.EvalError; -import com.google.refine.grel.ControlFunctionRegistry; -import com.google.refine.grel.Function; - -public class Xor implements Function { - - @Override - public Object call(Properties bindings, Object[] args) { - if (args.length == 2 && - args[0] != null && args[0] instanceof Boolean && - args[1] != null && args[0] instanceof Boolean) { - boolean o1 = ((Boolean) args[0]).booleanValue(); - boolean o2 = ((Boolean) args[1]).booleanValue(); - return o1 != o2; - } - return new EvalError(ControlFunctionRegistry.getFunctionName(this) + " expects 2 booleans"); - } - - @Override - public void write(JSONWriter writer, Properties options) - throws JSONException { - - writer.object(); - writer.key("description"); writer.value("XORs two boolean values"); - writer.key("params"); writer.value("boolean a, boolean b"); - writer.key("returns"); writer.value("boolean"); - writer.endObject(); - } -}