// Path: example-app/example-app-backend/src/main/java/com/github/mcollovati/vaadin/exampleapp/samples/backend/data/Category.java
// public class Category implements Serializable {
// 
//     @NotNull
//     private int id;
//     @NotNull
//     private String name;
// 
//     public int getId() {
//         return id;
//     }
// 
//     public void setId(int id) {
//         this.id = id;
//     }
// 
//     public String getName() {
//         return name;
//     }
// 
//     public void setName(String name) {
//         this.name = name;
//     }
// 
//     @Override
//     public String toString() {
//         return getName();
//     }
// }
// 
// Path: example-app/example-app-backend/src/main/java/com/github/mcollovati/vaadin/exampleapp/samples/backend/data/Product.java
// public class Product implements Serializable {
// 
//     @NotNull
//     private int id = -1;
//     @NotNull
//     @Size(min = 2, message = "Product name must have at least two characters")
//     private String productName = "";
//     @Min(0)
//     private BigDecimal price = BigDecimal.ZERO;
//     private Set<Category> category;
//     @Min(value = 0, message = "Can't have negative amount in stock")
//     private int stockCount = 0;
//     @NotNull
//     private Availability availability = Availability.COMING;
// 
//     public int getId() {
//         return id;
//     }
// 
//     public void setId(int id) {
//         this.id = id;
//     }
// 
//     public String getProductName() {
//         return productName;
//     }
// 
//     public void setProductName(String productName) {
//         this.productName = productName;
//     }
// 
//     public BigDecimal getPrice() {
//         return price;
//     }
// 
//     public void setPrice(BigDecimal price) {
//         this.price = price;
//     }
// 
//     public Set<Category> getCategory() {
//         return category;
//     }
// 
//     public void setCategory(Set<Category> category) {
//         this.category = category;
//     }
// 
//     public int getStockCount() {
//         return stockCount;
//     }
// 
//     public void setStockCount(int stockCount) {
//         this.stockCount = stockCount;
//     }
// 
//     public Availability getAvailability() {
//         return availability;
//     }
// 
//     public void setAvailability(Availability availability) {
//         this.availability = availability;
//     }
// 
// }
// 
// Path: example-app/example-app-backend/src/main/java/com/github/mcollovati/vaadin/exampleapp/samples/backend/mock/MockDataService.java
// public class MockDataService extends DataService {
// 
//     private static MockDataService INSTANCE;
// 
//     private List<Product> products;
//     private List<Category> categories;
//     private int nextProductId = 0;
// 
//     private MockDataService() {
//         categories = MockDataGenerator.createCategories();
//         products = MockDataGenerator.createProducts(categories);
//         nextProductId = products.size() + 1;
//     }
// 
//     public synchronized static DataService getInstance() {
//         if (INSTANCE == null) {
//             INSTANCE = new MockDataService();
//         }
//         return INSTANCE;
//     }
// 
//     @Override
//     public synchronized List<Product> getAllProducts() {
//         return products;
//     }
// 
//     @Override
//     public synchronized List<Category> getAllCategories() {
//         return categories;
//     }
// 
//     @Override
//     public synchronized void updateProduct(Product p) {
//         if (p.getId() < 0) {
//             // New product
//             p.setId(nextProductId++);
//             products.add(p);
//             return;
//         }
//         for (int i = 0; i < products.size(); i++) {
//             if (products.get(i).getId() == p.getId()) {
//                 products.set(i, p);
//                 return;
//             }
//         }
// 
//         throw new IllegalArgumentException("No product with id " + p.getId()
//                 + " found");
//     }
// 
//     @Override
//     public synchronized Product getProductById(int productId) {
//         for (int i = 0; i < products.size(); i++) {
//             if (products.get(i).getId() == productId) {
//                 return products.get(i);
//             }
//         }
//         return null;
//     }
// 
//     @Override
//     public synchronized void deleteProduct(int productId) {
//         Product p = getProductById(productId);
//         if (p == null) {
//             throw new IllegalArgumentException("Product with id " + productId
//                     + " not found");
//         }
//         products.remove(p);
//     }
// }


import java.io.Serializable;
import java.util.Collection;
import com.github.mcollovati.vaadin.exampleapp.samples.backend.data.Category;
import com.github.mcollovati.vaadin.exampleapp.samples.backend.data.Product;
import com.github.mcollovati.vaadin.exampleapp.samples.backend.mock.MockDataService;
package com.github.mcollovati.vaadin.exampleapp.samples.backend;



/**
 * Back-end service interface for retrieving and updating product data.
 */
public abstract class DataService implements Serializable {

    public abstract Collection<Product> getAllProducts();

    public abstract Collection<Category> getAllCategories();

    public abstract void updateProduct(Product p);

    public abstract void deleteProduct(int productId);

    public abstract Product getProductById(int productId);

    public static DataService get() {
// Path: example-app/example-app-backend/src/main/java/com/github/mcollovati/vaadin/exampleapp/samples/backend/data/Category.java
// public class Category implements Serializable {
// 
//     @NotNull
//     private int id;
//     @NotNull
//     private String name;
// 
//     public int getId() {
//         return id;
//     }
// 
//     public void setId(int id) {
//         this.id = id;
//     }
// 
//     public String getName() {
//         return name;
//     }
// 
//     public void setName(String name) {
//         this.name = name;
//     }
// 
//     @Override
//     public String toString() {
//         return getName();
//     }
// }
// 
// Path: example-app/example-app-backend/src/main/java/com/github/mcollovati/vaadin/exampleapp/samples/backend/data/Product.java
// public class Product implements Serializable {
// 
//     @NotNull
//     private int id = -1;
//     @NotNull
//     @Size(min = 2, message = "Product name must have at least two characters")
//     private String productName = "";
//     @Min(0)
//     private BigDecimal price = BigDecimal.ZERO;
//     private Set<Category> category;
//     @Min(value = 0, message = "Can't have negative amount in stock")
//     private int stockCount = 0;
//     @NotNull
//     private Availability availability = Availability.COMING;
// 
//     public int getId() {
//         return id;
//     }
// 
//     public void setId(int id) {
//         this.id = id;
//     }
// 
//     public String getProductName() {
//         return productName;
//     }
// 
//     public void setProductName(String productName) {
//         this.productName = productName;
//     }
// 
//     public BigDecimal getPrice() {
//         return price;
//     }
// 
//     public void setPrice(BigDecimal price) {
//         this.price = price;
//     }
// 
//     public Set<Category> getCategory() {
//         return category;
//     }
// 
//     public void setCategory(Set<Category> category) {
//         this.category = category;
//     }
// 
//     public int getStockCount() {
//         return stockCount;
//     }
// 
//     public void setStockCount(int stockCount) {
//         this.stockCount = stockCount;
//     }
// 
//     public Availability getAvailability() {
//         return availability;
//     }
// 
//     public void setAvailability(Availability availability) {
//         this.availability = availability;
//     }
// 
// }
// 
// Path: example-app/example-app-backend/src/main/java/com/github/mcollovati/vaadin/exampleapp/samples/backend/mock/MockDataService.java
// public class MockDataService extends DataService {
// 
//     private static MockDataService INSTANCE;
// 
//     private List<Product> products;
//     private List<Category> categories;
//     private int nextProductId = 0;
// 
//     private MockDataService() {
//         categories = MockDataGenerator.createCategories();
//         products = MockDataGenerator.createProducts(categories);
//         nextProductId = products.size() + 1;
//     }
// 
//     public synchronized static DataService getInstance() {
//         if (INSTANCE == null) {
//             INSTANCE = new MockDataService();
//         }
//         return INSTANCE;
//     }
// 
//     @Override
//     public synchronized List<Product> getAllProducts() {
//         return products;
//     }
// 
//     @Override
//     public synchronized List<Category> getAllCategories() {
//         return categories;
//     }
// 
//     @Override
//     public synchronized void updateProduct(Product p) {
//         if (p.getId() < 0) {
//             // New product
//             p.setId(nextProductId++);
//             products.add(p);
//             return;
//         }
//         for (int i = 0; i < products.size(); i++) {
//             if (products.get(i).getId() == p.getId()) {
//                 products.set(i, p);
//                 return;
//             }
//         }
// 
//         throw new IllegalArgumentException("No product with id " + p.getId()
//                 + " found");
//     }
// 
//     @Override
//     public synchronized Product getProductById(int productId) {
//         for (int i = 0; i < products.size(); i++) {
//             if (products.get(i).getId() == productId) {
//                 return products.get(i);
//             }
//         }
//         return null;
//     }
// 
//     @Override
//     public synchronized void deleteProduct(int productId) {
//         Product p = getProductById(productId);
//         if (p == null) {
//             throw new IllegalArgumentException("Product with id " + productId
//                     + " not found");
//         }
//         products.remove(p);
//     }
// }


// Path: example-app/example-app-backend/src/main/java/com/github/mcollovati/vaadin/exampleapp/samples/backend/DataService.java
import java.io.Serializable;
import java.util.Collection;
import com.github.mcollovati.vaadin.exampleapp.samples.backend.data.Category;
import com.github.mcollovati.vaadin.exampleapp.samples.backend.data.Product;
import com.github.mcollovati.vaadin.exampleapp.samples.backend.mock.MockDataService;

package com.github.mcollovati.vaadin.exampleapp.samples.backend;



/**
 * Back-end service interface for retrieving and updating product data.
 */
public abstract class DataService implements Serializable {

    public abstract Collection<Product> getAllProducts();

    public abstract Collection<Category> getAllCategories();

    public abstract void updateProduct(Product p);

    public abstract void deleteProduct(int productId);

    public abstract Product getProductById(int productId);

    public static DataService get() {
        return MockDataService.getInstance();