fr.itldev.koya.services.impl.AlfrescoRestService.java Source code

Java tutorial

Introduction

Here is the source code for fr.itldev.koya.services.impl.AlfrescoRestService.java

Source

/**
 * Koya is an alfresco module that provides a corporate orientated dataroom.
 *
 * Copyright (C) Itl Developpement 2014
 *
 * This program is free software: you can redistribute it and/or modify it under
 * the terms of the GNU Affero General Public License as published by the Free
 * Software Foundation, either version 3 of the License, or (at your option) any
 * later version.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
 * details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program. If not, see `<http://www.gnu.org/licenses/>`.
 */
package fr.itldev.koya.services.impl;

import fr.itldev.koya.model.SecuredItem;
import fr.itldev.koya.model.impl.MetaInfos;
import fr.itldev.koya.model.impl.User;
import fr.itldev.koya.model.json.AlfrescoUploadReturn;
import fr.itldev.koya.model.json.MailWrapper;
import fr.itldev.koya.services.AlfrescoService;
import fr.itldev.koya.services.exceptions.AlfrescoServiceException;
import fr.itldev.koya.services.impl.util.KoyaUtil;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.alfresco.service.namespace.QName;
import org.apache.log4j.Logger;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.type.TypeReference;
import org.springframework.core.io.Resource;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;

public class AlfrescoRestService implements AlfrescoService {

    private static final Logger logger = Logger.getLogger(AlfrescoRestService.class);

    private static final String REST_GET_SERVERINFOS = "/s/fr/itldev/koya/meta/infos";
    private static final String REST_POST_MAIL = "/s/fr/itldev/koya/global/mail";
    private static final String REST_GET_SECUREDITEM = "/s/fr/itldev/koya/global/getsecureditem/{nodeRef}";
    private static final String REST_GET_LIBVERSION = "/s/fr/itldev/koya/meta/libversion";
    protected static final String REST_POST_UPLOAD = "/s/api/upload";
    private static final String REST_GET_XPATH2NODEREF = "/s/fr/itldev/koya/global/xpath2noderef/{xPath}";

    protected static final String REST_GET_LISTCHILD_PAGINATED = "/s/fr/itldev/koya/content/list/{nodeRef}"
            + "?skipCount={skipCount}" + "&maxItems={maxItems}" + "&onlyFolders={onlyFolders}"
            + "&filterExpr={filterExpr}" + "&sortExpr={sortExpr}" + "&typeFilter={typeFilter}";

    private static final String REST_POST_COUNTCHILDREN = "/s/fr/itldev/koya/global/countchildren/{parentNodeRef}";

    private String alfrescoServerUrl;

    private RestTemplate template;

    // <editor-fold defaultstate="collapsed" desc="Getters/Setters">
    public String getAlfrescoServerUrl() {
        return alfrescoServerUrl;
    }

    public void setAlfrescoServerUrl(String alfrescoServerUrl) {
        this.alfrescoServerUrl = alfrescoServerUrl;
    }

    public RestTemplate getTemplate() {
        return template;
    }

    public void setTemplate(RestTemplate template) {
        this.template = template;
    }

    // </editor-fold>
    /**
     * Check if library version match with server one.
     */
    @Override
    public Boolean checkLibVersionMatch() {
        String serverVersion = getTemplate().getForObject(getAlfrescoServerUrl() + REST_GET_LIBVERSION,
                String.class);
        String localVersion = KoyaUtil.getLibKoyaVersion();

        Boolean match = localVersion.equals(serverVersion);
        if (!match) {
            logger.warn("LibKoya server version doesn't match local version" + " (server=" + serverVersion
                    + ";local=" + localVersion + " )");
        }

        return localVersion.equals(serverVersion);
    }

    /**
     * Get Informations about server and modules.
     *
     * @param user
     * @return
     */
    @Override
    public MetaInfos getServerInfos(User user) throws AlfrescoServiceException {
        return fromJSON(new TypeReference<MetaInfos>() {
        }, user.getRestTemplate().getForObject(getAlfrescoServerUrl() + REST_GET_SERVERINFOS, String.class));
    }

    /**
     *
     * @param user
     * @param wrapper
     * @throws AlfrescoServiceException
     */
    @Override
    public void sendMail(User user, MailWrapper wrapper) throws AlfrescoServiceException {
        if (user == null) {
            getTemplate().postForObject(alfrescoServerUrl + REST_POST_MAIL + "?guest=true", wrapper, String.class);
        } else {
            user.getRestTemplate().postForObject(alfrescoServerUrl + REST_POST_MAIL, wrapper, String.class);
        }

    }

    /**
     * Get SecuredItem from noderef reference.
     *
     * @param user
     * @param nodeRef
     * @return
     * @throws AlfrescoServiceException
     */
    @Override
    public SecuredItem getSecuredItem(User user, String nodeRef) throws AlfrescoServiceException {
        return fromJSON(new TypeReference<SecuredItem>() {
        }, user.getRestTemplate().getForObject(getAlfrescoServerUrl() + REST_GET_SECUREDITEM, String.class,
                nodeRef));
    }

    /**
     * Get NodeRef reference from xpath expression.
     *
     * @param user
     * @param nodeRef
     * @return
     * @throws AlfrescoServiceException
     */
    @Override
    public String xPathToNodeRef(User user, String nodeRef) throws AlfrescoServiceException {
        return user.getRestTemplate().getForObject(getAlfrescoServerUrl() + REST_GET_XPATH2NODEREF, String.class,
                nodeRef);

    }

    @Override
    public AlfrescoUploadReturn uploadToXpathNode(User user, Resource resource, String parentXPath)
            throws AlfrescoServiceException {
        MultiValueMap<String, Object> parts = new LinkedMultiValueMap<>();

        parts.add("filedata", resource);
        parts.add("destination", xPathToNodeRef(user, parentXPath));
        parts.add("overwrite", "true");
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.MULTIPART_FORM_DATA);
        HttpEntity<MultiValueMap<String, Object>> request = new HttpEntity<>(parts, headers);

        return fromJSON(new TypeReference<AlfrescoUploadReturn>() {
        }, user.getRestTemplate().postForObject(getAlfrescoServerUrl() + REST_POST_UPLOAD, request, String.class));
    }

    @Override
    public Integer countChildren(User user, SecuredItem parent, Set<QName> qNameFilter)
            throws AlfrescoServiceException {
        return user.getRestTemplate().postForObject(getAlfrescoServerUrl() + REST_POST_COUNTCHILDREN, qNameFilter,
                Integer.class, parent.getNodeRef());
    }

    /*
     * ================ Utils methods ==================
     */
    /**
     * Extracts noderef parts.
     *
     * @param nodeRef
     * @return
     */
    protected Map<String, String> explodeNodeRef(String nodeRef) {

        Map<String, String> exploded = new HashMap<>();

        Pattern p = Pattern.compile("(\\w+):\\/\\/(\\w+)\\/(.*)");
        Matcher m = p.matcher(nodeRef);

        if (m.find()) {
            exploded.put("store_type", m.group(1));
            exploded.put("store_id", m.group(2));
            exploded.put("id", m.group(3));

        }

        return exploded;
    }

    /**
     * Converts byte datasize to human readable
     *
     * @param bytes
     * @param si
     * @return
     */
    protected String getHumanReadableByteCount(long bytes, boolean si) {
        int unit = si ? 1000 : 1024;
        if (bytes < unit) {
            return bytes + " b";
        }
        int exp = (int) (Math.log(bytes) / Math.log(unit));
        String pre = (si ? "kMGTPE" : "KMGTPE").charAt(exp - 1) + (si ? "" : "i");
        return String.format("%.1f %so", bytes / Math.pow(unit, exp), pre);
    }

    /**
     * Return typed object from json string.
     *
     *
     * @param <T>
     * @param type
     * @param jsonPacket
     * @return
     */
    public static <T> T fromJSON(final TypeReference<T> type, final String jsonPacket) {
        T data = null;

        if (jsonPacket == null) {
            return null;
        }

        try {
            data = new ObjectMapper().readValue(jsonPacket, type);
        } catch (Exception e) {
            // Handle the problem
            logger.error(e.getMessage(), e);
        }
        return data;
    }

}