Coverage Report - com.damnhandy.uri.template.UriTemplateBuilder
 
Classes in this File Line Coverage Branch Coverage Complexity
UriTemplateBuilder
97%
90/92
91%
22/24
1.486
 
 1  
 /*
 2  
  *
 3  
  *
 4  
  */
 5  
 package com.damnhandy.uri.template;
 6  
 
 7  
 import com.damnhandy.uri.template.impl.Modifier;
 8  
 import com.damnhandy.uri.template.impl.Operator;
 9  
 import com.damnhandy.uri.template.impl.UriTemplateParser;
 10  
 import com.damnhandy.uri.template.impl.VarSpec;
 11  
 import org.joda.time.format.DateTimeFormat;
 12  
 import org.joda.time.format.DateTimeFormatter;
 13  
 
 14  
 import java.text.DateFormat;
 15  
 import java.text.SimpleDateFormat;
 16  
 import java.util.Collection;
 17  
 import java.util.LinkedList;
 18  
 import java.util.Map;
 19  
 
 20  
 /**
 21  
  * <p>
 22  
  * A utility class used for programatically generating a {@link UriTemplate}.
 23  
  * The class can be used as follows:
 24  
  * </p>
 25  
  * <pre>
 26  
  * UriTemplate template = UriTemplate.buildFromTemplate("http://example.com")
 27  
  *                                   .literal("/foo")
 28  
  *                                   .path(var("thing1"), var("explodedThing", true))
 29  
  *                                   .fragment(var("prefix", 2))
 30  
  *                                   .build();
 31  
  * </pre>
 32  
  * <p>
 33  
  * This code will return a {@link UriTemplate} with the following value:
 34  
  * </p>
 35  
  * <pre>
 36  
  * http://example.com/foo{/thing1,explodedThing*}{#prefix:2}
 37  
  * </pre>
 38  
  *
 39  
  * @author <a href="ryan@damnhandy.com">Ryan J. McDonough</a>
 40  
  * @version $Revision: 1.1 $
 41  
  */
 42  
 public final class UriTemplateBuilder
 43  
 {
 44  
 
 45  
     /**
 46  
      * The URI expression
 47  
      */
 48  432
     private LinkedList<UriTemplateComponent> components = new LinkedList<UriTemplateComponent>();
 49  
 
 50  
     /**
 51  
      *
 52  
      */
 53  432
     private DateTimeFormatter defaultDateTimeFormatter = null;
 54  
 
 55  
     /**
 56  
      *
 57  
      */
 58  432
     private Map<String, Object> values = null;
 59  
 
 60  
 
 61  180
     UriTemplateBuilder() {
 62  180
         this.components = new LinkedList<UriTemplateComponent>();
 63  180
     }
 64  
     /**
 65  
      * Create a new UriTemplateBuilder.
 66  
      *
 67  
      * @param templateString
 68  
      */
 69  
     UriTemplateBuilder(String templateString) throws MalformedUriTemplateException
 70  252
     {
 71  252
         this.components = new UriTemplateParser().scan(templateString);
 72  252
     }
 73  
 
 74  
 
 75  
     /**
 76  
      * Create a new UriTemplateBuilder.
 77  
      *
 78  
      * @param template
 79  
      */
 80  
     UriTemplateBuilder(UriTemplate template) throws MalformedUriTemplateException
 81  
     {
 82  182
         this(template.getTemplate());
 83  182
         this.values = template.getValues();
 84  182
         this.defaultDateTimeFormatter = template.defaultDateTimeFormatter;
 85  182
     }
 86  
 
 87  
 
 88  
     /**
 89  
      * @param dateFormatString
 90  
      * @return
 91  
      * @since 2.0
 92  
      */
 93  
     public UriTemplateBuilder withDefaultDateFormat(String dateFormatString)
 94  
     {
 95  2
         return this.withDefaultDateFormat(DateTimeFormat.forPattern(dateFormatString));
 96  
     }
 97  
 
 98  
     private UriTemplateBuilder withDefaultDateFormat(DateTimeFormatter dateTimeFormatter)
 99  
     {
 100  2
         defaultDateTimeFormatter = dateTimeFormatter;
 101  2
         return this;
 102  
     }
 103  
 
 104  
     /**
 105  
      * @param dateFormat
 106  
      * @return
 107  
      * @since 2.0
 108  
      * @deprecated replaced by {@link #withDefaultDateFormat(String) withDefaultDateFormat}
 109  
      */
 110  
     @Deprecated
 111  
     public UriTemplateBuilder withDefaultDateFormat(DateFormat dateFormat)
 112  
     {
 113  2
         if (!(dateFormat instanceof SimpleDateFormat))
 114  
         {
 115  0
             throw new IllegalArgumentException(
 116  
             "The only supported subclass of java.text.DateFormat is java.text.SimpleDateFormat");
 117  
         }
 118  2
         defaultDateTimeFormatter = DateTimeFormat.forPattern(((SimpleDateFormat) dateFormat).toPattern());
 119  2
         return this;
 120  
     }
 121  
 
 122  
 
 123  
     void addComponent(UriTemplateComponent component)
 124  
     {
 125  342
         this.components.add(component);
 126  342
     }
 127  
 
 128  
     void addComponents(Collection<UriTemplateComponent> compoments)
 129  
     {
 130  4
         this.components.addAll(compoments);
 131  4
     }
 132  
 
 133  
     /**
 134  
      * Appends a {@link Literal} value to the {@link UriTemplate}. The following
 135  
      * code:
 136  
      * <p>
 137  
      * <pre>
 138  
      * UriTemplate template = UriTemplate.buildFromTemplate("http://example.com")
 139  
      *                                   .literal("/foo")
 140  
      *                                   .build();
 141  
      * </pre>
 142  
      * <p>
 143  
      * Will generate the following template:
 144  
      * <p>
 145  
      * <pre>
 146  
      * http://example.com/foo
 147  
      * </pre>
 148  
      * <p>
 149  
      * Note that this particular example has no expressions, so it's not a valid URI template.
 150  
      *
 151  
      * @param string
 152  
      * @return
 153  
      */
 154  
     public UriTemplateBuilder literal(String string)
 155  
     {
 156  18
         if (string == null)
 157  
         {
 158  2
             return this;
 159  
         }
 160  16
         addComponent(new Literal(string, 0));
 161  16
         return this;
 162  
     }
 163  
 
 164  
     /**
 165  
      * @param varSpec
 166  
      * @return
 167  
      */
 168  
     private static VarSpec[] toVarSpec(String... varSpec)
 169  
     {
 170  60
         VarSpec[] vars = new VarSpec[varSpec.length];
 171  112
         for (int i = 0; i < varSpec.length; i++)
 172  
         {
 173  60
             vars[i] = var(varSpec[i]);
 174  
         }
 175  52
         return vars;
 176  
     }
 177  
 
 178  
     /**
 179  
      * Appends a template expression using no operator. The following
 180  
      * code:
 181  
      * <pre>
 182  
      * UriTemplate template =
 183  
      *        UriTemplate.buildFromTemplate("http://example.com/")
 184  
      *                   .simple("foo")
 185  
      *                   .build();
 186  
      * </pre>
 187  
      * Will generate the following URI Template string:
 188  
      * <pre>
 189  
      * http://example.com/{foo}
 190  
      * </pre>
 191  
      *
 192  
      * @param var
 193  
      * @return
 194  
      */
 195  
     public UriTemplateBuilder simple(String... var)
 196  
     {
 197  4
         simple(toVarSpec(var));
 198  4
         return this;
 199  
     }
 200  
 
 201  
     /**
 202  
      * Appends a template expression using no operator but with an optional
 203  
      * modifier. The following code:
 204  
      * <pre>
 205  
      * import static com.damnhandy.uri.template.UriTemplateBuilder.var;
 206  
      *
 207  
      * ...
 208  
      *
 209  
      * UriTemplate template =
 210  
      *        UriTemplate.buildFromTemplate("http://example.com/")
 211  
      *                   .simple(var("foo",true))
 212  
      *                   .build();
 213  
      * </pre>
 214  
      * Will generate the following URI Template string:
 215  
      * <pre>
 216  
      * http://example.com/{foo*}
 217  
      * </pre>
 218  
      *
 219  
      * @param var
 220  
      * @return
 221  
      */
 222  
     public UriTemplateBuilder simple(VarSpec... var)
 223  
     {
 224  4
         addComponent(Expression.simple(var).build());
 225  4
         return this;
 226  
     }
 227  
 
 228  
     /**
 229  
      * Appends a template expression using the reserved operator (+). The following
 230  
      * code:
 231  
      * <pre>
 232  
      * UriTemplate template =
 233  
      *        UriTemplate.buildFromTemplate("http://example.com/")
 234  
      *                   .reserved("foo")
 235  
      *                   .build();
 236  
      * </pre>
 237  
      * Will generate the following URI Template string:
 238  
      * <pre>
 239  
      * http://example.com/{+foo}
 240  
      * </pre>
 241  
      *
 242  
      * @param var
 243  
      * @return
 244  
      */
 245  
     public UriTemplateBuilder reserved(String... var)
 246  
     {
 247  8
         reserved(toVarSpec(var));
 248  8
         return this;
 249  
     }
 250  
 
 251  
     /**
 252  
      * Appends a template expression using the reserved operator (+) along
 253  
      * with an optional modifier. The following code:
 254  
      * <pre>
 255  
      * import static com.damnhandy.uri.template.UriTemplateBuilder.var;
 256  
      *
 257  
      * ...
 258  
      *
 259  
      * UriTemplate template =
 260  
      *        UriTemplate.buildFromTemplate("http://example.com/")
 261  
      *                   .reserved(var("foo",1))
 262  
      *                   .build();
 263  
      * </pre>
 264  
      * Will generate the following URI Template string:
 265  
      * <pre>
 266  
      * http://example.com/{+foo:1}
 267  
      * </pre>
 268  
      *
 269  
      * @param var
 270  
      * @return
 271  
      */
 272  
     public UriTemplateBuilder reserved(VarSpec... var)
 273  
     {
 274  12
         addComponent(Expression.reserved(var).build());
 275  12
         return this;
 276  
     }
 277  
 
 278  
     /**
 279  
      * Appends a template expression using the fragment operator (#). The
 280  
      * following code:
 281  
      * <pre>
 282  
      * UriTemplate template =
 283  
      *        UriTemplate.buildFromTemplate("http://example.com/")
 284  
      *                   .fragement("foo")
 285  
      *                   .build();
 286  
      * </pre>
 287  
      * Will generate the following URI Template string:
 288  
      * <pre>
 289  
      * http://example.com/{#foo}
 290  
      * </pre>
 291  
      *
 292  
      * @param var
 293  
      * @return
 294  
      * @throws UriTemplateBuilderException if you attempt to add more than one fragment expression, a UriTemplateBuilderException will be raised
 295  
      */
 296  
     public UriTemplateBuilder fragment(String... var) throws UriTemplateBuilderException
 297  
     {
 298  12
         fragment(toVarSpec(var));
 299  8
         return this;
 300  
     }
 301  
 
 302  
     /**
 303  
      * Appends a template expression using the fragment operator (#) with a
 304  
      * modifier. The following code:
 305  
      * <pre>
 306  
      * import static com.damnhandy.uri.template.UriTemplateBuilder.var;
 307  
      *
 308  
      * ...
 309  
      *
 310  
      * UriTemplate template =
 311  
      *        UriTemplate.buildFromTemplate("http://example.com/")
 312  
      *                   .fragement(var("foo", 1))
 313  
      *                   .build();
 314  
      * </pre>
 315  
      * Will generate the following URI Template string:
 316  
      * <pre>
 317  
      * http://example.com/{#foo:1}
 318  
      * </pre>
 319  
      *
 320  
      * @param var
 321  
      * @return
 322  
      * @throws UriTemplateBuilderException if you attempt to add more than one fragment expression, a UriTemplateBuilderException will be raised
 323  
      */
 324  
     public UriTemplateBuilder fragment(VarSpec... var) throws UriTemplateBuilderException
 325  
     {
 326  20
         if (hasExpressionWithOperator(Operator.FRAGMENT))
 327  
         {
 328  2
             throw new UriTemplateBuilderException("The template already has a fragment expression and this would not result in a valid URI");
 329  
         }
 330  18
         addComponent(Expression.fragment(var).build());
 331  18
         return this;
 332  
     }
 333  
 
 334  
     /**
 335  
      * Scans the components for an expression with the specified operator.
 336  
      *
 337  
      * @param op
 338  
      * @return
 339  
      */
 340  
     private boolean hasExpressionWithOperator(Operator op)
 341  
     {
 342  20
         for (UriTemplateComponent c : components)
 343  
         {
 344  46
             if (Expression.class.isInstance(c))
 345  
             {
 346  22
                 Expression e = (Expression) c;
 347  22
                 if (e.getOperator() == op)
 348  
                 {
 349  2
                     return true;
 350  
                 }
 351  
             }
 352  44
         }
 353  18
         return false;
 354  
     }
 355  
 
 356  
     /**
 357  
      * Appends a template expression using the label (.) operator. The following
 358  
      * code:
 359  
      * <pre>
 360  
      * UriTemplate template =
 361  
      *        UriTemplate.buildFromTemplate("http://example.com/")
 362  
      *                   .label("foo")
 363  
      *                   .build();
 364  
      * </pre>
 365  
      * Will generate the following URI Template string:
 366  
      * <pre>
 367  
      * http://example.com/{.foo}
 368  
      * </pre>
 369  
      *
 370  
      * @param var
 371  
      * @return
 372  
      */
 373  
     public UriTemplateBuilder label(String... var)
 374  
     {
 375  2
         label(toVarSpec(var));
 376  2
         return this;
 377  
     }
 378  
 
 379  
     /**
 380  
      * Appends a template expression using the label (.) operator and modifier.
 381  
      * The following code:
 382  
      * <pre>
 383  
      * UriTemplate template =
 384  
      *        UriTemplate.buildFromTemplate("http://example.com/")
 385  
      *                   .label(var("foo", true))
 386  
      *                   .build();
 387  
      * </pre>
 388  
      * Will generate the following URI Template string:
 389  
      * <pre>
 390  
      * http://example.com/{.foo*}
 391  
      * </pre>
 392  
      *
 393  
      * @param var
 394  
      * @return
 395  
      */
 396  
     public UriTemplateBuilder label(VarSpec... var)
 397  
     {
 398  6
         addComponent(Expression.label(var).build());
 399  6
         return this;
 400  
     }
 401  
 
 402  
     /**
 403  
      * Appends a template expression using the matrix (;) operator. The following
 404  
      * code:
 405  
      * <pre>
 406  
      * UriTemplate template =
 407  
      *        UriTemplate.buildFromTemplate("http://example.com/")
 408  
      *                   .matrix("foo")
 409  
      *                   .build();
 410  
      * </pre>
 411  
      * Will generate the following URI Template string:
 412  
      * <pre>
 413  
      * http://example.com/{;foo}
 414  
      * </pre>
 415  
      *
 416  
      * @param var
 417  
      * @return
 418  
      */
 419  
     public UriTemplateBuilder matrix(String... var)
 420  
     {
 421  2
         matrix(toVarSpec(var));
 422  2
         return this;
 423  
     }
 424  
 
 425  
     /**
 426  
      * Appends a template expression using the matrix (;) operator and modifier.
 427  
      * The following code:
 428  
      * <pre>
 429  
      * UriTemplate template =
 430  
      *        UriTemplate.buildFromTemplate("http://example.com/")
 431  
      *                   .matrix(var("foo", true))
 432  
      *                   .build();
 433  
      * </pre>
 434  
      * Will generate the following URI Template string:
 435  
      * <pre>
 436  
      * http://example.com/{;foo*}
 437  
      * </pre>
 438  
      *
 439  
      * @param var
 440  
      * @return
 441  
      */
 442  
     public UriTemplateBuilder matrix(VarSpec... var)
 443  
     {
 444  2
         addComponent(Expression.matrix(var).build());
 445  2
         return this;
 446  
     }
 447  
 
 448  
     /**
 449  
      * Appends a template expression using the path (/) operator. The following
 450  
      * code:
 451  
      * <pre>
 452  
      * UriTemplate template =
 453  
      *        UriTemplate.buildFromTemplate("http://example.com")
 454  
      *                   .path("foo")
 455  
      *                   .build();
 456  
      * </pre>
 457  
      * Will generate the following URI Template string:
 458  
      * <pre>
 459  
      * http://example.com{/foo}
 460  
      * </pre>
 461  
      *
 462  
      * @param var
 463  
      * @return
 464  
      */
 465  
     public UriTemplateBuilder path(String... var)
 466  
     {
 467  22
         path(toVarSpec(var));
 468  20
         return this;
 469  
     }
 470  
 
 471  
     /**
 472  
      * Appends a template expression using the path (/) operator and modifier.
 473  
      * The following code:
 474  
      * <pre>
 475  
      * UriTemplate template =
 476  
      *        UriTemplate.buildFromTemplate("http://example.com")
 477  
      *                   .path(var("foo", 1))
 478  
      *                   .build();
 479  
      * </pre>
 480  
      * Will generate the following URI Template string:
 481  
      * <pre>
 482  
      * http://example.com{/foo:1}
 483  
      * </pre>
 484  
      *
 485  
      * @param var
 486  
      * @return
 487  
      */
 488  
     public UriTemplateBuilder path(VarSpec... var)
 489  
     {
 490  26
         addComponent(Expression.path(var).build());
 491  26
         return this;
 492  
     }
 493  
 
 494  
     /**
 495  
      * Appends a template expression using the query (?) operator. The following
 496  
      * code:
 497  
      * <pre>
 498  
      * UriTemplate template =
 499  
      *        UriTemplate.buildFromTemplate("http://example.com/")
 500  
      *                   .query("foo")
 501  
      *                   .build();
 502  
      * </pre>
 503  
      * Will generate the following URI Template string:
 504  
      * <pre>
 505  
      * http://example.com/{?foo}
 506  
      * </pre>
 507  
      *
 508  
      * @param var
 509  
      * @return
 510  
      */
 511  
     public UriTemplateBuilder query(String... var)
 512  
     {
 513  8
         query(toVarSpec(var));
 514  4
         return this;
 515  
     }
 516  
 
 517  
     /**
 518  
      * Appends a template expression using the query (?) operator and
 519  
      * and optional modifier. The following
 520  
      * code:
 521  
      * <pre>
 522  
      * import static com.damnhandy.uri.template.UriTemplateBuilder.var;
 523  
      *
 524  
      * ...
 525  
      *
 526  
      * UriTemplate template =
 527  
      *        UriTemplate.buildFromTemplate("http://example.com/")
 528  
      *                   .query(var("foo",1))
 529  
      *                   .build();
 530  
      * </pre>
 531  
      * Will generate the following URI Template string:
 532  
      * <pre>
 533  
      * http://example.com/{?foo:1}
 534  
      * </pre>
 535  
      *
 536  
      * @param var
 537  
      * @return
 538  
      */
 539  
     public UriTemplateBuilder query(VarSpec... var)
 540  
     {
 541  14
         addComponent(Expression.query(var).build());
 542  14
         return this;
 543  
     }
 544  
 
 545  
     /**
 546  
      * Appends a template expression using the form-style query continuation. The following
 547  
      * code:
 548  
      * <pre>
 549  
      * UriTemplate template =
 550  
      *        UriTemplate.buildFromTemplate("http://example.com/")
 551  
      *                   .continuation("foo")
 552  
      *                   .build();
 553  
      * </pre>
 554  
      * Will generate the following URI Template string:
 555  
      * <pre>
 556  
      * http://example.com/{&foo}
 557  
      * </pre>
 558  
      *
 559  
      * @param var
 560  
      * @return
 561  
      */
 562  
     public UriTemplateBuilder continuation(String... var)
 563  
     {
 564  2
         return continuation(toVarSpec(var));
 565  
     }
 566  
 
 567  
     /**
 568  
      * Appends a template expression using the form-style query continuation and
 569  
      * and optional modifier. The following
 570  
      * code:
 571  
      * <pre>
 572  
      * import static com.damnhandy.uri.template.UriTemplateBuilder.var;
 573  
      *
 574  
      * ...
 575  
      *
 576  
      * UriTemplate template =
 577  
      *        UriTemplate.buildFromTemplate("http://example.com/")
 578  
      *                   .query(var("foo",1))
 579  
      *                   .build();
 580  
      * </pre>
 581  
      * Will generate the following URI Template string:
 582  
      * <pre>
 583  
      * http://example.com/{&foo:1}
 584  
      * </pre>
 585  
      *
 586  
      * @param var
 587  
      * @return
 588  
      */
 589  
     public UriTemplateBuilder continuation(VarSpec... var)
 590  
     {
 591  6
         addComponent(Expression.continuation(var).build());
 592  6
         return this;
 593  
     }
 594  
 
 595  
     /**
 596  
      * Parses the template and appends the parsed components
 597  
      * to the builder. The following
 598  
      * code:
 599  
      * <pre>
 600  
      * import static com.damnhandy.uri.template.UriTemplateBuilder.var;
 601  
      *
 602  
      * ...
 603  
      *
 604  
      * UriTemplate template =
 605  
      *        UriTemplate.buildFromTemplate("http://example.com/")
 606  
      *                   .template("foo/{id}{?filter}")
 607  
      *                   .build();
 608  
      * </pre>
 609  
      * Will generate the following URI Template string:
 610  
      * <pre>
 611  
      * http://example.com/foo/{id}{?filter}
 612  
      * </pre>
 613  
      *
 614  
      * @param template
 615  
      * @return
 616  
      */
 617  
     public UriTemplateBuilder template(UriTemplate... template) {
 618  4
         for(UriTemplate t : template) {
 619  2
             addComponents(t.getComponents());
 620  
         }
 621  
 
 622  2
         return this;
 623  
     }
 624  
 
 625  
     /**
 626  
      * Parses the template and appends the parsed components
 627  
      * to the builder. The following
 628  
      * code:
 629  
      * <pre>
 630  
      * import static com.damnhandy.uri.template.UriTemplateBuilder.var;
 631  
      *
 632  
      * ...
 633  
      *
 634  
      * UriTemplate template =
 635  
      *        UriTemplate.buildFromTemplate("http://example.com/")
 636  
      *                   .template("foo/{id}{?filter}")
 637  
      *                   .build();
 638  
      * </pre>
 639  
      * Will generate the following URI Template string:
 640  
      * <pre>
 641  
      * http://example.com/foo/{id}{?filter}
 642  
      * </pre>
 643  
      *
 644  
      * @param template
 645  
      * @return
 646  
      */
 647  
     public UriTemplateBuilder template(String... template) {
 648  2
         UriTemplateParser parser = new UriTemplateParser();
 649  4
         for(String t : template) {
 650  2
             addComponents(parser.scan(t));
 651  
         }
 652  
 
 653  2
         return this;
 654  
     }
 655  
 
 656  
     /**
 657  
      * Returns an array of the components in the Builder.
 658  
      * @return
 659  
      */
 660  
     public UriTemplateComponent[] getComponents()
 661  
     {
 662  178
         return this.components.toArray(new UriTemplateComponent[components.size()]);
 663  
     }
 664  
 
 665  
 
 666  
     /**
 667  
      * <p>
 668  
      * Generates a {@link UriTemplate} instance from the builder.
 669  
      * </p>
 670  
      *
 671  
      * @return the UriTemplate
 672  
      * @since 2.0
 673  
      */
 674  
     public UriTemplate build() throws MalformedUriTemplateException
 675  
     {
 676  244
         UriTemplate template = new UriTemplate(this.components);
 677  244
         if (this.values != null)
 678  
         {
 679  4
             template.set(values);
 680  
         }
 681  
 
 682  244
         if (defaultDateTimeFormatter != null)
 683  
         {
 684  8
             template.defaultDateTimeFormatter = defaultDateTimeFormatter;
 685  
         }
 686  244
         return template;
 687  
     }
 688  
 
 689  
     /**
 690  
      * Adds a variable name to the expression.
 691  
      * <p>
 692  
      * <pre>
 693  
      * var("foo");
 694  
      * </pre>
 695  
      * <p>
 696  
      * Will yield the following expression:
 697  
      * <pre>
 698  
      * {foo}
 699  
      * </pre>
 700  
      *
 701  
      * @param varName
 702  
      * @return the {@link com.damnhandy.uri.template.impl.VarSpec} for the specified name
 703  
      */
 704  
     public static VarSpec var(String varName)
 705  
     {
 706  88
         return var(varName, Modifier.NONE, null);
 707  
     }
 708  
 
 709  
     /**
 710  
      * Adds a variable name to the expression with an explode modifier.
 711  
      * <p>
 712  
      * <pre>
 713  
      * var("foo",true);
 714  
      * </pre>
 715  
      * <p>
 716  
      * Will yield the following expression:
 717  
      * <pre>
 718  
      * {foo*}
 719  
      * </pre>
 720  
      *
 721  
      * @param varName
 722  
      * @param explode
 723  
      * @return the {@link com.damnhandy.uri.template.impl.VarSpec} for the specified name
 724  
      */
 725  
     public static VarSpec var(String varName, boolean explode)
 726  
     {
 727  26
         if (explode)
 728  
         {
 729  26
             return var(varName, Modifier.EXPLODE, null);
 730  
         }
 731  0
         return var(varName, Modifier.NONE, null);
 732  
     }
 733  
 
 734  
     /**
 735  
      * Adds a variable name to the expression with a prefix modifier.
 736  
      * <p>
 737  
      * <pre>
 738  
      * var("foo",2);
 739  
      * </pre>
 740  
      * <p>
 741  
      * Will yield the following expression:
 742  
      * <pre>
 743  
      * {foo:2}
 744  
      * </pre>
 745  
      *
 746  
      * @param varName
 747  
      * @param prefix
 748  
      * @return the {@link com.damnhandy.uri.template.impl.VarSpec} for the specified name
 749  
      */
 750  
     public static VarSpec var(String varName, int prefix)
 751  
     {
 752  22
         return var(varName, Modifier.PREFIX, prefix);
 753  
     }
 754  
 
 755  
     /**
 756  
      * @param varName
 757  
      * @param modifier
 758  
      * @param position
 759  
      * @return the {@link com.damnhandy.uri.template.impl.VarSpec} for the specified name
 760  
      */
 761  
     private static VarSpec var(String varName, Modifier modifier, Integer position)
 762  
     {
 763  136
         return new VarSpec(varName, modifier, position);
 764  
     }
 765  
 
 766  
 }