/*
* ModeShape (http://www.modeshape.org)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.modeshape.sequencer.image;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import javax.jcr.Node;
import javax.jcr.RepositoryException;
import org.junit.Test;
import org.modeshape.common.FixFor;
import org.modeshape.jcr.api.JcrConstants;
import org.modeshape.jcr.sequencer.AbstractSequencerTest;
/**
* Unit test for {@link ImageMetadataSequencer}. This test runs a minimal, in memory MS repository, which has two image sequencers
* configured: one which writes sequenced output to the same location as the input and one which writes the output to another,
* custom location.
*
* @author Randall Hauch
* @author John Verhaeg
* @author Horia Chiorean
*/
public class ImageMetadataSequencerTest extends AbstractSequencerTest {
@Test
public void shouldGenerateMetadataForJpegImageFiles() throws Exception {
String filename = "caution.jpg";
Node imageNode = createNodeWithContentFromFile(filename, filename);
Node sequencedNodeDifferentLocation = getOutputNode(rootNode, "sequenced/images/" + filename);
assertMetaDataProperties(sequencedNodeDifferentLocation, "image/jpeg", "jpeg", 48, 48, 24, false, 1, 72, 72, 0.666667, 0.666667);
Node sequencedNodeSameLocation = getOutputNode(imageNode, ImageMetadataLexicon.METADATA_NODE);
assertMetaDataProperties(sequencedNodeSameLocation, "image/jpeg", "jpeg", 48, 48, 24, false, 1, 72, 72, 0.666667, 0.666667);
}
@Test
public void shouldGenerateMetadataForPngImageFiles() throws Exception {
String filename = "caution.png";
Node imageNode = createNodeWithContentFromFile(filename, filename);
Node sequencedNodeDifferentLocation = getOutputNode(rootNode, "sequenced/images/" + filename);
assertMetaDataProperties(sequencedNodeDifferentLocation, "image/png", "png", 48, 48, 24, false, 1, -1, -1, -1, -1);
Node sequencedNodeSameLocation = getOutputNode(imageNode, ImageMetadataLexicon.METADATA_NODE);
assertMetaDataProperties(sequencedNodeSameLocation, "image/png", "png", 48, 48, 24, false, 1, -1, -1, -1, -1);
}
@Test
public void shouldGenerateMetadataForGifImageFiles() throws Exception {
String filename = "caution.gif";
Node imageNode = createNodeWithContentFromFile(filename, filename);
Node sequencedNodeDifferentLocation = getOutputNode(rootNode, "sequenced/images/" + filename);
assertMetaDataProperties(sequencedNodeDifferentLocation, "image/gif", "gif", 48, 48, 8, false, 1, -1, -1, -1, -1);
Node sequencedNodeSameLocation = getOutputNode(imageNode, ImageMetadataLexicon.METADATA_NODE);
assertMetaDataProperties(sequencedNodeSameLocation, "image/gif", "gif", 48, 48, 8, false, 1, -1, -1, -1, -1);
}
@Test
public void shouldGenerateNoMetadataforPictImageFiles() throws Exception {
String filename = "caution.pict";
Node imageNode = createNodeWithContentFromFile(filename, filename);
try {
getOutputNode(rootNode, "sequenced/images/" + filename, 1);
} catch (AssertionError e) {
//expected
}
try {
getOutputNode(imageNode, ImageMetadataLexicon.METADATA_NODE, 1);
} catch (AssertionError e) {
//expected
}
}
@Test
@FixFor( "MODE-2021")
public void shouldExtractExifInformationFromJpeg() throws Exception {
String filename = "image_with_exif.jpg";
createNodeWithContentFromFile(filename, filename);
Node sequencedNode = getOutputNode(rootNode, "sequenced/images/" + filename);
assertNotNull(sequencedNode);
Node exifNode = sequencedNode.getNode(ImageMetadataLexicon.EXIF_NODE);
assertEquals("Top, left side (Horizontal / normal)", exifNode.getProperty(ImageMetadataLexicon.ORIENTATION).getString());
assertEquals("NIKON", exifNode.getProperty(ImageMetadataLexicon.MAKE).getString());
assertEquals("E4600", exifNode.getProperty(ImageMetadataLexicon.MODEL).getString());
assertEquals(300.0, exifNode.getProperty(ImageMetadataLexicon.RESOLUTION_X).getDouble(), 0);
assertEquals(300.0, exifNode.getProperty(ImageMetadataLexicon.RESOLUTION_Y).getDouble(), 0);
assertEquals("Inch", exifNode.getProperty(ImageMetadataLexicon.UNIT).getString());
assertEquals("2008:05:08 14:54:46", exifNode.getProperty(ImageMetadataLexicon.DATETIME).getString());
assertEquals("Adobe Photoshop CS3 Windows", exifNode.getProperty(ImageMetadataLexicon.SOFTWARE).getString());
}
@Test
@FixFor( "MODE-1847" )
public void shouldSequenceTIFFiles() throws Exception {
String filename = "tif_image.tif";
createNodeWithContentFromFile(filename, filename);
Node sequencedNodeDifferentLocation = getOutputNode(rootNode, "sequenced/images/" + filename);
assertEquals(ImageMetadataLexicon.METADATA_NODE, sequencedNodeDifferentLocation.getProperty(JcrConstants.JCR_PRIMARY_TYPE).getString());
assertEquals("image/tiff", sequencedNodeDifferentLocation.getProperty(JcrConstants.JCR_MIME_TYPE).getString());
}
private void assertMetaDataProperties( Node metadataNode, String mimeType, String format, int width, int height, int bitsPerPixel,
boolean progressive, int numberOfImages, int physicalWidthDpi, int physicalHeightDpi,
double physicalWidthInches, double physicalHeightInches ) throws RepositoryException {
assertNotNull(metadataNode);
assertEquals(ImageMetadataLexicon.METADATA_NODE, metadataNode.getProperty(JcrConstants.JCR_PRIMARY_TYPE).getString());
assertEquals(mimeType, metadataNode.getProperty(JcrConstants.JCR_MIME_TYPE).getString());
assertEquals(format, metadataNode.getProperty(ImageMetadataLexicon.FORMAT_NAME).getString().toLowerCase());
assertEquals(width, metadataNode.getProperty(ImageMetadataLexicon.WIDTH).getLong());
assertEquals(height, metadataNode.getProperty(ImageMetadataLexicon.HEIGHT).getLong());
assertEquals(bitsPerPixel, metadataNode.getProperty(ImageMetadataLexicon.BITS_PER_PIXEL).getLong());
assertEquals(progressive, metadataNode.getProperty(ImageMetadataLexicon.PROGRESSIVE).getBoolean());
assertEquals(numberOfImages, metadataNode.getProperty(ImageMetadataLexicon.NUMBER_OF_IMAGES).getLong());
assertEquals(physicalWidthDpi, metadataNode.getProperty(ImageMetadataLexicon.PHYSICAL_WIDTH_DPI).getLong());
assertEquals(physicalHeightDpi, metadataNode.getProperty(ImageMetadataLexicon.PHYSICAL_HEIGHT_DPI).getLong());
assertEquals(physicalWidthInches, metadataNode.getProperty(ImageMetadataLexicon.PHYSICAL_WIDTH_INCHES).getDouble(), 0.0001d);
assertEquals(physicalHeightInches, metadataNode.getProperty(ImageMetadataLexicon.PHYSICAL_HEIGHT_INCHES).getDouble(), 0.0001d);
}
}