package org.ovirt.engine.ui.common.widget.renderer; import org.ovirt.engine.core.common.utils.SizeConverter; import org.ovirt.engine.core.common.utils.SizeConverter.SizeUnit; import org.ovirt.engine.ui.common.CommonApplicationConstants; import org.ovirt.engine.ui.common.CommonApplicationMessages; import org.ovirt.engine.ui.common.gin.AssetProvider; import com.google.gwt.text.shared.AbstractRenderer; public class DiskSizeRenderer<T extends Number> extends AbstractRenderer<T> { public enum Format { GIGABYTE, HUMAN_READABLE } private final SizeConverter.SizeUnit unit; public final Format format; private static final CommonApplicationConstants constants = AssetProvider.getConstants(); private static final CommonApplicationMessages messages = AssetProvider.getMessages(); public DiskSizeRenderer(SizeConverter.SizeUnit unit) { this(unit, Format.GIGABYTE); } public DiskSizeRenderer(SizeConverter.SizeUnit unit, Format format) { if (unit == null) { throw new IllegalArgumentException("The unit can not be null!"); //$NON-NLS-1$ } this.unit = unit; this.format = format; } protected boolean isUnavailable(T size) { return size == null; } @Override public String render(T size) { if (isUnavailable(size)) { return constants.unAvailablePropertyLabel(); } switch (format) { case GIGABYTE: return renderGigabyteSize(size.longValue()); case HUMAN_READABLE: return renderHumanReadableSize(size.longValue()); default: throw new RuntimeException("Format '" + format + "' is not supported!"); //$NON-NLS-1$ //$NON-NLS-2$ } } private String renderGigabyteSize(long size) { long sizeInGB = (unit == SizeUnit.GiB) ? size : SizeConverter.convert(size, unit, SizeUnit.GiB).longValue(); return messages.gigabytes(sizeInGB >= 1 ? String.valueOf(sizeInGB) : "< 1"); //$NON-NLS-1$ } private String renderHumanReadableSize(long size) { long sizeInBytes = SizeConverter.convert(size, unit, SizeUnit.BYTES).longValue(); if(sizeInBytes > SizeConverter.BYTES_IN_GB) { return messages.gigabytes(String.valueOf( SizeConverter.convert(sizeInBytes, SizeUnit.BYTES, SizeUnit.GiB).longValue())); } else if(sizeInBytes > SizeConverter.BYTES_IN_MB) { return messages.megabytes(String.valueOf( SizeConverter.convert(sizeInBytes, SizeUnit.BYTES, SizeUnit.MiB).longValue())); } else if(sizeInBytes > SizeConverter.BYTES_IN_KB) { return messages.kilobytes(String.valueOf( SizeConverter.convert(sizeInBytes, SizeUnit.BYTES, SizeUnit.KiB).longValue())); } else { return messages.bytes(String.valueOf(sizeInBytes)); } } }