View Javadoc

1   package com.bradmcevoy.http.webdav;
2   
3   import com.bradmcevoy.http.PropPatchableResource;
4   import com.bradmcevoy.http.Resource;
5   import com.bradmcevoy.http.Response.Status;
6   import com.bradmcevoy.http.values.ValueAndType;
7   import com.bradmcevoy.http.webdav.PropPatchHandler.Field;
8   import com.bradmcevoy.http.webdav.PropPatchHandler.Fields;
9   import com.bradmcevoy.http.webdav.PropPatchRequestParser.ParseResult;
10  import java.util.ArrayList;
11  import java.util.HashMap;
12  import java.util.LinkedHashMap;
13  import java.util.List;
14  import java.util.Map.Entry;
15  import javax.xml.namespace.QName;
16  
17  /**
18   * Performs PROPPATCH updates on resources implementing PropPatchable
19   *
20   * @author brad
21   */
22  public class PropPatchableSetter implements PropPatchSetter {
23  
24      private final Helper helper;
25  
26      PropPatchableSetter( Helper helper ) {
27          this.helper = helper;
28      }
29  
30      public PropPatchableSetter() {
31          this.helper = new Helper();
32      }
33  
34      public boolean supports(Resource r) {
35          return (r instanceof PropPatchableResource);
36      }
37  
38      public PropFindResponse setProperties( String href, ParseResult parseResult, Resource r ) {
39          PropPatchableResource ppr = (PropPatchableResource) r;
40          Fields fields = helper.buildFields(parseResult);
41          ppr.setProperties( fields );
42          List<PropFindResponse> list = helper.buildResult(href, parseResult);
43          return list.get(0);
44      }
45  
46      class Helper {
47  
48          private Fields buildFields( ParseResult parseResult ) {
49              Fields fields = new Fields();
50              List<Field> removeFields = fields.removeFields;
51              for( QName p : parseResult.getFieldsToRemove()) {
52                  removeFields.add( new Field( p.getLocalPart()));
53              }
54              List<PropPatchHandler.SetField> setFields = fields.setFields;
55              for( Entry<QName, String> entry : parseResult.getFieldsToSet().entrySet()) {
56                  setFields.add( new PropPatchHandler.SetField( entry.getKey().getLocalPart(), entry.getValue()));
57              }
58              return fields;
59          }
60  
61          private List<PropFindResponse> buildResult( String href, ParseResult parseResult ) {
62              LinkedHashMap<QName,ValueAndType> knownProps = new LinkedHashMap<QName, ValueAndType>();
63              for( QName p : parseResult.getFieldsToRemove()) {
64                  knownProps.put( p, null);
65              }
66              for( Entry<QName, String> entry : parseResult.getFieldsToSet().entrySet()) {
67                  knownProps.put( entry.getKey(), null);
68              }
69              
70              PropFindResponse resp = new PropFindResponse( href, knownProps, new HashMap<Status, List<PropFindResponse.NameAndError>>());
71              List<PropFindResponse> responses = new ArrayList<PropFindResponse>();
72              responses.add( resp );
73              return responses;
74          }
75  
76      }
77  
78  }