package org.onehippo.forge.konakart.gogreen.hippo.visitor;
import org.apache.commons.lang.StringUtils;
import org.onehippo.forge.konakart.gogreen.database.helper.ProductHelper;
import org.onehippo.forge.konakart.gogreen.database.loader.CategoryLoader;
import org.onehippo.forge.konakart.gogreen.database.utils.LanguageUtil;
import org.onehippo.forge.konakart.gogreen.database.vo.ProductDescriptionVo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.jcr.*;
import javax.jcr.nodetype.NodeTypeDefinition;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
*
*/
public class CreateProductsVisitor implements Visitor {
public static final Logger log = LoggerFactory.getLogger(CreateProductsVisitor.class);
private String imagesFolder;
public CreateProductsVisitor(String imagesFolder) {
this.imagesFolder = imagesFolder;
}
@Override
public void visit(Node node) {
try {
NodeTypeDefinition nodeTypeDefinition = node.getPrimaryNodeType();
if (nodeTypeDefinition.getName().equals("hippogogreen:product")) {
// Get the name from the handle
log.debug(node.getName());
String name = node.getName();
if (node.getParent().hasNode("hippo:translation")) {
name = node.getParent().getNode("hippo:translation").getProperty("hippo:message").getString();
} else {
log.debug("No translation node");
}
ProductHelper productHelper = new ProductHelper();
productHelper.setCreationDate(node.getProperty("hippostdpubwf:creationDate").getDate());
productHelper.setLastModificationDate(node.getProperty("hippostdpubwf:lastModificationDate").getDate());
productHelper.setPublicationDate(node.getProperty("hippostdpubwf:publicationDate").getDate());
productHelper.setName(name);
// Set the categories
Property categoriesProp = node.getProperty("hippogogreen:categories");
List<Integer> cats = new ArrayList<Integer>();
if (categoriesProp.isMultiple()) {
Value[] categories = categoriesProp.getValues();
for (Value category : categories) {
int catId = CategoryLoader.getCategoryId(category.getString());
if (catId != -1) {
cats.add(catId);
}
}
} else {
String cat = categoriesProp.getString();
// try to find the category by the name of the parent folders
if (StringUtils.isBlank(cat)) {
Node currentNode = node;
Node parent = node.getParent();
while (!StringUtils.equalsIgnoreCase(parent.getName(), "products")) {
currentNode = parent;
parent = parent.getParent();
}
cat = currentNode.getNode("hippo:translation").getProperty("hippo:message").getString();
}
int catId = CategoryLoader.getCategoryId(cat);
if (catId != -1) {
cats.add(catId);
}
}
if (cats.isEmpty()) {
cats.add(CategoryLoader.getCategoryId(CategoryLoader.DEFAULT_CAT));
}
productHelper.setCategories(cats);
// Set the price
productHelper.setPrice(node.getProperty("hippogogreen:price").getDouble());
// Set the images
NodeIterator imagesIterator = node.getNodes("hippogogreen:image");
boolean hasImages = false;
while (imagesIterator.hasNext()) {
Node imageNodeDocBase = imagesIterator.nextNode();
String id = imageNodeDocBase.getProperty("hippo:docbase").getString();
Node imageHandleNode = node.getSession().getNodeByIdentifier(id);
if (imageHandleNode.hasNode(imageHandleNode.getName())) {
hasImages = true;
String imageName = StringUtils.substringAfter(imageHandleNode.getPath(), imagesFolder);
productHelper.addImage(imageName);
}
}
List<String> supportedTranslations = new ArrayList<String>();
supportedTranslations.addAll(Arrays.asList("en", "fr", "nl", "it", "de", "es", "zh", "ru"));
Node translationsNode = node.getNode("hippotranslation:translations");
NodeIterator nodeIterator = translationsNode.getNodes();
while (nodeIterator.hasNext()) {
Node translationNode = nodeIterator.nextNode();
String translationNodeName = translationNode.getName();
if (supportedTranslations.contains(translationNodeName)) {
supportedTranslations.remove(translationNodeName);
productHelper.addDescription(createDescription(translationNode, LanguageUtil.getMappingTranslations(translationNodeName)));
}
}
// Generate garbage information for the translation that are not available
for (String availableTranslation : supportedTranslations) {
productHelper.addDescription(createNotAvailableDescription(availableTranslation));
}
// Don't sync products without any images.
if (hasImages) {
int productId = productHelper.process();
ProductHelper.productsMapping.put(node.getParent().getIdentifier(), productId);
}
}
} catch (RepositoryException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
private ProductDescriptionVo createNotAvailableDescription(String availableTranslation) {
ProductDescriptionVo description = new ProductDescriptionVo();
description.setLocale(LanguageUtil.getMappingTranslations(availableTranslation));
description.setTitle("NO TRANSLATION YET");
description.setDescription("NO TRANSLATION YET");
return description;
}
private ProductDescriptionVo createDescription(Node node, String locale) throws RepositoryException {
ProductDescriptionVo description = new ProductDescriptionVo();
description.setLocale(locale);
description.setTitle(node.getProperty("hippogogreen:title").getString());
String htmlDescription = node.getNode("hippogogreen:description").getProperty("hippostd:content").getString();
htmlDescription = StringUtils.remove(htmlDescription, "<html>");
htmlDescription = StringUtils.remove(htmlDescription, "</html>");
htmlDescription = StringUtils.remove(htmlDescription, "<body>");
htmlDescription = StringUtils.remove(htmlDescription, "</body>");
description.setDescription(StringUtils.trim(htmlDescription));
// Set the summary
description.setSummary(node.getProperty("hippogogreen:summary").getString());
return description;
}
}