com.celements.photo.metadata.MetaInfoExtractor.java Source code

Java tutorial

Introduction

Here is the source code for com.celements.photo.metadata.MetaInfoExtractor.java

Source

/*
 * See the NOTICE file distributed with this work for additional
 * information regarding copyright ownership.
 *
 * This is free software; you can redistribute it and/or modify it
 * under the terms of the GNU Lesser General Public License as
 * published by the Free Software Foundation; either version 2.1 of
 * the License, or (at your option) any later version.
 *
 * This software 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
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this software; if not, write to the Free
 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
 * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
 */
package com.celements.photo.metadata;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.List;
import java.util.Map;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.xwiki.model.reference.DocumentReference;

import com.drew.imaging.jpeg.JpegMetadataReader;
import com.drew.imaging.jpeg.JpegProcessingException;
import com.drew.metadata.Directory;
import com.drew.metadata.Metadata;
import com.drew.metadata.MetadataException;
import com.drew.metadata.Tag;

/**
 * This class provides the metadata saved in a specified image. There are 
 * several methods to get certain parts of the data.
 */
public class MetaInfoExtractor {
    private static Log LOGGER = LogFactory.getFactory().getInstance(MetaInfoExtractor.class);

    /**
     * Returns an array of Tag elements representing the metainformation,
     * contained in the specified directory of the given file.
     * 
     * @param imageFile The file to extract the data from.
     * @param directory The desired directory's Class.
     * @return An arry of Tags.
     * @throws MetadataException
     */
    public List<Tag> getDirectoryTagsAsTagList(InputStream imageFile, Class directory) throws MetadataException {
        Metadata metadata = getMetadata(imageFile);
        Directory dir = metadata.getDirectory(directory);
        List<Tag> data = new ArrayList<Tag>();
        for (Tag tag : dir.getTags()) {
            data.add(tag);
        }
        return data;
    }

    /**
     * To get all meta tags possibly contained in an image.
     * 
     * @param imageFile File to extract the Metadata from.
     * @return Hashtable containing the directorys data.
     * @throws MetadataException
     */
    public Map<String, String> getAllTags(InputStream imageFile) throws MetadataException {
        Metadata data = getMetadata(imageFile);
        Map<String, String> tags = new HashMap<String, String>();
        for (Directory dir : data.getDirectories()) {
            tags.putAll(getDirsTags(dir));
        }
        return tags;
    }

    /*
     * Extracts the metadata from the image file represented by an InputStream
     * 
     * @param imageFile InputStream of an image file.
     * @return Metadata containied in the specified image.
     */
    Metadata getMetadata(InputStream imageFile) {
        Metadata metadata = null;
        try {
            metadata = JpegMetadataReader.readMetadata(imageFile);
        } catch (JpegProcessingException e) {
            LOGGER.error("Not able to load the meta data of " + imageFile, e);
        }
        return metadata;
    }

    /*
     * Saves all tags contained in the specified directory to a Hashtable and 
     * returnes them.
     * 
     * @param dir Directory to extract the tags from.
     * @return Hashtable containing th metatags from the Directory.
     * @throws MetadataException
     */
    Hashtable<String, String> getDirsTags(Directory dir) throws MetadataException {
        Hashtable<String, String> metadata = new Hashtable<String, String>();
        for (Tag tag : dir.getTags()) {
            metadata.put(tag.getTagName(), tag.toString());
        }
        return metadata;
    }
}