/*
* Copyright 2010-2015 Institut Pasteur.
*
* This file is part of Icy.
*
* Icy 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.
*
* Icy 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 Icy. If not, see <http://www.gnu.org/licenses/>.
*/
package icy.util;
import java.awt.Color;
import org.w3c.dom.Document;
import icy.image.IcyBufferedImage;
import icy.sequence.MetaDataUtil;
import icy.sequence.Sequence;
import icy.system.IcyExceptionHandler;
import icy.type.DataType;
import icy.type.TypeUtil;
import loci.common.services.ServiceException;
import loci.formats.MetadataTools;
import loci.formats.meta.MetadataRetrieve;
import loci.formats.meta.MetadataStore;
import loci.formats.ome.OMEXMLMetadataImpl;
import loci.formats.services.OMEXMLServiceImpl;
import ome.units.UNITS;
import ome.units.quantity.Length;
import ome.units.quantity.Time;
import ome.xml.meta.OMEXMLMetadata;
import ome.xml.model.OME;
import ome.xml.model.StructuredAnnotations;
import ome.xml.model.XMLAnnotation;
import ome.xml.model.primitives.NonNegativeInteger;
import ome.xml.model.primitives.PositiveFloat;
import ome.xml.model.primitives.PositiveInteger;
/**
* @author Stephane
*/
public class OMEUtil
{
private static final OMEXMLServiceImpl OMEService = new OMEXMLServiceImpl();
/**
* Safe integer evaluation from PositiveInteger object.<br>
* Return defaultValue if specified object is null.
*/
public static int getValue(PositiveInteger obj, int defaultValue)
{
if (obj == null)
return defaultValue;
return TypeUtil.getInt(obj.getValue(), defaultValue);
}
/**
* Safe integer evaluation from NonNegativeInteger object.<br>
* Return defaultValue if specified object is null.
*/
public static int getValue(NonNegativeInteger obj, int defaultValue)
{
if (obj == null)
return defaultValue;
return TypeUtil.getInt(obj.getValue(), defaultValue);
}
/**
* Safe float evaluation from PositiveFloat object.<br>
* Return <code>defaultValue</code> if <code>obj</code> is null or equal to infinite with <code>allowInfinite</code>
* set to false.
*/
public static double getValue(PositiveFloat obj, double defaultValue, boolean allowInfinite)
{
if (obj == null)
return defaultValue;
return TypeUtil.getDouble(obj.getValue(), defaultValue, allowInfinite);
}
/**
* Safe float evaluation from PositiveFloat object.<br>
* Return defaultValue if specified object is null.
*/
public static double getValue(PositiveFloat obj, double defaultValue)
{
return getValue(obj, defaultValue, true);
}
/**
* Convert specified Length to double value in �m (for backward compatibility).<br>
* Return defaultValue if specified object is <code>null</code>.
*/
public static double getValue(Length obj, double defaultValue)
{
if (obj == null)
return defaultValue;
final Number value = obj.value(UNITS.MICROMETER);
if (value == null)
return defaultValue;
return value.doubleValue();
}
/**
* Convert specified Time to double value in second (for backward compatibility).<br>
* Return defaultValue if specified object is <code>null</code>.
*/
public static double getValue(Time obj, double defaultValue)
{
if (obj == null)
return defaultValue;
final Number value = obj.value(UNITS.SECOND);
if (value == null)
return defaultValue;
return value.doubleValue();
}
/**
* Return a PositiveFloat object representing the specified value
*/
public static PositiveFloat getPositiveFloat(double value)
{
return new PositiveFloat(Double.valueOf(value));
}
/**
* Return a PositiveInteger object representing the specified value
*/
public static PositiveInteger getPositiveInteger(int value)
{
return new PositiveInteger(Integer.valueOf(value));
}
/**
* Return a Length object representing the specified value (in �m)
*/
public static Length getLength(double value)
{
return new Length(Double.valueOf(value), UNITS.MICROMETER);
}
/**
* Return a Time object representing the specified value (in second)
*/
public static Time getTime(double value)
{
return new Time(Double.valueOf(value), UNITS.SECOND);
}
/**
* Return a java Color object from a OME Color object
*/
public static Color getJavaColor(ome.xml.model.primitives.Color value)
{
if (value == null)
return null;
return new Color(value.getRed(), value.getGreen(), value.getBlue(), value.getAlpha());
}
/**
* Return a OME Color object from a java Color object
*/
public static ome.xml.model.primitives.Color getOMEColor(Color value)
{
return new ome.xml.model.primitives.Color(value.getRed(), value.getGreen(), value.getBlue(), value.getAlpha());
}
/**
* Create a new empty OME Metadata object.
*/
public synchronized static OMEXMLMetadata createOMEXMLMetadata()
{
try
{
return OMEService.createOMEXMLMetadata();
}
catch (Exception e)
{
IcyExceptionHandler.showErrorMessage(e, true);
return null;
}
}
/**
* @deprecated Use {@link #createOMEXMLMetadata()} instead
*/
@Deprecated
public synchronized static OMEXMLMetadataImpl createOMEMetadata()
{
return (OMEXMLMetadataImpl) createOMEXMLMetadata();
}
/**
* Create a new OME Metadata object from the specified Metadata object.<br>
*/
public synchronized static OMEXMLMetadata createOMEXMLMetadata(MetadataRetrieve metadata)
{
final OMEXMLMetadata result = createOMEXMLMetadata();
// TODO: remove that when annotations loading will be fixed in Bio-Formats
if (metadata instanceof OMEXMLMetadata)
{
final OME root = (OME) ((OMEXMLMetadata) metadata).getRoot();
final StructuredAnnotations annotations = root.getStructuredAnnotations();
// clean up annotation
if (annotations != null)
{
for (int i = annotations.sizeOfXMLAnnotationList() - 1; i >= 0; i--)
{
final XMLAnnotation annotation = annotations.getXMLAnnotation(i);
if (StringUtil.isEmpty(annotation.getValue()))
annotations.removeXMLAnnotation(annotation);
}
}
}
OMEService.convertMetadata(metadata, (MetadataStore) result);
return result;
}
/**
* @deprecated Use {@link #createOMEXMLMetadata(MetadataRetrieve)} instead
*/
@Deprecated
public synchronized static OMEXMLMetadataImpl createOMEMetadata(MetadataRetrieve metadata)
{
return (OMEXMLMetadataImpl) createOMEXMLMetadata(metadata);
}
/**
* Create a new single serie OME Metadata object from the specified Metadata object.
*
* @param serie
* Index of the serie we want to keep.
*/
public static OMEXMLMetadata createOMEXMLMetadata(MetadataRetrieve metadata, int serie)
{
final OMEXMLMetadata result = OMEUtil.createOMEXMLMetadata(metadata);
MetaDataUtil.keepSingleSerie(result, serie);
// set the default id with correct serie number (for XML metadata)
result.setImageID(MetadataTools.createLSID("Image", serie), 0);
return result;
}
/**
* @deprecated Use {@link #createOMEXMLMetadata(MetadataRetrieve,int)} instead
*/
@Deprecated
public static OMEXMLMetadataImpl createOMEMetadata(MetadataRetrieve metadata, int serie)
{
return (OMEXMLMetadataImpl) createOMEXMLMetadata(metadata, serie);
}
/**
* Convert the specified Metadata object to OME Metadata.<br>
* If the specified Metadata is already OME no conversion is done.
*/
public static OMEXMLMetadata getOMEXMLMetadata(MetadataRetrieve metadata)
{
if (metadata instanceof OMEXMLMetadata)
return (OMEXMLMetadata) metadata;
return createOMEXMLMetadata(metadata);
}
/**
* @deprecated Use {@link #getOMEXMLMetadata(MetadataRetrieve)} instead
*/
@Deprecated
public static OMEXMLMetadataImpl getOMEMetadata(MetadataRetrieve metadata)
{
return (OMEXMLMetadataImpl) getOMEXMLMetadata(metadata);
}
/**
* Return a XML document from the specified Metadata object
*/
public static Document getXMLDocument(OMEXMLMetadata metadata)
{
try
{
return XMLUtil.createDocument(metadata.dumpXML());
}
catch (Exception e)
{
IcyExceptionHandler.showErrorMessage(e, true);
}
// return empty document
return XMLUtil.createDocument(false);
}
/**
* @deprecated Use {@link #getXMLDocument(OMEXMLMetadata)} instead
*/
@Deprecated
public static Document getXMLDocument(MetadataRetrieve metadata)
{
return getXMLDocument(getOMEXMLMetadata(metadata));
}
/**
* @deprecated Uses {@link MetaDataUtil#setMetaData(OMEXMLMetadata, int, int, int, int, int, DataType, boolean)}
* instead.
*/
@Deprecated
public static OMEXMLMetadataImpl generateMetaData(OMEXMLMetadataImpl metadata, int sizeX, int sizeY, int sizeC,
int sizeZ, int sizeT, DataType dataType, boolean separateChannel) throws ServiceException
{
final OMEXMLMetadataImpl result;
if (metadata == null)
result = MetaDataUtil.createDefaultMetadata("Sample");
else
result = metadata;
MetaDataUtil.setMetaData(result, sizeX, sizeY, sizeC, sizeZ, sizeT, dataType, separateChannel);
return result;
}
/**
* @deprecated Uses {@link MetaDataUtil#generateMetaData(int, int, int, int, int, DataType, boolean)} instead.
*/
@Deprecated
public static OMEXMLMetadata generateMetaData(int sizeX, int sizeY, int sizeC, int sizeZ, int sizeT,
DataType dataType, boolean separateChannel) throws ServiceException
{
return MetaDataUtil.generateMetaData(sizeX, sizeY, sizeC, sizeZ, sizeT, dataType, separateChannel);
}
/**
* @deprecated Use {@link MetaDataUtil#generateMetaData(int, int, int, DataType, boolean)} instead.
*/
@Deprecated
public static OMEXMLMetadata generateMetaData(int sizeX, int sizeY, int sizeC, DataType dataType,
boolean separateChannel) throws ServiceException
{
return MetaDataUtil.generateMetaData(sizeX, sizeY, sizeC, dataType, separateChannel);
}
/**
* @deprecated Use {@link MetaDataUtil#generateMetaData(IcyBufferedImage, boolean)} instead.
*/
@Deprecated
public static OMEXMLMetadata generateMetaData(IcyBufferedImage image, boolean separateChannel)
throws ServiceException
{
return MetaDataUtil.generateMetaData(image, separateChannel);
}
/**
* @deprecated Use {@link MetaDataUtil#generateMetaData(Sequence, boolean)} instead.
*/
@Deprecated
public static OMEXMLMetadata generateMetaData(Sequence sequence, boolean useZ, boolean useT,
boolean separateChannel) throws ServiceException
{
return MetaDataUtil.generateMetaData(sequence, separateChannel);
}
/**
* @deprecated Use {@link MetaDataUtil#generateMetaData(Sequence, boolean)} instead.
*/
@Deprecated
public static OMEXMLMetadata generateMetaData(Sequence sequence, int sizeZ, int sizeT, boolean separateChannel)
throws ServiceException
{
return MetaDataUtil.generateMetaData(sequence, separateChannel);
}
/**
* @deprecated Use {@link MetaDataUtil#generateMetaData(Sequence, boolean)} instead.
*/
@Deprecated
public static OMEXMLMetadata generateMetaData(Sequence sequence, boolean separateChannel) throws ServiceException
{
return MetaDataUtil.generateMetaData(sequence, separateChannel);
}
/**
* Report and upload the specified filename to LOCI team.
*/
public static boolean reportLociError(String fileName, String errorMessage)
{
// TODO: implement this when done in LOCI
// final IssueReporter reporter = new IssueReporter();
// return reporter.reportBug(fileName, errorMessage);
return false;
}
}