if(! uri.isAbsolute()){
throw new IOException(URI_IS_NOT_ABSOLUTE);
}else if ("http".equals(uri.getScheme()) || "https".equals(uri.getScheme())){
- HttpResponse response = UriUtils.getResponse(uri, requestHeaders);
+ HttpResponse response = UriUtils.getResponse(uri, requestHeaders); // FIXME must use HTTP HEAD!
if(UriUtils.isOk(response)){
Header[] contentLengths = response.getHeaders("Content-Length");
*/
package eu.etaxonomy.cdm.common.media;
-import java.io.IOException;
-import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
-import org.apache.commons.imaging.ImageInfo;
-import org.apache.commons.imaging.ImageReadException;
-import org.apache.commons.imaging.Imaging;
-import org.apache.commons.imaging.common.GenericImageMetadata.GenericImageMetadataItem;
-import org.apache.commons.imaging.common.ImageMetadata;
-import org.apache.commons.imaging.common.ImageMetadata.ImageMetadataItem;
-import org.apache.commons.lang3.StringUtils;
-import org.apache.http.HttpException;
-import org.apache.http.client.ClientProtocolException;
-import org.apache.log4j.Logger;
-
-import eu.etaxonomy.cdm.common.CdmUtils;
import eu.etaxonomy.cdm.common.URI;
-import eu.etaxonomy.cdm.common.UriUtils;
+
/**
* @author k.luther
* @since 27.11.2009
*/
public class CdmImageInfo extends MediaInfo {
- private static Logger logger = Logger.getLogger(CdmImageInfo.class);
private int width;
private int height;
private int bitPerPixel;
private final URI imageUri;
- private Map<String, String> metaData;
-
-//********************** Factory Methods ******************************/
-
- public static CdmImageInfo NewInstance(URI imageUri, Integer timeOut) throws IOException, HttpException {
- CdmImageInfo instance = new CdmImageInfo(imageUri);
- instance.readSuffix();
- instance.readImageLength();
- instance.readImageInfo(timeOut);
- return instance;
- }
+ private Map<String, String> metaData = new HashMap<>();
- public static CdmImageInfo NewInstanceWithMetaData(URI imageUri, Integer timeOut) throws IOException, HttpException {
- CdmImageInfo instance = NewInstance(imageUri, timeOut);
-
- instance.readMetaData(timeOut);
-
- return instance;
- }
//*********************** CONSTRUCTOR **************************************/
- private CdmImageInfo(URI imageUri){
+ public CdmImageInfo(URI imageUri){
this.imageUri = imageUri;
}
return width;
}
- public int getHeight() {
+ public void setWidth(int width) {
+ this.width = width;
+ }
+
+ public void setHeight(int height) {
+ this.height = height;
+ }
+
+ public void setBitPerPixel(int bitPerPixel) {
+ this.bitPerPixel = bitPerPixel;
+ }
+
+ public int getHeight() {
return height;
}
return metaData;
}
-//**************************** METHODS *****************************/
-
- private void readSuffix(){
- String path = imageUri.getPath();
-
- String suffix = path.substring(StringUtils.lastIndexOf(path, '.') + 1);
- setSuffix(suffix);
- }
-
- private void readImageLength() throws ClientProtocolException, IOException, HttpException{
- try {
- long length = UriUtils.getResourceLength(imageUri, null);
- setLength(length);
- } catch (HttpException e) {
- if (e.getMessage().equals("Could not retrieve Content-Length")){
- InputStream inputStream = UriUtils.getInputStream(imageUri);
- int n = 0;
- while(inputStream.read() != -1){
- n++;
- }
- inputStream.close();
- logger.info("Content-Length not available in http header. Image size computed via input stream size: " + imageUri);
- setLength(n);
- }else{
- throw e;
- }
- }
- }
-
- /**
- * Reads the image infos (width, height, bitPerPixel, metadata, format, mime type)
- * @param timeOut
- * @throws IOException
- * @throws HttpException
- */
- private void readImageInfo(Integer timeOut) throws IOException, HttpException{
-
- InputStream inputStream;
- try {
- inputStream = UriUtils.getInputStream(imageUri);
- ImageInfo imageInfo = Imaging.getImageInfo(inputStream, null);
-
- setFormatName(imageInfo.getFormatName());
- setMimeType(imageInfo.getMimeType());
- width = imageInfo.getWidth();
- height = imageInfo.getHeight();
- bitPerPixel = imageInfo.getBitsPerPixel();
- inputStream.close();
-
- } catch (ImageReadException e) {
- logger.error("Could not read: " + imageUri + ". " + e.getMessage());
- throw new IOException(e);
- }
- }
-
-
- /**
- * @param timeOut TODO is not yet used
- * @return
- * @throws IOException
- * @throws HttpException
- */
- public Map<String, String> readMetaData(Integer timeOut) throws IOException, HttpException {
-
- try {
- InputStream inputStream = UriUtils.getInputStream(imageUri);
-
- ImageMetadata mediaData = Imaging.getMetadata(inputStream, null);
-
- if (mediaData != null){
- metaData = new HashMap<>();
- for (ImageMetadataItem imItem : mediaData.getItems()){
- if (imItem instanceof GenericImageMetadataItem){
- GenericImageMetadataItem item = (GenericImageMetadataItem)imItem;
- if ("Keywords".equals(item.getKeyword())){
- String value = text(item);
- String[] splits = value.split(":");
- if (splits.length == 2){
- //convention used e.g. for Flora of cyprus (#9137)
- metaData.put(splits[0].trim(), splits[1].trim());
- }else{
- metaData.put(item.getKeyword(), CdmUtils.concat("; ", metaData.get(item.getKeyword()), value));
- }
- }else if (item.getKeyword().contains("/")){
- //TODO: not sure where this syntax is used originally
- String key = item.getKeyword();
- //key.replace("/", "");
- int index = key.indexOf("/");
- key = key.substring(0, index);
- metaData.put(key, text(item));
- }else{
- metaData.put(item.getKeyword(), text(item));
- }
- }
- }
- }
- }catch (ImageReadException e) {
- logger.error("Could not read: " + imageUri + ". " + e.getMessage());
- //throw new IOException(e);
- }
- return metaData;
- }
-
- /**
- * Wrapper for the Item.getText() method which applies cleaning of the text representation.
- *
- * <ol>
- * <li>Strings are surrounded by single quotes, these must be removed</li>
- * </ol>
- * @param item
- */
- private String text(GenericImageMetadataItem item) {
- String text = item.getText();
- if(text.startsWith("'") && text.endsWith("'")) {
- text = text.substring(1 , text.length() - 1);
- }
- return text;
- }
// ******************* TO STRING **********************************/
import org.apache.log4j.Logger;
import eu.etaxonomy.cdm.api.facade.DerivedUnitFacade;
+import eu.etaxonomy.cdm.api.service.media.MediaMedadataFileReader;
import eu.etaxonomy.cdm.common.URI;
import eu.etaxonomy.cdm.common.UriUtils;
import eu.etaxonomy.cdm.common.media.CdmImageInfo;
if (mediaRecord.has("identifier")){
try {
uri = new URI(mediaRecord.getString("identifier"));
- imageInf = CdmImageInfo.NewInstance(uri, 0);
+ imageInf = new MediaMedadataFileReader(uri)
+ .readSuffix()
+ .readImageLength()
+ .readImageInfo()
+ .getCdmImageInfo();
} catch (URISyntaxException |IOException | HttpException e) {
e.printStackTrace();
}
derivedUnitFacade.addDerivedUnitMedia(media);
}
//identifier=http://ww2.bgbm.org/herbarium/images/B/-W/08/53/B_-W_08537%20-00%201__3.jpg
- //references=http://ww2.bgbm.org/herbarium/view_biocase.cfm?SpecimenPK=136628
+ //references=http://ww2.bgbm.org/herbarium/view_biocase.cfm?SpecimenPK=136628
//format=image/jpeg
//type=StillImage
}
try {
if (readMediaData){
logger.info("Read media data from: " + uri);
- cdmImageInfo = CdmImageInfo.NewInstance(uri, 0);
+ cdmImageInfo = getMediaInfoFactory().cdmImageInfo(uri);
}
} catch (Exception e) {
String message = "An error occurred when trying to read image meta data for " + uri.toString() + ": " + e.getMessage();
*/
package eu.etaxonomy.cdm.io.media.in;
-import eu.etaxonomy.cdm.common.URI;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.joda.time.Partial;
import org.springframework.stereotype.Component;
+import eu.etaxonomy.cdm.common.URI;
import eu.etaxonomy.cdm.common.media.CdmImageInfo;
import eu.etaxonomy.cdm.io.common.utils.ImportDeduplicationHelper;
import eu.etaxonomy.cdm.io.excel.common.ExcelImportBase;
CdmImageInfo cdmImageInfo = null;
try {
if (state.getConfig().isReadMediaData()){
- cdmImageInfo = CdmImageInfo.NewInstance(uri, 0);
+ cdmImageInfo = getMediaInfoFactory().cdmImageInfo(uri);
}
} catch (Exception e) {
String message = "An error occurred when trying to read image meta data for %s. Image was created but without metadata.";
try{\r
URL url = new URL(href);\r
\r
- imageMetaData = CdmImageInfo.NewInstance(URI.fromUrl(url), 0);\r
+ imageMetaData = getMediaInfoFactory().cdmImageInfo(URI.fromUrl(url));\r
image = ImageFile.NewInstance(URI.fromUrl(url), null, imageMetaData);\r
} catch (MalformedURLException e) {\r
logger.error("Malformed URL", e);\r
File parent = f.getParentFile();\r
String fi = parent.toString() + File.separator + href;\r
File file = new File(fi);\r
- imageMetaData = CdmImageInfo.NewInstance(new URI(fi), 0); //file\r
+ imageMetaData = getMediaInfoFactory().cdmImageInfo(new URI(fi)); //file\r
image = ImageFile.NewInstance(URI.fromFile(file), null, imageMetaData);\r
}\r
MediaRepresentation representation = MediaRepresentation.NewInstance(imageMetaData.getMimeType(), null);\r
import org.springframework.web.bind.annotation.RequestParam;\r
\r
import eu.etaxonomy.cdm.api.service.IMediaService;\r
-import eu.etaxonomy.cdm.api.service.MediaServiceImpl;\r
+import eu.etaxonomy.cdm.api.service.media.MediaInfoFactory;\r
import eu.etaxonomy.cdm.common.URI;\r
import eu.etaxonomy.cdm.common.media.CdmImageInfo;\r
import eu.etaxonomy.cdm.model.media.Media;\r
\r
private static final Logger logger = Logger.getLogger(MediaController.class);\r
\r
+\r
+ @Autowired\r
+ private MediaInfoFactory mediaInfoFactory;\r
+\r
@Autowired\r
@Override\r
public void setService(IMediaService service) {\r
\r
} else {\r
uri = mediaRepresentation.getParts().get(0).getUri();\r
- CdmImageInfo cdmImageInfo = CdmImageInfo.NewInstanceWithMetaData(uri, MediaServiceImpl.IMAGE_READ_TIMEOUT);\r
+ CdmImageInfo cdmImageInfo = mediaInfoFactory.cdmImageInfoWithMetaData(uri);\r
result = cdmImageInfo.getMetaData();\r
}\r
} catch (IOException | HttpException e) {\r
import de.digitalcollections.iiif.model.sharedcanvas.Resource;
import de.digitalcollections.iiif.model.sharedcanvas.Sequence;
import eu.etaxonomy.cdm.api.service.IMediaService;
-import eu.etaxonomy.cdm.api.service.MediaServiceImpl;
import eu.etaxonomy.cdm.api.service.l10n.LocaleContext;
+import eu.etaxonomy.cdm.api.service.media.MediaInfoFactory;
import eu.etaxonomy.cdm.common.media.CdmImageInfo;
import eu.etaxonomy.cdm.model.common.Credit;
import eu.etaxonomy.cdm.model.common.IdentifiableEntity;
private IMediaService mediaService;
+ private MediaInfoFactory mediaInfoFactory; // FIXME define and use interface
+
private String iiifIdPrefix;
private String[] thumbnailMimetypes = new String[] {"image/.*", ".*"};
}
- public ManifestComposer(String iiifIdPrefix, IMediaToolbox mediaTools, IMediaService mediaService) {
+ public ManifestComposer(String iiifIdPrefix, IMediaToolbox mediaTools, IMediaService mediaService, MediaInfoFactory mediaInfoFactory) {
this.mediaTools = mediaTools;
this.iiifIdPrefix = iiifIdPrefix;
this.mediaService = mediaService;
+ this.mediaInfoFactory = mediaInfoFactory;
}
<T extends IdentifiableEntity> Manifest manifestFor(EntityMediaContext<T> entityMediaContext, String onEntitiyType, String onEntityUuid) throws IOException {
}
/**
- * @deprecated unused as media metadata is now read via the mediaService, see
+ * @deprecated unused as media metadata is now read via the mediaService,
+ * see {@link IMediaService#readResourceMetadataFiltered(MediaRepresentation)}
*/
@Deprecated
private List<MetadataEntry> mediaRepresentationMetaData(MediaRepresentation representation) {
}
if (part.getUri() != null) {
try {
- CdmImageInfo cdmImageInfo = CdmImageInfo.NewInstanceWithMetaData(part.getUri(), MediaServiceImpl.IMAGE_READ_TIMEOUT);
+ CdmImageInfo cdmImageInfo = mediaInfoFactory.cdmImageInfoWithMetaData(part.getUri());
Map<String, String> result = cdmImageInfo.getMetaData();
if(result != null){
for (String key : result.keySet()) {
import de.digitalcollections.iiif.model.sharedcanvas.Manifest;
import eu.etaxonomy.cdm.api.service.IMediaService;
import eu.etaxonomy.cdm.api.service.ITermService;
+import eu.etaxonomy.cdm.api.service.media.MediaInfoFactory;
import eu.etaxonomy.cdm.api.util.TaxonRelationshipEdge;
import eu.etaxonomy.cdm.model.media.MediaRepresentationPart;
import eu.etaxonomy.cdm.model.taxon.Taxon;
@Autowired
private IMediaService mediaService;
+ @Autowired
+ private MediaInfoFactory mediaInfoFactory;
+
@RequestMapping(
value = {"taxon/{uuid}/manifest"},
method = RequestMethod.GET)
taxonPortalController.addTaxonomicChildrenMedia(includeTaxonDescriptions, includeOccurrences, includeTaxonNameDescriptions, entityMediaContext.getEntity(), includeRelationships, entityMediaContext.getMedia())
);
}
- ManifestComposer manifestFactory = new ManifestComposer(HTTP_IIIF_CYBERTAXONOMY_ORG, mediaTools, mediaService);
+ ManifestComposer manifestFactory = new ManifestComposer(HTTP_IIIF_CYBERTAXONOMY_ORG, mediaTools, mediaService, mediaInfoFactory);
manifestFactory.setDoJoinAttributions(true);
manifestFactory.setUseThumbnailDimensionsForCanvas(true);
return serializeManifest(manifestFactory.manifestFor(entityMediaContext, "taxon", uuid.toString()));
import eu.etaxonomy.cdm.api.service.IUserService;\r
import eu.etaxonomy.cdm.api.service.IVocabularyService;\r
import eu.etaxonomy.cdm.api.service.longrunningService.ILongRunningTasksService;\r
+import eu.etaxonomy.cdm.api.service.media.MediaInfoFactory;\r
import eu.etaxonomy.cdm.api.service.molecular.IAmplificationService;\r
import eu.etaxonomy.cdm.api.service.molecular.IPrimerService;\r
import eu.etaxonomy.cdm.api.service.molecular.ISequenceService;\r
return;\r
}\r
\r
-\r
- /**\r
- * {@inheritDoc}\r
- */\r
@Override\r
public IRightsService getRightsService() {\r
return configuration.getRightsService();\r
}\r
\r
-\r
- /**\r
- * {@inheritDoc}\r
- */\r
@Override\r
public IRegistrationService getRegistrationService() {\r
return configuration.getRegistrationService();\r
}\r
\r
+ @Override\r
+ public MediaInfoFactory getMediaInfoFactory() {\r
+ return configuration.getMediaInfoFactory();\r
+ }\r
+\r
}\r
\r
import eu.etaxonomy.cdm.api.service.IUserService;
import eu.etaxonomy.cdm.api.service.IVocabularyService;
import eu.etaxonomy.cdm.api.service.longrunningService.ILongRunningTasksService;
+import eu.etaxonomy.cdm.api.service.media.MediaInfoFactory;
import eu.etaxonomy.cdm.api.service.molecular.IAmplificationService;
import eu.etaxonomy.cdm.api.service.molecular.IPrimerService;
import eu.etaxonomy.cdm.api.service.molecular.ISequenceService;
private IEntityConstraintViolationService entityConstraintViolationService;
@Autowired
private ICdmPermissionEvaluator permissionEvaluator;
+ @Autowired
+ private MediaInfoFactory mediaInfoFactory; // FIXME define and use interface
@Autowired
private SessionFactory factory;
return permissionEvaluator;
}
+ public MediaInfoFactory getMediaInfoFactory() { // FIXME define and use interface
+ return mediaInfoFactory;
+ }
+
@Override
public TransactionStatus startTransaction(){
return startTransaction(false);
// no current session: nothing to clear!
}
}
+
}
import eu.etaxonomy.cdm.api.service.IUserService;
import eu.etaxonomy.cdm.api.service.IVocabularyService;
import eu.etaxonomy.cdm.api.service.longrunningService.ILongRunningTasksService;
+import eu.etaxonomy.cdm.api.service.media.MediaInfoFactory;
import eu.etaxonomy.cdm.api.service.molecular.IAmplificationService;
import eu.etaxonomy.cdm.api.service.molecular.IPrimerService;
import eu.etaxonomy.cdm.api.service.molecular.ISequenceService;
*/
public ICdmPermissionEvaluator getPermissionEvaluator();
+ public MediaInfoFactory getMediaInfoFactory(); // FIXME define and user interface
+
void authenticate(String username, String password);
}
import eu.etaxonomy.cdm.api.service.config.DeleteConfiguratorBase;\r
import eu.etaxonomy.cdm.api.service.config.MediaDeletionConfigurator;\r
import eu.etaxonomy.cdm.api.service.exception.ReferencedObjectUndeletableException;\r
+import eu.etaxonomy.cdm.api.service.media.MediaInfoFactory;\r
import eu.etaxonomy.cdm.api.service.pager.Pager;\r
import eu.etaxonomy.cdm.api.service.pager.impl.DefaultPagerImpl;\r
import eu.etaxonomy.cdm.common.media.CdmImageInfo;\r
@Transactional(readOnly=true)\r
public class MediaServiceImpl extends IdentifiableServiceBase<Media,IMediaDao> implements IMediaService {\r
\r
- public static final Integer IMAGE_READ_TIMEOUT = 3000;\r
-\r
@Override\r
@Autowired\r
protected void setDao(IMediaDao dao) {\r
private INameService nameService;\r
@Autowired\r
private IPreferenceService prefsService;\r
+ @Autowired\r
+ private MediaInfoFactory mediaInfoFactory; // FIXME define and use interface\r
\r
\r
@Override\r
Map<String, String> metadata = new HashMap<>();\r
\r
for(MediaRepresentationPart part : representation.getParts()) {\r
- CdmImageInfo iInfo = CdmImageInfo.NewInstanceWithMetaData(part.getUri(), IMAGE_READ_TIMEOUT);\r
+ CdmImageInfo iInfo = mediaInfoFactory.cdmImageInfoWithMetaData(part.getUri());\r
if(iInfo.getMetaData() != null) {\r
metadata.putAll(iInfo.getMetaData());\r
}\r
--- /dev/null
+/**
+* Copyright (C) 2021 EDIT
+* European Distributed Institute of Taxonomy
+* http://www.e-taxonomy.eu
+*
+* The contents of this file are subject to the Mozilla Public License Version 1.1
+* See LICENSE.TXT at the top of this package for the full license terms.
+*/
+package eu.etaxonomy.cdm.api.service.media;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.http.HttpException;
+import org.springframework.stereotype.Component;
+
+import eu.etaxonomy.cdm.common.URI;
+import eu.etaxonomy.cdm.common.media.CdmImageInfo;
+
+/**
+ * @author a.kohlbecker
+ * @since May 5, 2021
+ */
+@Component
+public class MediaInfoFactory {
+
+ /**
+ * TODO needs to be managed in CDM PREFERENCES
+ */
+ private List<MediaUriTransformation> uriTransformations = new ArrayList<>();
+
+ /**
+ * TODO needs to be managed in CDM PREFERENCES
+ *
+ * Transformation from
+ * https://pictures.bgbm.org/digilib/Scaler?fn=Cyprus/Sisymbrium_aegyptiacum_C1.jpg&mo=file
+ * to
+ * https://image.bgbm.org/metadata/info?file=Cyprus/Sisymbrium_aegyptiacum_C1.jpg
+ */
+ private MediaUriTransformation bgbmMediaMetadataService() {
+ MediaUriTransformation mut = new MediaUriTransformation();
+ mut.setHost(new SearchReplace("pictures.bgbm.org", "image.bgbm.org"));
+ mut.setPathQueryFragment(new SearchReplace("(digilib\\/Scaler\\?fn=)([^&]+)(&mo=file)", "file=$2"));
+ return mut;
+ }
+
+ public MediaInfoFactory() {
+ uriTransformations.add(bgbmMediaMetadataService());
+ }
+
+ public CdmImageInfo cdmImageInfoWithMetaData(URI imageUri) throws IOException, HttpException {
+ return new MediaMedadataFileReader(imageUri)
+ .readSuffix()
+ .readImageLength()
+ .readImageInfo()
+ .readMetaData()
+ .getCdmImageInfo();
+
+ }
+
+ public CdmImageInfo cdmImageInfo(URI imageUri) throws IOException, HttpException {
+ return new MediaMedadataFileReader(imageUri)
+ .readSuffix()
+ .readImageLength()
+ .readImageInfo()
+ .getCdmImageInfo();
+
+ }
+
+
+
+
+
+}
--- /dev/null
+/**
+* Copyright (C) 2021 EDIT
+* European Distributed Institute of Taxonomy
+* http://www.e-taxonomy.eu
+*
+* The contents of this file are subject to the Mozilla Public License Version 1.1
+* See LICENSE.TXT at the top of this package for the full license terms.
+*/
+package eu.etaxonomy.cdm.api.service.media;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+import org.apache.commons.imaging.ImageInfo;
+import org.apache.commons.imaging.ImageReadException;
+import org.apache.commons.imaging.Imaging;
+import org.apache.commons.imaging.common.GenericImageMetadata.GenericImageMetadataItem;
+import org.apache.commons.imaging.common.ImageMetadata;
+import org.apache.commons.imaging.common.ImageMetadata.ImageMetadataItem;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.http.HttpException;
+import org.apache.http.client.ClientProtocolException;
+import org.apache.log4j.Logger;
+
+import eu.etaxonomy.cdm.common.CdmUtils;
+import eu.etaxonomy.cdm.common.URI;
+import eu.etaxonomy.cdm.common.UriUtils;
+import eu.etaxonomy.cdm.common.media.CdmImageInfo;
+
+/**
+ * TODO make use of timeOut ?
+ *
+ * @author a.kohlbecker
+ * @since May 6, 2021
+ */
+public class MediaMedadataFileReader {
+
+
+ private static Logger logger = Logger.getLogger(MediaMedadataFileReader.class);
+
+ private CdmImageInfo cdmImageInfo;
+
+ public static final Integer IMAGE_READ_TIMEOUT = 3000; // ms
+
+ private Integer timeOut = IMAGE_READ_TIMEOUT; // setting default
+
+ public MediaMedadataFileReader(CdmImageInfo cdmImageInfo) {
+ this.cdmImageInfo = cdmImageInfo;
+ }
+
+ public MediaMedadataFileReader(URI uri) {
+ this.cdmImageInfo = new CdmImageInfo(uri);
+ }
+
+ /**
+ * Reads the image info (width, height, bitPerPixel, metadata, format, mime type)
+ */
+ public MediaMedadataFileReader readImageInfo() throws IOException, HttpException{
+
+ InputStream inputStream;
+ try {
+ inputStream = UriUtils.getInputStream(cdmImageInfo.getUri());
+ ImageInfo imageInfo = Imaging.getImageInfo(inputStream, null);
+
+ cdmImageInfo.setFormatName(imageInfo.getFormatName());
+ cdmImageInfo.setMimeType(imageInfo.getMimeType());
+ cdmImageInfo.setWidth(imageInfo.getWidth());
+ cdmImageInfo.setHeight(imageInfo.getHeight());
+ cdmImageInfo.setBitPerPixel(imageInfo.getBitsPerPixel());
+ inputStream.close();
+
+ } catch (ImageReadException e) {
+ logger.error("Could not read: " + cdmImageInfo.getUri() + ". " + e.getMessage());
+ throw new IOException(e);
+ }
+
+ return this;
+ }
+
+ public MediaMedadataFileReader readMetaData() throws IOException, HttpException {
+
+ ImageMetadata mediaData = null;
+ try {
+ InputStream inputStream = UriUtils.getInputStream(cdmImageInfo.getUri());
+ mediaData = Imaging.getMetadata(inputStream, null);
+ }catch (ImageReadException e) {
+ logger.error("Could not read: " + cdmImageInfo.getUri() + ". " + e.getMessage());
+ //throw new IOException(e);
+ }
+
+ if(mediaData != null) {
+ for (ImageMetadataItem imItem : mediaData.getItems()){
+ if (imItem instanceof GenericImageMetadataItem){
+ GenericImageMetadataItem item = (GenericImageMetadataItem)imItem;
+ if ("Keywords".equals(item.getKeyword())){
+ String value = text(item);
+ String[] splits = value.split(":");
+ if (splits.length == 2){
+ //convention used e.g. for Flora of cyprus (#9137)
+ cdmImageInfo.getMetaData().put(splits[0].trim(), splits[1].trim());
+ }else{
+ cdmImageInfo.getMetaData().put(
+ item.getKeyword(),
+ CdmUtils.concat("; ", cdmImageInfo.getMetaData().get(item.getKeyword()), value)
+ );
+ }
+ }else if (item.getKeyword().contains("/")){
+ //TODO: not sure where this syntax is used originally
+ String key = item.getKeyword();
+ //key.replace("/", "");
+ int index = key.indexOf("/");
+ key = key.substring(0, index);
+ cdmImageInfo.getMetaData().put(key, text(item));
+ }else{
+ cdmImageInfo.getMetaData().put(item.getKeyword(), text(item));
+ }
+ }
+ }
+ }
+
+ return this;
+ }
+
+ /**
+ * Reads the size of the image defined by the {@link #imageUri} in bytes
+ */
+ public MediaMedadataFileReader readImageLength() throws ClientProtocolException, IOException, HttpException{
+ try {
+ long length = UriUtils.getResourceLength(cdmImageInfo.getUri(), null);
+ cdmImageInfo.setLength(length);
+ } catch (HttpException e) {
+ if (e.getMessage().equals("Could not retrieve Content-Length")){
+ InputStream inputStream = UriUtils.getInputStream(cdmImageInfo.getUri());
+ int n = 0;
+ while(inputStream.read() != -1){
+ n++;
+ }
+ inputStream.close();
+ logger.info("Content-Length not available in http header. Image size computed via input stream size: " + cdmImageInfo.getUri());
+ cdmImageInfo.setLength(n);
+ }else{
+ throw e;
+ }
+ }
+ return this;
+ }
+
+ public MediaMedadataFileReader readSuffix(){
+ String path = cdmImageInfo.getUri().getPath();
+ String suffix = path.substring(StringUtils.lastIndexOf(path, '.') + 1);
+ cdmImageInfo.setSuffix(suffix);
+ return this;
+ }
+
+ public CdmImageInfo getCdmImageInfo() {
+ return cdmImageInfo;
+ }
+
+ /**
+ * Wrapper for the Item.getText() method which applies cleaning of the text representation.
+ * <ol>
+ * <li>Strings are surrounded by single quotes, these must be removed</li>
+ * </ol>
+ * @param item
+ */
+ private String text(GenericImageMetadataItem item) {
+ String text = item.getText();
+ if(text.startsWith("'") && text.endsWith("'")) {
+ text = text.substring(1 , text.length() - 1);
+ }
+ return text;
+ }
+
+
+
+}
/**
* Defines a search and replace operation for the
* {@link MediaUriTransformation}. The search pattern is a regular expression.
- * Internally the search regex is compiled into a caches regex pattern when it
- * is requested by calling # {@link #searchPattern}.
+ * Internally the search regex is compiled into a cached regex pattern when it
+ * is requested by calling {@link #searchPattern}.
* <p>
* <b>CHANGING THIS CLASS MAY BREAK DESERIALIZATION OF EXISTING CDM PREFERENCES.</b>
*
}
/**
- *
* @return The replacement string
*/
public String getReplace() {