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
19
20
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 }