Project

General

Profile

Download (8.76 KB) Statistics
| Branch: | Tag: | Revision:
1
/**
2
* Copyright (C) 2020 EDIT
3
* European Distributed Institute of Taxonomy
4
* http://www.e-taxonomy.eu
5
*
6
* The contents of this file are subject to the Mozilla Public License Version 1.1
7
* See LICENSE.TXT at the top of this package for the full license terms.
8
*/
9
package eu.etaxonomy.cdm.remote.controller.util;
10

    
11
import java.util.ArrayList;
12
import java.util.List;
13
import java.util.Map;
14

    
15
import org.apache.log4j.Logger;
16
import org.springframework.beans.factory.annotation.Autowired;
17

    
18
import com.fasterxml.jackson.core.JsonProcessingException;
19
import com.fasterxml.jackson.databind.JsonMappingException;
20
import com.fasterxml.jackson.databind.ObjectMapper;
21
import com.fasterxml.jackson.databind.type.CollectionType;
22

    
23
import eu.etaxonomy.cdm.api.service.IPreferenceService;
24
import eu.etaxonomy.cdm.api.service.media.MediaUriTransformation;
25
import eu.etaxonomy.cdm.api.service.media.MediaUriTransformationProcessor;
26
import eu.etaxonomy.cdm.api.service.media.SearchReplace;
27
import eu.etaxonomy.cdm.model.media.Media;
28
import eu.etaxonomy.cdm.model.media.MediaRepresentation;
29
import eu.etaxonomy.cdm.model.media.MediaRepresentationPart;
30
import eu.etaxonomy.cdm.model.media.MediaUtils;
31
import eu.etaxonomy.cdm.model.media.MediaUtils.MissingValueStrategy;
32
import eu.etaxonomy.cdm.model.metadata.CdmPreference;
33
import eu.etaxonomy.cdm.model.metadata.CdmPreference.PrefKey;
34
import eu.etaxonomy.cdm.model.metadata.PreferencePredicate;
35
import eu.etaxonomy.cdm.model.metadata.PreferenceSubject;
36

    
37
/**
38
 * @author a.kohlbecker
39
 * @since Jul 8, 2020
40
 */
41
public class MediaToolbox implements IMediaToolbox {
42

    
43
    private static final String SYS_PROP_MEDIA_REPRESENTATION_TRANSFORMATIONS_RESET = "mediaRepresentationTransformationsReset";
44

    
45
    private static final Logger logger = Logger.getLogger(MediaToolbox.class);
46

    
47
    private List<MediaUriTransformation> transformations = null;
48

    
49
    private Integer mediaRepresentationTransformationsLastHash = null;
50

    
51
    @Autowired
52
    private IPreferenceService service;
53

    
54
    @Override
55
    public List<Media> processAndFilterPreferredMediaRepresentations(Class<? extends MediaRepresentationPart> type, String[] mimeTypes,
56
            Integer widthOrDuration, Integer height, Integer size, List<Media> taxonGalleryMedia) {
57

    
58
        MediaUriTransformationProcessor mediaTransformationProcessor = new MediaUriTransformationProcessor();
59
        mediaTransformationProcessor.addAll(readTransformations());
60

    
61
        for(Media media : taxonGalleryMedia) {
62
            List<MediaRepresentation> newRepr = new ArrayList<>();
63
            for(MediaRepresentation repr : media.getRepresentations()) {
64
                for(MediaRepresentationPart part : repr.getParts()) {
65
                    newRepr.addAll(mediaTransformationProcessor.makeNewMediaRepresentationsFor(part));
66
                }
67
            }
68
            media.getRepresentations().addAll(newRepr);
69
        }
70
        return filterPreferredMediaRepresentations(type, mimeTypes, widthOrDuration, height, size, taxonGalleryMedia);
71

    
72
    }
73

    
74
    @Override
75
    public MediaRepresentation processAndFindBestMatchingRepresentation(Media media,
76
            Class<? extends MediaRepresentationPart> type, Integer size, Integer height, Integer widthOrDuration,
77
            String[] mimeTypes, MissingValueStrategy missingValStrategy) {
78

    
79
        MediaUriTransformationProcessor mediaTransformationProcessor = new MediaUriTransformationProcessor();
80
        mediaTransformationProcessor.addAll(readTransformations());
81

    
82
        List<MediaRepresentation> newRepr = new ArrayList<>();
83
        for (MediaRepresentation repr : media.getRepresentations()) {
84
            for (MediaRepresentationPart part : repr.getParts()) {
85
                newRepr.addAll(mediaTransformationProcessor.makeNewMediaRepresentationsFor(part));
86
            }
87
        }
88
        media.getRepresentations().addAll(newRepr);
89

    
90
        return MediaUtils.findBestMatchingRepresentation(media, type, size, height, widthOrDuration, mimeTypes,
91
                missingValStrategy);
92

    
93
    }
94

    
95
    @Override
96
    public List<Media> filterPreferredMediaRepresentations(Class<? extends MediaRepresentationPart> type, String[] mimeTypes,
97
            Integer widthOrDuration, Integer height, Integer size, List<Media> taxonGalleryMedia) {
98

    
99

    
100
        Map<Media, MediaRepresentation> mediaRepresentationMap = MediaUtils.findPreferredMedia(taxonGalleryMedia, type, mimeTypes, widthOrDuration, height, size, MediaUtils.MissingValueStrategy.MAX);
101

    
102
        List<Media> filteredMedia = new ArrayList<>(mediaRepresentationMap.size());
103
        for (Media media : mediaRepresentationMap.keySet()) {
104
            media.getRepresentations().clear();
105
            media.addRepresentation(mediaRepresentationMap.get(media));
106
            filteredMedia.add(media);
107
        }
108
        return filteredMedia;
109
    }
110

    
111
    private List<MediaUriTransformation> readTransformations() {
112

    
113
        //System.setProperty(SYS_PROP_MEDIA_REPRESENTATION_TRANSFORMATIONS_RESET, "1");
114
        PrefKey key = CdmPreference.NewKey(PreferenceSubject.NewDatabaseInstance(), PreferencePredicate.MediaRepresentationTransformations);
115
        CdmPreference pref = service.find(key);
116
        if(pref != null && pref.getValue() != null) {
117
            if(System.getProperty(SYS_PROP_MEDIA_REPRESENTATION_TRANSFORMATIONS_RESET) == null ||mediaRepresentationTransformationsLastHash == null || mediaRepresentationTransformationsLastHash != pref.getValue().hashCode()) {
118
                // loaded value is different from last value
119
                ObjectMapper mapper = new ObjectMapper();
120
                CollectionType javaType = mapper.getTypeFactory()
121
                        .constructCollectionType(List.class, MediaUriTransformation.class);
122
                try {
123
                    transformations = mapper.readValue(pref.getValue(), javaType);
124
                    mediaRepresentationTransformationsLastHash = pref.getValue().hashCode();
125
                } catch (JsonMappingException e) {
126
                    logger.error(e);
127
                } catch (JsonProcessingException e) {
128
                    logger.error(e);
129
                }
130
            }
131
        }
132
        if(transformations == null || System.getProperty(SYS_PROP_MEDIA_REPRESENTATION_TRANSFORMATIONS_RESET) != null) {
133

    
134
            transformations = new ArrayList<>();
135
            MediaUriTransformation tr1 = new MediaUriTransformation();
136

    
137
            tr1.setPathQueryFragment(new SearchReplace("digilib/Scaler/IIIF/([^\\!]+)\\!([^\\/]+)(.*)", "digilib/Scaler/IIIF/$1!$2/full/!200,200/0/default.jpg"));
138
            tr1.setHost(new SearchReplace("pictures.bgbm.org", "pictures.bgbm.org")); // host part only used for matching, no replace!
139
            tr1.setMimeType("image/jpeg");
140
            tr1.setWidth(200);
141
            tr1.setHeight(200);
142

    
143
            MediaUriTransformation tr2 = new MediaUriTransformation();
144

    
145
            tr2.setPathQueryFragment(new SearchReplace("digilib/Scaler/IIIF/([^\\!]+)\\!([^\\/]+)(.*)", "digilib/Scaler/IIIF/$1!$2/full/!400,400/0/default.jpg"));
146
            tr2.setHost(new SearchReplace("pictures.bgbm.org", "pictures.bgbm.org")); // host part only used for matching, no replace!
147
            tr2.setMimeType("image/jpeg");
148
            tr2.setWidth(400);
149
            tr2.setHeight(400);
150

    
151

    
152
            MediaUriTransformation tr3 = new MediaUriTransformation();
153
            tr3.setPathQueryFragment(new SearchReplace("digilib/Scaler/\\?fn=([^\\\\/]+)/(\\w+)(.*)", "digilib/Scaler/IIIF/$1!$2/full/!400,400/0/default.jpg"));
154
            tr3.setHost(new SearchReplace("pictures.bgbm.org", "pictures.bgbm.org")); // host part only used for matching, no replace!
155
            tr3.setMimeType("image/jpeg");
156
            tr3.setWidth(400);
157
            tr3.setHeight(400);
158

    
159
            MediaUriTransformation tr4 = new MediaUriTransformation();
160
            tr4.setPathQueryFragment(new SearchReplace("digilib/Scaler/\\?fn=([^\\\\/]+)/(\\w+)(.*)", "digilib/Scaler/IIIF/$1!$2/full/!200,200/0/default.jpg"));
161
            tr4.setHost(new SearchReplace("pictures.bgbm.org", "pictures.bgbm.org")); // host part only used for matching, no replace!
162
            tr4.setMimeType("image/jpeg");
163
            tr4.setWidth(200);
164
            tr4.setHeight(200);
165

    
166
            transformations.add(tr1);
167
            transformations.add(tr2);
168
            transformations.add(tr3);
169
            transformations.add(tr4);
170

    
171
            ObjectMapper mapper = new ObjectMapper();
172
            CollectionType javaType = mapper.getTypeFactory()
173
                    .constructCollectionType(List.class, MediaUriTransformation.class);
174
            try {
175
                String json = mapper.writerFor(javaType).writeValueAsString(transformations);
176
                pref = CdmPreference.NewDatabaseInstance(PreferencePredicate.MediaRepresentationTransformations, json);
177
                service.set(pref);
178
            } catch (JsonProcessingException e) {
179
                logger.error(e);
180
            }
181
        }
182

    
183
        return transformations;
184
    }
185
}
(3-3/5)