1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 package org.eluder.coveralls.maven.plugin.source;
25
26 import org.apache.commons.io.IOUtils;
27 import org.eluder.coveralls.maven.plugin.domain.Source;
28 import org.eluder.coveralls.maven.plugin.util.Sha521DigestInputStream;
29
30 import java.io.IOException;
31 import java.io.InputStream;
32 import java.io.InputStreamReader;
33 import java.net.URI;
34 import java.nio.charset.Charset;
35 import java.security.NoSuchAlgorithmException;
36
37 public abstract class AbstractSourceLoader implements SourceLoader {
38
39 private final Charset sourceEncoding;
40 private final String directoryPrefix;
41
42 protected AbstractSourceLoader(final URI base, final URI sourceBase, final String sourceEncoding) {
43 this.sourceEncoding = Charset.forName(sourceEncoding);
44 this.directoryPrefix = base.relativize(sourceBase).toString();
45 }
46
47 @Override
48 public Source load(final String sourceFile) throws IOException {
49 InputStream stream = locate(sourceFile);
50 if (stream != null) {
51 try (Sha521DigestInputStream ds = new Sha521DigestInputStream(stream);
52 InputStreamReader reader = new InputStreamReader(ds, getSourceEncoding())) {
53 String source = IOUtils.toString(reader);
54 return new Source(getFileName(sourceFile), source, ds.getDigestHex());
55 } catch (NoSuchAlgorithmException ex) {
56 throw new IOException("Sha-512 algorithm not available", ex);
57 }
58 } else {
59 return null;
60 }
61 }
62
63 protected Charset getSourceEncoding() {
64 return sourceEncoding;
65 }
66
67 protected String getFileName(final String sourceFile) {
68 return directoryPrefix + sourceFile;
69 }
70
71 protected abstract InputStream locate(String sourceFile) throws IOException;
72 }