001 002package com.commercetools.api.client; 003 004import java.net.URI; 005import java.nio.charset.StandardCharsets; 006import java.time.Duration; 007import java.util.ArrayList; 008import java.util.Collection; 009import java.util.List; 010import java.util.concurrent.CompletableFuture; 011import java.util.function.Function; 012import java.util.function.Supplier; 013import java.util.stream.Collectors; 014 015import io.vrap.rmf.base.client.*; 016import io.vrap.rmf.base.client.utils.Generated; 017 018import org.apache.commons.lang3.builder.EqualsBuilder; 019import org.apache.commons.lang3.builder.HashCodeBuilder; 020 021/** 022 * <p>If Price selection query parameters are provided, the selected Prices are added to the response.</p> 023 * <p>A failed response can return a DuplicatePriceScope, DuplicateVariantValues, DuplicateAttributeValue, or DuplicateAttributeValues error.</p> 024 * 025 * <hr> 026 * <div class=code-example> 027 * <pre><code class='java'>{@code 028 * CompletableFuture<ApiHttpResponse<com.commercetools.api.models.product.Product>> result = apiRoot 029 * .withProjectKey("{projectKey}") 030 * .products() 031 * .withId("{ID}") 032 * .post("") 033 * .execute() 034 * }</code></pre> 035 * </div> 036 */ 037@Generated(value = "io.vrap.rmf.codegen.rendering.CoreCodeGenerator", comments = "https://github.com/commercetools/rmf-codegen") 038public class ByProjectKeyProductsByIDPostString 039 extends StringBodyApiMethod<ByProjectKeyProductsByIDPostString, com.commercetools.api.models.product.Product> 040 implements com.commercetools.api.client.PriceselectingTrait<ByProjectKeyProductsByIDPostString>, 041 com.commercetools.api.client.ConflictingTrait<ByProjectKeyProductsByIDPostString>, 042 com.commercetools.api.client.ExpandableTrait<ByProjectKeyProductsByIDPostString>, 043 com.commercetools.api.client.Deprecatable200Trait<ByProjectKeyProductsByIDPostString>, 044 com.commercetools.api.client.ErrorableTrait<ByProjectKeyProductsByIDPostString> { 045 046 private String projectKey; 047 private String ID; 048 049 private String productUpdate; 050 051 public ByProjectKeyProductsByIDPostString(final ApiHttpClient apiHttpClient, String projectKey, String ID, 052 String productUpdate) { 053 super(apiHttpClient); 054 this.projectKey = projectKey; 055 this.ID = ID; 056 this.productUpdate = productUpdate; 057 } 058 059 public ByProjectKeyProductsByIDPostString(ByProjectKeyProductsByIDPostString t) { 060 super(t); 061 this.projectKey = t.projectKey; 062 this.ID = t.ID; 063 this.productUpdate = t.productUpdate; 064 } 065 066 @Override 067 protected ApiHttpRequest buildHttpRequest() { 068 List<String> params = new ArrayList<>(getQueryParamUriStrings()); 069 String httpRequestPath = String.format("%s/products/%s", this.projectKey, this.ID); 070 if (!params.isEmpty()) { 071 httpRequestPath += "?" + String.join("&", params); 072 } 073 return new ApiHttpRequest(ApiHttpMethod.POST, URI.create(httpRequestPath), getHeaders(), 074 productUpdate.getBytes(StandardCharsets.UTF_8)); 075 076 } 077 078 @Override 079 public ApiHttpResponse<com.commercetools.api.models.product.Product> executeBlocking(final ApiHttpClient client, 080 final Duration timeout) { 081 return executeBlocking(client, timeout, com.commercetools.api.models.product.Product.class); 082 } 083 084 @Override 085 public CompletableFuture<ApiHttpResponse<com.commercetools.api.models.product.Product>> execute( 086 final ApiHttpClient client) { 087 return execute(client, com.commercetools.api.models.product.Product.class); 088 } 089 090 public String getProjectKey() { 091 return this.projectKey; 092 } 093 094 public String getID() { 095 return this.ID; 096 } 097 098 public List<String> getPriceCurrency() { 099 return this.getQueryParam("priceCurrency"); 100 } 101 102 public List<String> getPriceCountry() { 103 return this.getQueryParam("priceCountry"); 104 } 105 106 public List<String> getPriceCustomerGroup() { 107 return this.getQueryParam("priceCustomerGroup"); 108 } 109 110 public List<String> getPriceChannel() { 111 return this.getQueryParam("priceChannel"); 112 } 113 114 public List<String> getLocaleProjection() { 115 return this.getQueryParam("localeProjection"); 116 } 117 118 public List<String> getExpand() { 119 return this.getQueryParam("expand"); 120 } 121 122 public void setProjectKey(final String projectKey) { 123 this.projectKey = projectKey; 124 } 125 126 public void setID(final String ID) { 127 this.ID = ID; 128 } 129 130 /** 131 * set priceCurrency with the specified value 132 * @param <TValue> value type 133 * @param priceCurrency value to be set 134 * @return ByProjectKeyProductsByIDPostString 135 */ 136 public <TValue> ByProjectKeyProductsByIDPostString withPriceCurrency(final TValue priceCurrency) { 137 return copy().withQueryParam("priceCurrency", priceCurrency); 138 } 139 140 /** 141 * add additional priceCurrency query parameter 142 * @param <TValue> value type 143 * @param priceCurrency value to be added 144 * @return ByProjectKeyProductsByIDPostString 145 */ 146 public <TValue> ByProjectKeyProductsByIDPostString addPriceCurrency(final TValue priceCurrency) { 147 return copy().addQueryParam("priceCurrency", priceCurrency); 148 } 149 150 /** 151 * set priceCurrency with the specified value 152 * @param supplier supplier for the value to be set 153 * @return ByProjectKeyProductsByIDPostString 154 */ 155 public ByProjectKeyProductsByIDPostString withPriceCurrency(final Supplier<String> supplier) { 156 return copy().withQueryParam("priceCurrency", supplier.get()); 157 } 158 159 /** 160 * add additional priceCurrency query parameter 161 * @param supplier supplier for the value to be added 162 * @return ByProjectKeyProductsByIDPostString 163 */ 164 public ByProjectKeyProductsByIDPostString addPriceCurrency(final Supplier<String> supplier) { 165 return copy().addQueryParam("priceCurrency", supplier.get()); 166 } 167 168 /** 169 * set priceCurrency with the specified value 170 * @param op builder for the value to be set 171 * @return ByProjectKeyProductsByIDPostString 172 */ 173 public ByProjectKeyProductsByIDPostString withPriceCurrency(final Function<StringBuilder, StringBuilder> op) { 174 return copy().withQueryParam("priceCurrency", op.apply(new StringBuilder())); 175 } 176 177 /** 178 * add additional priceCurrency query parameter 179 * @param op builder for the value to be added 180 * @return ByProjectKeyProductsByIDPostString 181 */ 182 public ByProjectKeyProductsByIDPostString addPriceCurrency(final Function<StringBuilder, StringBuilder> op) { 183 return copy().addQueryParam("priceCurrency", op.apply(new StringBuilder())); 184 } 185 186 /** 187 * set priceCurrency with the specified values 188 * @param <TValue> value type 189 * @param priceCurrency values to be set 190 * @return ByProjectKeyProductsByIDPostString 191 */ 192 public <TValue> ByProjectKeyProductsByIDPostString withPriceCurrency(final Collection<TValue> priceCurrency) { 193 return copy().withoutQueryParam("priceCurrency") 194 .addQueryParams(priceCurrency.stream() 195 .map(s -> new ParamEntry<>("priceCurrency", s.toString())) 196 .collect(Collectors.toList())); 197 } 198 199 /** 200 * add additional priceCurrency query parameters 201 * @param <TValue> value type 202 * @param priceCurrency values to be added 203 * @return ByProjectKeyProductsByIDPostString 204 */ 205 public <TValue> ByProjectKeyProductsByIDPostString addPriceCurrency(final Collection<TValue> priceCurrency) { 206 return copy().addQueryParams(priceCurrency.stream() 207 .map(s -> new ParamEntry<>("priceCurrency", s.toString())) 208 .collect(Collectors.toList())); 209 } 210 211 /** 212 * set priceCountry with the specified value 213 * @param <TValue> value type 214 * @param priceCountry value to be set 215 * @return ByProjectKeyProductsByIDPostString 216 */ 217 public <TValue> ByProjectKeyProductsByIDPostString withPriceCountry(final TValue priceCountry) { 218 return copy().withQueryParam("priceCountry", priceCountry); 219 } 220 221 /** 222 * add additional priceCountry query parameter 223 * @param <TValue> value type 224 * @param priceCountry value to be added 225 * @return ByProjectKeyProductsByIDPostString 226 */ 227 public <TValue> ByProjectKeyProductsByIDPostString addPriceCountry(final TValue priceCountry) { 228 return copy().addQueryParam("priceCountry", priceCountry); 229 } 230 231 /** 232 * set priceCountry with the specified value 233 * @param supplier supplier for the value to be set 234 * @return ByProjectKeyProductsByIDPostString 235 */ 236 public ByProjectKeyProductsByIDPostString withPriceCountry(final Supplier<String> supplier) { 237 return copy().withQueryParam("priceCountry", supplier.get()); 238 } 239 240 /** 241 * add additional priceCountry query parameter 242 * @param supplier supplier for the value to be added 243 * @return ByProjectKeyProductsByIDPostString 244 */ 245 public ByProjectKeyProductsByIDPostString addPriceCountry(final Supplier<String> supplier) { 246 return copy().addQueryParam("priceCountry", supplier.get()); 247 } 248 249 /** 250 * set priceCountry with the specified value 251 * @param op builder for the value to be set 252 * @return ByProjectKeyProductsByIDPostString 253 */ 254 public ByProjectKeyProductsByIDPostString withPriceCountry(final Function<StringBuilder, StringBuilder> op) { 255 return copy().withQueryParam("priceCountry", op.apply(new StringBuilder())); 256 } 257 258 /** 259 * add additional priceCountry query parameter 260 * @param op builder for the value to be added 261 * @return ByProjectKeyProductsByIDPostString 262 */ 263 public ByProjectKeyProductsByIDPostString addPriceCountry(final Function<StringBuilder, StringBuilder> op) { 264 return copy().addQueryParam("priceCountry", op.apply(new StringBuilder())); 265 } 266 267 /** 268 * set priceCountry with the specified values 269 * @param <TValue> value type 270 * @param priceCountry values to be set 271 * @return ByProjectKeyProductsByIDPostString 272 */ 273 public <TValue> ByProjectKeyProductsByIDPostString withPriceCountry(final Collection<TValue> priceCountry) { 274 return copy().withoutQueryParam("priceCountry") 275 .addQueryParams(priceCountry.stream() 276 .map(s -> new ParamEntry<>("priceCountry", s.toString())) 277 .collect(Collectors.toList())); 278 } 279 280 /** 281 * add additional priceCountry query parameters 282 * @param <TValue> value type 283 * @param priceCountry values to be added 284 * @return ByProjectKeyProductsByIDPostString 285 */ 286 public <TValue> ByProjectKeyProductsByIDPostString addPriceCountry(final Collection<TValue> priceCountry) { 287 return copy().addQueryParams(priceCountry.stream() 288 .map(s -> new ParamEntry<>("priceCountry", s.toString())) 289 .collect(Collectors.toList())); 290 } 291 292 /** 293 * set priceCustomerGroup with the specified value 294 * @param <TValue> value type 295 * @param priceCustomerGroup value to be set 296 * @return ByProjectKeyProductsByIDPostString 297 */ 298 public <TValue> ByProjectKeyProductsByIDPostString withPriceCustomerGroup(final TValue priceCustomerGroup) { 299 return copy().withQueryParam("priceCustomerGroup", priceCustomerGroup); 300 } 301 302 /** 303 * add additional priceCustomerGroup query parameter 304 * @param <TValue> value type 305 * @param priceCustomerGroup value to be added 306 * @return ByProjectKeyProductsByIDPostString 307 */ 308 public <TValue> ByProjectKeyProductsByIDPostString addPriceCustomerGroup(final TValue priceCustomerGroup) { 309 return copy().addQueryParam("priceCustomerGroup", priceCustomerGroup); 310 } 311 312 /** 313 * set priceCustomerGroup with the specified value 314 * @param supplier supplier for the value to be set 315 * @return ByProjectKeyProductsByIDPostString 316 */ 317 public ByProjectKeyProductsByIDPostString withPriceCustomerGroup(final Supplier<String> supplier) { 318 return copy().withQueryParam("priceCustomerGroup", supplier.get()); 319 } 320 321 /** 322 * add additional priceCustomerGroup query parameter 323 * @param supplier supplier for the value to be added 324 * @return ByProjectKeyProductsByIDPostString 325 */ 326 public ByProjectKeyProductsByIDPostString addPriceCustomerGroup(final Supplier<String> supplier) { 327 return copy().addQueryParam("priceCustomerGroup", supplier.get()); 328 } 329 330 /** 331 * set priceCustomerGroup with the specified value 332 * @param op builder for the value to be set 333 * @return ByProjectKeyProductsByIDPostString 334 */ 335 public ByProjectKeyProductsByIDPostString withPriceCustomerGroup(final Function<StringBuilder, StringBuilder> op) { 336 return copy().withQueryParam("priceCustomerGroup", op.apply(new StringBuilder())); 337 } 338 339 /** 340 * add additional priceCustomerGroup query parameter 341 * @param op builder for the value to be added 342 * @return ByProjectKeyProductsByIDPostString 343 */ 344 public ByProjectKeyProductsByIDPostString addPriceCustomerGroup(final Function<StringBuilder, StringBuilder> op) { 345 return copy().addQueryParam("priceCustomerGroup", op.apply(new StringBuilder())); 346 } 347 348 /** 349 * set priceCustomerGroup with the specified values 350 * @param <TValue> value type 351 * @param priceCustomerGroup values to be set 352 * @return ByProjectKeyProductsByIDPostString 353 */ 354 public <TValue> ByProjectKeyProductsByIDPostString withPriceCustomerGroup( 355 final Collection<TValue> priceCustomerGroup) { 356 return copy().withoutQueryParam("priceCustomerGroup") 357 .addQueryParams(priceCustomerGroup.stream() 358 .map(s -> new ParamEntry<>("priceCustomerGroup", s.toString())) 359 .collect(Collectors.toList())); 360 } 361 362 /** 363 * add additional priceCustomerGroup query parameters 364 * @param <TValue> value type 365 * @param priceCustomerGroup values to be added 366 * @return ByProjectKeyProductsByIDPostString 367 */ 368 public <TValue> ByProjectKeyProductsByIDPostString addPriceCustomerGroup( 369 final Collection<TValue> priceCustomerGroup) { 370 return copy().addQueryParams(priceCustomerGroup.stream() 371 .map(s -> new ParamEntry<>("priceCustomerGroup", s.toString())) 372 .collect(Collectors.toList())); 373 } 374 375 /** 376 * set priceChannel with the specified value 377 * @param <TValue> value type 378 * @param priceChannel value to be set 379 * @return ByProjectKeyProductsByIDPostString 380 */ 381 public <TValue> ByProjectKeyProductsByIDPostString withPriceChannel(final TValue priceChannel) { 382 return copy().withQueryParam("priceChannel", priceChannel); 383 } 384 385 /** 386 * add additional priceChannel query parameter 387 * @param <TValue> value type 388 * @param priceChannel value to be added 389 * @return ByProjectKeyProductsByIDPostString 390 */ 391 public <TValue> ByProjectKeyProductsByIDPostString addPriceChannel(final TValue priceChannel) { 392 return copy().addQueryParam("priceChannel", priceChannel); 393 } 394 395 /** 396 * set priceChannel with the specified value 397 * @param supplier supplier for the value to be set 398 * @return ByProjectKeyProductsByIDPostString 399 */ 400 public ByProjectKeyProductsByIDPostString withPriceChannel(final Supplier<String> supplier) { 401 return copy().withQueryParam("priceChannel", supplier.get()); 402 } 403 404 /** 405 * add additional priceChannel query parameter 406 * @param supplier supplier for the value to be added 407 * @return ByProjectKeyProductsByIDPostString 408 */ 409 public ByProjectKeyProductsByIDPostString addPriceChannel(final Supplier<String> supplier) { 410 return copy().addQueryParam("priceChannel", supplier.get()); 411 } 412 413 /** 414 * set priceChannel with the specified value 415 * @param op builder for the value to be set 416 * @return ByProjectKeyProductsByIDPostString 417 */ 418 public ByProjectKeyProductsByIDPostString withPriceChannel(final Function<StringBuilder, StringBuilder> op) { 419 return copy().withQueryParam("priceChannel", op.apply(new StringBuilder())); 420 } 421 422 /** 423 * add additional priceChannel query parameter 424 * @param op builder for the value to be added 425 * @return ByProjectKeyProductsByIDPostString 426 */ 427 public ByProjectKeyProductsByIDPostString addPriceChannel(final Function<StringBuilder, StringBuilder> op) { 428 return copy().addQueryParam("priceChannel", op.apply(new StringBuilder())); 429 } 430 431 /** 432 * set priceChannel with the specified values 433 * @param <TValue> value type 434 * @param priceChannel values to be set 435 * @return ByProjectKeyProductsByIDPostString 436 */ 437 public <TValue> ByProjectKeyProductsByIDPostString withPriceChannel(final Collection<TValue> priceChannel) { 438 return copy().withoutQueryParam("priceChannel") 439 .addQueryParams(priceChannel.stream() 440 .map(s -> new ParamEntry<>("priceChannel", s.toString())) 441 .collect(Collectors.toList())); 442 } 443 444 /** 445 * add additional priceChannel query parameters 446 * @param <TValue> value type 447 * @param priceChannel values to be added 448 * @return ByProjectKeyProductsByIDPostString 449 */ 450 public <TValue> ByProjectKeyProductsByIDPostString addPriceChannel(final Collection<TValue> priceChannel) { 451 return copy().addQueryParams(priceChannel.stream() 452 .map(s -> new ParamEntry<>("priceChannel", s.toString())) 453 .collect(Collectors.toList())); 454 } 455 456 /** 457 * set localeProjection with the specified value 458 * @param <TValue> value type 459 * @param localeProjection value to be set 460 * @return ByProjectKeyProductsByIDPostString 461 */ 462 public <TValue> ByProjectKeyProductsByIDPostString withLocaleProjection(final TValue localeProjection) { 463 return copy().withQueryParam("localeProjection", localeProjection); 464 } 465 466 /** 467 * add additional localeProjection query parameter 468 * @param <TValue> value type 469 * @param localeProjection value to be added 470 * @return ByProjectKeyProductsByIDPostString 471 */ 472 public <TValue> ByProjectKeyProductsByIDPostString addLocaleProjection(final TValue localeProjection) { 473 return copy().addQueryParam("localeProjection", localeProjection); 474 } 475 476 /** 477 * set localeProjection with the specified value 478 * @param supplier supplier for the value to be set 479 * @return ByProjectKeyProductsByIDPostString 480 */ 481 public ByProjectKeyProductsByIDPostString withLocaleProjection(final Supplier<String> supplier) { 482 return copy().withQueryParam("localeProjection", supplier.get()); 483 } 484 485 /** 486 * add additional localeProjection query parameter 487 * @param supplier supplier for the value to be added 488 * @return ByProjectKeyProductsByIDPostString 489 */ 490 public ByProjectKeyProductsByIDPostString addLocaleProjection(final Supplier<String> supplier) { 491 return copy().addQueryParam("localeProjection", supplier.get()); 492 } 493 494 /** 495 * set localeProjection with the specified value 496 * @param op builder for the value to be set 497 * @return ByProjectKeyProductsByIDPostString 498 */ 499 public ByProjectKeyProductsByIDPostString withLocaleProjection(final Function<StringBuilder, StringBuilder> op) { 500 return copy().withQueryParam("localeProjection", op.apply(new StringBuilder())); 501 } 502 503 /** 504 * add additional localeProjection query parameter 505 * @param op builder for the value to be added 506 * @return ByProjectKeyProductsByIDPostString 507 */ 508 public ByProjectKeyProductsByIDPostString addLocaleProjection(final Function<StringBuilder, StringBuilder> op) { 509 return copy().addQueryParam("localeProjection", op.apply(new StringBuilder())); 510 } 511 512 /** 513 * set localeProjection with the specified values 514 * @param <TValue> value type 515 * @param localeProjection values to be set 516 * @return ByProjectKeyProductsByIDPostString 517 */ 518 public <TValue> ByProjectKeyProductsByIDPostString withLocaleProjection(final Collection<TValue> localeProjection) { 519 return copy().withoutQueryParam("localeProjection") 520 .addQueryParams(localeProjection.stream() 521 .map(s -> new ParamEntry<>("localeProjection", s.toString())) 522 .collect(Collectors.toList())); 523 } 524 525 /** 526 * add additional localeProjection query parameters 527 * @param <TValue> value type 528 * @param localeProjection values to be added 529 * @return ByProjectKeyProductsByIDPostString 530 */ 531 public <TValue> ByProjectKeyProductsByIDPostString addLocaleProjection(final Collection<TValue> localeProjection) { 532 return copy().addQueryParams(localeProjection.stream() 533 .map(s -> new ParamEntry<>("localeProjection", s.toString())) 534 .collect(Collectors.toList())); 535 } 536 537 /** 538 * set expand with the specified value 539 * @param <TValue> value type 540 * @param expand value to be set 541 * @return ByProjectKeyProductsByIDPostString 542 */ 543 public <TValue> ByProjectKeyProductsByIDPostString withExpand(final TValue expand) { 544 return copy().withQueryParam("expand", expand); 545 } 546 547 /** 548 * add additional expand query parameter 549 * @param <TValue> value type 550 * @param expand value to be added 551 * @return ByProjectKeyProductsByIDPostString 552 */ 553 public <TValue> ByProjectKeyProductsByIDPostString addExpand(final TValue expand) { 554 return copy().addQueryParam("expand", expand); 555 } 556 557 /** 558 * set expand with the specified value 559 * @param supplier supplier for the value to be set 560 * @return ByProjectKeyProductsByIDPostString 561 */ 562 public ByProjectKeyProductsByIDPostString withExpand(final Supplier<String> supplier) { 563 return copy().withQueryParam("expand", supplier.get()); 564 } 565 566 /** 567 * add additional expand query parameter 568 * @param supplier supplier for the value to be added 569 * @return ByProjectKeyProductsByIDPostString 570 */ 571 public ByProjectKeyProductsByIDPostString addExpand(final Supplier<String> supplier) { 572 return copy().addQueryParam("expand", supplier.get()); 573 } 574 575 /** 576 * set expand with the specified value 577 * @param op builder for the value to be set 578 * @return ByProjectKeyProductsByIDPostString 579 */ 580 public ByProjectKeyProductsByIDPostString withExpand(final Function<StringBuilder, StringBuilder> op) { 581 return copy().withQueryParam("expand", op.apply(new StringBuilder())); 582 } 583 584 /** 585 * add additional expand query parameter 586 * @param op builder for the value to be added 587 * @return ByProjectKeyProductsByIDPostString 588 */ 589 public ByProjectKeyProductsByIDPostString addExpand(final Function<StringBuilder, StringBuilder> op) { 590 return copy().addQueryParam("expand", op.apply(new StringBuilder())); 591 } 592 593 /** 594 * set expand with the specified values 595 * @param <TValue> value type 596 * @param expand values to be set 597 * @return ByProjectKeyProductsByIDPostString 598 */ 599 public <TValue> ByProjectKeyProductsByIDPostString withExpand(final Collection<TValue> expand) { 600 return copy().withoutQueryParam("expand") 601 .addQueryParams( 602 expand.stream().map(s -> new ParamEntry<>("expand", s.toString())).collect(Collectors.toList())); 603 } 604 605 /** 606 * add additional expand query parameters 607 * @param <TValue> value type 608 * @param expand values to be added 609 * @return ByProjectKeyProductsByIDPostString 610 */ 611 public <TValue> ByProjectKeyProductsByIDPostString addExpand(final Collection<TValue> expand) { 612 return copy().addQueryParams( 613 expand.stream().map(s -> new ParamEntry<>("expand", s.toString())).collect(Collectors.toList())); 614 } 615 616 public String getBody() { 617 return productUpdate; 618 } 619 620 public ByProjectKeyProductsByIDPostString withBody(String productUpdate) { 621 ByProjectKeyProductsByIDPostString t = copy(); 622 t.productUpdate = productUpdate; 623 return t; 624 } 625 626 @Override 627 public boolean equals(Object o) { 628 if (this == o) 629 return true; 630 631 if (o == null || getClass() != o.getClass()) 632 return false; 633 634 ByProjectKeyProductsByIDPostString that = (ByProjectKeyProductsByIDPostString) o; 635 636 return new EqualsBuilder().append(projectKey, that.projectKey) 637 .append(ID, that.ID) 638 .append(productUpdate, that.productUpdate) 639 .isEquals(); 640 } 641 642 @Override 643 public int hashCode() { 644 return new HashCodeBuilder(17, 37).append(projectKey).append(ID).append(productUpdate).toHashCode(); 645 } 646 647 @Override 648 protected ByProjectKeyProductsByIDPostString copy() { 649 return new ByProjectKeyProductsByIDPostString(this); 650 } 651}