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