EngineKey.java revision 8acb4cc63588cdf595357bb60ac1ac79d3985893
1package com.bumptech.glide.load.engine;
2
3import com.bumptech.glide.load.Encoder;
4import com.bumptech.glide.load.Key;
5import com.bumptech.glide.load.ResourceDecoder;
6import com.bumptech.glide.load.ResourceEncoder;
7import com.bumptech.glide.load.Transformation;
8import com.bumptech.glide.load.resource.transcode.ResourceTranscoder;
9
10import java.io.UnsupportedEncodingException;
11import java.nio.ByteBuffer;
12import java.security.MessageDigest;
13
14@SuppressWarnings("rawtypes")
15class EngineKey implements Key {
16    private static final String FORMAT = "UTF-8";
17
18    private final String id;
19    private final int width;
20    private final int height;
21    private final ResourceDecoder cacheDecoder;
22    private final ResourceDecoder decoder;
23    private final Transformation transformation;
24    private final ResourceEncoder encoder;
25    private final ResourceTranscoder transcoder;
26    private final Encoder sourceEncoder;
27    private String stringKey;
28    private int hashCode;
29    private OriginalEngineKey originalKey;
30
31    public EngineKey(String id, int width, int height, ResourceDecoder cacheDecoder, ResourceDecoder decoder,
32            Transformation transformation, ResourceEncoder encoder, ResourceTranscoder transcoder,
33            Encoder sourceEncoder) {
34        this.id = id;
35        this.width = width;
36        this.height = height;
37        this.cacheDecoder = cacheDecoder;
38        this.decoder = decoder;
39        this.transformation = transformation;
40        this.encoder = encoder;
41        this.transcoder = transcoder;
42        this.sourceEncoder = sourceEncoder;
43    }
44
45    public Key getOriginalKey() {
46        if (originalKey == null) {
47            originalKey = new OriginalEngineKey(id);
48        }
49        return originalKey;
50    }
51
52    @Override
53    public boolean equals(Object o) {
54        if (this == o) {
55            return true;
56        }
57        if (o == null || getClass() != o.getClass()) {
58            return false;
59        }
60
61        EngineKey engineKey = (EngineKey) o;
62
63        if (!id.equals(engineKey.id)) {
64            return false;
65        } else if (height != engineKey.height) {
66            return false;
67        } else if (width != engineKey.width) {
68            return false;
69        } else  if (!transformation.getId().equals(engineKey.transformation.getId())) {
70            return false;
71        } else if (!decoder.getId().equals(engineKey.decoder.getId())) {
72            return false;
73        } else if (!cacheDecoder.getId().equals(engineKey.cacheDecoder.getId())) {
74            return false;
75        } else if (!encoder.getId().equals(engineKey.encoder.getId())) {
76            return false;
77        } else if (!transcoder.getId().equals(engineKey.transcoder.getId())) {
78            return false;
79        } else {
80            return sourceEncoder.getId().equals(engineKey.sourceEncoder.getId());
81        }
82    }
83
84    @Override
85    public int hashCode() {
86        if (hashCode == 0) {
87            hashCode = id.hashCode();
88            hashCode = 31 * hashCode + width;
89            hashCode = 31 * hashCode + height;
90            hashCode = 31 * hashCode + cacheDecoder.getId().hashCode();
91            hashCode = 31 * hashCode + decoder.getId().hashCode();
92            hashCode = 31 * hashCode + transformation.getId().hashCode();
93            hashCode = 31 * hashCode + encoder.getId().hashCode();
94            hashCode = 31 * hashCode + transcoder.getId().hashCode();
95            hashCode = 31 * hashCode + sourceEncoder.getId().hashCode();
96        }
97        return hashCode;
98    }
99
100    @Override
101    public String toString() {
102        if (stringKey == null) {
103            stringKey = new StringBuilder()
104                .append(id)
105                .append(width)
106                .append(height)
107                .append(cacheDecoder.getId())
108                .append(decoder.getId())
109                .append(transformation.getId())
110                .append(encoder.getId())
111                .append(transcoder.getId())
112                .append(sourceEncoder)
113                .toString();
114        }
115        return stringKey;
116    }
117
118    @Override
119    public void updateDiskCacheKey(MessageDigest messageDigest) throws UnsupportedEncodingException {
120        byte[] dimensions = ByteBuffer.allocate(8)
121                .putInt(width)
122                .putInt(height)
123                .array();
124        messageDigest.update(id.getBytes(FORMAT));
125        messageDigest.update(dimensions);
126        messageDigest.update(cacheDecoder.getId().getBytes(FORMAT));
127        messageDigest.update(decoder.getId().getBytes(FORMAT));
128        messageDigest.update(transformation.getId().getBytes(FORMAT));
129        messageDigest.update(encoder.getId().getBytes(FORMAT));
130        messageDigest.update(sourceEncoder.getId().getBytes(FORMAT));
131    }
132}
133