details: /erp/devel/pi/rev/ea0e4ccba637
changeset: 11142:ea0e4ccba637
user: Antonio Moreno <antonio.moreno <at> openbravo.com>
date: Wed Mar 09 13:13:14 2011 +0100
summary: Add advanced filtering to csv export. Fixed a potential failure when
no filtering was done.
diffstat:
modules/org.openbravo.service.datasource/src/org/openbravo/service/datasource/DataSourceServlet.java
| 296 +++++----
modules/org.openbravo.service.datasource/src/org/openbravo/service/datasource/DefaultDataSourceService.java
| 43 +-
modules/org.openbravo.service.json/src/org/openbravo/service/json/DefaultJsonDataService.java
| 16 +-
3 files changed, 205 insertions(+), 150 deletions(-)
diffs (truncated from 441 to 300 lines):
diff -r 12ab2f0c3bb5 -r ea0e4ccba637
modules/org.openbravo.service.datasource/src/org/openbravo/service/datasource/DataSourceServlet.java
---
a/modules/org.openbravo.service.datasource/src/org/openbravo/service/datasource/DataSourceServlet.java
Wed Mar 09 12:36:51 2011 +0100
+++
b/modules/org.openbravo.service.datasource/src/org/openbravo/service/datasource/DataSourceServlet.java
Wed Mar 09 13:13:14 2011 +0100
@@ -20,7 +20,6 @@
import java.io.BufferedReader;
import java.io.IOException;
-import java.io.PrintWriter;
import java.io.Writer;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
@@ -58,6 +57,7 @@
import org.openbravo.erpCommon.businessUtility.Preferences;
import org.openbravo.erpCommon.security.UsageAudit;
import org.openbravo.erpCommon.utility.PropertyException;
+import org.openbravo.service.json.DefaultJsonDataService;
import org.openbravo.service.json.JsonConstants;
import org.openbravo.service.json.JsonUtils;
import org.openbravo.service.web.InvalidContentException;
@@ -173,7 +173,7 @@
}
}
// now do the action
- String result = getDataSource(request).fetch(parameters);
+
boolean isExport = "true".equals(parameters.get("exportToFile"));
if (isExport) {
String exportAs = parameters.get("exportAs");
@@ -181,11 +181,25 @@
exportAs = "csv";
}
if ("csv".equals(exportAs)) {
- writeResultCSV(request, response, parameters, result);
+ response.setContentType("text/csv; charset=UTF-8");
+ response.setHeader("Content-Disposition", "attachment;
filename=ExportedData.csv");
+ if (getDataSource(request) instanceof DefaultDataSourceService) {
+ QueryJSONWriterToCSV writer = new QueryJSONWriterToCSV(request,
response, parameters);
+ ((DefaultDataSourceService)
getDataSource(request)).fetch(parameters, writer);
+ } else {
+ String result = getDataSource(request).fetch(parameters);
+ JSONObject jsonResult = new JSONObject(result);
+ JSONArray data =
jsonResult.getJSONObject("response").getJSONArray("data");
+ QueryJSONWriterToCSV writer = new QueryJSONWriterToCSV(request,
response, parameters);
+ for (int i = 0; i < data.length(); i++) {
+ writer.write(data.getJSONObject(i));
+ }
+ }
} else {
log.error("Unsupported export format: " + exportAs);
}
} else {
+ String result = getDataSource(request).fetch(parameters);
writeResult(response, result);
}
} catch (Exception e) {
@@ -193,6 +207,155 @@
}
}
+ private class QueryJSONWriterToCSV extends
DefaultJsonDataService.QueryResultWriter {
+
+ Writer writer;
+ String fieldSeparator;
+ String decimalSeparator;
+ List<String> fieldProperties;
+ boolean propertiesWritten = false;
+
+ public QueryJSONWriterToCSV(HttpServletRequest request,
HttpServletResponse response,
+ Map<String, String> parameters) {
+ response.setContentType("text/csv; charset=UTF-8");
+ response.setHeader("Content-Disposition", "attachment;
filename=ExportedData.csv");
+ try {
+ writer = response.getWriter();
+ VariablesSecureApp vars = new VariablesSecureApp(request);
+ decimalSeparator =
vars.getSessionValue("#DecimalSeparator|generalQtyEdition").substring(0,
+ 1);
+ // JSONObject jsonResult = new JSONObject(result);
+ // JSONArray data =
jsonResult.getJSONObject("response").getJSONArray("data");
+ try {
+ fieldSeparator = Preferences.getPreferenceValue("CSVFieldSeparator",
false, null, null,
+ OBContext.getOBContext().getUser(), null, null);
+ } catch (PropertyException e) {
+ log.warn("CSV Field Separator couldn't be found. Using default
separator: ,");
+ fieldSeparator = ",";
+ }
+ fieldProperties = new ArrayList<String>();
+ if (parameters.get("viewState") != null
+ && !parameters.get("viewState").toString().equals("undefined")) {
+ String viewStateO = parameters.get("viewState");
+ String viewStateWithoutParenthesis = viewStateO.substring(1,
viewStateO.length() - 1);
+ JSONObject viewState = new JSONObject(viewStateWithoutParenthesis);
+ String fieldA = viewState.getString("field");
+ JSONArray fields = new JSONArray(fieldA);
+ for (int i = 0; i < fields.length(); i++) {
+ JSONObject field = fields.getJSONObject(i);
+ if (field.has("visible") && !field.getBoolean("visible")) {
+ // The field is not visible. We should not export it
+ continue;
+ }
+ if (field.getString("name").equals("_checkboxField")
+ || field.getString("name").equals("_editLink")) {
+ continue;
+ }
+ fieldProperties.add(field.getString("name"));
+ }
+ }
+
+ if (fieldProperties.size() > 0) {
+ // If the request came with the view state information, we get the
properties from there
+ for (int i = 0; i < fieldProperties.size(); i++) {
+ if (i > 0) {
+ writer.append(fieldSeparator);
+ }
+ writer.append("\"").append(fieldProperties.get(i)).append("\"");
+ }
+ propertiesWritten = true;
+ }
+ } catch (Exception e) {
+ throw new OBException("Error while exporting a CSV file", e);
+ }
+ }
+
+ private void writeJSONProperties(JSONObject row) {
+ final Iterator<?> itKeysF = row.keys();
+ Vector<String> keys = new Vector<String>();
+ boolean isFirst = true;
+ try {
+ while (itKeysF.hasNext()) {
+ String key = (String) itKeysF.next();
+ if (key.endsWith("_identifier")) {
+ continue;
+ }
+ if (fieldProperties.size() > 0 && !fieldProperties.contains(key)) {
+ // Field is not visible. We don't show it
+ continue;
+ }
+ if (isFirst) {
+ isFirst = false;
+ } else {
+ writer.append(fieldSeparator);
+ }
+ keys.add(key);
+ writer.append("'").append(key).append("'");
+ }
+ } catch (Exception e) {
+ throw new OBException("Error while writing column names when exporting
a CSV file", e);
+ }
+ }
+
+ public void write(JSONObject json) {
+ try {
+ if (!propertiesWritten) {
+ writeJSONProperties(json);
+ }
+ writer.append("\n");
+ final Iterator<?> itKeys;
+ if (fieldProperties.size() > 0) {
+ itKeys = fieldProperties.iterator();
+ } else {
+ itKeys = json.keys();
+ }
+ boolean isFirst = true;
+ while (itKeys.hasNext()) {
+ String key = (String) itKeys.next();
+ if (key.endsWith("_identifier")) {
+ continue;
+ }
+ if (fieldProperties.size() > 0 && !fieldProperties.contains(key)) {
+ // Field is not visible. We don't show it
+ continue;
+ }
+ if (isFirst) {
+ isFirst = false;
+ } else {
+ writer.append(fieldSeparator);
+ }
+ if (!json.has(key)) {
+ continue;
+ }
+ Object keyValue = json.has(key + "._identifier") ? json.get(key +
"._identifier") : json
+ .get(key);
+ if (keyValue instanceof Number && keyValue != null) {
+ keyValue = keyValue.toString().replace(".", decimalSeparator);
+ }
+ if ((keyValue instanceof Date) && keyValue != null) {
+ // TODO This currently will never happen. Dates in JSONObjects are
represented as
+ // Strings, and therefore keyValue will never be Date or DateTime.
Once a BaseOBObject
+ // is exported instead of a JSONObject, this will be done properly
+ String pattern =
RequestContext.get().getSessionAttribute("#AD_JAVADATEFORMAT")
+ .toString();
+ SimpleDateFormat dateFormat = new SimpleDateFormat(pattern);
+ dateFormat.setLenient(true);
+ keyValue = dateFormat.format((Date) keyValue);
+ }
+ if (keyValue != null && !keyValue.toString().equals("null")) {
+ keyValue = Replace.replace(keyValue.toString(), "\"", "\"\"");
+ } else {
+ keyValue = "";
+ }
+ keyValue = "\"" + keyValue + "\"";
+ writer.append(keyValue.toString());
+ }
+ } catch (Exception e) {
+ throw new OBException("Error while exporting CSV information", e);
+ }
+ }
+ }
+
private void handleException(Exception e, HttpServletResponse response)
throws IOException {
log4j.error(e.getMessage(), e);
if (!response.isCommitted()) {
@@ -430,134 +593,9 @@
private void writeResultCSV(HttpServletRequest request, HttpServletResponse
response,
Map<String, String> parameters, String result) throws IOException,
JSONException {
- response.setContentType("text/csv; charset=UTF-8");
- response.setHeader("Content-Disposition", "attachment;
filename=ExportedData.csv");
- VariablesSecureApp vars = new VariablesSecureApp(request);
- JSONObject jsonResult = new JSONObject(result);
- JSONArray data = jsonResult.getJSONObject("response").getJSONArray("data");
- String fieldSeparator;
- try {
- fieldSeparator = Preferences.getPreferenceValue("CSVFieldSeparator",
false, null, null,
- OBContext.getOBContext().getUser(), null, null);
- } catch (PropertyException e) {
- log.warn("CSV Field Separator couldn't be found. Using default
separator: ,");
- fieldSeparator = ",";
- }
+ StringBuffer csv = new StringBuffer();
- List<String> fieldProperties = new ArrayList<String>();
- if (parameters.get("viewState") != null
- && !parameters.get("viewState").toString().equals("undefined")) {
- String viewStateO = parameters.get("viewState");
- String viewStateWithoutParenthesis = viewStateO.substring(1,
viewStateO.length() - 1);
- JSONObject viewState = new JSONObject(viewStateWithoutParenthesis);
- String fieldA = viewState.getString("field");
- JSONArray fields = new JSONArray(fieldA);
- for (int i = 0; i < fields.length(); i++) {
- JSONObject field = fields.getJSONObject(i);
- if (field.has("visible") && !field.getBoolean("visible")) {
- // The field is not visible. We should not export it
- continue;
- }
- if (field.getString("name").equals("_checkboxField")
- || field.getString("name").equals("_editLink")) {
- continue;
- }
- fieldProperties.add(field.getString("name"));
- }
- }
- StringBuffer csv = new StringBuffer();
- if (data.length() > 0) {
- if (fieldProperties.size() > 0) {
- // If the request came with the view state information, we get the
properties from there
- for (int i = 0; i < fieldProperties.size(); i++) {
- if (i > 0) {
- csv.append(fieldSeparator);
- }
- csv.append("\"").append(fieldProperties.get(i)).append("\"");
- }
- } else {
- // If not, we get them from the JSONObject itself
- final JSONObject headerRow = data.getJSONObject(0);
- final Iterator<?> itKeysF = headerRow.keys();
- Vector<String> keys = new Vector<String>();
- boolean isFirst = true;
- while (itKeysF.hasNext()) {
- String key = (String) itKeysF.next();
- if (key.endsWith("_identifier")) {
- continue;
- }
- if (fieldProperties.size() > 0 && !fieldProperties.contains(key)) {
- // Field is not visible. We don't show it
- continue;
- }
- if (isFirst) {
- isFirst = false;
- } else {
- csv.append(fieldSeparator);
- }
- keys.add(key);
- csv.append("'").append(key).append("'");
- }
- }
-
- for (int i = 0; i < data.length(); i++) {
- JSONObject row = data.getJSONObject(i);
- csv.append("\n");
- final Iterator<?> itKeys;
- if (fieldProperties.size() > 0) {
- itKeys = fieldProperties.iterator();
- } else {
- itKeys = row.keys();
- }
- boolean isFirst = true;
- while (itKeys.hasNext()) {
- String key = (String) itKeys.next();
- if (key.endsWith("_identifier")) {
------------------------------------------------------------------------------
Colocation vs. Managed Hosting
A question and answer guide to determining the best fit
for your organization - today and in the future.
http://p.sf.net/sfu/internap-sfd2d
_______________________________________________
Openbravo-commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/openbravo-commits