/* * Copyright (C) 2011 Red Hat, Inc. and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.jboss.errai.marshalling.client.util; import org.jboss.errai.common.client.protocols.SerializationParts; import org.jboss.errai.marshalling.client.api.json.EJObject; import org.jboss.errai.marshalling.client.api.json.EJValue; /** * @author Mike Brock <cbrock@redhat.com> */ public class NumbersUtils { public static Object getEncodedNumber(final EJObject object) { return getNumber(object.get(SerializationParts.ENCODED_TYPE).isString().stringValue(), object.get(SerializationParts.NUMERIC_VALUE)); } public static Object getNumber(final String wrapperClassName, final EJValue value) { if (Integer.class.getName().equals(wrapperClassName)) { return new Double(value.isNumber().doubleValue()).intValue(); } else if (Double.class.getName().equals(wrapperClassName)) { if (value.isString() != null) { return Double.parseDouble(value.isString().stringValue()); } return value.isNumber().doubleValue(); } else if (Long.class.getName().equals(wrapperClassName)) { return Long.parseLong(value.isString().stringValue()); } else if (Boolean.class.getName().equals(wrapperClassName)) { return value.isBoolean().booleanValue(); } else if (Float.class.getName().equals(wrapperClassName)) { if (value.isString() != null) { return Float.parseFloat(value.isString().stringValue()); } return new Double(value.isNumber().doubleValue()).floatValue(); } else if (Short.class.getName().equals(wrapperClassName)) { return new Double(value.isNumber().doubleValue()).shortValue(); } else if (Character.class.getName().equals(wrapperClassName)) { return value.isString().stringValue().charAt(0); } else if (Byte.class.getName().equals(wrapperClassName)) { return new Double(value.isNumber().doubleValue()).byteValue(); } else { throw new RuntimeException("unknown type"); } } private final static String quote = "\""; public static String qualifiedNumericEncoding(final Object o) { final String typeName; if (o == null) { typeName = Object.class.getName(); } else if (o instanceof String) { typeName = Character.class.getName(); } else { typeName = o.getClass().getName(); } return "{" + quote + SerializationParts.ENCODED_TYPE + quote + ":" + quote + typeName + quote + ", " + quote + SerializationParts.OBJECT_ID + quote + ": " + quote + "-1" + quote + "," + quote + SerializationParts.NUMERIC_VALUE + quote + ":" + getNumericValue(o) + "}"; } private static String getNumericValue(final Object o) { String val; if (o instanceof Long || o instanceof Character || (o instanceof Double && (((Double) o).isNaN() || ((Double) o).isInfinite())) || (o instanceof Float && (((Float) o).isNaN() || ((Float) o).isInfinite()))) { val = quote + String.valueOf(o) + quote; } else { val = String.valueOf(o); } return val; } }