/*
* Copyright (C) 2014 Jan Pokorsky
*
* 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/>.
*/
package cz.cas.lib.proarc.urnnbn;
import cz.cas.lib.proarc.mix.BasicDigitalObjectInformationType;
import cz.cas.lib.proarc.mix.BasicDigitalObjectInformationType.FormatDesignation;
import cz.cas.lib.proarc.mix.BasicImageInformationType;
import cz.cas.lib.proarc.mix.BasicImageInformationType.BasicImageCharacteristics;
import cz.cas.lib.proarc.mix.ImageAssessmentMetadataType;
import cz.cas.lib.proarc.mix.ImageAssessmentMetadataType.SpatialMetrics;
import cz.cas.lib.proarc.mix.MixType;
import cz.cas.lib.proarc.mix.PositiveIntegerType;
import cz.cas.lib.proarc.mix.RationalType;
import cz.cas.lib.proarc.mix.StringType;
import cz.cas.lib.proarc.urnnbn.model.registration.Compression;
import cz.cas.lib.proarc.urnnbn.model.registration.DigitalDocument;
import cz.cas.lib.proarc.urnnbn.model.registration.Format;
import cz.cas.lib.proarc.urnnbn.model.registration.PictureSize;
import cz.cas.lib.proarc.urnnbn.model.registration.RegistrarScopeIdentifier;
import cz.cas.lib.proarc.urnnbn.model.registration.RegistrarScopeIdentifiers;
import cz.cas.lib.proarc.urnnbn.model.registration.Resolution;
import cz.cas.lib.proarc.urnnbn.model.registration.TechnicalMetadata;
import java.math.BigInteger;
import java.util.List;
/**
* Builds a digital document for the resolver registration.
*
* @author Jan Pokorsky
*/
public class DigitalDocumentBuilder {
private DigitalDocument digitalDocument = new DigitalDocument();
public DigitalDocument build() {
return digitalDocument;
}
public DigitalDocumentBuilder setUuid(String uuid) {
RegistrarScopeIdentifiers rsIdentifiers = new RegistrarScopeIdentifiers();
RegistrarScopeIdentifier rsIdentifier = new RegistrarScopeIdentifier();
rsIdentifier.setType("uuid");
rsIdentifier.setValue(uuid);
rsIdentifiers.getId().add(rsIdentifier);
digitalDocument.setRegistrarScopeIdentifiers(rsIdentifiers);
return this;
}
public DigitalDocumentBuilder setCompression(String scheme, Double ratio) {
if (scheme != null || ratio != null) {
Compression tmCompression = new Compression();
tmCompression.setValue(scheme);
tmCompression.setRatio(ratio);
getTechnicalMetadata().setCompression(tmCompression);
}
return this;
}
public DigitalDocumentBuilder setFormat(String formatName, String formatVersion) {
if (formatName != null || formatVersion != null) {
Format format = new Format();
format.setValue(formatName);
format.setVersion(formatVersion);
getTechnicalMetadata().setFormat(format);
}
return this;
}
public DigitalDocumentBuilder setMix(MixType mix) {
BasicDigitalObjectInformationType basicDigitalObjectInformation = mix.getBasicDigitalObjectInformation();
if (basicDigitalObjectInformation != null) {
// format
FormatDesignation formatDesignation = basicDigitalObjectInformation.getFormatDesignation();
if (formatDesignation != null) {
setFormat(string(formatDesignation.getFormatName()), string(formatDesignation.getFormatVersion()));
}
// compression
List<BasicDigitalObjectInformationType.Compression> compressions = basicDigitalObjectInformation.getCompression();
if (!compressions.isEmpty()) {
BasicDigitalObjectInformationType.Compression compression = compressions.get(0);
String scheme = string(compression.getCompressionScheme());
BigInteger ratio = ratio(compression.getCompressionRatio());
setCompression(scheme, ratio == null ? null : ratio.doubleValue());
}
}
// size
BasicImageInformationType basicImageInformation = mix.getBasicImageInformation();
if (basicImageInformation != null) {
BasicImageCharacteristics basicImageCharacteristics = basicImageInformation.getBasicImageCharacteristics();
if (basicImageCharacteristics != null) {
PositiveIntegerType imageHeight = basicImageCharacteristics.getImageHeight();
BigInteger height = imageHeight == null ? null : imageHeight.getValue();
PositiveIntegerType imageWidth = basicImageCharacteristics.getImageWidth();
BigInteger width = imageWidth == null ? null : imageWidth.getValue();
if (height != null || width == null) {
PictureSize pictureSize = new PictureSize();
pictureSize.setHeight(height);
pictureSize.setWidth(width);
getTechnicalMetadata().setPictureSize(pictureSize);
}
}
}
// resolution
ImageAssessmentMetadataType imageAssessmentMetadata = mix.getImageAssessmentMetadata();
if (imageAssessmentMetadata != null) {
SpatialMetrics spatialMetrics = imageAssessmentMetadata.getSpatialMetrics();
if (spatialMetrics != null) {
BigInteger xRatio = ratio(spatialMetrics.getXSamplingFrequency());
BigInteger yRatio = ratio(spatialMetrics.getYSamplingFrequency());
if (xRatio != null || yRatio != null) {
Resolution resolution = new Resolution();
resolution.setHorizontal(xRatio);
resolution.setVertical(yRatio);
getTechnicalMetadata().setResolution(resolution);
}
}
}
return this;
}
private TechnicalMetadata getTechnicalMetadata() {
TechnicalMetadata tm = digitalDocument.getTechnicalMetadata();
if (tm == null) {
tm = new TechnicalMetadata();
digitalDocument.setTechnicalMetadata(tm);
}
return tm;
}
private static String string(StringType st) {
return st == null ? null : st.getValue();
}
private static BigInteger ratio(BigInteger numerator, BigInteger denominator) {
if (numerator != null && denominator == null) {
return numerator;
}
if (numerator != null && denominator != null) {
return numerator.divide(denominator);
}
return null;
}
private static BigInteger ratio(RationalType rationalType) {
if (rationalType != null) {
return ratio(rationalType.getNumerator(), rationalType.getDenominator());
}
return null;
}
}