/*
* Copyright (c) 2012 Diamond Light Source Ltd.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*/
package uk.ac.diamond.scisoft.analysis.rpc.flattening.helpers;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.UUID;
import org.apache.commons.lang.ArrayUtils;
import uk.ac.diamond.scisoft.analysis.plotserver.GuiBean;
import uk.ac.diamond.scisoft.analysis.plotserver.GuiParameters;
import uk.ac.diamond.scisoft.analysis.plotserver.GuiPlotMode;
import uk.ac.diamond.scisoft.analysis.rpc.flattening.IFlattener;
import uk.ac.diamond.scisoft.analysis.rpc.flattening.IRootFlattener;
/**
* Note that the following GuiParameters in GuiBean are unsupported:
* <ul>
* <li> {@link GuiParameters#FILEOPERATION}: FileOperationBean is an unsupported type</li>
* <li> {@link GuiParameters#GRIDPREFERENCES}: GridPreferences is an unsupported type</li>
* <li> {@link GuiParameters#MASKING}: has no type</li>
* <li> {@link GuiParameters#CALIBRATIONPEAKS}: has no type</li>
* <li> {@link GuiParameters#CALIBRATIONFUNCTIONNCD}: has no type</li>
* </ul>
*/
public class GuiBeanHelper extends MapFlatteningHelper<GuiBean> {
static Set<GuiParameters> unsupported;
static {
unsupported = new HashSet<GuiParameters>();
unsupported.add(GuiParameters.FILEOPERATION);
unsupported.add(GuiParameters.GRIDPREFERENCES);
unsupported.add(GuiParameters.MASKING);
unsupported.add(GuiParameters.CALIBRATIONFUNCTIONNCD);
unsupported.add(GuiParameters.CALIBRATIONPEAKS);
unsupported.add(GuiParameters.QUIET_UPDATE);
}
public GuiBeanHelper() {
super(GuiBean.class);
}
@Override
public Object flatten(Object obj, IRootFlattener rootFlattener) {
GuiBean inMap = (GuiBean) obj;
Map<String, Object> returnMap = getFlattenedOutMap(GuiBean.class);
returnMap.put(IFlattener.TYPE_KEY, GuiBean.class.getCanonicalName());
Set<Entry<GuiParameters, Serializable>> entrySet = inMap.entrySet();
for (Entry<GuiParameters, Serializable> entry : entrySet) {
GuiParameters keyObj = entry.getKey();
String key = keyObj.toString();
if (!unsupported.contains(keyObj)) {
Object value = rootFlattener.flatten(entry.getValue());
returnMap.put(key, value);
}
}
return returnMap;
}
@Override
public GuiBean unflatten(Map<?, ?> thisMap, IRootFlattener rootFlattener) {
GuiBean returnBean = new GuiBean();
for (Object entryObj : thisMap.entrySet()) {
Entry<?, ?> entry = (Entry<?, ?>) entryObj;
String keyObj = (String) entry.getKey();
Serializable valueObj = (Serializable) rootFlattener.unflatten(entry.getValue());
if (!keyObj.equals(IFlattener.TYPE_KEY)) {
GuiParameters thisParam = GuiParameters.valueOf(keyObj);
if (thisParam.toString().equals(keyObj)) {
returnBean.put(thisParam, unflattenParam(thisParam, valueObj));
}
}
}
return returnBean;
}
/**
* We know the intended type, so in many cases we can upgrade from flattened to the expected type e.g. Object[] to
* List<Object>.
*
* @param params
* @param valueObj
* @return upgraded valueObj, or the original if it matches
*/
private Serializable unflattenParam(GuiParameters params, Serializable valueObj) {
Class<?> clazz = params.getStorageClass();
if (clazz.isInstance(valueObj)) {
return valueObj;
} else if (clazz.equals(List.class)) {
return new ArrayList<Object>(Arrays.asList((Object[]) valueObj));
} else if (clazz.equals(Integer[].class)) {
return ArrayUtils.toObject((int[]) valueObj);
} else if (clazz.equals(GuiPlotMode.class)) {
return GuiPlotMode.valueOf((String) valueObj);
} else if (clazz.equals(UUID.class)) {
return UUID.fromString(valueObj.toString());
}
return valueObj;
}
}