com.hybris.datahub.outbound.adapter.TmallAdapter.java Source code

Java tutorial

Introduction

Here is the source code for com.hybris.datahub.outbound.adapter.TmallAdapter.java

Source

/*
 * [y] hybris Platform
 *
 * Copyright (c) 2000-2016 hybris AG
 * All rights reserved.
 *
 * This software is the confidential and proprietary information of hybris
 * ("Confidential Information"). You shall not disclose such Confidential
 * Information and shall use it only in accordance with the terms of the
 * license agreement you entered into with hybris.
 */
package com.hybris.datahub.outbound.adapter;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.tuple.ImmutablePair;
import org.apache.commons.lang3.tuple.Pair;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Required;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.support.TransactionTemplate;
import org.springframework.util.CollectionUtils;

import com.google.common.base.Preconditions;
import com.google.common.collect.Lists;
import com.google.gson.Gson;
import com.google.gson.JsonObject;
import com.hybris.datahub.adapter.AdapterService;
import com.hybris.datahub.api.publication.PublicationException;
import com.hybris.datahub.domain.TargetItemMetadata;
import com.hybris.datahub.dto.item.ErrorData;
import com.hybris.datahub.dto.publication.PublicationResult;
import com.hybris.datahub.model.TargetItem;
import com.hybris.datahub.outbound.utils.CommonUtils;
import com.hybris.datahub.outbound.utils.RestTemplateUtil;
import com.hybris.datahub.paging.DataHubIdBasedPageable;
import com.hybris.datahub.paging.DataHubPage;
import com.hybris.datahub.paging.DefaultDataHubIdBasedPageRequest;
import com.hybris.datahub.runtime.domain.PublicationActionStatusType;
import com.hybris.datahub.runtime.domain.TargetSystemPublication;
import com.hybris.datahub.service.PublicationActionService;

public class TmallAdapter implements AdapterService {
    private static final Logger LOG = LoggerFactory.getLogger(TmallAdapter.class);
    public static final String EXPORT_ITEM_CODE = "exportItemCode";
    public static final String EXPORT_LOG_PATH = "marketplaceintegration/log/marketplace-log";
    private PublicationActionService publicationActionService;
    private PlatformTransactionManager transactionManager;
    private String targetSystemType;
    private int pageSize = 1000;

    @Value("${datahub.server.url}")
    protected String datahubServerUrl;

    @Autowired
    private RestTemplateUtil httpUtil;

    @Override
    public String getTargetSystemType() {
        return targetSystemType;
    }

    @Override
    public void publish(TargetSystemPublication targetSystemPublication, String serverURL)
            throws PublicationException {
        Preconditions.checkArgument(targetSystemPublication != null
                && targetSystemPublication.getTargetSystem().getTargetSystemType().equals(getTargetSystemType()));
        Preconditions.checkArgument(StringUtils.isNotEmpty(serverURL),
                "Server " + targetSystemType + " url must be provided.");

        final List<ErrorData> errors = new ArrayList<>();
        try {
            for (final TargetItemMetadata targetItemMetadata : targetSystemPublication.getTargetSystem()
                    .getTargetItemMetadata()) {
                errors.addAll(processItems(targetSystemPublication, targetItemMetadata));
            }
            completePublication(targetSystemPublication, errors);
        } catch (final Exception e) {
            LOG.error(e.getMessage(), e);
            targetSystemPublication.setStatus(PublicationActionStatusType.FAILURE);
            throw new PublicationException(
                    "Failed to send publication " + targetSystemPublication.getPublicationId() + " data to "
                            + targetSystemPublication.getTargetSystem().getTargetSystemName(),
                    e);
        }
    }

    private void completePublication(final TargetSystemPublication targetSystemPublication,
            final List<ErrorData> errors) {
        final PublicationResult publicationResult = new PublicationResult();
        publicationResult.setExportErrorDatas(errors);
        publicationActionService.completeTargetSystemPublication(targetSystemPublication.getPublicationId(),
                publicationResult);
    }

    /**
     * Gets the ItemPage.
     *
     * @param targetItemMetadata
     *           The targetItemMetadata.
     * @param targetSystemPublication
     *           The targetSystemPublication.
     * @param pageable
     *           The datahub pageable.
     * @return The datahubPage.
     */
    @SuppressWarnings("deprecation")
    public DataHubPage<TargetItem> getItemPage(final TargetItemMetadata targetItemMetadata,
            final TargetSystemPublication targetSystemPublication, final DataHubIdBasedPageable pageable) {
        return publicationActionService.findByPublication(targetSystemPublication.getPublicationId(),
                targetItemMetadata.getItemType(), pageable);
    }

    private ErrorData buildPublicationError(final TargetItem targetItem, final Exception e) {
        final ErrorData errorData = new ErrorData();
        errorData.setCanonicalItemId(targetItem.getCanonicalItem().getId());
        errorData.setCode(e.getMessage());
        errorData.setMessage(e.getMessage());
        return errorData;
    }

    private ErrorData buildPublicationError(final TargetItem targetItem, final JsonObject results) {
        final ErrorData errorData = new ErrorData();
        errorData.setCanonicalItemId(targetItem.getCanonicalItem().getId());

        final String responseCode = results.get("code").getAsString();
        final String msg = results.get("msg").getAsString();
        errorData.setCode(responseCode);
        errorData.setMessage(msg);
        return errorData;
    }

    private List<ErrorData> doPublish(final TargetItem targetItem,
            final TargetSystemPublication targetSystemPublication) {
        String content = null;
        final List<ErrorData> errors = Lists.newArrayList();
        String url = targetSystemPublication.getTargetSystem().getExportURL() + "/" + targetItem.getExportCode()
                + "?marketplaceLogUUID=";
        //      String url = targetSystemPublication.getTargetSystem().getExportURL();
        try {
            LOG.info("begin to process target item:" + targetItem.getExportCode());
            content = buildJsonFromItem(targetItem);
            final JsonObject results = httpUtil.post(url + targetItem.getField("marketplaceLogId"), content);
            final String responseCode = results.get("code").getAsString();
            final String responseMsg = results.get("msg").getAsString();

            /*
             * if ("401".equals(responseCode)) { errors.add(buildPublicationError(targetItem, results));
             * LOG.warn("Authentication was failed, please re-authenticate again!"); return errors; } else if
             * (!("0".equals(responseCode))) { errors.add(buildPublicationError(targetItem, results));
             * LOG.warn("Authentication was failed, please re-authenticate again!"); }
             */
            LOG.info("Response Code: " + responseCode);
            LOG.info("Response Msg: " + responseMsg);
            LOG.info("post json value {}", content);
        } catch (final Exception e) {
            errors.add(buildPublicationError(targetItem, e));
            LOG.error("process item error " + content, e);
            exprotLogToHybris(true, targetItem.getField("marketplaceLogId").toString(), e.toString(),
                    targetSystemPublication.getTargetSystem().getExportURL());
        }
        return errors;
    }

    private String buildJsonFromItem(final TargetItem targetItem) {

        Gson gson = CommonUtils.getGsonByBuilder(false);

        String exportCode = targetItem.getExportCode();
        Map<String, Object> fieldExportMap = new HashMap<>();
        for (Entry<String, Object> field : targetItem.getFields().entrySet()) {
            String fieldKey = field.getKey();
            if (StringUtils.isNotBlank(fieldKey)) {
                String exportAttr = targetItem.getExportCodeAttributeByName(fieldKey).get();
                //change key to export name
                fieldExportMap.put(exportAttr, field.getValue());
            }
        }
        fieldExportMap.put(EXPORT_ITEM_CODE, exportCode);
        return gson.toJson(fieldExportMap);
    }

    private List<ErrorData> processItems(final TargetSystemPublication targetSystemPublication,
            final TargetItemMetadata targetItemMetadata) {
        final List<ErrorData> errors = Lists.newArrayList();
        final TransactionTemplate template = new TransactionTemplate(transactionManager);
        Pair<Integer, Long> elementsAndLastId = new ImmutablePair<>(0, 0L);
        do {
            final Long lastProcessedId = elementsAndLastId.getRight();
            elementsAndLastId = template.execute(status -> {
                final List<? extends TargetItem> items = getItems(targetItemMetadata, targetSystemPublication,
                        makePageable(lastProcessedId));
                final Pair<Integer, Long> pageElementsAndLastId;
                if (!CollectionUtils.isEmpty(items)) {
                    for (final TargetItem targetItem : items) {
                        errors.addAll(doPublish(targetItem, targetSystemPublication));
                    }
                    pageElementsAndLastId = new ImmutablePair<>(items.size(),
                            getLastProcessedId(lastProcessedId, items));
                } else {
                    pageElementsAndLastId = new ImmutablePair<>(0, 0L);
                }
                return pageElementsAndLastId;
            });
        } while (elementsAndLastId.getRight() > 0);
        return errors;
    }

    private Long getLastProcessedId(final Long lastProcessedId, final List<? extends TargetItem> items) {
        return !CollectionUtils.isEmpty(items) ? items.get(items.size() - 1).getId() : lastProcessedId;
    }

    private List<? extends TargetItem> getItems(final TargetItemMetadata targetItemMetadata,
            final TargetSystemPublication targetSystemPublication, final DataHubIdBasedPageable pageable) {
        return publicationActionService.findTargetItemsByPublication(targetSystemPublication.getPublicationId(),
                targetItemMetadata.getItemType(), pageable);
    }

    private DefaultDataHubIdBasedPageRequest makePageable(final Long pageNumber) {
        return new DefaultDataHubIdBasedPageRequest(pageSize, pageNumber);
    }

    /**
     * @return the pageSize
     */
    public int getPageSize() {
        return pageSize;
    }

    /**
     * @param pageSize
     *           the pageSize to set
     */
    @Required
    public void setPageSize(int pageSize) {
        this.pageSize = pageSize;
    }

    /**
     * @param targetSystemType
     *           the targetSystemType to set
     */
    @Required
    public void setTargetSystemType(String targetSystemType) {
        this.targetSystemType = targetSystemType;
    }

    @Required
    public void setTransactionManager(PlatformTransactionManager transactionManager) {
        this.transactionManager = transactionManager;
    }

    /**
     * Needed by datahub.
     *
     * @param publicationActionService
     *           Publication Service needed to complete the target publication.
     */
    public PublicationActionService getPublicationActionService() {
        return publicationActionService;
    }

    /**
     * @param publicationActionService
     *           the publicationActionService to set
     */
    @Required
    public void setPublicationActionService(PublicationActionService publicationActionService) {
        this.publicationActionService = publicationActionService;
    }

    /**
     * @param httpUtil
     *           the httpUtil to set
     */
    public void setHttpUtil(RestTemplateUtil httpUtil) {
        this.httpUtil = httpUtil;
    }

    private void exprotLogToHybris(boolean isError, String actionUUID, String message, String targetUrl) {
        String url = datahubServerUrl + "/" + EXPORT_LOG_PATH;
        final JsonObject jsonObj = new JsonObject();
        jsonObj.addProperty("actionuuid", actionUUID);
        jsonObj.addProperty("actionstatus", (isError ? "ERROR" : "SUCCESS"));
        jsonObj.addProperty("message", message);
        jsonObj.addProperty("messagesource", "DH");

        final JsonObject results = httpUtil.post(url, jsonObj.toString());
        final String responseCode = results.get("code").getAsString();
    }

}