1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.opensaml.util.resource;
18
19 import java.io.File;
20 import java.io.FileInputStream;
21 import java.io.FileOutputStream;
22 import java.io.IOException;
23 import java.io.InputStream;
24 import java.net.URI;
25
26 import org.apache.commons.httpclient.methods.GetMethod;
27 import org.joda.time.DateTime;
28 import org.joda.time.chrono.ISOChronology;
29 import org.opensaml.xml.util.DatatypeHelper;
30
31
32
33
34
35
36
37
38
39 public class FileBackedHttpResource extends HttpResource {
40
41
42 private File resourceFile;
43
44
45
46
47
48
49
50 public FileBackedHttpResource(String resource, String backingFile) {
51 super(resource);
52
53 if (DatatypeHelper.isEmpty(backingFile)) {
54 throw new IllegalArgumentException("Backing file path may not be null or empty");
55 }
56
57 resourceFile = new File(backingFile);
58 }
59
60
61
62
63
64
65
66
67
68 public FileBackedHttpResource(String resource, URI backingFile) {
69 super(resource);
70
71 if (backingFile == null) {
72 throw new IllegalArgumentException("Backing file path may not be null or empty");
73 }
74
75 resourceFile = new File(backingFile);
76 }
77
78
79
80
81
82
83
84
85
86
87 public FileBackedHttpResource(String resource, String backingFile, ResourceFilter resourceFilter) {
88 super(resource, resourceFilter);
89
90 if (DatatypeHelper.isEmpty(backingFile)) {
91 throw new IllegalArgumentException("Backing file path may not be null or empty");
92 }
93
94 resourceFile = new File(backingFile);
95 }
96
97
98
99
100
101
102
103
104
105
106
107 public FileBackedHttpResource(String resource, URI backingFile, ResourceFilter resourceFilter) {
108 super(resource, resourceFilter);
109
110 if (backingFile == null) {
111 throw new IllegalArgumentException("Backing file path may not be null or empty");
112 }
113
114 resourceFile = new File(backingFile);
115 }
116
117
118 public boolean exists() throws ResourceException {
119 if (!super.exists()) {
120 return resourceFile.exists();
121 }
122
123 return true;
124 }
125
126
127 public InputStream getInputStream() throws ResourceException {
128 InputStream ins = null;
129 try {
130 GetMethod getMethod = super.getResource();
131 byte[] response = getMethod.getResponseBody();
132 saveToResourceFile(response);
133 ins = getMethod.getResponseBodyAsStream();
134 } catch (Exception e) {
135 try {
136 ins = new FileInputStream(resourceFile);
137 } catch (IOException ioe) {
138 throw new ResourceException("Unable to read resource URL or backing file "
139 + resourceFile.getAbsolutePath(), ioe);
140 }
141 }
142
143 return applyFilter(ins);
144 }
145
146
147 public DateTime getLastModifiedTime() throws ResourceException {
148 try {
149 return super.getLastModifiedTime();
150 } catch (ResourceException e) {
151 long lastModifiedTime = resourceFile.lastModified();
152 if (lastModifiedTime == 0) {
153 throw new ResourceException("URL resource is not reachable and backing file is not readable");
154 }
155
156 return new DateTime(lastModifiedTime, ISOChronology.getInstanceUTC());
157 }
158 }
159
160
161 public String getLocation() {
162 return super.getLocation();
163 }
164
165
166
167
168
169
170
171
172 protected void saveToResourceFile(byte[] resource) throws ResourceException {
173 try {
174 FileOutputStream out = new FileOutputStream(resourceFile);
175 out.write(resource);
176 } catch (IOException e) {
177 throw new ResourceException("Unable to write resource to backing file " + resourceFile.getAbsolutePath(), e);
178 }
179 }
180 }