http://git-wip-us.apache.org/repos/asf/incubator-juneau-website/blob/756ffe72/content/site/apidocs/src-html/org/apache/juneau/rest/RestServletDefault.html ---------------------------------------------------------------------- diff --git a/content/site/apidocs/src-html/org/apache/juneau/rest/RestServletDefault.html b/content/site/apidocs/src-html/org/apache/juneau/rest/RestServletDefault.html index 33f5618..1757461 100644 --- a/content/site/apidocs/src-html/org/apache/juneau/rest/RestServletDefault.html +++ b/content/site/apidocs/src-html/org/apache/juneau/rest/RestServletDefault.html @@ -196,7 +196,7 @@ <span class="sourceLineNo">188</span> @Property(name=HTMLDOC_description, value="$R{servletDescription}")<a name="line.188"></a> <span class="sourceLineNo">189</span> },<a name="line.189"></a> <span class="sourceLineNo">190</span> stylesheet="styles/juneau.css",<a name="line.190"></a> -<span class="sourceLineNo">191</span> favicon="juneau.ico",<a name="line.191"></a> +<span class="sourceLineNo">191</span> favicon="juneau.png",<a name="line.191"></a> <span class="sourceLineNo">192</span> staticFiles="{htdocs:'htdocs'}"<a name="line.192"></a> <span class="sourceLineNo">193</span>)<a name="line.193"></a> <span class="sourceLineNo">194</span>public abstract class RestServletDefault extends RestServlet {<a name="line.194"></a>
http://git-wip-us.apache.org/repos/asf/incubator-juneau-website/blob/756ffe72/content/site/apidocs/src-html/org/apache/juneau/rest/StreamResource.html ---------------------------------------------------------------------- diff --git a/content/site/apidocs/src-html/org/apache/juneau/rest/StreamResource.html b/content/site/apidocs/src-html/org/apache/juneau/rest/StreamResource.html index 68d68fe..c4099ee 100644 --- a/content/site/apidocs/src-html/org/apache/juneau/rest/StreamResource.html +++ b/content/site/apidocs/src-html/org/apache/juneau/rest/StreamResource.html @@ -30,71 +30,188 @@ <span class="sourceLineNo">022</span>/**<a name="line.22"></a> <span class="sourceLineNo">023</span> * Represents the contents of a byte stream file with convenience methods for adding HTTP response headers.<a name="line.23"></a> <span class="sourceLineNo">024</span> * <p><a name="line.24"></a> -<span class="sourceLineNo">025</span> * This class is handled special by the {@link StreamableHandler} class.<a name="line.25"></a> -<span class="sourceLineNo">026</span> */<a name="line.26"></a> -<span class="sourceLineNo">027</span>public class StreamResource implements Streamable {<a name="line.27"></a> -<span class="sourceLineNo">028</span><a name="line.28"></a> -<span class="sourceLineNo">029</span> private byte[] contents;<a name="line.29"></a> -<span class="sourceLineNo">030</span> private String mediaType;<a name="line.30"></a> -<span class="sourceLineNo">031</span> private Map<String,String> headers = new LinkedHashMap<String,String>();<a name="line.31"></a> -<span class="sourceLineNo">032</span><a name="line.32"></a> -<span class="sourceLineNo">033</span> /**<a name="line.33"></a> -<span class="sourceLineNo">034</span> * Constructor.<a name="line.34"></a> -<span class="sourceLineNo">035</span> * Create a stream resource from a byte array.<a name="line.35"></a> -<span class="sourceLineNo">036</span> *<a name="line.36"></a> -<span class="sourceLineNo">037</span> * @param contents The resource contents.<a name="line.37"></a> -<span class="sourceLineNo">038</span> * @param mediaType The resource media type.<a name="line.38"></a> -<span class="sourceLineNo">039</span> */<a name="line.39"></a> -<span class="sourceLineNo">040</span> public StreamResource(byte[] contents, String mediaType) {<a name="line.40"></a> -<span class="sourceLineNo">041</span> this.contents = contents;<a name="line.41"></a> -<span class="sourceLineNo">042</span> this.mediaType = mediaType;<a name="line.42"></a> -<span class="sourceLineNo">043</span> }<a name="line.43"></a> -<span class="sourceLineNo">044</span><a name="line.44"></a> -<span class="sourceLineNo">045</span> /**<a name="line.45"></a> -<span class="sourceLineNo">046</span> * Constructor.<a name="line.46"></a> -<span class="sourceLineNo">047</span> * Create a stream resource from an <code>InputStream</code>.<a name="line.47"></a> -<span class="sourceLineNo">048</span> * Contents of stream will be loaded into a reusable byte array.<a name="line.48"></a> -<span class="sourceLineNo">049</span> *<a name="line.49"></a> -<span class="sourceLineNo">050</span> * @param contents The resource contents.<a name="line.50"></a> -<span class="sourceLineNo">051</span> * @param mediaType The resource media type.<a name="line.51"></a> -<span class="sourceLineNo">052</span> * @throws IOException<a name="line.52"></a> -<span class="sourceLineNo">053</span> */<a name="line.53"></a> -<span class="sourceLineNo">054</span> public StreamResource(InputStream contents, String mediaType) throws IOException {<a name="line.54"></a> -<span class="sourceLineNo">055</span> this.contents = IOUtils.readBytes(contents, 1024);<a name="line.55"></a> -<span class="sourceLineNo">056</span> this.mediaType = mediaType;<a name="line.56"></a> -<span class="sourceLineNo">057</span> }<a name="line.57"></a> -<span class="sourceLineNo">058</span><a name="line.58"></a> -<span class="sourceLineNo">059</span> /**<a name="line.59"></a> -<span class="sourceLineNo">060</span> * Add an HTTP response header.<a name="line.60"></a> -<span class="sourceLineNo">061</span> *<a name="line.61"></a> -<span class="sourceLineNo">062</span> * @param name The header name.<a name="line.62"></a> -<span class="sourceLineNo">063</span> * @param value The header value, converted to a string using {@link Object#toString()}.<a name="line.63"></a> -<span class="sourceLineNo">064</span> * @return This object (for method chaining).<a name="line.64"></a> -<span class="sourceLineNo">065</span> */<a name="line.65"></a> -<span class="sourceLineNo">066</span> public StreamResource setHeader(String name, Object value) {<a name="line.66"></a> -<span class="sourceLineNo">067</span> headers.put(name, value == null ? "" : value.toString());<a name="line.67"></a> -<span class="sourceLineNo">068</span> return this;<a name="line.68"></a> -<span class="sourceLineNo">069</span> }<a name="line.69"></a> -<span class="sourceLineNo">070</span><a name="line.70"></a> -<span class="sourceLineNo">071</span> /**<a name="line.71"></a> -<span class="sourceLineNo">072</span> * Get the HTTP response headers.<a name="line.72"></a> -<span class="sourceLineNo">073</span> *<a name="line.73"></a> -<span class="sourceLineNo">074</span> * @return The HTTP response headers. Never <jk>null</jk>.<a name="line.74"></a> -<span class="sourceLineNo">075</span> */<a name="line.75"></a> -<span class="sourceLineNo">076</span> public Map<String,String> getHeaders() {<a name="line.76"></a> -<span class="sourceLineNo">077</span> return headers;<a name="line.77"></a> -<span class="sourceLineNo">078</span> }<a name="line.78"></a> -<span class="sourceLineNo">079</span><a name="line.79"></a> -<span class="sourceLineNo">080</span> @Override /* Streamable */<a name="line.80"></a> -<span class="sourceLineNo">081</span> public void streamTo(OutputStream os) throws IOException {<a name="line.81"></a> -<span class="sourceLineNo">082</span> os.write(contents);<a name="line.82"></a> -<span class="sourceLineNo">083</span> }<a name="line.83"></a> -<span class="sourceLineNo">084</span><a name="line.84"></a> -<span class="sourceLineNo">085</span> @Override /* Streamable */<a name="line.85"></a> -<span class="sourceLineNo">086</span> public String getMediaType() {<a name="line.86"></a> -<span class="sourceLineNo">087</span> return mediaType;<a name="line.87"></a> -<span class="sourceLineNo">088</span> }<a name="line.88"></a> -<span class="sourceLineNo">089</span>}<a name="line.89"></a> +<span class="sourceLineNo">025</span> * The purpose of this class is to maintain an in-memory reusable byte array of a streamed resource for<a name="line.25"></a> +<span class="sourceLineNo">026</span> * the fastest possible streaming.<a name="line.26"></a> +<span class="sourceLineNo">027</span> * Therefore, this object is designed to be reused and thread-safe.<a name="line.27"></a> +<span class="sourceLineNo">028</span> * <p><a name="line.28"></a> +<span class="sourceLineNo">029</span> * This class is handled special by the {@link StreamableHandler} class.<a name="line.29"></a> +<span class="sourceLineNo">030</span> * This allows these objects to be returned as responses by REST methods.<a name="line.30"></a> +<span class="sourceLineNo">031</span> */<a name="line.31"></a> +<span class="sourceLineNo">032</span>public class StreamResource implements Streamable {<a name="line.32"></a> +<span class="sourceLineNo">033</span><a name="line.33"></a> +<span class="sourceLineNo">034</span> private final MediaType mediaType;<a name="line.34"></a> +<span class="sourceLineNo">035</span> private final byte[][] contents;<a name="line.35"></a> +<span class="sourceLineNo">036</span> private final Map<String,String> headers;<a name="line.36"></a> +<span class="sourceLineNo">037</span><a name="line.37"></a> +<span class="sourceLineNo">038</span> /**<a name="line.38"></a> +<span class="sourceLineNo">039</span> * Constructor.<a name="line.39"></a> +<span class="sourceLineNo">040</span> * @param mediaType The resource media type.<a name="line.40"></a> +<span class="sourceLineNo">041</span> * @param contents The resource contents.<a name="line.41"></a> +<span class="sourceLineNo">042</span> * <br>If multiple contents are specified, the results will be concatenated.<a name="line.42"></a> +<span class="sourceLineNo">043</span> * <br>Contents can be any of the following:<a name="line.43"></a> +<span class="sourceLineNo">044</span> * <ul><a name="line.44"></a> +<span class="sourceLineNo">045</span> * <li><code><jk>byte</jk>[]</code><a name="line.45"></a> +<span class="sourceLineNo">046</span> * <li><code>InputStream</code><a name="line.46"></a> +<span class="sourceLineNo">047</span> * <li><code>Reader</code> - Converted to UTF-8 bytes.<a name="line.47"></a> +<span class="sourceLineNo">048</span> * <li><code>File</code><a name="line.48"></a> +<span class="sourceLineNo">049</span> * <li><code>CharSequence</code> - Converted to UTF-8 bytes.<a name="line.49"></a> +<span class="sourceLineNo">050</span> * </ul><a name="line.50"></a> +<span class="sourceLineNo">051</span> * @throws IOException<a name="line.51"></a> +<span class="sourceLineNo">052</span> */<a name="line.52"></a> +<span class="sourceLineNo">053</span> public StreamResource(MediaType mediaType, Object...contents) throws IOException {<a name="line.53"></a> +<span class="sourceLineNo">054</span> this(mediaType, null, contents);<a name="line.54"></a> +<span class="sourceLineNo">055</span> }<a name="line.55"></a> +<span class="sourceLineNo">056</span><a name="line.56"></a> +<span class="sourceLineNo">057</span> /**<a name="line.57"></a> +<span class="sourceLineNo">058</span> * Constructor.<a name="line.58"></a> +<span class="sourceLineNo">059</span> * @param mediaType The resource media type.<a name="line.59"></a> +<span class="sourceLineNo">060</span> * @param headers The HTTP response headers for this streamed resource.<a name="line.60"></a> +<span class="sourceLineNo">061</span> * @param contents The resource contents.<a name="line.61"></a> +<span class="sourceLineNo">062</span> * <br>If multiple contents are specified, the results will be concatenated.<a name="line.62"></a> +<span class="sourceLineNo">063</span> * <br>Contents can be any of the following:<a name="line.63"></a> +<span class="sourceLineNo">064</span> * <ul><a name="line.64"></a> +<span class="sourceLineNo">065</span> * <li><code><jk>byte</jk>[]</code><a name="line.65"></a> +<span class="sourceLineNo">066</span> * <li><code>InputStream</code><a name="line.66"></a> +<span class="sourceLineNo">067</span> * <li><code>Reader</code> - Converted to UTF-8 bytes.<a name="line.67"></a> +<span class="sourceLineNo">068</span> * <li><code>File</code><a name="line.68"></a> +<span class="sourceLineNo">069</span> * <li><code>CharSequence</code> - Converted to UTF-8 bytes.<a name="line.69"></a> +<span class="sourceLineNo">070</span> * </ul><a name="line.70"></a> +<span class="sourceLineNo">071</span> * @throws IOException<a name="line.71"></a> +<span class="sourceLineNo">072</span> */<a name="line.72"></a> +<span class="sourceLineNo">073</span> public StreamResource(MediaType mediaType, Map<String,Object> headers, Object...contents) throws IOException {<a name="line.73"></a> +<span class="sourceLineNo">074</span> this.mediaType = mediaType;<a name="line.74"></a> +<span class="sourceLineNo">075</span><a name="line.75"></a> +<span class="sourceLineNo">076</span> Map<String,String> m = new LinkedHashMap<String,String>();<a name="line.76"></a> +<span class="sourceLineNo">077</span> if (headers != null)<a name="line.77"></a> +<span class="sourceLineNo">078</span> for (Map.Entry<String,Object> e : headers.entrySet())<a name="line.78"></a> +<span class="sourceLineNo">079</span> m.put(e.getKey(), StringUtils.toString(e.getValue()));<a name="line.79"></a> +<span class="sourceLineNo">080</span> this.headers = Collections.unmodifiableMap(m);<a name="line.80"></a> +<span class="sourceLineNo">081</span><a name="line.81"></a> +<span class="sourceLineNo">082</span> this.contents = new byte[contents.length][];<a name="line.82"></a> +<span class="sourceLineNo">083</span> for (int i = 0; i < contents.length; i++) {<a name="line.83"></a> +<span class="sourceLineNo">084</span> Object c = contents[i];<a name="line.84"></a> +<span class="sourceLineNo">085</span> if (c == null)<a name="line.85"></a> +<span class="sourceLineNo">086</span> this.contents[i] = new byte[0];<a name="line.86"></a> +<span class="sourceLineNo">087</span> else if (c instanceof byte[])<a name="line.87"></a> +<span class="sourceLineNo">088</span> this.contents[i] = (byte[])c;<a name="line.88"></a> +<span class="sourceLineNo">089</span> else if (c instanceof InputStream)<a name="line.89"></a> +<span class="sourceLineNo">090</span> this.contents[i] = IOUtils.readBytes((InputStream)c, 1024);<a name="line.90"></a> +<span class="sourceLineNo">091</span> else if (c instanceof File)<a name="line.91"></a> +<span class="sourceLineNo">092</span> this.contents[i] = IOUtils.readBytes((File)c);<a name="line.92"></a> +<span class="sourceLineNo">093</span> else if (c instanceof Reader)<a name="line.93"></a> +<span class="sourceLineNo">094</span> this.contents[i] = IOUtils.read((Reader)c).getBytes(IOUtils.UTF8);<a name="line.94"></a> +<span class="sourceLineNo">095</span> else if (c instanceof CharSequence)<a name="line.95"></a> +<span class="sourceLineNo">096</span> this.contents[i] = ((CharSequence)c).toString().getBytes(IOUtils.UTF8);<a name="line.96"></a> +<span class="sourceLineNo">097</span> else<a name="line.97"></a> +<span class="sourceLineNo">098</span> throw new IOException("Invalid class type passed to StreamResource: " + c.getClass().getName());<a name="line.98"></a> +<span class="sourceLineNo">099</span> }<a name="line.99"></a> +<span class="sourceLineNo">100</span> }<a name="line.100"></a> +<span class="sourceLineNo">101</span><a name="line.101"></a> +<span class="sourceLineNo">102</span> /**<a name="line.102"></a> +<span class="sourceLineNo">103</span> * Builder class for constructing {@link StreamResource} objects.<a name="line.103"></a> +<span class="sourceLineNo">104</span> */<a name="line.104"></a> +<span class="sourceLineNo">105</span> @SuppressWarnings("hiding")<a name="line.105"></a> +<span class="sourceLineNo">106</span> public static class Builder {<a name="line.106"></a> +<span class="sourceLineNo">107</span> ArrayList<Object> contents = new ArrayList<Object>();<a name="line.107"></a> +<span class="sourceLineNo">108</span> MediaType mediaType;<a name="line.108"></a> +<span class="sourceLineNo">109</span> Map<String,String> headers = new LinkedHashMap<String,String>();<a name="line.109"></a> +<span class="sourceLineNo">110</span><a name="line.110"></a> +<span class="sourceLineNo">111</span> /**<a name="line.111"></a> +<span class="sourceLineNo">112</span> * Specifies the resource media type string.<a name="line.112"></a> +<span class="sourceLineNo">113</span> * @param mediaType The resource media type string.<a name="line.113"></a> +<span class="sourceLineNo">114</span> * @return This object (for method chaining).<a name="line.114"></a> +<span class="sourceLineNo">115</span> */<a name="line.115"></a> +<span class="sourceLineNo">116</span> public Builder mediaType(String mediaType) {<a name="line.116"></a> +<span class="sourceLineNo">117</span> this.mediaType = MediaType.forString(mediaType);<a name="line.117"></a> +<span class="sourceLineNo">118</span> return this;<a name="line.118"></a> +<span class="sourceLineNo">119</span> }<a name="line.119"></a> +<span class="sourceLineNo">120</span><a name="line.120"></a> +<span class="sourceLineNo">121</span> /**<a name="line.121"></a> +<span class="sourceLineNo">122</span> * Specifies the resource media type string.<a name="line.122"></a> +<span class="sourceLineNo">123</span> * @param mediaType The resource media type string.<a name="line.123"></a> +<span class="sourceLineNo">124</span> * @return This object (for method chaining).<a name="line.124"></a> +<span class="sourceLineNo">125</span> */<a name="line.125"></a> +<span class="sourceLineNo">126</span> public Builder mediaType(MediaType mediaType) {<a name="line.126"></a> +<span class="sourceLineNo">127</span> this.mediaType = mediaType;<a name="line.127"></a> +<span class="sourceLineNo">128</span> return this;<a name="line.128"></a> +<span class="sourceLineNo">129</span> }<a name="line.129"></a> +<span class="sourceLineNo">130</span><a name="line.130"></a> +<span class="sourceLineNo">131</span> /**<a name="line.131"></a> +<span class="sourceLineNo">132</span> * Specifies the contents for this resource.<a name="line.132"></a> +<span class="sourceLineNo">133</span> * <p><a name="line.133"></a> +<span class="sourceLineNo">134</span> * This method can be called multiple times to add more content.<a name="line.134"></a> +<span class="sourceLineNo">135</span> *<a name="line.135"></a> +<span class="sourceLineNo">136</span> * @param contents The resource contents.<a name="line.136"></a> +<span class="sourceLineNo">137</span> * <br>If multiple contents are specified, the results will be concatenated.<a name="line.137"></a> +<span class="sourceLineNo">138</span> * <br>Contents can be any of the following:<a name="line.138"></a> +<span class="sourceLineNo">139</span> * <ul><a name="line.139"></a> +<span class="sourceLineNo">140</span> * <li><code><jk>byte</jk>[]</code><a name="line.140"></a> +<span class="sourceLineNo">141</span> * <li><code>InputStream</code><a name="line.141"></a> +<span class="sourceLineNo">142</span> * <li><code>Reader</code> - Converted to UTF-8 bytes.<a name="line.142"></a> +<span class="sourceLineNo">143</span> * <li><code>File</code><a name="line.143"></a> +<span class="sourceLineNo">144</span> * <li><code>CharSequence</code> - Converted to UTF-8 bytes.<a name="line.144"></a> +<span class="sourceLineNo">145</span> * </ul><a name="line.145"></a> +<span class="sourceLineNo">146</span> * @return This object (for method chaining).<a name="line.146"></a> +<span class="sourceLineNo">147</span> */<a name="line.147"></a> +<span class="sourceLineNo">148</span> public Builder contents(Object...contents) {<a name="line.148"></a> +<span class="sourceLineNo">149</span> this.contents.addAll(Arrays.asList(contents));<a name="line.149"></a> +<span class="sourceLineNo">150</span> return this;<a name="line.150"></a> +<span class="sourceLineNo">151</span> }<a name="line.151"></a> +<span class="sourceLineNo">152</span><a name="line.152"></a> +<span class="sourceLineNo">153</span> /**<a name="line.153"></a> +<span class="sourceLineNo">154</span> * Specifies an HTTP response header value.<a name="line.154"></a> +<span class="sourceLineNo">155</span> *<a name="line.155"></a> +<span class="sourceLineNo">156</span> * @param name The HTTP header name.<a name="line.156"></a> +<span class="sourceLineNo">157</span> * @param value The HTTP header value. Will be converted to a <code>String</code> using {@link Object#toString()}.<a name="line.157"></a> +<span class="sourceLineNo">158</span> * @return This object (for method chaining).<a name="line.158"></a> +<span class="sourceLineNo">159</span> */<a name="line.159"></a> +<span class="sourceLineNo">160</span> public Builder header(String name, Object value) {<a name="line.160"></a> +<span class="sourceLineNo">161</span> this.headers.put(name, StringUtils.toString(value));<a name="line.161"></a> +<span class="sourceLineNo">162</span> return this;<a name="line.162"></a> +<span class="sourceLineNo">163</span> }<a name="line.163"></a> +<span class="sourceLineNo">164</span><a name="line.164"></a> +<span class="sourceLineNo">165</span> /**<a name="line.165"></a> +<span class="sourceLineNo">166</span> * Specifies HTTP response header values.<a name="line.166"></a> +<span class="sourceLineNo">167</span> *<a name="line.167"></a> +<span class="sourceLineNo">168</span> * @param headers The HTTP headers. Values will be converted to <code>Strings</code> using {@link Object#toString()}.<a name="line.168"></a> +<span class="sourceLineNo">169</span> * @return This object (for method chaining).<a name="line.169"></a> +<span class="sourceLineNo">170</span> */<a name="line.170"></a> +<span class="sourceLineNo">171</span> public Builder headers(Map<String,Object> headers) {<a name="line.171"></a> +<span class="sourceLineNo">172</span> for (Map.Entry<String,Object> e : headers.entrySet())<a name="line.172"></a> +<span class="sourceLineNo">173</span> header(e.getKey(), e.getValue());<a name="line.173"></a> +<span class="sourceLineNo">174</span> return this;<a name="line.174"></a> +<span class="sourceLineNo">175</span> }<a name="line.175"></a> +<span class="sourceLineNo">176</span><a name="line.176"></a> +<span class="sourceLineNo">177</span> /**<a name="line.177"></a> +<span class="sourceLineNo">178</span> * Create a new {@link StreamResource} using values in this builder.<a name="line.178"></a> +<span class="sourceLineNo">179</span> *<a name="line.179"></a> +<span class="sourceLineNo">180</span> * @return A new immutable {@link StreamResource} object.<a name="line.180"></a> +<span class="sourceLineNo">181</span> * @throws IOException<a name="line.181"></a> +<span class="sourceLineNo">182</span> */<a name="line.182"></a> +<span class="sourceLineNo">183</span> public StreamResource build() throws IOException {<a name="line.183"></a> +<span class="sourceLineNo">184</span> return new StreamResource(mediaType, headers, contents.toArray());<a name="line.184"></a> +<span class="sourceLineNo">185</span> }<a name="line.185"></a> +<span class="sourceLineNo">186</span> }<a name="line.186"></a> +<span class="sourceLineNo">187</span><a name="line.187"></a> +<span class="sourceLineNo">188</span> /**<a name="line.188"></a> +<span class="sourceLineNo">189</span> * Get the HTTP response headers.<a name="line.189"></a> +<span class="sourceLineNo">190</span> * @return The HTTP response headers. An unmodifiable map. Never <jk>null</jk>.<a name="line.190"></a> +<span class="sourceLineNo">191</span> */<a name="line.191"></a> +<span class="sourceLineNo">192</span> public Map<String,String> getHeaders() {<a name="line.192"></a> +<span class="sourceLineNo">193</span> return headers;<a name="line.193"></a> +<span class="sourceLineNo">194</span> }<a name="line.194"></a> +<span class="sourceLineNo">195</span><a name="line.195"></a> +<span class="sourceLineNo">196</span> @Override /* Streamable */<a name="line.196"></a> +<span class="sourceLineNo">197</span> public void streamTo(OutputStream os) throws IOException {<a name="line.197"></a> +<span class="sourceLineNo">198</span> for (byte[] b : contents)<a name="line.198"></a> +<span class="sourceLineNo">199</span> os.write(b);<a name="line.199"></a> +<span class="sourceLineNo">200</span> }<a name="line.200"></a> +<span class="sourceLineNo">201</span><a name="line.201"></a> +<span class="sourceLineNo">202</span> @Override /* Streamable */<a name="line.202"></a> +<span class="sourceLineNo">203</span> public MediaType getMediaType() {<a name="line.203"></a> +<span class="sourceLineNo">204</span> return mediaType;<a name="line.204"></a> +<span class="sourceLineNo">205</span> }<a name="line.205"></a> +<span class="sourceLineNo">206</span>}<a name="line.206"></a> http://git-wip-us.apache.org/repos/asf/incubator-juneau-website/blob/756ffe72/content/site/apidocs/src-html/org/apache/juneau/rest/UrlPathPattern.html ---------------------------------------------------------------------- diff --git a/content/site/apidocs/src-html/org/apache/juneau/rest/UrlPathPattern.html b/content/site/apidocs/src-html/org/apache/juneau/rest/UrlPathPattern.html index 1a76051..6d5735c 100644 --- a/content/site/apidocs/src-html/org/apache/juneau/rest/UrlPathPattern.html +++ b/content/site/apidocs/src-html/org/apache/juneau/rest/UrlPathPattern.html @@ -34,137 +34,167 @@ <span class="sourceLineNo">026</span> * Handles aspects of matching and precedence ordering.<a name="line.26"></a> <span class="sourceLineNo">027</span> */<a name="line.27"></a> <span class="sourceLineNo">028</span>public final class UrlPathPattern implements Comparable<UrlPathPattern> {<a name="line.28"></a> -<span class="sourceLineNo">029</span> private Pattern pattern;<a name="line.29"></a> -<span class="sourceLineNo">030</span> String patternString;<a name="line.30"></a> -<span class="sourceLineNo">031</span> private boolean isOnlyDotAll, isDotAll;<a name="line.31"></a> -<span class="sourceLineNo">032</span> String[] vars = new String[0];<a name="line.32"></a> -<span class="sourceLineNo">033</span><a name="line.33"></a> -<span class="sourceLineNo">034</span> /**<a name="line.34"></a> -<span class="sourceLineNo">035</span> * Constructor.<a name="line.35"></a> -<span class="sourceLineNo">036</span> *<a name="line.36"></a> -<span class="sourceLineNo">037</span> * @param patternString The raw pattern string from the {@link RestMethod#path()} annotation.<a name="line.37"></a> -<span class="sourceLineNo">038</span> */<a name="line.38"></a> -<span class="sourceLineNo">039</span> public UrlPathPattern(String patternString) {<a name="line.39"></a> -<span class="sourceLineNo">040</span> this.patternString = patternString;<a name="line.40"></a> -<span class="sourceLineNo">041</span> if (! StringUtils.startsWith(patternString, '/'))<a name="line.41"></a> -<span class="sourceLineNo">042</span> patternString = '/' + patternString;<a name="line.42"></a> -<span class="sourceLineNo">043</span> if (patternString.equals("/*")) {<a name="line.43"></a> -<span class="sourceLineNo">044</span> isOnlyDotAll = true;<a name="line.44"></a> -<span class="sourceLineNo">045</span> return;<a name="line.45"></a> -<span class="sourceLineNo">046</span> }<a name="line.46"></a> -<span class="sourceLineNo">047</span> if (patternString.endsWith("/*"))<a name="line.47"></a> -<span class="sourceLineNo">048</span> isDotAll = true;<a name="line.48"></a> -<span class="sourceLineNo">049</span><a name="line.49"></a> -<span class="sourceLineNo">050</span> // Find all {xxx} variables.<a name="line.50"></a> -<span class="sourceLineNo">051</span> Pattern p = Pattern.compile("\\{([^\\}]+)\\}");<a name="line.51"></a> -<span class="sourceLineNo">052</span> List<String> vl = new LinkedList<String>();<a name="line.52"></a> -<span class="sourceLineNo">053</span> Matcher m = p.matcher(patternString);<a name="line.53"></a> -<span class="sourceLineNo">054</span> while (m.find())<a name="line.54"></a> -<span class="sourceLineNo">055</span> vl.add(m.group(1));<a name="line.55"></a> -<span class="sourceLineNo">056</span> this.vars = vl.toArray(new String[vl.size()]);<a name="line.56"></a> -<span class="sourceLineNo">057</span><a name="line.57"></a> -<span class="sourceLineNo">058</span> patternString = patternString.replaceAll("\\{[^\\}]+\\}", "([^\\/]+)");<a name="line.58"></a> -<span class="sourceLineNo">059</span> patternString = patternString.replaceAll("\\/\\*$", "((?:)|(?:\\/.*))");<a name="line.59"></a> -<span class="sourceLineNo">060</span> pattern = Pattern.compile(patternString);<a name="line.60"></a> -<span class="sourceLineNo">061</span> }<a name="line.61"></a> -<span class="sourceLineNo">062</span><a name="line.62"></a> -<span class="sourceLineNo">063</span> /**<a name="line.63"></a> -<span class="sourceLineNo">064</span> * Returns a non-<jk>null</jk> value if the specified path matches this pattern.<a name="line.64"></a> -<span class="sourceLineNo">065</span> *<a name="line.65"></a> -<span class="sourceLineNo">066</span> * @param path The path to match against.<a name="line.66"></a> -<span class="sourceLineNo">067</span> * @return An array of values matched against <js>"{var}"</js> variable in the pattern,<a name="line.67"></a> -<span class="sourceLineNo">068</span> * or an empty array if the pattern matched but no vars were present, or <jk>null</jk><a name="line.68"></a> -<span class="sourceLineNo">069</span> * if the specified path didn't match the pattern.<a name="line.69"></a> -<span class="sourceLineNo">070</span> */<a name="line.70"></a> -<span class="sourceLineNo">071</span> protected String[] match(String path) {<a name="line.71"></a> -<span class="sourceLineNo">072</span><a name="line.72"></a> -<span class="sourceLineNo">073</span> if (isOnlyDotAll) {<a name="line.73"></a> -<span class="sourceLineNo">074</span> // Remainder always gets leading slash trimmed.<a name="line.74"></a> -<span class="sourceLineNo">075</span> if (path != null)<a name="line.75"></a> -<span class="sourceLineNo">076</span> path = path.substring(1);<a name="line.76"></a> -<span class="sourceLineNo">077</span> return new String[]{path};<a name="line.77"></a> -<span class="sourceLineNo">078</span> }<a name="line.78"></a> -<span class="sourceLineNo">079</span><a name="line.79"></a> -<span class="sourceLineNo">080</span> if (path == null)<a name="line.80"></a> -<span class="sourceLineNo">081</span> return (patternString.equals("/") ? new String[]{} : null);<a name="line.81"></a> -<span class="sourceLineNo">082</span><a name="line.82"></a> -<span class="sourceLineNo">083</span> Matcher m = pattern.matcher(path);<a name="line.83"></a> -<span class="sourceLineNo">084</span> if (! m.matches())<a name="line.84"></a> -<span class="sourceLineNo">085</span> return null;<a name="line.85"></a> +<span class="sourceLineNo">029</span><a name="line.29"></a> +<span class="sourceLineNo">030</span> private final Pattern pattern;<a name="line.30"></a> +<span class="sourceLineNo">031</span> private final String patternString;<a name="line.31"></a> +<span class="sourceLineNo">032</span> private final boolean isOnlyDotAll, isDotAll;<a name="line.32"></a> +<span class="sourceLineNo">033</span> private final String[] vars;<a name="line.33"></a> +<span class="sourceLineNo">034</span><a name="line.34"></a> +<span class="sourceLineNo">035</span> /**<a name="line.35"></a> +<span class="sourceLineNo">036</span> * Constructor.<a name="line.36"></a> +<span class="sourceLineNo">037</span> *<a name="line.37"></a> +<span class="sourceLineNo">038</span> * @param patternString The raw pattern string from the {@link RestMethod#path()} annotation.<a name="line.38"></a> +<span class="sourceLineNo">039</span> */<a name="line.39"></a> +<span class="sourceLineNo">040</span> public UrlPathPattern(String patternString) {<a name="line.40"></a> +<span class="sourceLineNo">041</span> this.patternString = patternString;<a name="line.41"></a> +<span class="sourceLineNo">042</span> Builder b = new Builder(patternString);<a name="line.42"></a> +<span class="sourceLineNo">043</span> pattern = b.pattern;<a name="line.43"></a> +<span class="sourceLineNo">044</span> isDotAll = b.isDotAll;<a name="line.44"></a> +<span class="sourceLineNo">045</span> isOnlyDotAll = b.isOnlyDotAll;<a name="line.45"></a> +<span class="sourceLineNo">046</span> vars = b.vars.toArray(new String[b.vars.size()]);<a name="line.46"></a> +<span class="sourceLineNo">047</span> }<a name="line.47"></a> +<span class="sourceLineNo">048</span><a name="line.48"></a> +<span class="sourceLineNo">049</span> @SuppressWarnings("hiding")<a name="line.49"></a> +<span class="sourceLineNo">050</span> class Builder {<a name="line.50"></a> +<span class="sourceLineNo">051</span> boolean isDotAll, isOnlyDotAll;<a name="line.51"></a> +<span class="sourceLineNo">052</span> Pattern pattern;<a name="line.52"></a> +<span class="sourceLineNo">053</span> List<String> vars = new LinkedList<String>();<a name="line.53"></a> +<span class="sourceLineNo">054</span><a name="line.54"></a> +<span class="sourceLineNo">055</span> private Builder(String patternString) {<a name="line.55"></a> +<span class="sourceLineNo">056</span> if (! StringUtils.startsWith(patternString, '/'))<a name="line.56"></a> +<span class="sourceLineNo">057</span> patternString = '/' + patternString;<a name="line.57"></a> +<span class="sourceLineNo">058</span> if (patternString.equals("/*")) {<a name="line.58"></a> +<span class="sourceLineNo">059</span> isOnlyDotAll = true;<a name="line.59"></a> +<span class="sourceLineNo">060</span> return;<a name="line.60"></a> +<span class="sourceLineNo">061</span> }<a name="line.61"></a> +<span class="sourceLineNo">062</span> if (patternString.endsWith("/*"))<a name="line.62"></a> +<span class="sourceLineNo">063</span> isDotAll = true;<a name="line.63"></a> +<span class="sourceLineNo">064</span><a name="line.64"></a> +<span class="sourceLineNo">065</span> // Find all {xxx} variables.<a name="line.65"></a> +<span class="sourceLineNo">066</span> Pattern p = Pattern.compile("\\{([^\\}]+)\\}");<a name="line.66"></a> +<span class="sourceLineNo">067</span> Matcher m = p.matcher(patternString);<a name="line.67"></a> +<span class="sourceLineNo">068</span> while (m.find())<a name="line.68"></a> +<span class="sourceLineNo">069</span> vars.add(m.group(1));<a name="line.69"></a> +<span class="sourceLineNo">070</span><a name="line.70"></a> +<span class="sourceLineNo">071</span> patternString = patternString.replaceAll("\\{[^\\}]+\\}", "([^\\/]+)");<a name="line.71"></a> +<span class="sourceLineNo">072</span> patternString = patternString.replaceAll("\\/\\*$", "((?:)|(?:\\/.*))");<a name="line.72"></a> +<span class="sourceLineNo">073</span> pattern = Pattern.compile(patternString);<a name="line.73"></a> +<span class="sourceLineNo">074</span> }<a name="line.74"></a> +<span class="sourceLineNo">075</span> }<a name="line.75"></a> +<span class="sourceLineNo">076</span><a name="line.76"></a> +<span class="sourceLineNo">077</span> /**<a name="line.77"></a> +<span class="sourceLineNo">078</span> * Returns a non-<jk>null</jk> value if the specified path matches this pattern.<a name="line.78"></a> +<span class="sourceLineNo">079</span> *<a name="line.79"></a> +<span class="sourceLineNo">080</span> * @param path The path to match against.<a name="line.80"></a> +<span class="sourceLineNo">081</span> * @return An array of values matched against <js>"{var}"</js> variable in the pattern,<a name="line.81"></a> +<span class="sourceLineNo">082</span> * or an empty array if the pattern matched but no vars were present, or <jk>null</jk><a name="line.82"></a> +<span class="sourceLineNo">083</span> * if the specified path didn't match the pattern.<a name="line.83"></a> +<span class="sourceLineNo">084</span> */<a name="line.84"></a> +<span class="sourceLineNo">085</span> protected String[] match(String path) {<a name="line.85"></a> <span class="sourceLineNo">086</span><a name="line.86"></a> -<span class="sourceLineNo">087</span> int len = m.groupCount();<a name="line.87"></a> -<span class="sourceLineNo">088</span> String[] v = new String[len];<a name="line.88"></a> -<span class="sourceLineNo">089</span><a name="line.89"></a> -<span class="sourceLineNo">090</span> for (int i = 0; i < len; i++) {<a name="line.90"></a> -<span class="sourceLineNo">091</span> if (isDotAll && i == len-1)<a name="line.91"></a> -<span class="sourceLineNo">092</span> v[i] = m.group(i+1).isEmpty() ? null : m.group(i+1).substring(1);<a name="line.92"></a> -<span class="sourceLineNo">093</span> else<a name="line.93"></a> -<span class="sourceLineNo">094</span> v[i] = decode(m.group(i+1));<a name="line.94"></a> -<span class="sourceLineNo">095</span> }<a name="line.95"></a> +<span class="sourceLineNo">087</span> if (isOnlyDotAll) {<a name="line.87"></a> +<span class="sourceLineNo">088</span> // Remainder always gets leading slash trimmed.<a name="line.88"></a> +<span class="sourceLineNo">089</span> if (path != null)<a name="line.89"></a> +<span class="sourceLineNo">090</span> path = path.substring(1);<a name="line.90"></a> +<span class="sourceLineNo">091</span> return new String[]{path};<a name="line.91"></a> +<span class="sourceLineNo">092</span> }<a name="line.92"></a> +<span class="sourceLineNo">093</span><a name="line.93"></a> +<span class="sourceLineNo">094</span> if (path == null)<a name="line.94"></a> +<span class="sourceLineNo">095</span> return (patternString.equals("/") ? new String[]{} : null);<a name="line.95"></a> <span class="sourceLineNo">096</span><a name="line.96"></a> -<span class="sourceLineNo">097</span> return v;<a name="line.97"></a> -<span class="sourceLineNo">098</span> }<a name="line.98"></a> -<span class="sourceLineNo">099</span><a name="line.99"></a> -<span class="sourceLineNo">100</span> /**<a name="line.100"></a> -<span class="sourceLineNo">101</span> * Comparator for this object.<a name="line.101"></a> -<span class="sourceLineNo">102</span> * The comparator is designed to order URL pattern from most-specific to least-specific.<a name="line.102"></a> -<span class="sourceLineNo">103</span> * For example, the following patterns would be ordered as follows:<a name="line.103"></a> -<span class="sourceLineNo">104</span> * <ol><a name="line.104"></a> -<span class="sourceLineNo">105</span> * <li><code>/foo/bar</code><a name="line.105"></a> -<span class="sourceLineNo">106</span> * <li><code>/foo/bar/*</code><a name="line.106"></a> -<span class="sourceLineNo">107</span> * <li><code>/foo/{id}/bar</code><a name="line.107"></a> -<span class="sourceLineNo">108</span> * <li><code>/foo/{id}/bar/*</code><a name="line.108"></a> -<span class="sourceLineNo">109</span> * <li><code>/foo/{id}</code><a name="line.109"></a> -<span class="sourceLineNo">110</span> * <li><code>/foo/{id}/*</code><a name="line.110"></a> -<span class="sourceLineNo">111</span> * <li><code>/foo</code><a name="line.111"></a> -<span class="sourceLineNo">112</span> * <li><code>/foo/*</code><a name="line.112"></a> -<span class="sourceLineNo">113</span> * </ol><a name="line.113"></a> -<span class="sourceLineNo">114</span> */<a name="line.114"></a> -<span class="sourceLineNo">115</span> @Override /* Comparable */<a name="line.115"></a> -<span class="sourceLineNo">116</span> public int compareTo(UrlPathPattern o) {<a name="line.116"></a> -<span class="sourceLineNo">117</span> String s1 = patternString.replaceAll("\\{[^\\}]+\\}", ".").replaceAll("\\w+", "X").replaceAll("\\.", "W");<a name="line.117"></a> -<span class="sourceLineNo">118</span> String s2 = o.patternString.replaceAll("\\{[^\\}]+\\}", ".").replaceAll("\\w+", "X").replaceAll("\\.", "W");<a name="line.118"></a> -<span class="sourceLineNo">119</span> if (s1.isEmpty())<a name="line.119"></a> -<span class="sourceLineNo">120</span> s1 = "+";<a name="line.120"></a> -<span class="sourceLineNo">121</span> if (s2.isEmpty())<a name="line.121"></a> -<span class="sourceLineNo">122</span> s2 = "+";<a name="line.122"></a> -<span class="sourceLineNo">123</span> if (! s1.endsWith("/*"))<a name="line.123"></a> -<span class="sourceLineNo">124</span> s1 = s1 + "/W";<a name="line.124"></a> -<span class="sourceLineNo">125</span> if (! s2.endsWith("/*"))<a name="line.125"></a> -<span class="sourceLineNo">126</span> s2 = s2 + "/W";<a name="line.126"></a> -<span class="sourceLineNo">127</span> int c = s2.compareTo(s1);<a name="line.127"></a> -<span class="sourceLineNo">128</span> if (c == 0)<a name="line.128"></a> -<span class="sourceLineNo">129</span> return o.toRegEx().compareTo(toRegEx());<a name="line.129"></a> -<span class="sourceLineNo">130</span> return c;<a name="line.130"></a> -<span class="sourceLineNo">131</span> }<a name="line.131"></a> -<span class="sourceLineNo">132</span><a name="line.132"></a> -<span class="sourceLineNo">133</span> @Override /* Object */<a name="line.133"></a> -<span class="sourceLineNo">134</span> public boolean equals(Object o) {<a name="line.134"></a> -<span class="sourceLineNo">135</span> if (! (o instanceof UrlPathPattern))<a name="line.135"></a> -<span class="sourceLineNo">136</span> return false;<a name="line.136"></a> -<span class="sourceLineNo">137</span> return (compareTo((UrlPathPattern)o) == 0);<a name="line.137"></a> -<span class="sourceLineNo">138</span> }<a name="line.138"></a> -<span class="sourceLineNo">139</span><a name="line.139"></a> -<span class="sourceLineNo">140</span> @Override /* Object */<a name="line.140"></a> -<span class="sourceLineNo">141</span> public int hashCode() {<a name="line.141"></a> -<span class="sourceLineNo">142</span> return super.hashCode();<a name="line.142"></a> -<span class="sourceLineNo">143</span> }<a name="line.143"></a> -<span class="sourceLineNo">144</span><a name="line.144"></a> -<span class="sourceLineNo">145</span> @Override /* Object */<a name="line.145"></a> -<span class="sourceLineNo">146</span> public String toString() {<a name="line.146"></a> -<span class="sourceLineNo">147</span> return patternString;<a name="line.147"></a> -<span class="sourceLineNo">148</span> }<a name="line.148"></a> -<span class="sourceLineNo">149</span><a name="line.149"></a> -<span class="sourceLineNo">150</span> /**<a name="line.150"></a> -<span class="sourceLineNo">151</span> * Returns this path pattern as the compiled regular expression.<a name="line.151"></a> -<span class="sourceLineNo">152</span> * Useful for debugging.<a name="line.152"></a> -<span class="sourceLineNo">153</span> *<a name="line.153"></a> -<span class="sourceLineNo">154</span> * @return The path pattern.<a name="line.154"></a> -<span class="sourceLineNo">155</span> */<a name="line.155"></a> -<span class="sourceLineNo">156</span> public String toRegEx() {<a name="line.156"></a> -<span class="sourceLineNo">157</span> return isOnlyDotAll ? "*" : pattern.pattern();<a name="line.157"></a> -<span class="sourceLineNo">158</span> }<a name="line.158"></a> -<span class="sourceLineNo">159</span>}<a name="line.159"></a> +<span class="sourceLineNo">097</span> Matcher m = pattern.matcher(path);<a name="line.97"></a> +<span class="sourceLineNo">098</span> if (! m.matches())<a name="line.98"></a> +<span class="sourceLineNo">099</span> return null;<a name="line.99"></a> +<span class="sourceLineNo">100</span><a name="line.100"></a> +<span class="sourceLineNo">101</span> int len = m.groupCount();<a name="line.101"></a> +<span class="sourceLineNo">102</span> String[] v = new String[len];<a name="line.102"></a> +<span class="sourceLineNo">103</span><a name="line.103"></a> +<span class="sourceLineNo">104</span> for (int i = 0; i < len; i++) {<a name="line.104"></a> +<span class="sourceLineNo">105</span> if (isDotAll && i == len-1)<a name="line.105"></a> +<span class="sourceLineNo">106</span> v[i] = m.group(i+1).isEmpty() ? null : m.group(i+1).substring(1);<a name="line.106"></a> +<span class="sourceLineNo">107</span> else<a name="line.107"></a> +<span class="sourceLineNo">108</span> v[i] = decode(m.group(i+1));<a name="line.108"></a> +<span class="sourceLineNo">109</span> }<a name="line.109"></a> +<span class="sourceLineNo">110</span><a name="line.110"></a> +<span class="sourceLineNo">111</span> return v;<a name="line.111"></a> +<span class="sourceLineNo">112</span> }<a name="line.112"></a> +<span class="sourceLineNo">113</span><a name="line.113"></a> +<span class="sourceLineNo">114</span> /**<a name="line.114"></a> +<span class="sourceLineNo">115</span> * Comparator for this object.<a name="line.115"></a> +<span class="sourceLineNo">116</span> * The comparator is designed to order URL pattern from most-specific to least-specific.<a name="line.116"></a> +<span class="sourceLineNo">117</span> * For example, the following patterns would be ordered as follows:<a name="line.117"></a> +<span class="sourceLineNo">118</span> * <ol><a name="line.118"></a> +<span class="sourceLineNo">119</span> * <li><code>/foo/bar</code><a name="line.119"></a> +<span class="sourceLineNo">120</span> * <li><code>/foo/bar/*</code><a name="line.120"></a> +<span class="sourceLineNo">121</span> * <li><code>/foo/{id}/bar</code><a name="line.121"></a> +<span class="sourceLineNo">122</span> * <li><code>/foo/{id}/bar/*</code><a name="line.122"></a> +<span class="sourceLineNo">123</span> * <li><code>/foo/{id}</code><a name="line.123"></a> +<span class="sourceLineNo">124</span> * <li><code>/foo/{id}/*</code><a name="line.124"></a> +<span class="sourceLineNo">125</span> * <li><code>/foo</code><a name="line.125"></a> +<span class="sourceLineNo">126</span> * <li><code>/foo/*</code><a name="line.126"></a> +<span class="sourceLineNo">127</span> * </ol><a name="line.127"></a> +<span class="sourceLineNo">128</span> */<a name="line.128"></a> +<span class="sourceLineNo">129</span> @Override /* Comparable */<a name="line.129"></a> +<span class="sourceLineNo">130</span> public int compareTo(UrlPathPattern o) {<a name="line.130"></a> +<span class="sourceLineNo">131</span> String s1 = patternString.replaceAll("\\{[^\\}]+\\}", ".").replaceAll("\\w+", "X").replaceAll("\\.", "W");<a name="line.131"></a> +<span class="sourceLineNo">132</span> String s2 = o.patternString.replaceAll("\\{[^\\}]+\\}", ".").replaceAll("\\w+", "X").replaceAll("\\.", "W");<a name="line.132"></a> +<span class="sourceLineNo">133</span> if (s1.isEmpty())<a name="line.133"></a> +<span class="sourceLineNo">134</span> s1 = "+";<a name="line.134"></a> +<span class="sourceLineNo">135</span> if (s2.isEmpty())<a name="line.135"></a> +<span class="sourceLineNo">136</span> s2 = "+";<a name="line.136"></a> +<span class="sourceLineNo">137</span> if (! s1.endsWith("/*"))<a name="line.137"></a> +<span class="sourceLineNo">138</span> s1 = s1 + "/W";<a name="line.138"></a> +<span class="sourceLineNo">139</span> if (! s2.endsWith("/*"))<a name="line.139"></a> +<span class="sourceLineNo">140</span> s2 = s2 + "/W";<a name="line.140"></a> +<span class="sourceLineNo">141</span> int c = s2.compareTo(s1);<a name="line.141"></a> +<span class="sourceLineNo">142</span> if (c == 0)<a name="line.142"></a> +<span class="sourceLineNo">143</span> return o.toRegEx().compareTo(toRegEx());<a name="line.143"></a> +<span class="sourceLineNo">144</span> return c;<a name="line.144"></a> +<span class="sourceLineNo">145</span> }<a name="line.145"></a> +<span class="sourceLineNo">146</span><a name="line.146"></a> +<span class="sourceLineNo">147</span> @Override /* Object */<a name="line.147"></a> +<span class="sourceLineNo">148</span> public boolean equals(Object o) {<a name="line.148"></a> +<span class="sourceLineNo">149</span> if (! (o instanceof UrlPathPattern))<a name="line.149"></a> +<span class="sourceLineNo">150</span> return false;<a name="line.150"></a> +<span class="sourceLineNo">151</span> return (compareTo((UrlPathPattern)o) == 0);<a name="line.151"></a> +<span class="sourceLineNo">152</span> }<a name="line.152"></a> +<span class="sourceLineNo">153</span><a name="line.153"></a> +<span class="sourceLineNo">154</span> @Override /* Object */<a name="line.154"></a> +<span class="sourceLineNo">155</span> public int hashCode() {<a name="line.155"></a> +<span class="sourceLineNo">156</span> return super.hashCode();<a name="line.156"></a> +<span class="sourceLineNo">157</span> }<a name="line.157"></a> +<span class="sourceLineNo">158</span><a name="line.158"></a> +<span class="sourceLineNo">159</span> @Override /* Object */<a name="line.159"></a> +<span class="sourceLineNo">160</span> public String toString() {<a name="line.160"></a> +<span class="sourceLineNo">161</span> return patternString;<a name="line.161"></a> +<span class="sourceLineNo">162</span> }<a name="line.162"></a> +<span class="sourceLineNo">163</span><a name="line.163"></a> +<span class="sourceLineNo">164</span> /**<a name="line.164"></a> +<span class="sourceLineNo">165</span> * Returns this path pattern as the compiled regular expression.<a name="line.165"></a> +<span class="sourceLineNo">166</span> * Useful for debugging.<a name="line.166"></a> +<span class="sourceLineNo">167</span> *<a name="line.167"></a> +<span class="sourceLineNo">168</span> * @return The path pattern.<a name="line.168"></a> +<span class="sourceLineNo">169</span> */<a name="line.169"></a> +<span class="sourceLineNo">170</span> public String toRegEx() {<a name="line.170"></a> +<span class="sourceLineNo">171</span> return isOnlyDotAll ? "*" : pattern.pattern();<a name="line.171"></a> +<span class="sourceLineNo">172</span> }<a name="line.172"></a> +<span class="sourceLineNo">173</span><a name="line.173"></a> +<span class="sourceLineNo">174</span> /**<a name="line.174"></a> +<span class="sourceLineNo">175</span> * Bean property getter: <property>vars</property>.<a name="line.175"></a> +<span class="sourceLineNo">176</span> * @return The value of the <property>vars</property> property on this bean, or <jk>null</jk> if it is not set.<a name="line.176"></a> +<span class="sourceLineNo">177</span> */<a name="line.177"></a> +<span class="sourceLineNo">178</span> public String[] getVars() {<a name="line.178"></a> +<span class="sourceLineNo">179</span> return vars;<a name="line.179"></a> +<span class="sourceLineNo">180</span> }<a name="line.180"></a> +<span class="sourceLineNo">181</span><a name="line.181"></a> +<span class="sourceLineNo">182</span> /**<a name="line.182"></a> +<span class="sourceLineNo">183</span> * Bean property getter: <property>patternString</property>.<a name="line.183"></a> +<span class="sourceLineNo">184</span> * @return The value of the <property>patternString</property> property on this bean, or <jk>null</jk> if it is not set.<a name="line.184"></a> +<span class="sourceLineNo">185</span> */<a name="line.185"></a> +<span class="sourceLineNo">186</span> public String getPatternString() {<a name="line.186"></a> +<span class="sourceLineNo">187</span> return patternString;<a name="line.187"></a> +<span class="sourceLineNo">188</span> }<a name="line.188"></a> +<span class="sourceLineNo">189</span>}<a name="line.189"></a> http://git-wip-us.apache.org/repos/asf/incubator-juneau-website/blob/756ffe72/content/site/apidocs/src-html/org/apache/juneau/rest/annotation/RestResource.html ---------------------------------------------------------------------- diff --git a/content/site/apidocs/src-html/org/apache/juneau/rest/annotation/RestResource.html b/content/site/apidocs/src-html/org/apache/juneau/rest/annotation/RestResource.html index e9c1f59..0ab10f8 100644 --- a/content/site/apidocs/src-html/org/apache/juneau/rest/annotation/RestResource.html +++ b/content/site/apidocs/src-html/org/apache/juneau/rest/annotation/RestResource.html @@ -519,85 +519,89 @@ <span class="sourceLineNo">511</span> * <ol><a name="line.511"></a> <span class="sourceLineNo">512</span> * <li><code>com.foo.mypackage.mystyles</code> package.<a name="line.512"></a> <span class="sourceLineNo">513</span> * <li><code>org.apache.juneau.rest.mystyles</code> package (since <code>RestServletDefault</code> is in <code>org.apache.juneau.rest</code>).<a name="line.513"></a> -<span class="sourceLineNo">514</span> * <li><code>[working-dir]/mystyles</code> directory. <a name="line.514"></a> +<span class="sourceLineNo">514</span> * <li><code>[working-dir]/mystyles</code> directory.<a name="line.514"></a> <span class="sourceLineNo">515</span> * </ol><a name="line.515"></a> -<span class="sourceLineNo">516</span> */<a name="line.516"></a> -<span class="sourceLineNo">517</span> String stylesheet() default "";<a name="line.517"></a> -<span class="sourceLineNo">518</span><a name="line.518"></a> -<span class="sourceLineNo">519</span> /**<a name="line.519"></a> -<span class="sourceLineNo">520</span> * The favicon to use for HTML views.<a name="line.520"></a> -<span class="sourceLineNo">521</span> * <p><a name="line.521"></a> -<span class="sourceLineNo">522</span> * The name is a path to an icon file located in either the classpath or working directory in a similar way<a name="line.522"></a> -<span class="sourceLineNo">523</span> * to how the {@link #stylesheet()} stylesheet is resolved.<a name="line.523"></a> -<span class="sourceLineNo">524</span> * The resulting favicon becomes available in the servlet via the URL <js>"[servletpath]/favicon.ico"</js>.<a name="line.524"></a> +<span class="sourceLineNo">516</span> * <p><a name="line.516"></a> +<span class="sourceLineNo">517</span> * Multiple stylesheets can be specified as a comma-delimited list.<a name="line.517"></a> +<span class="sourceLineNo">518</span> * When multiple stylesheets are specified, their contents will be concatenated and return in the order specified<a name="line.518"></a> +<span class="sourceLineNo">519</span> * in the list.<a name="line.519"></a> +<span class="sourceLineNo">520</span> */<a name="line.520"></a> +<span class="sourceLineNo">521</span> String stylesheet() default "";<a name="line.521"></a> +<span class="sourceLineNo">522</span><a name="line.522"></a> +<span class="sourceLineNo">523</span> /**<a name="line.523"></a> +<span class="sourceLineNo">524</span> * The favicon to use for HTML views.<a name="line.524"></a> <span class="sourceLineNo">525</span> * <p><a name="line.525"></a> -<span class="sourceLineNo">526</span> * If the file cannot be located, the request to <js>"[servletpath]/favicon.ico"</js> will return {@link HttpServletResponse#SC_NOT_FOUND}.<a name="line.526"></a> -<span class="sourceLineNo">527</span> *<a name="line.527"></a> -<span class="sourceLineNo">528</span> * <h5 class='section'>Example:</h5><a name="line.528"></a> -<span class="sourceLineNo">529</span> * <p class='bcode'><a name="line.529"></a> -<span class="sourceLineNo">530</span> * <jk>package</jk> com.foo.mypackage;<a name="line.530"></a> +<span class="sourceLineNo">526</span> * The name is a path to an icon file located in either the classpath or working directory in a similar way<a name="line.526"></a> +<span class="sourceLineNo">527</span> * to how the {@link #stylesheet()} stylesheet is resolved.<a name="line.527"></a> +<span class="sourceLineNo">528</span> * The resulting favicon becomes available in the servlet via the URL <js>"[servletpath]/favicon.ico"</js>.<a name="line.528"></a> +<span class="sourceLineNo">529</span> * <p><a name="line.529"></a> +<span class="sourceLineNo">530</span> * If the file cannot be located, the request to <js>"[servletpath]/favicon.ico"</js> will return {@link HttpServletResponse#SC_NOT_FOUND}.<a name="line.530"></a> <span class="sourceLineNo">531</span> *<a name="line.531"></a> -<span class="sourceLineNo">532</span> * <ja>@RestResource</ja>(<a name="line.532"></a> -<span class="sourceLineNo">533</span> * favicon=<js>"mydocs/myicon.ico"</js><a name="line.533"></a> -<span class="sourceLineNo">534</span> * )<a name="line.534"></a> -<span class="sourceLineNo">535</span> * <jk>public class</jk> MyResource <jk>extends</jk> RestServletDefault {<a name="line.535"></a> -<span class="sourceLineNo">536</span> * }<a name="line.536"></a> -<span class="sourceLineNo">537</span> * </p><a name="line.537"></a> -<span class="sourceLineNo">538</span> * <p><a name="line.538"></a> -<span class="sourceLineNo">539</span> * In this example, the servlet will attempt to find the <code>myicon.ico</code> file in the following ordered locations:<a name="line.539"></a> -<span class="sourceLineNo">540</span> * </p><a name="line.540"></a> -<span class="sourceLineNo">541</span> * <ol><a name="line.541"></a> -<span class="sourceLineNo">542</span> * <li><code>com.foo.mypackage.mydocs</code> package.<a name="line.542"></a> -<span class="sourceLineNo">543</span> * <li><code>org.apache.juneau.rest.mydocs</code> package (since <code>RestServletDefault</code> is in <code>org.apache.juneau.rest</code>).<a name="line.543"></a> -<span class="sourceLineNo">544</span> * <li><code>[working-dir]/mydocs</code> directory.<a name="line.544"></a> -<span class="sourceLineNo">545</span> * </ol><a name="line.545"></a> -<span class="sourceLineNo">546</span> */<a name="line.546"></a> -<span class="sourceLineNo">547</span> String favicon() default "";<a name="line.547"></a> -<span class="sourceLineNo">548</span><a name="line.548"></a> -<span class="sourceLineNo">549</span> /**<a name="line.549"></a> -<span class="sourceLineNo">550</span> * Defines paths and locations of statically served files.<a name="line.550"></a> -<span class="sourceLineNo">551</span> * <p><a name="line.551"></a> -<span class="sourceLineNo">552</span> * This is a JSON map of paths to packages/directories located on either the classpath or working directory.<a name="line.552"></a> -<span class="sourceLineNo">553</span> * <p><a name="line.553"></a> -<span class="sourceLineNo">554</span> * Mappings are cumulative from parent to child. Child resources can override mappings made on parent resources.<a name="line.554"></a> +<span class="sourceLineNo">532</span> * <h5 class='section'>Example:</h5><a name="line.532"></a> +<span class="sourceLineNo">533</span> * <p class='bcode'><a name="line.533"></a> +<span class="sourceLineNo">534</span> * <jk>package</jk> com.foo.mypackage;<a name="line.534"></a> +<span class="sourceLineNo">535</span> *<a name="line.535"></a> +<span class="sourceLineNo">536</span> * <ja>@RestResource</ja>(<a name="line.536"></a> +<span class="sourceLineNo">537</span> * favicon=<js>"mydocs/myicon.ico"</js><a name="line.537"></a> +<span class="sourceLineNo">538</span> * )<a name="line.538"></a> +<span class="sourceLineNo">539</span> * <jk>public class</jk> MyResource <jk>extends</jk> RestServletDefault {<a name="line.539"></a> +<span class="sourceLineNo">540</span> * }<a name="line.540"></a> +<span class="sourceLineNo">541</span> * </p><a name="line.541"></a> +<span class="sourceLineNo">542</span> * <p><a name="line.542"></a> +<span class="sourceLineNo">543</span> * In this example, the servlet will attempt to find the <code>myicon.ico</code> file in the following ordered locations:<a name="line.543"></a> +<span class="sourceLineNo">544</span> * </p><a name="line.544"></a> +<span class="sourceLineNo">545</span> * <ol><a name="line.545"></a> +<span class="sourceLineNo">546</span> * <li><code>com.foo.mypackage.mydocs</code> package.<a name="line.546"></a> +<span class="sourceLineNo">547</span> * <li><code>org.apache.juneau.rest.mydocs</code> package (since <code>RestServletDefault</code> is in <code>org.apache.juneau.rest</code>).<a name="line.547"></a> +<span class="sourceLineNo">548</span> * <li><code>[working-dir]/mydocs</code> directory.<a name="line.548"></a> +<span class="sourceLineNo">549</span> * </ol><a name="line.549"></a> +<span class="sourceLineNo">550</span> */<a name="line.550"></a> +<span class="sourceLineNo">551</span> String favicon() default "";<a name="line.551"></a> +<span class="sourceLineNo">552</span><a name="line.552"></a> +<span class="sourceLineNo">553</span> /**<a name="line.553"></a> +<span class="sourceLineNo">554</span> * Defines paths and locations of statically served files.<a name="line.554"></a> <span class="sourceLineNo">555</span> * <p><a name="line.555"></a> -<span class="sourceLineNo">556</span> * If the file cannot be located, the request will return {@link HttpServletResponse#SC_NOT_FOUND}.<a name="line.556"></a> +<span class="sourceLineNo">556</span> * This is a JSON map of paths to packages/directories located on either the classpath or working directory.<a name="line.556"></a> <span class="sourceLineNo">557</span> * <p><a name="line.557"></a> -<span class="sourceLineNo">558</span> * The media type on the response is determined by the {@link RestServlet#getMimetypesFileTypeMap()} method.<a name="line.558"></a> -<span class="sourceLineNo">559</span> *<a name="line.559"></a> -<span class="sourceLineNo">560</span> * <h5 class='section'>Example:</h5><a name="line.560"></a> -<span class="sourceLineNo">561</span> * <p class='bcode'><a name="line.561"></a> -<span class="sourceLineNo">562</span> * <jk>package</jk> com.foo.mypackage;<a name="line.562"></a> +<span class="sourceLineNo">558</span> * Mappings are cumulative from parent to child. Child resources can override mappings made on parent resources.<a name="line.558"></a> +<span class="sourceLineNo">559</span> * <p><a name="line.559"></a> +<span class="sourceLineNo">560</span> * If the file cannot be located, the request will return {@link HttpServletResponse#SC_NOT_FOUND}.<a name="line.560"></a> +<span class="sourceLineNo">561</span> * <p><a name="line.561"></a> +<span class="sourceLineNo">562</span> * The media type on the response is determined by the {@link RestServlet#getMimetypesFileTypeMap()} method.<a name="line.562"></a> <span class="sourceLineNo">563</span> *<a name="line.563"></a> -<span class="sourceLineNo">564</span> * <ja>@RestResource</ja>(<a name="line.564"></a> -<span class="sourceLineNo">565</span> * path=<js>"/myresource"</js>,<a name="line.565"></a> -<span class="sourceLineNo">566</span> * staticFiles=<js>"{htdocs:'docs'}"</js><a name="line.566"></a> -<span class="sourceLineNo">567</span> * )<a name="line.567"></a> -<span class="sourceLineNo">568</span> * <jk>public class</jk> MyResource <jk>extends</jk> RestServletDefault {<a name="line.568"></a> -<span class="sourceLineNo">569</span> * }<a name="line.569"></a> -<span class="sourceLineNo">570</span> * </p><a name="line.570"></a> -<span class="sourceLineNo">571</span> * <p><a name="line.571"></a> -<span class="sourceLineNo">572</span> * In this example, given a GET request to <code>/myresource/htdocs/foobar.html</code>, the servlet will attempt to find the <code>foobar.html</code> file<a name="line.572"></a> -<span class="sourceLineNo">573</span> * in the following ordered locations:<a name="line.573"></a> +<span class="sourceLineNo">564</span> * <h5 class='section'>Example:</h5><a name="line.564"></a> +<span class="sourceLineNo">565</span> * <p class='bcode'><a name="line.565"></a> +<span class="sourceLineNo">566</span> * <jk>package</jk> com.foo.mypackage;<a name="line.566"></a> +<span class="sourceLineNo">567</span> *<a name="line.567"></a> +<span class="sourceLineNo">568</span> * <ja>@RestResource</ja>(<a name="line.568"></a> +<span class="sourceLineNo">569</span> * path=<js>"/myresource"</js>,<a name="line.569"></a> +<span class="sourceLineNo">570</span> * staticFiles=<js>"{htdocs:'docs'}"</js><a name="line.570"></a> +<span class="sourceLineNo">571</span> * )<a name="line.571"></a> +<span class="sourceLineNo">572</span> * <jk>public class</jk> MyResource <jk>extends</jk> RestServletDefault {<a name="line.572"></a> +<span class="sourceLineNo">573</span> * }<a name="line.573"></a> <span class="sourceLineNo">574</span> * </p><a name="line.574"></a> -<span class="sourceLineNo">575</span> * <ol><a name="line.575"></a> -<span class="sourceLineNo">576</span> * <li><code>com.foo.mypackage.docs</code> package.<a name="line.576"></a> -<span class="sourceLineNo">577</span> * <li><code>org.apache.juneau.rest.docs</code> package (since <code>RestServletDefault</code> is in <code>org.apache.juneau.rest</code>).<a name="line.577"></a> -<span class="sourceLineNo">578</span> * <li><code>[working-dir]/docs</code> directory.<a name="line.578"></a> -<span class="sourceLineNo">579</span> * </ol><a name="line.579"></a> -<span class="sourceLineNo">580</span> */<a name="line.580"></a> -<span class="sourceLineNo">581</span> String staticFiles() default "";<a name="line.581"></a> -<span class="sourceLineNo">582</span><a name="line.582"></a> -<span class="sourceLineNo">583</span> /**<a name="line.583"></a> -<span class="sourceLineNo">584</span> * Specifies the HTTP header name used to identify the client version.<a name="line.584"></a> -<span class="sourceLineNo">585</span> * <p><a name="line.585"></a> -<span class="sourceLineNo">586</span> * The client version is used to support backwards compatibility for breaking REST interface<a name="line.586"></a> -<span class="sourceLineNo">587</span> * changes. Used in conjunction with {@link RestMethod#clientVersion()} annotation.<a name="line.587"></a> -<span class="sourceLineNo">588</span> * <p><a name="line.588"></a> -<span class="sourceLineNo">589</span> * If not specified, uses <js>"X-Client-Version"</js>.<a name="line.589"></a> -<span class="sourceLineNo">590</span> */<a name="line.590"></a> -<span class="sourceLineNo">591</span> String clientVersionHeader() default "";<a name="line.591"></a> -<span class="sourceLineNo">592</span>}<a name="line.592"></a> +<span class="sourceLineNo">575</span> * <p><a name="line.575"></a> +<span class="sourceLineNo">576</span> * In this example, given a GET request to <code>/myresource/htdocs/foobar.html</code>, the servlet will attempt to find the <code>foobar.html</code> file<a name="line.576"></a> +<span class="sourceLineNo">577</span> * in the following ordered locations:<a name="line.577"></a> +<span class="sourceLineNo">578</span> * </p><a name="line.578"></a> +<span class="sourceLineNo">579</span> * <ol><a name="line.579"></a> +<span class="sourceLineNo">580</span> * <li><code>com.foo.mypackage.docs</code> package.<a name="line.580"></a> +<span class="sourceLineNo">581</span> * <li><code>org.apache.juneau.rest.docs</code> package (since <code>RestServletDefault</code> is in <code>org.apache.juneau.rest</code>).<a name="line.581"></a> +<span class="sourceLineNo">582</span> * <li><code>[working-dir]/docs</code> directory.<a name="line.582"></a> +<span class="sourceLineNo">583</span> * </ol><a name="line.583"></a> +<span class="sourceLineNo">584</span> */<a name="line.584"></a> +<span class="sourceLineNo">585</span> String staticFiles() default "";<a name="line.585"></a> +<span class="sourceLineNo">586</span><a name="line.586"></a> +<span class="sourceLineNo">587</span> /**<a name="line.587"></a> +<span class="sourceLineNo">588</span> * Specifies the HTTP header name used to identify the client version.<a name="line.588"></a> +<span class="sourceLineNo">589</span> * <p><a name="line.589"></a> +<span class="sourceLineNo">590</span> * The client version is used to support backwards compatibility for breaking REST interface<a name="line.590"></a> +<span class="sourceLineNo">591</span> * changes. Used in conjunction with {@link RestMethod#clientVersion()} annotation.<a name="line.591"></a> +<span class="sourceLineNo">592</span> * <p><a name="line.592"></a> +<span class="sourceLineNo">593</span> * If not specified, uses <js>"X-Client-Version"</js>.<a name="line.593"></a> +<span class="sourceLineNo">594</span> */<a name="line.594"></a> +<span class="sourceLineNo">595</span> String clientVersionHeader() default "";<a name="line.595"></a> +<span class="sourceLineNo">596</span>}<a name="line.596"></a>
