View Javadoc

1   /*
2    * #%L
3    * bitrepository-access-client
4    * *
5    * $Id$
6    * $HeadURL$
7    * %%
8    * Copyright (C) 2010 - 2011 The State and University Library, The Royal Library and The State Archives, Denmark
9    * %%
10   * This program is free software: you can redistribute it and/or modify
11   * it under the terms of the GNU Lesser General Public License as 
12   * published by the Free Software Foundation, either version 2.1 of the 
13   * License, or (at your option) any later version.
14   * 
15   * This program is distributed in the hope that it will be useful,
16   * but WITHOUT ANY WARRANTY; without even the implied warranty of
17   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18   * GNU General Lesser Public License for more details.
19   * 
20   * You should have received a copy of the GNU General Lesser Public 
21   * License along with this program.  If not, see
22   * <http://www.gnu.org/licenses/lgpl-2.1.html>.
23   * #L%
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   * Class for handling the identification of this pillar for the purpose of performing the PutFile operation.
48   */
49  public class IdentifyPillarsForPutFileRequestHandler extends ChecksumPillarMessageHandler<IdentifyPillarsForPutFileRequest> {
50  
51      private Logger log = LoggerFactory.getLogger(getClass());
52  
53      /**
54       * Constructor.
55       * @param context The context of the message handler.
56       * @param refCache The cache for the checksum data.
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; // Irrelevant collection.
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       * Validates that the file is not already within the archive. 
89       * @param message The request with the filename to validate.
90       * @return Whether the file already exists.
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      * Method for sending a response for 'DUPLICATE_FILE_FAILURE'.
103      * @param message The request to base the response upon.
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      * Method for sending a positive response for putting this file.
125      * @param request The request to respond to.
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      * Creates a IdentifyPillarsForPutFileResponse based on a 
142      * IdentifyPillarsForPutFileRequest. The following fields are not inserted:
143      * <br/> - TimeToDeliver
144      * <br/> - AuditTrailInformation
145      * <br/> - PillarChecksumSpec
146      * <br/> - IdentifyResponseInfo
147      * 
148      * @param msg The IdentifyPillarsForPutFileRequest to base the response on.
149      * @return A IdentifyPillarsForPutFileResponse from the request.
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 }