Project

General

Profile

« Previous | Next » 

Revision 8165e2b9

Added by Andreas Kohlbecker almost 4 years ago

ref #9134 no longer storing DefaultMediaTransformations in the db, better exception handling and more documentation

View differences:

cdmlib-remote/src/main/java/eu/etaxonomy/cdm/remote/controller/util/MediaToolbox.java
14 14

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

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

  
23 24
import eu.etaxonomy.cdm.api.service.IPreferenceService;
25
import eu.etaxonomy.cdm.api.service.media.DefaultMediaTransformations;
24 26
import eu.etaxonomy.cdm.api.service.media.MediaUriTransformation;
25 27
import eu.etaxonomy.cdm.api.service.media.MediaUriTransformationProcessor;
26
import eu.etaxonomy.cdm.api.service.media.SearchReplace;
27 28
import eu.etaxonomy.cdm.model.media.Media;
28 29
import eu.etaxonomy.cdm.model.media.MediaRepresentation;
29 30
import eu.etaxonomy.cdm.model.media.MediaRepresentationPart;
......
35 36
import eu.etaxonomy.cdm.model.metadata.PreferenceSubject;
36 37

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

  
45
    private static final String SYS_PROP_MEDIA_REPRESENTATION_TRANSFORMATIONS_RESET = "mediaRepresentationTransformationsReset";
46

  
47 51
    private static final Logger logger = Logger.getLogger(MediaToolbox.class);
48 52

  
49 53
    private List<MediaUriTransformation> transformations = null;
......
55 59

  
56 60
    @Override
57 61
    public List<Media> processAndFilterPreferredMediaRepresentations(Class<? extends MediaRepresentationPart> type, String[] mimeTypes,
58
            Integer widthOrDuration, Integer height, Integer size, List<Media> galleryMedia) {
62
            Integer widthOrDuration, Integer height, Integer size, List<Media> mediaList) {
59 63

  
60 64
        MediaUriTransformationProcessor mediaTransformationProcessor = new MediaUriTransformationProcessor();
61 65
        mediaTransformationProcessor.addAll(readTransformations());
62 66

  
63
        for(Media media : galleryMedia) {
67
        for(Media media : mediaList) {
64 68
            List<MediaRepresentation> newRepr = new ArrayList<>();
65 69
            for(MediaRepresentation repr : media.getRepresentations()) {
66 70
                for(MediaRepresentationPart part : repr.getParts()) {
......
69 73
            }
70 74
            media.getRepresentations().addAll(newRepr);
71 75
        }
72
        return filterPreferredMediaRepresentations(type, mimeTypes, widthOrDuration, height, size, galleryMedia);
76
        return filterPreferredMediaRepresentations(mediaList, type, mimeTypes, widthOrDuration, height, size);
73 77
    }
74 78

  
75 79
    @Override
......
90 94

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

  
94 97
    }
95 98

  
96 99
    @Override
97
    public List<Media> filterPreferredMediaRepresentations(Class<? extends MediaRepresentationPart> type, String[] mimeTypes,
98
            Integer widthOrDuration, Integer height, Integer size, List<Media> galleryMedia) {
100
    public List<Media> filterPreferredMediaRepresentations(List<Media> mediaList, Class<? extends MediaRepresentationPart> type,
101
            String[] mimeTypes, Integer widthOrDuration, Integer height, Integer size) {
102

  
99 103

  
100
        Map<Media, MediaRepresentation> mediaRepresentationMap = MediaUtils.findPreferredMedia(
101
                galleryMedia, type, mimeTypes, widthOrDuration, height, size, MediaUtils.MissingValueStrategy.MAX);
104
        Map<Media, MediaRepresentation> mediaRepresentationMap = MediaUtils.findPreferredMedia(mediaList, type, mimeTypes, widthOrDuration, height, size, MediaUtils.MissingValueStrategy.MAX);
102 105

  
103 106
        List<Media> filteredMedia = new ArrayList<>(mediaRepresentationMap.size());
104 107
        for (Media media : mediaRepresentationMap.keySet()) {
......
109 112
        return filteredMedia;
110 113
    }
111 114

  
115
    /**
116
     * Read the {@link MediaUriTransformation MediaUriTransformations} from the cdm preferences ({@link PreferencePredicate.MediaRepresentationTransformations}
117
     * or use the default defined in {@link DefaultMediaTransformations#digilib()}
118
     *
119
     */
112 120
    private List<MediaUriTransformation> readTransformations() {
113 121

  
114
        //System.setProperty(SYS_PROP_MEDIA_REPRESENTATION_TRANSFORMATIONS_RESET, "1");
115 122
        PrefKey key = CdmPreference.NewKey(PreferenceSubject.NewDatabaseInstance(), PreferencePredicate.MediaRepresentationTransformations);
116 123
        CdmPreference pref = preferenceService.find(key);
117 124
        if(pref != null && pref.getValue() != null) {
118
            if(System.getProperty(SYS_PROP_MEDIA_REPRESENTATION_TRANSFORMATIONS_RESET) == null
119
                    || mediaRepresentationTransformationsLastHash == null
120
                    || mediaRepresentationTransformationsLastHash != pref.getValue().hashCode()) {
125
            if(mediaRepresentationTransformationsLastHash == null || mediaRepresentationTransformationsLastHash != pref.getValue().hashCode()) {
121 126
                // loaded value is different from last value
122 127
                ObjectMapper mapper = new ObjectMapper();
123 128
                CollectionType javaType = mapper.getTypeFactory()
......
132 137
                }
133 138
            }
134 139
        }
135
        if(transformations == null || System.getProperty(SYS_PROP_MEDIA_REPRESENTATION_TRANSFORMATIONS_RESET) != null) {
136

  
137
            transformations = new ArrayList<>();
138
            MediaUriTransformation tr1 = new MediaUriTransformation();
139

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

  
146
            MediaUriTransformation tr2 = new MediaUriTransformation();
147

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

  
154

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

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

  
169
            transformations.add(tr1);
170
            transformations.add(tr2);
171
            transformations.add(tr3);
172
            transformations.add(tr4);
173

  
174
            ObjectMapper mapper = new ObjectMapper();
175
            CollectionType javaType = mapper.getTypeFactory()
176
                    .constructCollectionType(List.class, MediaUriTransformation.class);
177
            try {
178
                String json = mapper.writerFor(javaType).writeValueAsString(transformations);
179
                pref = CdmPreference.NewDatabaseInstance(PreferencePredicate.MediaRepresentationTransformations, json);
180
                preferenceService.set(pref);
181
            } catch (JsonProcessingException e) {
182
                logger.error(e);
183
            }
140
        if(transformations == null) {
141
            transformations = DefaultMediaTransformations.digilib();
184 142
        }
185 143

  
186 144
        return transformations;
187 145
    }
146

  
147
    /**
148
     * @param trans the list of MediaUriTransformation to be serialized
149
     * @return the JSON string
150
     * @throws JsonProcessingException
151
     */
152
    static protected String transformationsToJson(List<MediaUriTransformation> trans) throws JsonProcessingException {
153

  
154
      ObjectMapper mapper = new ObjectMapper();
155
      CollectionType javaType = mapper.getTypeFactory()
156
              .constructCollectionType(List.class, MediaUriTransformation.class);
157

  
158
      String json = mapper.writerFor(javaType).withDefaultPrettyPrinter().writeValueAsString(trans);
159
      return json;
160
    }
161

  
162
    /**
163
     *
164
     * @param args
165
     * @throws JsonProcessingException
166
     */
167
    public static void main(String[] args) throws JsonProcessingException {
168

  
169
        System.out.println("Default tansformations for digilib");
170
        System.out.println("========================================");
171
        System.out.println(transformationsToJson(DefaultMediaTransformations.digilib()));
172
    }
173

  
188 174
}

Also available in: Unified diff