package com.salesmanager.test.catalog; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.OutputStream; import java.math.BigDecimal; import java.sql.Date; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import org.apache.commons.io.IOUtils; import org.junit.Ignore; import org.junit.Test; import com.salesmanager.core.business.exception.ServiceException; import com.salesmanager.core.model.catalog.category.Category; import com.salesmanager.core.model.catalog.category.CategoryDescription; import com.salesmanager.core.model.catalog.product.Product; import com.salesmanager.core.model.catalog.product.attribute.ProductAttribute; import com.salesmanager.core.model.catalog.product.attribute.ProductOption; import com.salesmanager.core.model.catalog.product.attribute.ProductOptionDescription; import com.salesmanager.core.model.catalog.product.attribute.ProductOptionType; import com.salesmanager.core.model.catalog.product.attribute.ProductOptionValue; import com.salesmanager.core.model.catalog.product.attribute.ProductOptionValueDescription; import com.salesmanager.core.model.catalog.product.availability.ProductAvailability; import com.salesmanager.core.model.catalog.product.description.ProductDescription; import com.salesmanager.core.model.catalog.product.file.ProductImageSize; import com.salesmanager.core.model.catalog.product.image.ProductImage; import com.salesmanager.core.model.catalog.product.manufacturer.Manufacturer; import com.salesmanager.core.model.catalog.product.manufacturer.ManufacturerDescription; import com.salesmanager.core.model.catalog.product.price.ProductPrice; import com.salesmanager.core.model.catalog.product.price.ProductPriceDescription; import com.salesmanager.core.model.catalog.product.relationship.ProductRelationship; import com.salesmanager.core.model.catalog.product.review.ProductReview; import com.salesmanager.core.model.catalog.product.review.ProductReviewDescription; import com.salesmanager.core.model.catalog.product.type.ProductType; import com.salesmanager.core.model.content.FileContentType; import com.salesmanager.core.model.content.ImageContentFile; import com.salesmanager.core.model.content.OutputContentFile; import com.salesmanager.core.model.merchant.MerchantStore; import com.salesmanager.core.model.reference.language.Language; import junit.framework.Assert; @Ignore public class ProductTest extends com.salesmanager.test.common.AbstractSalesManagerCoreTestCase { private static final Date date = new Date(System.currentTimeMillis()); private final String IMAGE_FOLDER = "C:/doc/"; private final String IMAGE_NAME = "Hadoop.jpg"; /** * This method creates multiple products using multiple catelog APIs * @throws ServiceException */ @Test public void testCreateProduct() throws Exception { Language en = languageService.getByCode("en"); Language fr = languageService.getByCode("fr"); MerchantStore store = merchantService.getByCode(MerchantStore.DEFAULT_STORE); ProductType generalType = productTypeService.getProductType(ProductType.GENERAL_TYPE); Category book = new Category(); book.setMerchantStore(store); book.setCode("book"); CategoryDescription bookEnglishDescription = new CategoryDescription(); bookEnglishDescription.setName("Book"); bookEnglishDescription.setCategory(book); bookEnglishDescription.setLanguage(en); CategoryDescription bookFrenchDescription = new CategoryDescription(); bookFrenchDescription.setName("Livre"); bookFrenchDescription.setCategory(book); bookFrenchDescription.setLanguage(fr); List<CategoryDescription> descriptions = new ArrayList<CategoryDescription>(); descriptions.add(bookEnglishDescription); descriptions.add(bookFrenchDescription); book.setDescriptions(descriptions); categoryService.create(book); Category music = new Category(); music.setMerchantStore(store); music.setCode("music"); CategoryDescription musicEnglishDescription = new CategoryDescription(); musicEnglishDescription.setName("Music"); musicEnglishDescription.setCategory(music); musicEnglishDescription.setLanguage(en); CategoryDescription musicFrenchDescription = new CategoryDescription(); musicFrenchDescription.setName("Musique"); musicFrenchDescription.setCategory(music); musicFrenchDescription.setLanguage(fr); List<CategoryDescription> descriptions2 = new ArrayList<CategoryDescription>(); descriptions2.add(musicEnglishDescription); descriptions2.add(musicFrenchDescription); music.setDescriptions(descriptions2); categoryService.create(music); Category novell = new Category(); novell.setMerchantStore(store); novell.setCode("novell"); CategoryDescription novellEnglishDescription = new CategoryDescription(); novellEnglishDescription.setName("Novell"); novellEnglishDescription.setCategory(novell); novellEnglishDescription.setLanguage(en); CategoryDescription novellFrenchDescription = new CategoryDescription(); novellFrenchDescription.setName("Roman"); novellFrenchDescription.setCategory(novell); novellFrenchDescription.setLanguage(fr); List<CategoryDescription> descriptions3 = new ArrayList<CategoryDescription>(); descriptions3.add(novellEnglishDescription); descriptions3.add(novellFrenchDescription); novell.setDescriptions(descriptions3); novell.setParent(book); categoryService.create(novell); categoryService.addChild(book, novell); Category tech = new Category(); tech.setMerchantStore(store); tech.setCode("tech"); CategoryDescription techEnglishDescription = new CategoryDescription(); techEnglishDescription.setName("Technology"); techEnglishDescription.setCategory(tech); techEnglishDescription.setLanguage(en); CategoryDescription techFrenchDescription = new CategoryDescription(); techFrenchDescription.setName("Technologie"); techFrenchDescription.setCategory(tech); techFrenchDescription.setLanguage(fr); List<CategoryDescription> descriptions4 = new ArrayList<CategoryDescription>(); descriptions4.add(techFrenchDescription); descriptions4.add(techFrenchDescription); tech.setDescriptions(descriptions4); tech.setParent(book); categoryService.create(tech); categoryService.addChild(book, tech); Category fiction = new Category(); fiction.setMerchantStore(store); fiction.setCode("fiction"); CategoryDescription fictionEnglishDescription = new CategoryDescription(); fictionEnglishDescription.setName("Fiction"); fictionEnglishDescription.setCategory(fiction); fictionEnglishDescription.setLanguage(en); CategoryDescription fictionFrenchDescription = new CategoryDescription(); fictionFrenchDescription.setName("Sc Fiction"); fictionFrenchDescription.setCategory(fiction); fictionFrenchDescription.setLanguage(fr); List<CategoryDescription> fictiondescriptions = new ArrayList<CategoryDescription>(); fictiondescriptions.add(fictionEnglishDescription); fictiondescriptions.add(fictionFrenchDescription); fiction.setDescriptions(fictiondescriptions); fiction.setParent(novell); categoryService.create(fiction); categoryService.addChild(book, fiction); Manufacturer oreilley = new Manufacturer(); oreilley.setMerchantStore(store); oreilley.setCode("oreilley"); ManufacturerDescription oreilleyd = new ManufacturerDescription(); oreilleyd.setLanguage(en); oreilleyd.setName("O\'reilley"); oreilleyd.setManufacturer(oreilley); oreilley.getDescriptions().add(oreilleyd); manufacturerService.create(oreilley); Manufacturer packed = new Manufacturer(); packed.setMerchantStore(store); packed.setCode("packed"); ManufacturerDescription packedd = new ManufacturerDescription(); packedd.setLanguage(en); packedd.setManufacturer(packed); packedd.setName("Packed publishing"); packed.getDescriptions().add(packedd); manufacturerService.create(packed); Manufacturer novells = new Manufacturer(); novells.setMerchantStore(store); novells.setCode("novells"); ManufacturerDescription novellsd = new ManufacturerDescription(); novellsd.setLanguage(en); novellsd.setManufacturer(novells); novellsd.setName("Novells publishing"); novells.getDescriptions().add(novellsd); manufacturerService.create(novells); // PRODUCT 1 Product product = new Product(); product.setProductHeight(new BigDecimal(4)); product.setProductLength(new BigDecimal(3)); product.setProductWidth(new BigDecimal(1)); product.setSku("TB12345"); product.setManufacturer(oreilley); product.setType(generalType); product.setMerchantStore(store); // Product description ProductDescription description = new ProductDescription(); description.setName("Spring in Action"); description.setLanguage(en); description.setProduct(product); product.getDescriptions().add(description); //add category product.getCategories().add(tech); // Availability ProductAvailability availability = new ProductAvailability(); availability.setProductDateAvailable(date); availability.setProductQuantity(100); availability.setRegion("*"); availability.setProduct(product);// associate with product //productAvailabilityService.create(availability); product.getAvailabilities().add(availability); ProductPrice dprice = new ProductPrice(); dprice.setDefaultPrice(true); dprice.setProductPriceAmount(new BigDecimal(29.99)); dprice.setProductAvailability(availability); ProductPriceDescription dpd = new ProductPriceDescription(); dpd.setName("Base price"); dpd.setProductPrice(dprice); dpd.setLanguage(en); dprice.getDescriptions().add(dpd); availability.getPrices().add(dprice); /** * Create product */ productService.create(product); ProductReview review = new ProductReview(); review.setProduct(product); review.setReviewRating(new Double(4)); ProductReviewDescription reviewDescription = new ProductReviewDescription(); reviewDescription.setLanguage(en); reviewDescription.setDescription("This is a product review"); reviewDescription.setName("A review for you"); reviewDescription.setProductReview(review); review.getDescriptions().add(reviewDescription); productReviewService.create(review); review = new ProductReview(); review.setProduct(product); review.setReviewRating(new Double(5)); reviewDescription = new ProductReviewDescription(); reviewDescription.setLanguage(en); reviewDescription.setDescription("This is a second product review"); reviewDescription.setName("A new review for you"); reviewDescription.setProductReview(review); review.getDescriptions().add(reviewDescription); productReviewService.create(review); List<Product> products = productService.listByStore(store); System.out.println("Total number of items " + products.size()); //count products by category String lineage = new StringBuilder().append(book.getLineage()).toString(); List<Category> categories = categoryService.listByLineage(store, lineage); List<Long> ids = new ArrayList<Long>(); if(categories!=null && categories.size()>0) { for(Category c : categories) { System.out.println("Contains category " + c.getCode()); ids.add(c.getId()); } } List<Object[]> objs = categoryService.countProductsByCategories(store, ids); for(Object[] ob : objs) { Category c = (Category) ob[0]; System.out.println("Category " + c.getCode() + " has " + ob[1] + " items"); } //get manufacturer for given categories List<Manufacturer> manufacturers = manufacturerService.listByProductsByCategoriesId(store, ids, en); System.out.println("Number of manufacturer for all category " + manufacturers.size()); //Update product -- get first from the list Product updatableProduct = products.get(0); //Get first availability, which is the only one created ProductAvailability updatableAvailability = updatableProduct.getAvailabilities().iterator().next(); //Get first price, which is the only one created ProductPrice updatablePrice = updatableAvailability.getPrices().iterator().next(); updatablePrice.setProductPriceAmount(new BigDecimal(19.99)); //Add a second price ProductPrice anotherPrice = new ProductPrice(); anotherPrice.setCode("eco"); anotherPrice.setProductPriceAmount(new BigDecimal(1.99)); anotherPrice.setProductAvailability(updatableAvailability); ProductPriceDescription anotherPriceD = new ProductPriceDescription(); anotherPriceD.setName("Eco price"); anotherPriceD.setProductPrice(anotherPrice); anotherPriceD.setLanguage(en); anotherPrice.getDescriptions().add(anotherPriceD); updatableAvailability.getPrices().add(anotherPrice); //Update product productService.update(updatableProduct); //go and get products again products = productService.listByStore(store); updatableProduct = products.get(0); //test insert, view image testInsertImage(updatableProduct); testViewImage(updatableProduct); updatableProduct.setDateAvailable(new java.util.Date()); productService.create(updatableProduct); //go and get products again products = productService.listByStore(store); updatableProduct = products.get(0); //test create, view attribute testInsertAttribute(updatableProduct); testViewAttribute(updatableProduct); //go and get products again products = productService.listByStore(store); updatableProduct = products.get(0); testCreateRelationShip(updatableProduct); //Now remove product productService.delete(updatableProduct); } private void testViewAttribute(Product product) throws Exception { //todo fetch product Set<ProductAttribute> attributes = product.getAttributes(); for(ProductAttribute attribute : attributes) { ProductOption option = attribute.getProductOption(); ProductOptionValue optionValue = attribute.getProductOptionValue(); System.out.println("Option id " + option.getId() + " OptionValue id " + optionValue.getId()); } } private void testInsertAttribute(Product product) throws Exception { /** * An attribute can be created dynamicaly but the attached Option and Option value need to exist */ MerchantStore store = product.getMerchantStore(); Language en = languageService.getByCode("en"); /** * Create an option */ ProductOption option = new ProductOption(); option.setMerchantStore(store); option.setCode("copy"); option.setProductOptionType(ProductOptionType.Radio.name()); ProductOptionDescription optionDescription = new ProductOptionDescription(); optionDescription.setLanguage(en); optionDescription.setName("Book type"); optionDescription.setDescription("Offered in hard and soft copy"); optionDescription.setProductOption(option); option.getDescriptions().add(optionDescription); //create option productOptionService.saveOrUpdate(option); //option value ProductOptionValue soft = new ProductOptionValue(); soft.setMerchantStore(store); soft.setCode("soft"); ProductOptionValueDescription softDescription = new ProductOptionValueDescription(); softDescription.setLanguage(en); softDescription.setName("Soft"); softDescription.setDescription("Soft copy"); softDescription.setProductOptionValue(soft); soft.getDescriptions().add(softDescription); //create an option value productOptionValueService.saveOrUpdate(soft); //another option value ProductOptionValue hard = new ProductOptionValue(); hard.setMerchantStore(store); hard.setCode("hard"); ProductOptionValueDescription hardDescription = new ProductOptionValueDescription(); hardDescription.setLanguage(en); hardDescription.setName("Hard"); hardDescription.setDescription("Hard copy"); hardDescription.setProductOptionValue(hard); hard.getDescriptions().add(hardDescription); //create another option value productOptionValueService.saveOrUpdate(hard); /** create attributes **/ //attributes ProductAttribute attribute = new ProductAttribute(); attribute.setProduct(product); attribute.setProductOption(option); attribute.setAttributeDefault(true); attribute.setProductAttributePrice(new BigDecimal(0));//no price variation attribute.setProductAttributeWeight(new BigDecimal(1));//weight variation attribute.setProductOptionValue(hard); product.getAttributes().add(attribute); //another attribute attribute = new ProductAttribute(); attribute.setProduct(product); attribute.setProductOption(option); attribute.setProductAttributePrice(new BigDecimal(0));//no price variation attribute.setProductAttributeWeight(new BigDecimal(0));//no weight variation attribute.setProductOption(option); attribute.setProductOptionValue(soft); product.getAttributes().add(attribute); productService.update(product); } /** * Images * @param product * @throws Exception */ private void testInsertImage(Product product) throws Exception { ProductImage productImage = new ProductImage(); File file1 = new File( IMAGE_FOLDER + IMAGE_NAME); if ( !file1.exists() || !file1.canRead() ) { throw new ServiceException( "Can't read" + file1.getAbsolutePath() ); } byte[] is = IOUtils.toByteArray( new FileInputStream( file1 ) ); ByteArrayInputStream inputStream = new ByteArrayInputStream( is ); ImageContentFile cmsContentImage = new ImageContentFile(); cmsContentImage.setFileName( file1.getName() ); cmsContentImage.setFile( inputStream ); cmsContentImage.setFileContentType(FileContentType.PRODUCT); productImage.setProductImage(file1.getName()); productImage.setProduct(product); //absolutely required otherwise the file is not created on disk productImage.setImage(inputStream); product.getImages().add(productImage); productService.update(product);//saves the ProductImage entity and the file on disk } private void testViewImage(Product product) throws Exception { ProductImage productImage = product.getProductImage(); //equivalent //productImage = productImageService.getById(productImage.getId()); //get physical small image OutputContentFile contentFile = productImageService.getProductImage(product.getMerchantStore().getCode(), product.getSku(), productImage.getProductImage(), ProductImageSize.SMALL); Assert.assertNotNull(contentFile); //print small image OutputStream outputStream = new FileOutputStream (IMAGE_FOLDER + "productImage_small_" + contentFile.getFileName()); ByteArrayOutputStream baos = contentFile.getFile(); baos.writeTo(outputStream); //get physical original image contentFile = productImageService.getProductImage(product.getMerchantStore().getCode(), product.getSku(), productImage.getProductImage(), ProductImageSize.LARGE); Assert.assertNotNull(contentFile); //print large image outputStream = new FileOutputStream (IMAGE_FOLDER + "productImage_large_" + contentFile.getFileName()); baos = contentFile.getFile(); baos.writeTo(outputStream); } private void testCreateRelationShip(Product product) throws Exception { MerchantStore store = merchantService.getByCode(MerchantStore.DEFAULT_STORE); Language en = languageService.getByCode("en"); Manufacturer oreilley = manufacturerService.getByCode(store, "oreilley"); ProductType generalType = productTypeService.getProductType(ProductType.GENERAL_TYPE); Category tech = categoryService.getByCode(store, "tech"); //create new related product // PRODUCT 1 Product related = new Product(); related.setProductHeight(new BigDecimal(4)); related.setProductLength(new BigDecimal(3)); related.setProductWidth(new BigDecimal(1)); related.setSku("TB67891"); related.setManufacturer(oreilley); related.setType(generalType); related.setMerchantStore(store); // Product description ProductDescription description = new ProductDescription(); description.setName("Spring 4 in Action"); description.setLanguage(en); description.setProduct(related); product.getDescriptions().add(description); //add category product.getCategories().add(tech); // Availability ProductAvailability availability = new ProductAvailability(); availability.setProductDateAvailable(date); availability.setProductQuantity(200); availability.setRegion("*"); availability.setProduct(related);// associate with product //productAvailabilityService.create(availability); related.getAvailabilities().add(availability); ProductPrice dprice = new ProductPrice(); dprice.setDefaultPrice(true); dprice.setProductPriceAmount(new BigDecimal(39.99)); dprice.setProductAvailability(availability); ProductPriceDescription dpd = new ProductPriceDescription(); dpd.setName("Base price"); dpd.setProductPrice(dprice); dpd.setLanguage(en); dprice.getDescriptions().add(dpd); availability.getPrices().add(dprice); related.getAvailabilities().add(availability); productService.save(related); ProductRelationship relationship = new ProductRelationship(); relationship.setActive(true); relationship.setCode("spring"); relationship.setProduct(product); relationship.setRelatedProduct(related); relationship.setStore(store); //because relationships are nor joined fetched, make sure you query relationships first, then ad to an existing list //so relationship and review are they only objects not joined fetch when querying a product //need to do a subsequent query List<ProductRelationship> relationships = productRelationshipService.listByProduct(product); relationships.add(relationship); product.setRelationships(new HashSet<ProductRelationship>(relationships)); productService.save(product); } }