/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
<<<<<<< Updated upstream
 *
 *     https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
=======
 * 
 *     https://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software 
 * distributed under the License is distributed on an "AS IS" BASIS, 
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
 * See the License for the specific language governing permissions and 
>>>>>>> Stashed changes
 * limitations under the License.
 */
package org.apache.jdo.tck.pc.shoppingcart;

import java.io.Serializable;

/** This class represents a product that you would buy from an online store. */
public class Product implements Serializable {

  private static final long serialVersionUID = 1L;

  /** Identity field when used with application identity */
  protected String sku;

  protected String description;

  /** No-arg constructor required by JDO; not for public consumption */
  protected Product() {}

  /**
   * Domain model constructor
   *
   * @param sku identity field
   */
  public Product(String sku) {
    setSku(sku);
  }

  /**
   * Constructor with sku and description
   *
   * @param sku identity field
   * @param description description
   */
  public Product(String sku, String description) {
    this(sku);
    setDescription(description);
  }

  public String getDescription() {
    return description;
  }

  public void setDescription(String description) {
    this.description = description;
  }

  public String getSku() {
    return sku;
  }

  public void setSku(String sku) {
    if (sku == null || (sku = sku.trim()).length() == 0) {
      throw new IllegalArgumentException("no sku given");
    }
    this.sku = sku.toUpperCase();
  }

  public static class Oid implements Serializable {

    private static final long serialVersionUID = 1L;

    public String sku;

    public Oid() {}

    public Oid(String s) {
      sku = justTheSku(s);
    }

    public String toString() {
      return this.getClass().getName() + ":" + sku;
    }

    public int hashCode() {
      return sku.hashCode();
    }

    public boolean equals(Object other) {
      if (other != null && (other instanceof Oid)) {
        Oid that = (Oid) other;
        return that.sku.equals(this.sku);
      }
      return false;
    }

    protected static String justTheSku(String str) {
      return str.substring(str.indexOf(':') + 1);
    }
  }
}
