EMMA Coverage Report (generated Wed Jan 06 12:31:26 CET 2010)
[all classes][org.amicofragile.webclient]

COVERAGE SUMMARY FOR SOURCE FILE [URLBuilder.java]

nameclass, %method, %block, %line, %
URLBuilder.java100% (2/2)100% (11/11)100% (215/215)100% (41/41)

COVERAGE BREAKDOWN BY CLASS AND METHOD

nameclass, %method, %block, %line, %
     
class URLBuilder100% (1/1)100% (9/9)100% (184/184)100% (35/35)
URLBuilder (String): void 100% (1/1)100% (5/5)100% (2/2)
URLBuilder (String, String): void 100% (1/1)100% (25/25)100% (6/6)
access$000 (URLBuilder, String): String 100% (1/1)100% (4/4)100% (1/1)
addParam (String, String): void 100% (1/1)100% (15/15)100% (2/2)
deleteLastChar (StringBuilder): void 100% (1/1)100% (8/8)100% (2/2)
encode (String): String 100% (1/1)100% (13/13)100% (3/3)
parseBaseUrl (String): String 100% (1/1)100% (13/13)100% (3/3)
parseBaseUrlParameters (String): List 100% (1/1)100% (58/58)100% (8/8)
renderURL (): String 100% (1/1)100% (43/43)100% (8/8)
     
class URLBuilder$Parameter100% (1/1)100% (2/2)100% (31/31)100% (6/6)
URLBuilder$Parameter (URLBuilder, String, String): void 100% (1/1)100% (12/12)100% (5/5)
render (): String 100% (1/1)100% (19/19)100% (1/1)

1package org.amicofragile.webclient;
2 
3import java.io.UnsupportedEncodingException;
4import java.net.URLEncoder;
5import java.util.Collection;
6import java.util.Collections;
7import java.util.LinkedList;
8import java.util.List;
9 
10/**
11 * Utility class who provides URL creation.
12 * @author Pietro Martinelli
13 */
14public class URLBuilder {
15        private static final String SLASH = "/";
16        private static final char PARAMETER_DEFINITION_CHAR = '=';
17        private static final String PARAMETERS_SEPARATOR = "&";
18        private static final char QUERY_STRING_SEPARATOR = '?';
19        /**
20         * Default character set for parameters encoding.
21         */
22        public static final String DEFAULT_ENCODING = "UTF-8";
23        /**
24         * Base URL (without parameters).
25         */
26        private final String baseURL;
27        /**
28         * URL's parameters.
29         */
30        private final List<Parameter> parameters;
31        /**
32         * Charset for URL parameters encoding.
33         */
34        private final String encoding;
35        /**
36         * Initializes new instance.
37         * @param url An URL, eventually including parameters.
38         * @param encoding Charset to be used for parameters URL-encoding.
39         */
40        public URLBuilder(final String url, final String encoding) {
41                this.baseURL = parseBaseUrl(url);
42                this.parameters = new LinkedList<Parameter>();
43                this.parameters.addAll(parseBaseUrlParameters(url));
44                this.encoding = parseBaseUrl(encoding);
45        }
46 
47        /**
48         * Extracts parameters from base URL.
49         * @param baseURL A base URL, eventually including parameters.
50         * @return Given URL's parameters, if any.
51         */
52        private List<? extends Parameter> parseBaseUrlParameters(final String baseURL) {
53                final List<Parameter> baseParameters = new LinkedList<Parameter>();
54                if (baseURL.indexOf(QUERY_STRING_SEPARATOR) >= 0) {
55                        final String queryString = baseURL.substring(baseURL.indexOf(QUERY_STRING_SEPARATOR) + 1);
56                        final String[] stringParameters = queryString.split(PARAMETERS_SEPARATOR);
57                        for (String stringParam : stringParameters) {
58                                final int separator = stringParam.indexOf(PARAMETER_DEFINITION_CHAR);
59                                baseParameters.add(new Parameter(stringParam.substring(0, separator), stringParam.substring(separator + 1)));
60                        }
61                }
62                return baseParameters;
63        }
64 
65        /**
66         * Extracts base URL (without parameters) from given URL.
67         * @param url An URL-representing {@link java.lang.String}
68         * @return Base URL (without parameters)
69         */
70        private String parseBaseUrl(final String url) {
71                if (url.indexOf(QUERY_STRING_SEPARATOR) < 0) {
72                        return url;
73                }
74                return url.substring(0, url.indexOf(QUERY_STRING_SEPARATOR));
75        }
76        /**
77         * Initializes an instance with default charset for parameters encoding.
78         * @param url An URL, eventually including parameters.
79         */
80        public URLBuilder(final String url) {
81                this(url, DEFAULT_ENCODING);
82        }
83 
84        /**
85         * Registers new parameter, as name/value couple.
86         * @param name URL parameter's name
87         * @param value URL parameter's value
88         */
89        public final void addParam(final String name, final String value) {
90                this.parameters.add(new Parameter(parseBaseUrl(name), parseBaseUrl(value)));
91        }
92 
93        /**
94         * Renders URL as {@link java.lang.String}, using a
95         * {@link java.lang.StringBuilder}.
96         * @return URL as {@link java.lang.String}
97         */
98        public final String renderURL() {
99                final StringBuilder builder = new StringBuilder(this.baseURL);
100                if (this.baseURL.endsWith(SLASH)) {
101                        deleteLastChar(builder);
102                }
103 
104                builder.append(QUERY_STRING_SEPARATOR);
105 
106                for (Parameter param : this.parameters) {
107                        builder.append(param.render()).append(PARAMETERS_SEPARATOR);
108                }
109                deleteLastChar(builder);
110                return builder.toString();
111        }
112 
113        /**
114         * URL-encodes input {@link java.lang.String}, using encoding specified at
115         * construction time.
116         * @param in {@link java.lang.String} to encode
117         * @return <tt>in</tt>'s URL-encoding
118         */
119        private final String encode(final String in) {
120                try {
121                        return URLEncoder.encode(parseBaseUrl(in), this.encoding);
122                } catch (UnsupportedEncodingException e) {
123                        throw new RuntimeException(e);
124                }
125        }
126 
127        /**
128         * Deletes last char from <tt>builder</tt>.
129         * @param builder {@link java.lang.StringBuilder} from which delete last
130         *            char
131         */
132        private void deleteLastChar(final StringBuilder builder) {
133                builder.deleteCharAt(builder.length() - 1);
134        }
135 
136        /**
137         * URL parameter's abstraction. This class represents single URL parameter,
138         * encapsulating its URL generation logic.
139         * @author Pietro Martinelli
140         */
141        private final class Parameter {
142                /**
143                 * URL parameter's name.
144                 */
145                private final String name;
146                /**
147                 * URL parameter's value.
148                 */
149                private final String value;
150 
151                /**
152                 * Initializes an instance by specifying parameter's name and value.
153                 * @param name URL parameter's name.
154                 * @param value URL parameter's value.
155                 */
156                public Parameter(final String name, final String value) {
157                        super();
158                        this.name = name;
159                        this.value = value;
160                }
161 
162                /**
163                 * Renders {@link Parameter} as {@link java.lang.String}, taking care of
164                 * name/value's encoding, if necessary.
165                 * @return {@link Parameter} as {@link java.lang.String}
166                 */
167                public final String render() {
168                        return encode(this.name) + PARAMETER_DEFINITION_CHAR + encode(this.value);
169                }
170        }
171}

[all classes][org.amicofragile.webclient]
EMMA 2.0.5312 (C) Vladimir Roubtsov