/***************************************************
*
* cismet GmbH, Saarbruecken, Germany
*
* ... and it just works.
*
****************************************************/
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package de.cismet.cismap.commons.tools;
import com.vividsolutions.jts.geom.Geometry;
import org.apache.log4j.Logger;
import org.deegree.datatypes.Types;
import org.openide.util.NbBundle;
import java.math.BigDecimal;
import java.sql.Timestamp;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.util.Date;
import de.cismet.cismap.commons.featureservice.FeatureServiceAttribute;
/**
* Some useful method for features.
*
* @author therter
* @version $Revision$, $Date$
*/
public class FeatureTools {
//~ Static fields/initializers ---------------------------------------------
private static final Logger LOG = Logger.getLogger(FeatureTools.class);
public static final DecimalFormat FORMATTER = new DecimalFormat();
static {
final DecimalFormatSymbols symbols = new DecimalFormatSymbols();
symbols.setDecimalSeparator('.');
FORMATTER.setDecimalFormatSymbols(symbols);
FORMATTER.setGroupingUsed(false);
}
//~ Methods ----------------------------------------------------------------
/**
* Determines the java class that can represent the type of the given feature attribute.
*
* @param attr DOCUMENT ME!
*
* @return The java class that can represent the type of the given feature attribute
*/
public static Class<?> getClass(final FeatureServiceAttribute attr) {
if (attr.isGeometry()) {
return String.class;
} else if (attr.getType().equals(String.valueOf(Types.CHAR))
|| attr.getType().equals(String.valueOf(Types.VARCHAR))
|| attr.getType().equals(String.valueOf(Types.LONGVARCHAR))) {
return String.class;
} else if (attr.getType().equals(String.valueOf(Types.INTEGER))
|| attr.getType().equals(String.valueOf(Types.SMALLINT))
|| attr.getType().equals(String.valueOf(Types.TINYINT))
|| attr.getType().equals("xsd:integer")) {
return Integer.class;
} else if (attr.getType().equals(String.valueOf(Types.BIGINT))
|| attr.getType().equals("xsd:long")) {
return Long.class;
} else if (attr.getType().equals(String.valueOf(Types.DOUBLE))
|| attr.getType().equals(String.valueOf(Types.FLOAT))
|| attr.getType().equals(String.valueOf(Types.DECIMAL))
|| attr.getType().equals("xsd:float")
|| attr.getType().equals("xsd:decimal")
|| attr.getType().equals("xsd:double")) {
return Double.class;
} else if (attr.getType().equals(String.valueOf(Types.NUMERIC))) {
return BigDecimal.class;
} else if (attr.getType().equals(String.valueOf(Types.DATE))
|| attr.getType().equals(String.valueOf(Types.TIME))
|| attr.getType().equals(String.valueOf(Types.TIMESTAMP))) {
return Date.class;
} else if (attr.getType().equals(String.valueOf(Types.BOOLEAN))
|| attr.getType().equals("xsd:boolean")) {
return Boolean.class;
} else {
return String.class;
}
}
/**
* Converts the given java data type to its corresponding feature data type.
*
* @param cl a java class
*
* @return the service data type
*/
public static String getType(final Class cl) {
if (Geometry.class.isAssignableFrom(cl)) {
return String.valueOf(Types.GEOMETRY);
} else if (cl.getName().endsWith("String")) {
return String.valueOf(Types.VARCHAR);
} else if (cl.getName().endsWith("Integer") || cl.getName().equals("int")) {
return String.valueOf(Types.INTEGER);
} else if (cl.getName().endsWith("Long") || cl.getName().equals("long")) {
return String.valueOf(Types.BIGINT);
} else if (cl.getName().endsWith("Double") || cl.getName().equals("double") || cl.getName().endsWith("Float")
|| cl.getName().equals("float")) {
return String.valueOf(Types.DOUBLE);
} else if (cl.getName().endsWith("Date")) {
return String.valueOf(Types.DATE);
} else if (cl.getName().endsWith("Timestamp")) {
return String.valueOf(Types.TIMESTAMP);
} else if (cl.getName().endsWith("Boolean") || cl.getName().equals("boolean")) {
return String.valueOf(Types.BOOLEAN);
} else if (cl.getName().endsWith("BigDecimal")) {
return String.valueOf(Types.NUMERIC);
} else {
return String.valueOf(Types.VARCHAR);
}
}
/**
* Determines the H2 data type that can represent the type of the given feature attribute.
*
* @param attr DOCUMENT ME!
*
* @return The H2 data type that can represent the type of the given feature attribute
*/
public static String getH2DataType(final FeatureServiceAttribute attr) {
if (attr.isGeometry()) {
return "Geometry";
} else if (attr.getType().equals(String.valueOf(Types.CHAR))
|| attr.getType().equals(String.valueOf(Types.VARCHAR))
|| attr.getType().equals(String.valueOf(Types.LONGVARCHAR))) {
return "VARCHAR";
} else if (attr.getType().equals(String.valueOf(Types.INTEGER))
|| attr.getType().equals(String.valueOf(Types.SMALLINT))
|| attr.getType().equals(String.valueOf(Types.TINYINT))
|| attr.getType().equals("xsd:integer")) {
return "Integer";
} else if (attr.getType().equals(String.valueOf(Types.BIGINT))
|| attr.getType().equals("xsd:long")) {
return "BIGINT";
} else if (attr.getType().equals(String.valueOf(Types.DOUBLE))
|| attr.getType().equals(String.valueOf(Types.FLOAT))
|| attr.getType().equals(String.valueOf(Types.DECIMAL))
|| attr.getType().equals("xsd:float")
|| attr.getType().equals("xsd:decimal")
|| attr.getType().equals("xsd:double")) {
return "Double";
} else if (attr.getType().equals(String.valueOf(Types.DATE))
|| attr.getType().equals(String.valueOf(Types.TIME))
|| attr.getType().equals(String.valueOf(Types.TIMESTAMP))) {
return "Timestamp";
} else if (attr.getType().equals(String.valueOf(Types.NUMERIC))) {
return "NUMERIC";
} else if (attr.getType().equals(String.valueOf(Types.BOOLEAN))
|| attr.getType().equals("xsd:boolean")) {
return "Boolean";
} else if (attr.getType().equalsIgnoreCase("geometry")) {
return "Geometry";
} else {
return attr.getType();
}
}
/**
* Converts the given object to the given class.
*
* @param object the object to convert
* @param cl the class, the object should be converted to
*
* @return the converted object
*
* @throws Exception If the conversion is not possible
*/
public static Object convertObjectToClass(final Object object, final Class cl) throws Exception {
final String objectAsString = String.valueOf(object);
if (object == null) {
return object;
}
try {
if (cl.equals(String.class)) {
if ((object instanceof Float) || (object instanceof Double)) {
return FORMATTER.format(object);
} else {
return objectAsString;
}
} else if (cl.equals(Double.class)) {
return Double.parseDouble(objectAsString);
} else if (cl.equals(Float.class)) {
return Float.parseFloat(objectAsString);
} else if (cl.equals(Integer.class)) {
try {
return Integer.parseInt(objectAsString);
} catch (NumberFormatException e) {
final Double d = Double.parseDouble(objectAsString);
return d.intValue();
}
} else if (cl.equals(Boolean.class)) {
return Boolean.parseBoolean(objectAsString);
} else if (cl.equals(Long.class)) {
try {
return Long.parseLong(objectAsString);
} catch (NumberFormatException e) {
final Double d = Double.parseDouble(objectAsString);
return d.longValue();
}
} else if (cl.equals(Date.class)) {
return Timestamp.valueOf(objectAsString);
} else if (cl.equals(BigDecimal.class)) {
return new BigDecimal(objectAsString);
} else {
return object;
}
} catch (Exception e) {
LOG.error("Wrong data type: " + objectAsString + " expected type: " + cl.toString(), e);
throw new Exception(NbBundle.getMessage(
FeatureTools.class,
"FeatureTools.convertObjectToClass.message",
objectAsString,
cl.getName()));
}
}
}