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}