/*******************************************************************************
* Copyright (c) 2016 Weasis Team and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Nicolas Roduit - initial API and implementation
*******************************************************************************/
package org.weasis.core.api.media.data;
import java.io.File;
import java.net.URI;
import java.nio.file.Paths;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Objects;
import java.util.Optional;
import org.weasis.core.api.util.FileUtil;
public class MediaElement implements Tagable {
// Metadata of the media
protected final Map<TagW, Object> tags;
// Reader of the media (local or remote)
protected final MediaReader mediaIO;
// Key to identify the media (the URI passed to the Reader can contain several media elements)
protected final Object key;
private volatile boolean loading = false;
public <E> MediaElement(MediaReader mediaIO, Object key) {
this.mediaIO = Objects.requireNonNull(mediaIO);
this.key = key;
this.tags = Optional.ofNullable(mediaIO.getMediaFragmentTags(key)).orElseGet(HashMap::new);
}
public MediaReader getMediaReader() {
return mediaIO;
}
@Override
public void setTag(TagW tag, Object value) {
if (tag != null) {
tags.put(tag, value);
}
}
@Override
public boolean containTagKey(TagW tag) {
return tags.containsKey(tag);
}
@Override
public Object getTagValue(TagW tag) {
return tag == null ? null : tags.get(tag);
}
public TagW getTagElement(int id) {
Iterator<TagW> enumVal = tags.keySet().iterator();
while (enumVal.hasNext()) {
TagW e = enumVal.next();
if (e.id == id) {
return e;
}
}
return null;
}
@Override
public void setTagNoNull(TagW tag, Object value) {
if (value != null) {
setTag(tag, value);
}
}
@Override
public Iterator<Entry<TagW, Object>> getTagEntrySetIterator() {
return tags.entrySet().iterator();
}
public void clearAllTags() {
tags.clear();
}
public void dispose() {
// Close image reader and image stream, but it should be already closed
mediaIO.close();
mediaIO.getFileCache().dispose();
}
public URI getMediaURI() {
return mediaIO.getUri();
}
/**
* This file can be the result of a processing like downloading, tiling or uncompressing.
*
* @return the final file that has been load by the reader.
*/
public File getFile() {
return mediaIO.getFileCache().getFinalFile();
}
public FileCache getFileCache() {
return mediaIO.getFileCache();
}
public String getName() {
return Paths.get(mediaIO.getUri()).getFileName().toString();
}
public Object getKey() {
return key;
}
public boolean saveToFile(File output) {
if (mediaIO.getFileCache().isElementInMemory()) {
return mediaIO.buildFile(output);
}
return FileUtil.nioCopyFile(mediaIO.getFileCache().getFinalFile(), output);
}
public long getLength() {
return mediaIO.getFileCache().getLength();
}
public long getLastModified() {
return mediaIO.getFileCache().getLastModified();
}
public String getMimeType() {
return mediaIO.getMediaFragmentMimeType();
}
protected final synchronized boolean setAsLoading() {
if (!loading) {
loading = true;
return loading;
}
return false;
}
protected final synchronized void setAsLoaded() {
loading = false;
}
public final synchronized boolean isLoading() {
return loading;
}
}