1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.logging.log4j.core.config;
19
20 import java.io.ByteArrayInputStream;
21 import java.io.ByteArrayOutputStream;
22 import java.io.File;
23 import java.io.FileInputStream;
24 import java.io.IOException;
25 import java.io.InputStream;
26 import java.net.URI;
27 import java.net.URISyntaxException;
28 import java.net.URL;
29 import java.util.Objects;
30
31
32
33
34 public class ConfigurationSource {
35
36
37
38 public static final ConfigurationSource NULL_SOURCE = new ConfigurationSource(new byte[0]);
39
40 private final File file;
41 private final URL url;
42 private final String location;
43 private final InputStream stream;
44 private final byte[] data;
45
46
47
48
49
50
51
52
53 public ConfigurationSource(final InputStream stream, final File file) {
54 this.stream = Objects.requireNonNull(stream, "stream is null");
55 this.file = Objects.requireNonNull(file, "file is null");
56 this.location = file.getAbsolutePath();
57 this.url = null;
58 this.data = null;
59 }
60
61
62
63
64
65
66
67
68 public ConfigurationSource(final InputStream stream, final URL url) {
69 this.stream = Objects.requireNonNull(stream, "stream is null");
70 this.url = Objects.requireNonNull(url, "URL is null");
71 this.location = url.toString();
72 this.file = null;
73 this.data = null;
74 }
75
76
77
78
79
80
81
82
83 public ConfigurationSource(final InputStream stream) throws IOException {
84 this(toByteArray(stream));
85 }
86
87 private ConfigurationSource(final byte[] data) {
88 this.data = Objects.requireNonNull(data, "data is null");
89 this.stream = new ByteArrayInputStream(data);
90 this.file = null;
91 this.url = null;
92 this.location = null;
93 }
94
95
96
97
98
99
100
101
102 private static byte[] toByteArray(final InputStream inputStream) throws IOException {
103 final int buffSize = Math.max(4096, inputStream.available());
104 final ByteArrayOutputStream contents = new ByteArrayOutputStream(buffSize);
105 final byte[] buff = new byte[buffSize];
106
107 int length = inputStream.read(buff);
108 while (length > 0) {
109 contents.write(buff, 0, length);
110 length = inputStream.read(buff);
111 }
112 return contents.toByteArray();
113 }
114
115
116
117
118
119
120
121 public File getFile() {
122 return file;
123 }
124
125
126
127
128
129
130
131 public URL getURL() {
132 return url;
133 }
134
135
136
137
138
139 public URI getURI() {
140 URI sourceURI = null;
141 if (url != null) {
142 try {
143 sourceURI = url.toURI();
144 } catch (final URISyntaxException ex) {
145
146 }
147 }
148 if (sourceURI == null && file != null) {
149 sourceURI = file.toURI();
150 }
151 if (sourceURI == null && location != null) {
152 try {
153 sourceURI = new URI(location);
154 } catch (final URISyntaxException ex) {
155
156 try {
157 sourceURI = new URI("file://" + location);
158 } catch (final URISyntaxException uriEx) {
159
160 }
161 }
162 }
163 return sourceURI;
164 }
165
166
167
168
169
170
171
172 public String getLocation() {
173 return location;
174 }
175
176
177
178
179
180
181 public InputStream getInputStream() {
182 return stream;
183 }
184
185
186
187
188
189
190
191 public ConfigurationSource resetInputStream() throws IOException {
192 if (file != null) {
193 return new ConfigurationSource(new FileInputStream(file), file);
194 } else if (url != null) {
195 return new ConfigurationSource(url.openStream(), url);
196 } else {
197 return new ConfigurationSource(data);
198 }
199 }
200
201 @Override
202 public String toString() {
203 if (location != null) {
204 return location;
205 }
206 if (this == NULL_SOURCE) {
207 return "NULL_SOURCE";
208 }
209 final int length = data == null ? -1 : data.length;
210 return "stream (" + length + " bytes, unknown location)";
211 }
212 }