]> source.dussan.org Git - sonarqube.git/blob - sonar-plugin-api/src/main/java/org/sonar/api/utils/UriReader.java
Decrease coupling with Guava
[sonarqube.git] / sonar-plugin-api / src / main / java / org / sonar / api / utils / UriReader.java
1 /*
2  * SonarQube
3  * Copyright (C) 2009-2017 SonarSource SA
4  * mailto:info AT sonarsource DOT com
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 3 of the License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public License
17  * along with this program; if not, write to the Free Software Foundation,
18  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
19  */
20 package org.sonar.api.utils;
21
22 import com.google.common.base.Preconditions;
23 import com.google.common.base.Throwables;
24 import com.google.common.io.Files;
25 import java.io.File;
26 import java.io.IOException;
27 import java.net.URI;
28 import java.nio.charset.Charset;
29 import java.util.Arrays;
30 import java.util.HashMap;
31 import java.util.Locale;
32 import java.util.Map;
33 import java.util.stream.Stream;
34 import org.sonar.api.batch.ScannerSide;
35 import org.sonar.api.ce.ComputeEngineSide;
36 import org.sonar.api.server.ServerSide;
37
38 /**
39  * Reads different types of URI. Supported schemes are http and file.
40  *
41  * @since 3.2
42  */
43 @ScannerSide
44 @ServerSide
45 @ComputeEngineSide
46 public class UriReader {
47
48   private final Map<String, SchemeProcessor> processorsByScheme = new HashMap<>();
49
50   public UriReader(SchemeProcessor[] processors) {
51     Stream.concat(Stream.of(new FileProcessor()), Arrays.stream(processors)).forEach(processor -> {
52       for (String scheme : processor.getSupportedSchemes()) {
53         processorsByScheme.put(scheme.toLowerCase(Locale.ENGLISH), processor);
54       }
55     });
56   }
57
58   /**
59    * Reads all bytes from uri. It throws an unchecked exception if an error occurs.
60    */
61   public byte[] readBytes(URI uri) {
62     return searchForSupportedProcessor(uri).readBytes(uri);
63   }
64
65   /**
66    * Reads all characters from uri, using the given character set.
67    * It throws an unchecked exception if an error occurs.
68    */
69   public String readString(URI uri, Charset charset) {
70     return searchForSupportedProcessor(uri).readString(uri, charset);
71   }
72
73   /**
74    * Returns a detailed description of the given uri. For example HTTP URIs are completed
75    * with the configured HTTP proxy.
76    */
77   public String description(URI uri) {
78     SchemeProcessor reader = searchForSupportedProcessor(uri);
79
80     return reader.description(uri);
81   }
82
83   SchemeProcessor searchForSupportedProcessor(URI uri) {
84     SchemeProcessor processor = processorsByScheme.get(uri.getScheme().toLowerCase(Locale.ENGLISH));
85     Preconditions.checkArgument(processor != null, "URI schema is not supported: " + uri.getScheme());
86     return processor;
87   }
88
89   public abstract static class SchemeProcessor {
90     protected abstract String[] getSupportedSchemes();
91
92     protected abstract byte[] readBytes(URI uri);
93
94     protected abstract String readString(URI uri, Charset charset);
95
96     protected abstract String description(URI uri);
97   }
98
99   /**
100    * This implementation is not exposed in API and is kept private.
101    */
102   private static class FileProcessor extends SchemeProcessor {
103
104     @Override
105     public String[] getSupportedSchemes() {
106       return new String[]{"file"};
107     }
108
109     @Override
110     protected byte[] readBytes(URI uri) {
111       try {
112         return Files.toByteArray(new File(uri));
113       } catch (IOException e) {
114         throw Throwables.propagate(e);
115       }
116     }
117
118     @Override
119     protected String readString(URI uri, Charset charset) {
120       try {
121         return Files.toString(new File(uri), charset);
122       } catch (IOException e) {
123         throw Throwables.propagate(e);
124       }
125     }
126
127     @Override
128     protected String description(URI uri) {
129       return new File(uri).getAbsolutePath();
130     }
131   }
132 }