package org.sigmah.offline.js;
/*
* #%L
* Sigmah
* %%
* Copyright (C) 2010 - 2016 URD
* %%
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this program. If not, see
* <http://www.gnu.org/licenses/gpl-3.0.html>.
* #L%
*/
import com.allen_sauer.gwt.log.client.Log;
import java.util.Date;
import org.sigmah.shared.command.result.Calendar;
import org.sigmah.shared.dto.calendar.CalendarWrapper;
import org.sigmah.shared.dto.calendar.PersonalCalendarIdentifier;
/**
*
* @author Raphaƫl Calabro (rcalabro@ideia.fr)
*/
public class ObjectJsMapBoxer implements AutoBoxingJsMap.Boxer<Object> {
private enum Type {
BOOLEAN,
CALENDAR_WRAPPER,
DATE,
DOUBLE,
INTEGER,
LONG,
NULL,
STRING,
UNKNOWN;
}
private static final char SEPARATOR = '#';
@Override
public String toString(Object object) {
final StringBuilder stringBuilder = new StringBuilder();
if (object == null) {
stringBuilder.append(Type.NULL)
.append(SEPARATOR);
} else if(object instanceof String) {
stringBuilder.append(Type.STRING)
.append(SEPARATOR)
.append((String)object);
} else if(object instanceof Date) {
stringBuilder.append(Type.DATE)
.append(SEPARATOR)
.append(((Date)object).getTime());
} else if (object instanceof Double) {
stringBuilder.append(Type.DOUBLE)
.append(SEPARATOR)
.append((Double)object);
} else if(object instanceof Integer) {
stringBuilder.append(Type.INTEGER)
.append(SEPARATOR)
.append((Integer)object);
} else if(object instanceof Long) {
stringBuilder.append(Type.LONG)
.append(SEPARATOR)
.append((Long)object);
} else if(object instanceof Boolean) {
stringBuilder.append(Type.BOOLEAN)
.append(SEPARATOR)
.append((Boolean) object);
} else if(object instanceof CalendarWrapper) {
final CalendarWrapper calendarWrapper = (CalendarWrapper)object;
final PersonalCalendarIdentifier personalCalendarIdentifier = (PersonalCalendarIdentifier)calendarWrapper.getCalendar().getIdentifier();
stringBuilder.append(Type.CALENDAR_WRAPPER)
.append(SEPARATOR)
.append(personalCalendarIdentifier.getId());
} else {
stringBuilder.append(Type.UNKNOWN)
.append(SEPARATOR);
Log.warn("Unsupported type '" + object.getClass() + "'.");
}
return stringBuilder.toString();
}
@Override
public Object fromString(String string) {
final int separator = string.indexOf(SEPARATOR);
final Type type = Type.valueOf(string.substring(0, separator));
switch(type) {
case BOOLEAN:
return Boolean.parseBoolean(string.substring(separator + 1));
case CALENDAR_WRAPPER:
final PersonalCalendarIdentifier personalCalendarIdentifier = new PersonalCalendarIdentifier(Integer.parseInt(string.substring(separator + 1)));
final Calendar calendar = new Calendar();
calendar.setIdentifier(personalCalendarIdentifier);
return new CalendarWrapper(calendar);
case DATE:
return new Date(Long.parseLong(string.substring(separator + 1)));
case DOUBLE:
return Double.parseDouble(string.substring(separator + 1));
case INTEGER:
return Integer.parseInt(string.substring(separator + 1));
case LONG:
return Long.parseLong(string.substring(separator + 1));
case STRING:
return string.substring(separator + 1);
default:
return null;
}
}
}