View Javadoc

1   package com.atlassian.plugins.rest.sample.expansion;
2   
3   import org.apache.commons.lang.StringUtils;
4   
5   import java.net.URI;
6   import java.net.URISyntaxException;
7   import java.util.*;
8   
9   public class UriBuilder
10  {
11      private static final String CONTEXT_SYSTEM_PROPERTY = "context.path";
12      private static final String HTTP_PORT_SYSTEM_PROPERTY = "http.port";
13      private static final int DEFAULT_HTTP_PORT = 0;
14  
15      private final static String CONTEXT;
16      private final static int HTTP_PORT;
17  
18      static
19      {
20          CONTEXT = System.getProperty(CONTEXT_SYSTEM_PROPERTY);
21          HTTP_PORT = Integer.valueOf(System.getProperty(HTTP_PORT_SYSTEM_PROPERTY, String.valueOf(DEFAULT_HTTP_PORT)));
22  
23          if (CONTEXT == null || HTTP_PORT == DEFAULT_HTTP_PORT)
24          {
25              throw new IllegalStateException(CONTEXT_SYSTEM_PROPERTY + " or " + HTTP_PORT_SYSTEM_PROPERTY + " not set!");
26          }
27      }
28  
29      private final List<String> paths = new LinkedList<String>();
30      private Map<String,String> params = new HashMap<String,String>();
31  
32      private UriBuilder()
33      {
34      }
35  
36      public static UriBuilder create()
37      {
38          return new UriBuilder();
39      }
40  
41      public UriBuilder path(String path)
42      {
43          paths.add(path);
44          return this;
45      }
46  
47      public URI build()
48      {
49          try
50          {
51              return new URI("http", null, "localhost", HTTP_PORT, buildPath(), buildQuery(), buildFragment());
52          }
53          catch (URISyntaxException e)
54          {
55              // will not happen
56              return null;
57          }
58      }
59  
60      private String buildPath()
61      {
62          final StringBuilder path = new StringBuilder(paths.size() * 8);
63          if (StringUtils.isNotBlank(CONTEXT))
64          {
65              path.append(CONTEXT).append("/");
66          }
67          for (String element : paths)
68          {
69              path.append(element).append("/");
70          }
71          if (path.charAt(0) != '/')
72          {
73              path.insert(0, '/');
74          }
75          return path.toString();
76      }
77  
78      private String buildQuery()
79      {
80          final StringBuilder query = new StringBuilder();
81          for (Iterator<Map.Entry<String, String>> iterator = params.entrySet().iterator(); iterator.hasNext();)
82          {
83              Map.Entry<String, String> entry = iterator.next();
84              query.append(entry.getKey());
85              query.append("=");
86              query.append(entry.getValue());
87              if(iterator.hasNext())
88                  query.append("&");
89          }
90          return query.toString();
91      }
92  
93      private String buildFragment()
94      {
95          return null;
96      }
97  
98      public UriBuilder param(String param, String value)
99      {
100         params.put(param,value);
101         return this;
102     }
103 }