Add string representation of TypedDataItem value to conversion error message.
[online-glom:gwt-glom.git] / src / main / java / org / glom / web / server / Utils.java
1 /*
2  * Copyright (C) 2011 Openismus GmbH
3  *
4  * This file is part of GWT-Glom.
5  *
6  * GWT-Glom is free software: you can redistribute it and/or modify it
7  * under the terms of the GNU Lesser General Public License as published by the
8  * Free Software Foundation, either version 3 of the License, or (at your
9  * option) any later version.
10  *
11  * GWT-Glom is distributed in the hope that it will be useful, but WITHOUT
12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
14  * for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public License
17  * along with GWT-Glom.  If not, see <http://www.gnu.org/licenses/>.
18  */
19
20 package org.glom.web.server;
21
22 import java.io.File;
23
24 import org.glom.libglom.Field.glom_field_type;
25 import org.glom.libglom.Value;
26 import org.glom.web.shared.TypedDataItem;
27 import org.glom.web.shared.layout.LayoutItemField.GlomFieldType;
28
29 /**
30  * @author Ben Konrath <ben@bagu.org>
31  * 
32  */
33 public class Utils {
34
35         /*
36          * This method safely converts longs from libglom into ints. This method was taken from stackoverflow:
37          * 
38          * http://stackoverflow.com/questions/1590831/safely-casting-long-to-int-in-java
39          */
40         public static int safeLongToInt(long value) {
41                 if (value < Integer.MIN_VALUE || value > Integer.MAX_VALUE) {
42                         throw new IllegalArgumentException(value + " cannot be cast to int without changing its value.");
43                 }
44                 return (int) value;
45         }
46
47         public static String getFileName(String fileURI) {
48                 String[] splitURI = fileURI.split(File.separator);
49                 return splitURI[splitURI.length - 1];
50         }
51
52         public static Value getGlomTypeGdaValueForTypedDataItem(String documentID, String tableName,
53                         glom_field_type glomType, TypedDataItem dataItem) {
54                 Value gdaValue = null;
55
56                 switch (glomType) {
57                 case TYPE_NUMERIC:
58
59                         if (dataItem.isEmpty()) {
60                                 // No data has been set on the TypedDataItem. Use an empty value.
61                                 gdaValue = new Value();
62
63                         } else if (dataItem.getType() == GlomFieldType.TYPE_NUMERIC) {
64                                 // non-empty data, numeric type:
65                                 // Trust the data in the TypedDataItem because the types match.
66                                 gdaValue = new Value(dataItem.getNumber());
67
68                         } else if (dataItem.getType() == GlomFieldType.TYPE_INVALID) {
69                                 // non-empty data, invalid type:
70                                 // An invalid type that's not empty indicates that the TypeDataItem has been created from a URL string.
71                                 // The string will be converted into the Glom type (numeric).
72                                 try {
73                                         // non-locale specific string-to-number conversion:
74                                         // http://docs.oracle.com/javase/6/docs/api/java/lang/Double.html#valueOf%28java.lang.String%29
75                                         gdaValue = new Value(Double.parseDouble(dataItem.getUnknown()));
76                                 } catch (Exception e) {
77                                         // Use an empty Value when the number conversion doesn't work.
78                                         gdaValue = new Value();
79                                 }
80
81                         } else {
82                                 // non-empty data, mis-matched types:
83                                 // Don't use the data when the type doesn't match the type from the Glom document.
84                                 logTypeMismatchError(documentID, tableName, glomType, dataItem);
85                                 gdaValue = new Value(); // an empty Value
86                         }
87                         break;
88
89                 case TYPE_TEXT:
90
91                         if (dataItem.isEmpty()) {
92                                 // No data has been set on the TypedDataItem. Use an empty string value.
93                                 gdaValue = new Value("");
94
95                         } else if (dataItem.getType() == GlomFieldType.TYPE_TEXT) {
96                                 // non-empty data, text type:
97                                 // Trust the data in the TypedDataItem because the types match.
98                                 gdaValue = new Value(dataItem.getText());
99
100                         } else if (dataItem.getType() == GlomFieldType.TYPE_INVALID) {
101                                 // non-empty data, invalid type:
102                                 // An invalid type that's not empty indicates that primary key value has been created from a URL string.
103                                 // The string will be converted into the Glom type (text).
104                                 gdaValue = new Value(dataItem.getUnknown());
105
106                         } else {
107                                 // non-empty data, mis-matched types:
108                                 // Don't use the primary key value when the type doesn't match the type from the Glom document.
109                                 logTypeMismatchError(documentID, tableName, glomType, dataItem);
110                                 gdaValue = new Value(""); // an emtpy string Value
111                         }
112                         break;
113
114                 default:
115                         Log.error(documentID, tableName, "Unable to create a Gda Value of type: " + glomType
116                                         + " based on data of type: " + dataItem.getType() + ".");
117                         Log.warn(documentID, tableName, "The data item is being ignored. This is a Bug.");
118                         gdaValue = new Value(); // an empty Value
119                         break;
120                 }
121
122                 return gdaValue;
123         }
124
125         private static void logTypeMismatchError(String documentID, String tableName, glom_field_type glomType,
126                         TypedDataItem dataItem) {
127
128                 String dataItemString;
129                 switch (dataItem.getType()) {
130                 case TYPE_BOOLEAN:
131                         dataItemString = Boolean.toString(dataItem.getBoolean());
132                         break;
133                 case TYPE_NUMERIC:
134                         dataItemString = Double.toString(dataItem.getNumber());
135                         break;
136                 case TYPE_INVALID:
137                         dataItemString = dataItem.getUnknown();
138                         break;
139                 case TYPE_TEXT:
140                         dataItemString = dataItem.getText();
141                         break;
142                 default:
143                         dataItemString = "";
144                         break;
145                 }
146
147                 Log.error(documentID, tableName, "The data with type: " + dataItem.getType() + " and value: " + dataItemString
148                                 + " doesn't match the expected type from the Glom document: " + glomType + ".");
149                 Log.error(documentID, tableName, "The data item is being ignored. This is a bug.");
150         }
151
152 }