/* *------------------------------------------------------------------------------ * Copyright (C) 2006-2015 University of Dundee. All rights reserved. * * * 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 2 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, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *------------------------------------------------------------------------------ */ package org.openmicroscopy.shoola.env.data.util; import java.util.ArrayList; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import org.openmicroscopy.shoola.util.CommonsLangUtils; import omero.RBool; import omero.RDouble; import omero.RFloat; import omero.RInt; import omero.RList; import omero.RLong; import omero.RMap; import omero.RString; import omero.RType; import omero.model.Annotation; import omero.model.AnnotationAnnotationLink; import omero.model.AnnotationAnnotationLinkI; import omero.model.BooleanAnnotation; import omero.model.BooleanAnnotationI; import omero.model.CommentAnnotation; import omero.model.CommentAnnotationI; import omero.model.Dataset; import omero.model.DatasetAnnotationLink; import omero.model.DatasetAnnotationLinkI; import omero.model.DatasetI; import omero.model.DatasetImageLink; import omero.model.DatasetImageLinkI; import omero.model.DoubleAnnotation; import omero.model.DoubleAnnotationI; import omero.model.Experimenter; import omero.model.ExperimenterGroup; import omero.model.ExperimenterGroupI; import omero.model.ExperimenterI; import omero.model.GroupExperimenterMapI; import omero.model.IObject; import omero.model.Image; import omero.model.ImageAnnotationLink; import omero.model.ImageAnnotationLinkI; import omero.model.ImageI; import omero.model.LongAnnotation; import omero.model.LongAnnotationI; import omero.model.MapAnnotation; import omero.model.MapAnnotationI; import omero.model.NamedValue; import omero.model.OriginalFile; import omero.model.OriginalFileAnnotationLink; import omero.model.OriginalFileAnnotationLinkI; import omero.model.Plate; import omero.model.PlateAcquisition; import omero.model.PlateAcquisitionAnnotationLink; import omero.model.PlateAcquisitionAnnotationLinkI; import omero.model.PlateAnnotationLink; import omero.model.PlateAnnotationLinkI; import omero.model.PlateI; import omero.model.Project; import omero.model.ProjectAnnotationLink; import omero.model.ProjectAnnotationLinkI; import omero.model.ProjectDatasetLink; import omero.model.ProjectDatasetLinkI; import omero.model.ProjectI; import omero.model.Roi; import omero.model.RoiAnnotationLink; import omero.model.RoiAnnotationLinkI; import omero.model.Screen; import omero.model.ScreenAnnotationLink; import omero.model.ScreenAnnotationLinkI; import omero.model.ScreenI; import omero.model.ScreenPlateLink; import omero.model.ScreenPlateLinkI; import omero.model.Shape; import omero.model.ShapeAnnotationLink; import omero.model.ShapeAnnotationLinkI; import omero.model.TagAnnotation; import omero.model.TagAnnotationI; import omero.model.TermAnnotation; import omero.model.TermAnnotationI; import omero.model.Well; import omero.model.WellAnnotationLink; import omero.model.WellAnnotationLinkI; import omero.model.XmlAnnotation; import omero.model.XmlAnnotationI; import omero.gateway.model.AnnotationData; import omero.gateway.model.BooleanAnnotationData; import omero.gateway.model.DataObject; import omero.gateway.model.DatasetData; import omero.gateway.model.DoubleAnnotationData; import omero.gateway.model.ExperimenterData; import omero.gateway.model.GroupData; import omero.gateway.model.ImageData; import omero.gateway.model.LongAnnotationData; import omero.gateway.model.MapAnnotationData; import omero.gateway.model.ProjectData; import omero.gateway.model.RatingAnnotationData; import omero.gateway.model.ScreenData; import omero.gateway.model.TagAnnotationData; import omero.gateway.model.TermAnnotationData; import omero.gateway.model.TextualAnnotationData; import omero.gateway.model.XMLAnnotationData; /** * Helper class to map {@link DataObject}s into their corresponding * {@link IObject}s. * * @author Jean-Marie Burel      * <a href="mailto:j.burel@dundee.ac.uk">j.burel@dundee.ac.uk</a> * @version 2.2 * @since OME2.2 */ public class ModelMapper { /** * Unlinks the collections linked to the specified {@link IObject}. * * @param object The object. */ public static void unloadCollections(IObject object) { if (object == null) return; if (object.isLoaded()) object.unloadCollections(); } /** * Returns the child from the passed link. * * @param link The link to handle. * @return See above. */ public static IObject getChildFromLink(IObject link) { if (link == null) return null; if (link instanceof ProjectAnnotationLink) return ((ProjectAnnotationLink) link).getChild(); if (link instanceof DatasetAnnotationLink) return ((DatasetAnnotationLink) link).getChild(); if (link instanceof ImageAnnotationLink) return ((ImageAnnotationLink) link).getChild(); if (link instanceof PlateAnnotationLink) return ((PlateAnnotationLink) link).getChild(); if (link instanceof ScreenAnnotationLink) return ((ScreenAnnotationLink) link).getChild(); if (link instanceof WellAnnotationLink) return ((WellAnnotationLink) link).getChild(); if (link instanceof PlateAcquisitionAnnotationLink) return ((PlateAcquisitionAnnotationLink) link).getChild(); if (link instanceof AnnotationAnnotationLink) return ((AnnotationAnnotationLink) link).getChild(); if (link instanceof ShapeAnnotationLink) return ((ShapeAnnotationLink) link).getChild(); if (link instanceof RoiAnnotationLink) return ((RoiAnnotationLink) link).getChild(); return null; } /** * Returns the child from the passed link. * * @param link The link to handle. * @return See above. */ public static IObject getParentFromLink(IObject link) { if (link == null) return null; if (link instanceof ProjectAnnotationLink) return ((ProjectAnnotationLink) link).getParent(); if (link instanceof DatasetAnnotationLink) return ((DatasetAnnotationLink) link).getParent(); if (link instanceof ImageAnnotationLink) return ((ImageAnnotationLink) link).getParent(); if (link instanceof PlateAnnotationLink) return ((PlateAnnotationLink) link).getParent(); if (link instanceof ScreenAnnotationLink) return ((ScreenAnnotationLink) link).getParent(); if (link instanceof WellAnnotationLink) return ((WellAnnotationLink) link).getParent(); if (link instanceof PlateAcquisitionAnnotationLink) return ((PlateAcquisitionAnnotationLink) link).getParent(); if (link instanceof AnnotationAnnotationLink) return ((AnnotationAnnotationLink) link).getParent(); if (link instanceof ShapeAnnotationLink) return ((ShapeAnnotationLink) link).getParent(); if (link instanceof RoiAnnotationLink) return ((RoiAnnotationLink) link).getParent(); return null; } /** * Links the {@link IObject child} to its {@link IObject parent}. * * @param child The child to handle. * @param parent The parent to handle. * @return The link. */ public static IObject linkParentToChild(IObject child, IObject parent) { if (parent == null) return null; if (child == null) throw new IllegalArgumentException("Child cannot" + "be null."); if (parent instanceof Project) { if (!(child instanceof Dataset)) throw new IllegalArgumentException("Child not valid."); Project unloadedProject; if (parent.getId() == null) unloadedProject = (Project) parent; else unloadedProject = new ProjectI(parent.getId().getValue(), false); Dataset unloadedDataset; if (child.getId() == null) unloadedDataset = (Dataset) child; else unloadedDataset = new DatasetI(child.getId().getValue(), false); ProjectDatasetLink l = new ProjectDatasetLinkI(); l.link(unloadedProject, unloadedDataset); return l; } else if (parent instanceof Dataset) { if (!(child instanceof Image)) throw new IllegalArgumentException("Child not valid."); Dataset unloadedDataset; if (parent.getId() == null) unloadedDataset = (Dataset) parent; else unloadedDataset = new DatasetI(parent.getId().getValue(), false); Image unloadedImage = new ImageI(child.getId().getValue(), false); DatasetImageLink l = new DatasetImageLinkI(); l.link(unloadedDataset, unloadedImage); return l; } else if (parent instanceof Screen) { if (!(child instanceof Plate)) throw new IllegalArgumentException("Child not valid."); Screen unloadedScreen; if (parent.getId() == null) unloadedScreen = (Screen) parent; else unloadedScreen = new ScreenI(parent.getId().getValue(), false); Plate unloadedPlate; if (child.getId() == null) unloadedPlate = (Plate) child; else unloadedPlate = new PlateI(child.getId().getValue(), false); ScreenPlateLink l = new ScreenPlateLinkI(); l.link(unloadedScreen, unloadedPlate); return l; } else if (parent instanceof TagAnnotation) { if (!(child instanceof TagAnnotation)) throw new IllegalArgumentException("Child not valid."); RString ns = ((TagAnnotation) parent).getNs(); if (ns == null || !ns.getValue().equals( TagAnnotationData.INSIGHT_TAGSET_NS)) return null; return linkAnnotation(parent, (TagAnnotation) child); } else if (parent instanceof ExperimenterGroup) { if (!(child instanceof Experimenter)) throw new IllegalArgumentException("Child not valid."); ExperimenterGroup unloadedGroup = new ExperimenterGroupI(parent.getId().getValue(), false); Experimenter unloadedExp = new ExperimenterI(child.getId().getValue(), false); GroupExperimenterMapI l = new GroupExperimenterMapI(); l.link(unloadedGroup, unloadedExp); return l; } return null; } /** * Links the newly created {@link IObject child} to its * {@link IObject parent}. This method should only be invoked to add a * newly created child. * * @param child The newly created child. * @param parent The parent of the newly created child. */ public static void linkParentToNewChild(IObject child, IObject parent) { if (parent == null) return; if (child == null) throw new IllegalArgumentException("Child cannot" + "be null."); if (parent instanceof Project) { if (!(child instanceof Dataset)) throw new IllegalArgumentException("Child not valid."); Project p = (Project) parent; Dataset d = (Dataset) child; List<ProjectDatasetLink> l = d.copyProjectLinks(); if (l == null) return; ProjectDatasetLink link; Iterator<ProjectDatasetLink> it = l.iterator(); long id = p.getId().getValue(); while (it.hasNext()) { link = it.next(); if (id == link.getParent().getId().getValue()) { p.addProjectDatasetLink( new ProjectDatasetLinkI(link.getId(), false)); } } } else if (parent instanceof Dataset) { if (!(child instanceof Image)) throw new IllegalArgumentException("Child not valid."); Dataset p = (Dataset) parent; Image d = (Image) child; List<DatasetImageLink> l = d.copyDatasetLinks(); if (l == null) return; DatasetImageLink link; Iterator<DatasetImageLink> it = l.iterator(); long id = p.getId().getValue(); while (it.hasNext()) { link = it.next(); if (id == link.getParent().getId().getValue()) { p.addDatasetImageLink( new DatasetImageLinkI(link.getId(), false)); } } } else throw new IllegalArgumentException("DataObject not supported."); } /** * Converts the specified <code>DataObject</code> into its corresponding * <code>IObject</code>. * * @param child The child to create. * @return The {@link IObject} to create. */ public static IObject createIObject(DataObject child) { return createIObject(child, null); } /** * Converts the specified <code>DataObject</code> into its corresponding * <code>IObject</code>. * * @param child The child to create. * @param parent The child's parent. * @return The {@link IObject} to create. */ public static IObject createIObject(DataObject child, DataObject parent) { if (child instanceof ProjectData) { ProjectData data = (ProjectData) child; Project model = new ProjectI(); model.setName(omero.rtypes.rstring(data.getName())); model.setDescription(omero.rtypes.rstring(data.getDescription())); return model; } else if (child instanceof DatasetData) { DatasetData data = (DatasetData) child; Dataset model = new DatasetI(); model.setName(omero.rtypes.rstring(data.getName())); model.setDescription(omero.rtypes.rstring(data.getDescription())); if (parent != null) model.linkProject( new ProjectI(Long.valueOf(parent.getId()), false)); return model; } else if (child instanceof ImageData) { if (!(parent instanceof DatasetData)) throw new IllegalArgumentException("Parent not valid."); ImageData data = (ImageData) child; Image model = new ImageI(); model.setName(omero.rtypes.rstring(data.getName())); model.setDescription(omero.rtypes.rstring(data.getDescription())); model.linkDataset(new DatasetI(Long.valueOf(parent.getId()), false)); return model; } else if (child instanceof ScreenData) { ScreenData data = (ScreenData) child; Screen model = new ScreenI(); model.setName(omero.rtypes.rstring(data.getName())); model.setDescription(omero.rtypes.rstring(data.getDescription())); return model; } else if (child instanceof TagAnnotationData) { return createAnnotation((TagAnnotationData) child); } else if (child instanceof ExperimenterData) { ExperimenterData data = (ExperimenterData) child; Experimenter exp = new ExperimenterI(); exp.setFirstName(omero.rtypes.rstring(data.getFirstName())); exp.setLastName(omero.rtypes.rstring(data.getLastName())); exp.setMiddleName(omero.rtypes.rstring(data.getMiddleName())); exp.setEmail(omero.rtypes.rstring(data.getEmail())); exp.setInstitution(omero.rtypes.rstring(data.getInstitution())); return exp; } else if (child instanceof GroupData) { GroupData data = (GroupData) child; ExperimenterGroup g = new ExperimenterGroupI(); g.setName(omero.rtypes.rstring(data.getName())); //g.setDescription(omero.rtypes.rstring(data.getDescription())); return g; } throw new IllegalArgumentException("Child and parent are not " + "compatible."); } /** * Unlinks the specified child and the parent and returns the * updated child <code>IObject</code>. * * @param child The child to remove. * @param parent The parent of the child. * @return See above. */ public static IObject removeIObject(IObject child, IObject parent) { if ((child instanceof Dataset) && (parent instanceof Project)) { Project mParent = (Project) parent; List<ProjectDatasetLink> s = mParent.copyDatasetLinks(); Iterator<ProjectDatasetLink> i = s.iterator(); while (i.hasNext()) { mParent.removeProjectDatasetLink( new ProjectDatasetLinkI(i.next().getId(), false)); } return mParent; } throw new IllegalArgumentException("DataObject not supported."); } /** * Creates a new annotation <code>IObject</code>. * * @param annotatedObject The <code>DataObject</code> to annotate. * Can either be a <code>DatasetData</code> * or a <code>ImageData</code>. Mustn't be * <code>null</code>. * @param data The annotation to create. * @return See above. */ public static IObject createAnnotationAndLink(IObject annotatedObject, AnnotationData data) { Annotation annotation = createAnnotation(data); if (annotation == null) return null; return linkAnnotation(annotatedObject, annotation); } /** * Creates a new annotation <code>IObject</code>. * * @param data The annotation to create. * @return See above. */ @SuppressWarnings("unchecked") public static Annotation createAnnotation(AnnotationData data) { Annotation annotation = null; if (data instanceof TextualAnnotationData) { annotation = new CommentAnnotationI(); ((CommentAnnotation) annotation).setTextValue(omero.rtypes.rstring( data.getContentAsString())); } else if (data instanceof RatingAnnotationData) { int rate = ((RatingAnnotationData) data).getRating(); if (rate == RatingAnnotationData.LEVEL_ZERO) return null; annotation = new LongAnnotationI(); annotation.setNs(omero.rtypes.rstring( RatingAnnotationData.INSIGHT_RATING_NS)); ((LongAnnotation) annotation).setLongValue(omero.rtypes.rlong( (Long) data.getContent())); } else if (data instanceof TermAnnotationData) { annotation = new TermAnnotationI(); ((TermAnnotation) annotation).setTermValue( omero.rtypes.rstring(data.getContentAsString())); } else if (data instanceof TagAnnotationData) { annotation = new TagAnnotationI(); ((TagAnnotation) annotation).setTextValue( omero.rtypes.rstring(data.getContentAsString())); annotation.setDescription(omero.rtypes.rstring( ((TagAnnotationData) data).getTagDescription())); String ns = data.getNameSpace(); if (CommonsLangUtils.isNotEmpty(ns)) { annotation.setNs(omero.rtypes.rstring(ns)); } } else if (data instanceof BooleanAnnotationData) { annotation = new BooleanAnnotationI(); annotation.setNs(omero.rtypes.rstring( BooleanAnnotationData.INSIGHT_PUBLISHED_NS)); ((BooleanAnnotation) annotation).setBoolValue(omero.rtypes.rbool( ((BooleanAnnotationData) data).getValue())); } else if (data instanceof XMLAnnotationData) { annotation = new XmlAnnotationI(); ((XmlAnnotation) annotation).setTextValue( omero.rtypes.rstring(data.getContentAsString())); annotation.setDescription(omero.rtypes.rstring( ((XMLAnnotationData) data).getDescription())); String ns = data.getNameSpace(); if (ns != null && ns.length() > 0) { annotation.setNs(omero.rtypes.rstring(ns)); } } else if (data instanceof LongAnnotationData) { annotation = new LongAnnotationI(); ((LongAnnotation) annotation).setLongValue(omero.rtypes.rlong( (Long) data.getContent())); } else if (data instanceof DoubleAnnotationData) { annotation = new DoubleAnnotationI(); ((DoubleAnnotation) annotation).setDoubleValue(omero.rtypes.rdouble( (Double) data.getContent())); } else if (data instanceof MapAnnotationData) { annotation = new MapAnnotationI(); String ns = data.getNameSpace(); if (CommonsLangUtils.isNotEmpty(ns)) { annotation.setNs(omero.rtypes.rstring(ns)); } ((MapAnnotation) annotation).setMapValue((List<NamedValue>) data .getContent()); } return annotation; } /** * Links the annotation to the passed object. * * @param annotatedObject The object to annotate. * @param annotation The annotation to link. * @return See above. */ public static IObject linkAnnotation(IObject annotatedObject, Annotation annotation) { if (annotation == null) return null; if (annotatedObject instanceof Dataset) { DatasetAnnotationLink l = new DatasetAnnotationLinkI(); l.setParent((Dataset) annotatedObject.proxy()); l.setChild(annotation); return l; } else if (annotatedObject instanceof Image) { ImageAnnotationLink l = new ImageAnnotationLinkI(); l.setParent((Image) annotatedObject.proxy()); l.setChild(annotation); return l; } else if (annotatedObject instanceof Project) { ProjectAnnotationLink l = new ProjectAnnotationLinkI(); l.setParent((Project) annotatedObject.proxy()); l.setChild(annotation); return l; } else if (annotatedObject instanceof Annotation) { AnnotationAnnotationLink l = new AnnotationAnnotationLinkI(); l.setParent((Annotation) annotatedObject.proxy()); l.setChild(annotation); return l; } else if (annotatedObject instanceof Screen) { ScreenAnnotationLink l = new ScreenAnnotationLinkI(); l.setParent((Screen) annotatedObject.proxy()); l.setChild(annotation); return l; } else if (annotatedObject instanceof Plate) { PlateAnnotationLink l = new PlateAnnotationLinkI(); l.setParent((Plate) annotatedObject.proxy()); l.setChild(annotation); return l; } else if (annotatedObject instanceof PlateAcquisition) { PlateAcquisitionAnnotationLink l = new PlateAcquisitionAnnotationLinkI(); l.setParent((PlateAcquisition) annotatedObject.proxy()); l.setChild(annotation); return l; } else if (annotatedObject instanceof Well) { WellAnnotationLink l = new WellAnnotationLinkI(); l.setParent((Well) annotatedObject.proxy()); l.setChild(annotation); return l; } else if (annotatedObject instanceof OriginalFile) { OriginalFileAnnotationLink l = new OriginalFileAnnotationLinkI(); l.setParent((OriginalFile) annotatedObject.proxy()); l.setChild(annotation); return l; } else if (annotatedObject instanceof Shape) { ShapeAnnotationLink l = new ShapeAnnotationLinkI(); l.setParent((Shape) annotatedObject.proxy()); l.setChild(annotation); return l; } else if (annotatedObject instanceof Roi) { RoiAnnotationLink l = new RoiAnnotationLinkI(); l.setParent((Roi) annotatedObject.proxy()); l.setChild(annotation); return l; } return null; } /** * Returns the annotated IObject related to the specified annotation. * * @param annotation The annotation. * @return See above. */ public static IObject getAnnotatedObject(IObject annotation) { if (annotation instanceof DatasetAnnotationLink) return ((DatasetAnnotationLink) annotation).getParent(); else if (annotation instanceof ProjectAnnotationLink) return ((ProjectAnnotationLink) annotation).getParent(); else if (annotation instanceof ImageAnnotationLink) return ((ImageAnnotationLink) annotation).getParent(); else if (annotation instanceof AnnotationAnnotationLink) return ((AnnotationAnnotationLink) annotation).getParent(); else if (annotation instanceof PlateAnnotationLink) return ((PlateAnnotationLink) annotation).getParent(); else if (annotation instanceof ScreenAnnotationLink) return ((ScreenAnnotationLink) annotation).getParent(); else if (annotation instanceof WellAnnotationLink) return ((WellAnnotationLink) annotation).getParent(); else if (annotation instanceof PlateAcquisitionAnnotationLink) return ((PlateAcquisitionAnnotationLink) annotation).getParent(); return null; } /** * Returns the annotation represented by the specified link * * @param link The annotation. * @return See above. */ public static IObject getAnnotationObject(IObject link) { if (link instanceof DatasetAnnotationLink) return ((DatasetAnnotationLink) link).getChild(); else if (link instanceof ProjectAnnotationLink) return ((ProjectAnnotationLink) link).getChild(); else if (link instanceof ImageAnnotationLink) return ((ImageAnnotationLink) link).getChild(); else if (link instanceof PlateAnnotationLink) return ((PlateAnnotationLink) link).getChild(); else if (link instanceof ScreenAnnotationLink) return ((ScreenAnnotationLink) link).getChild(); else if (link instanceof WellAnnotationLink) return ((WellAnnotationLink) link).getChild(); return null; } /** * Fills the new IObject with data from the old one. * * @param oldObject The old object. * @param newObject The object to fill. */ public static void fillIObject(IObject oldObject, IObject newObject) { if (oldObject == null || newObject == null) throw new IllegalArgumentException("Object cannot be NULL."); if (oldObject.getClass() != newObject.getClass()) throw new IllegalArgumentException("Objects should be of the " + "same type."); if (oldObject instanceof Project) { Project n = (Project) newObject; Project o = (Project) oldObject; n.setName(o.getName()); n.setDescription(o.getDescription()); } else if (oldObject instanceof Dataset) { Dataset n = (Dataset) newObject; Dataset o = (Dataset) oldObject; n.setName(o.getName()); n.setDescription(o.getDescription()); } else if (oldObject instanceof Image) { Image n = (Image) newObject; Image o = (Image) oldObject; n.setName(o.getName()); n.setDescription(o.getDescription()); } else if (oldObject instanceof Experimenter) { Experimenter n = (Experimenter) newObject; Experimenter o = (Experimenter) oldObject; n.setEmail(o.getEmail()); n.setFirstName(o.getFirstName()); n.setLastName(o.getLastName()); n.setMiddleName(o.getMiddleName()); n.setInstitution(o.getInstitution()); } else if (oldObject instanceof Screen) { Screen n = (Screen) newObject; Screen o = (Screen) oldObject; n.setName(o.getName()); n.setDescription(o.getDescription()); } else if (oldObject instanceof Plate) { Plate n = (Plate) newObject; Plate o = (Plate) oldObject; n.setName(o.getName()); n.setDescription(o.getDescription()); n.setDefaultSample(o.getDefaultSample()); } else if (oldObject instanceof Well) { Well n = (Well) newObject; Well o = (Well) oldObject; n.setType(o.getType()); n.setExternalDescription(o.getExternalDescription()); n.setRed(o.getRed()); n.setGreen(o.getGreen()); n.setBlue(o.getBlue()); n.setAlpha(o.getAlpha()); } else if (oldObject instanceof PlateAcquisition) { PlateAcquisition n = (PlateAcquisition) newObject; PlateAcquisition o = (PlateAcquisition) oldObject; n.setName(o.getName()); n.setDescription(o.getDescription()); n.setEndTime(o.getEndTime()); n.setStartTime(o.getStartTime()); n.setMaximumFieldCount(o.getMaximumFieldCount()); } } /** * Converts the passed OMERO type into its corresponding Java type. * * @param type The type to handle. * @return See above. */ public static Object convertRTypeToJava(RType type) { //return omero.rtypes.unwrap(type); if (type instanceof RString) return ((RString) type).getValue(); if (type instanceof RLong) return ((RLong) type).getValue(); if (type instanceof RBool) return ((RBool) type).getValue(); if (type instanceof RDouble) return ((RDouble) type).getValue(); if (type instanceof RFloat) return ((RFloat) type).getValue(); if (type instanceof RInt) return ((RInt) type).getValue(); if (type instanceof RList) { List<RType> types = ((RList) type).getValue(); List<Object> l = new ArrayList<Object>(types.size()); Iterator<RType> i = types.iterator(); while (i.hasNext()) { l.add(convertRTypeToJava(i.next())); } return l; } if (type instanceof RMap) { Map<String, RType> types = ((RMap) type).getValue(); Map<String, Object> l = new LinkedHashMap<String, Object>( types.size()); Entry<String, RType> e; Iterator<Entry<String, RType>> i = types.entrySet().iterator(); while (i.hasNext()) { e = i.next(); l.put(e.getKey(), convertRTypeToJava(e.getValue())); } return l; } return ""; } }