Project

General

Profile

Download (7.77 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.HashSet;
13
import java.util.List;
14
import java.util.Map;
15
import java.util.Set;
16

    
17
import org.apache.log4j.Logger;
18
import org.springframework.beans.factory.annotation.Autowired;
19
import org.springframework.stereotype.Component;
20

    
21
import com.fasterxml.jackson.core.JsonProcessingException;
22
import com.fasterxml.jackson.databind.JsonMappingException;
23
import com.fasterxml.jackson.databind.ObjectMapper;
24
import com.fasterxml.jackson.databind.type.CollectionType;
25

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

    
40
/**
41
 * Utility service which creates volatile objects which must not be persisted.
42
 * <p>
43
 * By now this class provides methods for filtering {@link Media} and {@link MediaRepresentation}s
44
 * <p>
45
 * See also {@link MediaUriTransformationProcessor} and {@link MediaUriTransformation}
46
 *
47
 * @author a.kohlbecker
48
 * @since Jul 8, 2020
49
 */
50
@Component // not used for component scan, see eu.etaxonomy.cdm.remote.config.CdmRemoteConfiguration
51
public class MediaToolbox implements IMediaToolbox {
52

    
53
    private static final Logger logger = Logger.getLogger(MediaToolbox.class);
54

    
55
    private List<MediaUriTransformation> transformations = null;
56

    
57
    private Integer mediaRepresentationTransformationsLastHash = null;
58

    
59
    @Autowired
60
    private IPreferenceService preferenceService;
61

    
62
    @Override
63
    public List<Media> processAndFilterPreferredMediaRepresentations(Class<? extends MediaRepresentationPart> type, String[] mimeTypes,
64
            Integer widthOrDuration, Integer height, Integer size, List<Media> mediaList) {
65

    
66
        MediaUriTransformationProcessor mediaTransformationProcessor = new MediaUriTransformationProcessor();
67
        mediaTransformationProcessor.addAll(readTransformations());
68

    
69
        for(Media media : mediaList) {
70
            List<MediaRepresentation> newReprs = new ArrayList<>();
71
            for(MediaRepresentation repr : media.getRepresentations()) {
72
                for(MediaRepresentationPart part : repr.getParts()) {
73
                    newReprs.addAll(mediaTransformationProcessor.makeNewMediaRepresentationsFor(part));
74
                }
75
            }
76
            for(MediaRepresentation r : newReprs) {
77
                media.addRepresentation(r);
78
            }
79
        }
80
        return filterPreferredMediaRepresentations(mediaList, type, mimeTypes, widthOrDuration, height, size);
81
    }
82

    
83
    @Override
84
    public MediaRepresentation processAndFindBestMatchingRepresentation(Media media,
85
            Class<? extends MediaRepresentationPart> type, Integer size, Integer height, Integer widthOrDuration,
86
            String[] mimeTypes, MissingValueStrategy missingValStrategy) {
87

    
88
        MediaUriTransformationProcessor mediaTransformationProcessor = new MediaUriTransformationProcessor();
89
        mediaTransformationProcessor.addAll(readTransformations());
90

    
91
        Set<MediaRepresentation> newReprs = new HashSet<>();
92
        for (MediaRepresentation repr : media.getRepresentations()) {
93
            for (MediaRepresentationPart part : repr.getParts()) {
94
                newReprs.addAll(mediaTransformationProcessor.makeNewMediaRepresentationsFor(part));
95
            }
96
        }
97
        newReprs.addAll(media.getRepresentations());
98
        return MediaUtils.findBestMatchingRepresentation(newReprs, type, size, height, widthOrDuration, mimeTypes, missingValStrategy);
99
    }
100

    
101
    /**
102
     * @deprecated needs to be replaced, see https://dev.e-taxonomy.eu/redmine/issues/9160
103
     */
104
    @Override
105
    @Deprecated
106
    public List<Media> filterPreferredMediaRepresentations(List<Media> mediaList, Class<? extends MediaRepresentationPart> type,
107
            String[] mimeTypes, Integer widthOrDuration, Integer height, Integer size) {
108

    
109
        Map<Media, MediaRepresentation> mediaRepresentationMap = MediaUtils.findPreferredMedia(mediaList, type, mimeTypes, widthOrDuration, height, size, MediaUtils.MissingValueStrategy.MAX);
110

    
111
        List<Media> filteredMedia = new ArrayList<>(mediaRepresentationMap.size());
112
        for (Media media : mediaRepresentationMap.keySet()) {
113
            media.getRepresentations().clear();
114
            media.addRepresentation(mediaRepresentationMap.get(media));
115
            media.setId(0); // prevent from persisting the media entity accidentally
116
            filteredMedia.add(media);
117
        }
118
        return filteredMedia;
119
    }
120

    
121
    /**
122
     * Read the {@link MediaUriTransformation MediaUriTransformations} from the cdm preferences ({@link PreferencePredicate.MediaRepresentationTransformations}
123
     * or use the default defined in {@link DefaultMediaTransformations#digilib()}
124
     *
125
     */
126
    private List<MediaUriTransformation> readTransformations() {
127

    
128
        PrefKey key = CdmPreference.NewKey(PreferenceSubject.NewDatabaseInstance(), PreferencePredicate.MediaRepresentationTransformations);
129
        CdmPreference pref = preferenceService.find(key);
130
        if(pref != null && pref.getValue() != null) {
131
            if(mediaRepresentationTransformationsLastHash == null || mediaRepresentationTransformationsLastHash != pref.getValue().hashCode()) {
132
                // loaded value is different from last value
133
                ObjectMapper mapper = new ObjectMapper();
134
                CollectionType javaType = mapper.getTypeFactory()
135
                        .constructCollectionType(List.class, MediaUriTransformation.class);
136
                try {
137
                    transformations = mapper.readValue(pref.getValue(), javaType);
138
                    mediaRepresentationTransformationsLastHash = pref.getValue().hashCode();
139
                } catch (JsonMappingException e) {
140
                    logger.error(e);
141
                } catch (JsonProcessingException e) {
142
                    logger.error(e);
143
                }
144
            }
145
        }
146
        if(transformations == null) {
147
            transformations = DefaultMediaTransformations.digilib();
148
        }
149

    
150
        return transformations;
151
    }
152

    
153
    /**
154
     * @param trans the list of MediaUriTransformation to be serialized
155
     * @return the JSON string
156
     * @throws JsonProcessingException
157
     */
158
    static protected String transformationsToJson(List<MediaUriTransformation> trans) throws JsonProcessingException {
159

    
160
      ObjectMapper mapper = new ObjectMapper();
161
      CollectionType javaType = mapper.getTypeFactory()
162
              .constructCollectionType(List.class, MediaUriTransformation.class);
163

    
164
      String json = mapper.writerFor(javaType).withDefaultPrettyPrinter().writeValueAsString(trans);
165
      return json;
166
    }
167

    
168
    /**
169
     *
170
     * @param args
171
     * @throws JsonProcessingException
172
     */
173
    public static void main(String[] args) throws JsonProcessingException {
174

    
175
        System.out.println("Default tansformations for digilib");
176
        System.out.println("========================================");
177
        System.out.println(transformationsToJson(DefaultMediaTransformations.digilib()));
178
    }
179

    
180
}
(3-3/5)