1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 package org.bitrepository.pillar.checksumpillar.messagehandler;
26
27 import java.util.Arrays;
28
29 import org.bitrepository.bitrepositoryelements.ChecksumDataForFileTYPE;
30 import org.bitrepository.bitrepositoryelements.ResponseCode;
31 import org.bitrepository.bitrepositoryelements.ResponseInfo;
32 import org.bitrepository.bitrepositorymessages.IdentifyPillarsForPutFileRequest;
33 import org.bitrepository.bitrepositorymessages.IdentifyPillarsForPutFileResponse;
34 import org.bitrepository.bitrepositorymessages.MessageResponse;
35 import org.bitrepository.common.utils.Base16Utils;
36 import org.bitrepository.common.utils.CalendarUtils;
37 import org.bitrepository.common.utils.TimeMeasurementUtils;
38 import org.bitrepository.pillar.cache.ChecksumEntry;
39 import org.bitrepository.pillar.cache.ChecksumStore;
40 import org.bitrepository.pillar.common.MessageHandlerContext;
41 import org.bitrepository.protocol.utils.MessageUtils;
42 import org.bitrepository.service.exception.RequestHandlerException;
43 import org.slf4j.Logger;
44 import org.slf4j.LoggerFactory;
45
46
47
48
49 public class IdentifyPillarsForPutFileRequestHandler extends ChecksumPillarMessageHandler<IdentifyPillarsForPutFileRequest> {
50
51 private Logger log = LoggerFactory.getLogger(getClass());
52
53
54
55
56
57
58 public IdentifyPillarsForPutFileRequestHandler(MessageHandlerContext context, ChecksumStore refCache) {
59 super(context, refCache);
60 }
61
62 @Override
63 public Class<IdentifyPillarsForPutFileRequest> getRequestClass() {
64 return IdentifyPillarsForPutFileRequest.class;
65 }
66
67 @Override
68 public void processRequest(IdentifyPillarsForPutFileRequest message) throws RequestHandlerException {
69 validateCollectionID(message);
70 if (!Arrays.asList(context.getPillarCollections()).contains(message.getCollectionID())) {
71 return;
72 }
73 if(checkThatTheFileDoesNotAlreadyExist(message)) {
74 respondDuplicateFile(message);
75 } else {
76 respondSuccesfullIdentification(message);
77 }
78
79 }
80
81 @Override
82 public MessageResponse generateFailedResponse(IdentifyPillarsForPutFileRequest message) {
83 return createFinalResponse(message);
84 }
85
86
87
88
89
90
91
92 private boolean checkThatTheFileDoesNotAlreadyExist(IdentifyPillarsForPutFileRequest message)
93 throws RequestHandlerException {
94 if(message.getFileID() == null) {
95 return false;
96 }
97
98 return getCache().hasFile(message.getFileID(), message.getCollectionID());
99 }
100
101
102
103
104
105 protected void respondDuplicateFile(IdentifyPillarsForPutFileRequest message) {
106 log.debug("Creating DuplicateFile response for " + MessageUtils.createMessageIdentifier(message));
107 IdentifyPillarsForPutFileResponse response = createFinalResponse(message);
108
109 ChecksumEntry entry = getCache().getEntry(message.getFileID(), message.getCollectionID());
110 ChecksumDataForFileTYPE checksumData = new ChecksumDataForFileTYPE();
111 checksumData.setCalculationTimestamp(CalendarUtils.getXmlGregorianCalendar(entry.getCalculationDate()));
112 checksumData.setChecksumSpec(getChecksumType());
113 checksumData.setChecksumValue(Base16Utils.encodeBase16(entry.getChecksum()));
114 response.setChecksumDataForExistingFile(checksumData);
115
116 ResponseInfo irInfo = new ResponseInfo();
117 irInfo.setResponseCode(ResponseCode.DUPLICATE_FILE_FAILURE);
118 response.setResponseInfo(irInfo);
119
120 getContext().getResponseDispatcher().dispatchResponse(response, message);
121 }
122
123
124
125
126
127 protected void respondSuccesfullIdentification(IdentifyPillarsForPutFileRequest request) {
128 IdentifyPillarsForPutFileResponse response = createFinalResponse(request);
129 response.setTimeToDeliver(TimeMeasurementUtils.getTimeMeasurementFromMiliseconds(
130 getSettings().getReferenceSettings().getPillarSettings().getTimeToStartDeliver()));
131
132 ResponseInfo irInfo = new ResponseInfo();
133 irInfo.setResponseCode(ResponseCode.IDENTIFICATION_POSITIVE);
134 irInfo.setResponseText(RESPONSE_FOR_POSITIVE_IDENTIFICATION);
135 response.setResponseInfo(irInfo);
136
137 getContext().getResponseDispatcher().dispatchResponse(response, request);
138 }
139
140
141
142
143
144
145
146
147
148
149
150
151 private IdentifyPillarsForPutFileResponse createFinalResponse(IdentifyPillarsForPutFileRequest msg) {
152 IdentifyPillarsForPutFileResponse res
153 = new IdentifyPillarsForPutFileResponse();
154 res.setPillarID(getSettings().getReferenceSettings().getPillarSettings().getPillarID());
155 res.setPillarChecksumSpec(getChecksumType());
156 return res;
157 }
158 }