com.siblinks.ws.service.impl.PostServiceImpl.java Source code

Java tutorial

Introduction

Here is the source code for com.siblinks.ws.service.impl.PostServiceImpl.java

Source

/*
 * Copyright (c) 2016-2017, Tinhvan Outsourcing JSC. All rights reserved.
 *
 * No permission to use, copy, modify and distribute this software
 * and its documentation for any purpose is granted.
 * This software is provided under applicable license agreement only.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
package com.siblinks.ws.service.impl;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.DefaultTransactionDefinition;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import com.siblinks.ws.Notification.Helper.FireBaseNotification;
import com.siblinks.ws.dao.CacheObjectDao;
import com.siblinks.ws.dao.ObjectDao;
import com.siblinks.ws.filter.AuthenticationFilter;
import com.siblinks.ws.model.ActivityLogData;
import com.siblinks.ws.model.RequestData;
import com.siblinks.ws.response.Response;
import com.siblinks.ws.response.SimpleResponse;
import com.siblinks.ws.service.ActivityLogService;
import com.siblinks.ws.service.PostService;
import com.siblinks.ws.service.UserService;
import com.siblinks.ws.util.CommonUtil;
import com.siblinks.ws.util.Parameters;
import com.siblinks.ws.util.RandomString;
import com.siblinks.ws.util.SibConstants;
import com.siblinks.ws.util.StringUtil;

/**
 * {@link PostService}
 *
 * @author hungpd
 * @version 1.0
 */
@RestController
@RequestMapping("/siblinks/services/post")
public class PostServiceImpl implements PostService {

    private final Log logger = LogFactory.getLog(getClass());

    @Autowired
    private HttpServletRequest context;

    @Autowired
    ObjectDao dao;

    @Autowired
    CacheObjectDao cachedDao;

    @Autowired
    private PlatformTransactionManager transactionManager;

    @Autowired
    private Environment environment;

    @Autowired
    private UserService userservice;

    @Autowired
    private FireBaseNotification fireBaseNotification;

    @Autowired
    private ActivityLogService activityLogSerservice;

    /**
     * {@inheritDoc}
     */
    @Override
    @RequestMapping(value = "/createPost", method = RequestMethod.POST)
    public ResponseEntity<Response> createPost(@RequestParam("content") final String content,
            @RequestParam("userId") final String userId, @RequestParam("file") final MultipartFile[] files,
            @RequestParam("subjectId") final String subjectId) {
        SimpleResponse simpleResponse = null;
        MultipartFile file = null;
        try {
            if (!AuthenticationFilter.isAuthed(context)) {
                // Return authentication
                simpleResponse = new SimpleResponse(SibConstants.FAILURE, "Authentication required.");
                return new ResponseEntity<Response>(simpleResponse, HttpStatus.FORBIDDEN);
            }
            long id = 0l;
            String error = validateFileImage(files);
            if (StringUtil.isNull(content)) {
                simpleResponse = new SimpleResponse(SibConstants.FAILURE, "post", "createPost",
                        "Content is not empty.");
                return new ResponseEntity<Response>(simpleResponse, HttpStatus.OK);
            } else if (content.length() > 4000) {
                simpleResponse = new SimpleResponse(SibConstants.FAILURE, "post", "createPost",
                        "Content must be less than 4000 characters.");
                return new ResponseEntity<Response>(simpleResponse, HttpStatus.OK);
            }

            String strContent = CommonUtil.filterWord(content, cachedDao.getAllWordFilter());

            if (!StringUtil.isNull(error)) {
                // Return is not exist image
                simpleResponse = new SimpleResponse(SibConstants.FAILURE, "post", "createPost", error);
                return new ResponseEntity<Response>(simpleResponse, HttpStatus.OK);
            }
            // Get Image files
            String filePath = "";
            String pathget = environment.getProperty("directoryGetImageQuestion");
            if (files != null && files.length > 0) {
                for (int i = 0; i < files.length; i++) {
                    file = files[i];
                    filePath += pathget + uploadFile(file, "directoryImageQuestion") + ".png";
                    if (i < files.length - 1) {
                        filePath += ";";
                    }
                }
            }

            // Insert question
            id = dao.insertObject(SibConstants.SqlMapper.SQL_CREATE_QUESTION,
                    new Object[] { userId, subjectId, strContent, filePath });
            simpleResponse = new SimpleResponse("" + (id > 0), "post", "createPost", id);

        } catch (Exception e) {
            e.printStackTrace();
            logger.error(e.getMessage(), e.getCause());
            simpleResponse = new SimpleResponse(SibConstants.FAILURE, "post", "createPost", e.getMessage());
        }

        return new ResponseEntity<Response>(simpleResponse, HttpStatus.OK);
    }

    /**
     * {@inheritDoc}
     */
    @Override
    @RequestMapping(value = "/createAnswer", method = RequestMethod.POST)
    public @ResponseBody ResponseEntity<Response> createAnswer(@RequestParam("pid") final String pid,
            @RequestParam("content") final String content, @RequestParam("studentId") final String studentId,
            @RequestParam("mentorId") final String mentorId, @RequestParam("file") final MultipartFile[] files,
            @RequestParam("subjectId") final String subjectId) {

        SimpleResponse simpleResponse = null;
        TransactionStatus statusBD = null;
        try {
            if (!AuthenticationFilter.isAuthed(context)) {
                simpleResponse = new SimpleResponse(SibConstants.FAILURE, "Authentication required.");
                return new ResponseEntity<Response>(simpleResponse, HttpStatus.FORBIDDEN);
            }

            boolean status = false;
            long id = 0l;
            String error = validateFileImage(files);
            if (StringUtil.isNull(content)) {
                simpleResponse = new SimpleResponse(SibConstants.FAILURE, "post", "createAnswer",
                        "Content is not empty.");
                return new ResponseEntity<Response>(simpleResponse, HttpStatus.OK);
            } else if (content.length() > 4000) {
                simpleResponse = new SimpleResponse(SibConstants.FAILURE, "post", "createAnswer",
                        "Content must be less than 4000 characters.");
                return new ResponseEntity<Response>(simpleResponse, HttpStatus.OK);
            }
            if (!StringUtil.isNull(error)) {
                simpleResponse = new SimpleResponse(SibConstants.FAILURE, "post", "createAnswer", error);
                return new ResponseEntity<Response>(simpleResponse, HttpStatus.OK);
            }
            TransactionDefinition def = new DefaultTransactionDefinition();
            statusBD = transactionManager.getTransaction(def);
            MultipartFile file = null;
            String filePath = "";
            String pathget = environment.getProperty("directoryGetImageAnswer");
            if (files != null && files.length > 0) {
                for (int i = 0; i < files.length; i++) {
                    file = files[i];
                    filePath += pathget + uploadFile(file, "directoryImageAnswer") + ".png";
                    if (i < files.length - 1) {
                        filePath += ";";
                    }
                }
            }
            String strContent = CommonUtil.filterWord(content, cachedDao.getAllWordFilter());

            Object[] queryParamsAnswer = { pid, mentorId, strContent, filePath };
            String strContentNofi = strContent;
            if (!StringUtil.isNull(strContent) && strContent.length() > Parameters.MAX_LENGTH_TO_NOFICATION) {
                strContentNofi = strContent.substring(0, Parameters.MAX_LENGTH_TO_NOFICATION);
            }
            id = dao.insertObject(SibConstants.SqlMapper.SQL_CREATE_ANSWER, queryParamsAnswer);
            Object[] queryParams = { mentorId, studentId, SibConstants.NOTIFICATION_TYPE_ANSWER_QUESTION,
                    SibConstants.NOTIFICATION_TITLE_ANSWER_QUESTION, strContentNofi, subjectId, pid };
            dao.insertUpdateObject(SibConstants.SqlMapper.SQL_UPDATE_NUMREPLIES_QUESTION, new Object[] { pid });

            status = dao.insertUpdateObject(SibConstants.SqlMapper.SQL_CREATE_NOTIFICATION, queryParams);
            // Push message notification
            String toTokenId = userservice.getTokenUser(studentId);
            if (!StringUtil.isNull(toTokenId)) {

                fireBaseNotification.sendMessage(toTokenId, SibConstants.NOTIFICATION_TITLE_ANSWER_QUESTION,
                        SibConstants.TYPE_QUENSION_ANSWER, pid, strContent, SibConstants.NOTIFICATION_ICON,
                        SibConstants.NOTIFICATION_PRIPORITY_HIGH);
            }
            if (id > 0 && status == true) {
                status = true;
            }
            activityLogSerservice.insertActivityLog(new ActivityLogData(SibConstants.TYPE_QUENSION_ANSWER, "C",
                    "You answered a question", mentorId, pid));
            transactionManager.commit(statusBD);
            logger.info("Insert Menu success " + new Date());
            simpleResponse = new SimpleResponse("" + status, "POST", "createAnswer", status);
        } catch (Exception e) {
            e.printStackTrace();
            if (statusBD != null) {
                transactionManager.rollback(statusBD);
            }
            logger.info("Create answer Error:" + e.getMessage(), e.getCause());
            simpleResponse = new SimpleResponse(e.getMessage(), "POST", "createAnswer", e.getMessage());
        }

        return new ResponseEntity<Response>(simpleResponse, HttpStatus.OK);
    }

    /**
     * {@inheritDoc}
     */
    @Override
    @RequestMapping(value = "/editPost", method = RequestMethod.POST)
    public ResponseEntity<Response> editPost(@RequestParam("content") final String content,
            @RequestParam("qid") final String qid, @RequestParam("file") final MultipartFile[] files,
            @RequestParam("subjectId") final String subjectId,
            @RequestParam("oldImagePathEdited") final String oldImagePathEdited,
            @RequestParam("oldImagePath") final String oldImagePath) {

        SimpleResponse simpleResponse = null;
        try {
            if (!AuthenticationFilter.isAuthed(context)) {
                simpleResponse = new SimpleResponse(SibConstants.FAILURE, "Authentication required.");
                return new ResponseEntity<Response>(simpleResponse, HttpStatus.FORBIDDEN);
            }
            if (StringUtil.isNull(content)) {
                simpleResponse = new SimpleResponse(SibConstants.FAILURE, "post", "createPost",
                        "Content is not empty.");
                return new ResponseEntity<Response>(simpleResponse, HttpStatus.OK);
            } else if (content.length() > 4000) {
                simpleResponse = new SimpleResponse(SibConstants.FAILURE, "post", "createPost",
                        "Content must be less than 4000 characters.");
                return new ResponseEntity<Response>(simpleResponse, HttpStatus.OK);
            }
            String error = "";
            if (files != null && files.length > 0) {
                error = validateFileImage(files);
            }

            if (!StringUtil.isNull(error)) {
                simpleResponse = new SimpleResponse(SibConstants.FAILURE, "post", "editPost", error);
                return new ResponseEntity<Response>(simpleResponse, HttpStatus.OK);
            }

            String filePathEdited = mergeImage(oldImagePath, oldImagePathEdited);
            String maxLength = environment.getProperty("file.upload.image.length");
            String pathget = environment.getProperty("directoryGetImageQuestion");
            // Check total file length
            int totalLength = 0;
            for (String pathImage : filePathEdited.split(";")) {
                if (!StringUtil.isNull(pathImage)) {
                    String oldPathFile = environment.getProperty("directoryImageQuestion")
                            + pathImage.substring(pathImage.lastIndexOf("/"));
                    totalLength += new File(oldPathFile).length();
                }
            }

            if (files != null && files.length > 0) {
                if ((files.length + filePathEdited.split(";").length) > Integer.parseInt(maxLength)) {
                    error = "You only upload " + maxLength + " image";
                    simpleResponse = new SimpleResponse(SibConstants.FAILURE, "post", "editPost", error);
                    return new ResponseEntity<Response>(simpleResponse, HttpStatus.OK);
                }
                for (int i = 0; i < files.length; i++) {
                    totalLength += files[i].getSize();
                }
            }

            int maxSize = Integer.parseInt(environment.getProperty("file.upload.image.size"));
            if (totalLength > maxSize) {
                simpleResponse = new SimpleResponse(SibConstants.FAILURE, "post", "editPost",
                        "File size must be less than 5MB.");
            } else {
                // upload file
                String filePath = "";
                for (int i = 0; i < files.length; i++) {
                    filePath += pathget + uploadFile(files[i], "directoryImageQuestion") + ".png";
                    if (i < files.length - 1) {
                        filePath += ";";
                    }
                }
                // remove file when edit question
                removeFileEdit(oldImagePathEdited, "directoryImageQuestion");
                String strContent = CommonUtil.filterWord(content, cachedDao.getAllWordFilter());
                dao.insertUpdateObject(SibConstants.SqlMapper.SQL_POST_EDIT,
                        new Object[] { fixFilePath(filePathEdited + filePath), strContent, subjectId, qid });

                // TODO can add user edit
                // activityLogSerservice.insertActivityLog(new
                // ActivityLogData(SibConstants.TYPE_QUENSION_ANSWER, "C",
                // "You answered a question", studentId, qid));
                simpleResponse = new SimpleResponse(SibConstants.SUCCESS, "post", "editPost", "");
            }
        } catch (Exception e) {
            e.printStackTrace();
            simpleResponse = new SimpleResponse(SibConstants.FAILURE, "Post", "editPost", e.getMessage());
        }
        return new ResponseEntity<Response>(simpleResponse, HttpStatus.OK);
    }

    /**
     * {@inheritDoc}
     */
    @Override
    @RequestMapping(value = "/getPosts", method = RequestMethod.POST)
    public ResponseEntity<Response> getPosts(@RequestBody final RequestData request) {
        SimpleResponse simpleResponse = null;
        try {
            Map<String, String> queryParams = new HashMap<String, String>();

            List<Object> readObject = null;
            readObject = dao.readObjects(SibConstants.SqlMapper.SQL_GET_POSTS, queryParams);

            simpleResponse = new SimpleResponse(SibConstants.SUCCESS, request.getRequest_data_type(),
                    request.getRequest_data_method(), readObject);
        } catch (Exception e) {
            e.printStackTrace();
            simpleResponse = new SimpleResponse(SibConstants.FAILURE, "Post", "EditPost", e.getMessage());
        }
        return new ResponseEntity<Response>(simpleResponse, HttpStatus.OK);
    }

    /**
     * {@inheritDoc}
     */
    @SuppressWarnings({ "rawtypes", "unchecked" })
    @Override
    @RequestMapping(value = "/getPostInfo", method = RequestMethod.POST)
    public ResponseEntity<Response> getPostInfo(@RequestBody final RequestData request) {
        SimpleResponse simpleResponse = null;
        try {

            Object[] queryParams = new Object[] { request.getRequest_data().getPid() };

            List<Object> readObject = dao.readObjects(SibConstants.SqlMapper.SQL_GET_POST_INFO, queryParams);

            List<Object> readObject1 = dao.readObjects(SibConstants.SqlMapper.SQL_POST_GET_TAGS, queryParams);

            Map<String, Object> tags = null;
            if (readObject1 != null) {
                for (Object obj : readObject1) {
                    tags = (Map) obj;
                    Iterator<Entry<String, Object>> it = tags.entrySet().iterator();
                    while (it.hasNext()) {
                        Map.Entry pairs = it.next();
                        if (pairs.getKey().equals("pid")) {
                            it.remove();
                        }
                    }
                }
            }

            Map<String, Object> mymap = new HashMap<String, Object>();
            mymap.put("tags", readObject1);

            readObject.add(mymap);

            simpleResponse = new SimpleResponse(SibConstants.SUCCESS, request.getRequest_data_type(),
                    request.getRequest_data_method(), readObject);
        } catch (Exception e) {
            e.printStackTrace();
            simpleResponse = new SimpleResponse(SibConstants.FAILURE, "Post", "getPostInfo", e.getMessage());
        }
        return new ResponseEntity<Response>(simpleResponse, HttpStatus.OK);
    }

    /**
     * {@inheritDoc}
     */
    @Override
    @RequestMapping(value = "/getPostList", method = RequestMethod.POST)
    public ResponseEntity<Response> getPostList(@RequestBody final RequestData request) {
        SimpleResponse simpleResponse = null;
        try {
            Map<String, String> queryParams = new HashMap<String, String>();

            queryParams.put("subjectId", request.getRequest_data().getSubjectId());
            String sqlMapper = "";
            if (request.getRequest_data().getSubjectId().equals("0")) {
                sqlMapper = SibConstants.SqlMapper.SQL_GET_POST_LIST;
            } else {
                sqlMapper = SibConstants.SqlMapper.SQL_GET_POST_SUBID_LIST;
            }

            List<Object> readObject = null;
            readObject = dao.readObjects(sqlMapper, queryParams);

            simpleResponse = new SimpleResponse(SibConstants.SUCCESS, request.getRequest_data_type(),
                    request.getRequest_data_method(), readObject);
        } catch (Exception e) {
            e.printStackTrace();
            simpleResponse = new SimpleResponse(SibConstants.FAILURE, "Post", "getPostInfo", e.getMessage());
        }
        return new ResponseEntity<Response>(simpleResponse, HttpStatus.OK);
    }

    /**
     * {@inheritDoc}
     */
    @Override
    @RequestMapping(value = "/getAllQuestions", method = RequestMethod.POST)
    public ResponseEntity<Response> getAllQuestions(@RequestBody final RequestData request) {
        SimpleResponse simpleResponse = null;
        try {
            List<Object> readObject = null;
            readObject = dao.readObjects(SibConstants.SqlMapper.SQL_GET_ALL_QUESTION, new Object[] {});

            simpleResponse = new SimpleResponse(SibConstants.SUCCESS, request.getRequest_data_type(),
                    request.getRequest_data_method(), readObject);
        } catch (Exception e) {
            e.printStackTrace();
            simpleResponse = new SimpleResponse(SibConstants.FAILURE, "Post", "getPostInfo", e.getMessage());
        }
        return new ResponseEntity<Response>(simpleResponse, HttpStatus.OK);
    }

    /**
     * {@inheritDoc}
     */
    @Override
    @RequestMapping(value = "/getPostById", method = RequestMethod.POST)
    public ResponseEntity<Response> getPostById(@RequestBody final RequestData request) {
        SimpleResponse simpleResponse = null;
        TransactionStatus statusBD = null;
        try {
            Object[] queryParams = { request.getRequest_data().getPid() };
            TransactionDefinition def = new DefaultTransactionDefinition();
            statusBD = transactionManager.getTransaction(def);
            dao.insertUpdateObject(SibConstants.SqlMapper.SQL_UPDATE_VIEW_POST, queryParams);
            List<Object> readObject = dao.readObjects(SibConstants.SqlMapper.SQL_GET_POST_BY_ID, queryParams);
            transactionManager.commit(statusBD);

            simpleResponse = new SimpleResponse(SibConstants.SUCCESS, request.getRequest_data_type(),
                    request.getRequest_data_method(), readObject);
        } catch (Exception e) {
            e.printStackTrace();
            if (statusBD != null) {
                transactionManager.rollback(statusBD);
            }
            logger.info("getPostById:" + e.getMessage());

            simpleResponse = new SimpleResponse(SibConstants.FAILURE, "Post", "getPostById", e.getMessage());
        }
        return new ResponseEntity<Response>(simpleResponse, HttpStatus.OK);
    }

    /**
     * {@inheritDoc}
     */
    @Override
    @RequestMapping(value = "/getAnswerById", method = RequestMethod.POST)
    public ResponseEntity<Response> getAnswerById(@RequestBody final RequestData request) {
        SimpleResponse simpleResponse = null;
        try {
            Map<String, String> queryParams = new HashMap<String, String>();

            queryParams.put("pid", request.getRequest_data().getPid());
            List<Object> readObject = null;
            readObject = dao.readObjects(SibConstants.SqlMapper.SQL_GET_POST_ANSWER_LASTEST, queryParams);

            simpleResponse = new SimpleResponse(SibConstants.SUCCESS, request.getRequest_data_type(),
                    request.getRequest_data_method(), readObject);
        } catch (Exception e) {
            e.printStackTrace();
            simpleResponse = new SimpleResponse(SibConstants.FAILURE, "Post", "getPostById", e.getMessage());
        }
        return new ResponseEntity<Response>(simpleResponse, HttpStatus.OK);
    }

    /**
     * {@inheritDoc}
     */
    @Override
    @RequestMapping(value = "/getAnswerList", method = RequestMethod.POST)
    public ResponseEntity<Response> getAnswerList(@RequestBody final RequestData request) {
        SimpleResponse simpleResponse = null;
        try {
            Map<String, String> queryParams = new HashMap<String, String>();

            queryParams.put("pid", request.getRequest_data().getPid());
            String sqlMapper = "";
            if (request.getRequest_data().getPid().equals("0")) {
                sqlMapper = SibConstants.SqlMapper.SQL_GET_POST_ANSWER_LIST;
            } else {
                sqlMapper = SibConstants.SqlMapper.SQL_GET_POST_ANSWER_SUBID_LIST;
            }

            List<Object> readObject = null;
            readObject = dao.readObjects(sqlMapper, queryParams);

            simpleResponse = new SimpleResponse(SibConstants.SUCCESS, request.getRequest_data_type(),
                    request.getRequest_data_method(), readObject);
        } catch (Exception e) {
            e.printStackTrace();
            simpleResponse = new SimpleResponse(SibConstants.FAILURE, "Post", "getPostById", e.getMessage());
        }
        return new ResponseEntity<Response>(simpleResponse, HttpStatus.OK);
    }

    /**
     * {@inheritDoc}
     */
    @SuppressWarnings({ "rawtypes", "unchecked" })
    @Override
    @RequestMapping(value = "/getPostListPN", method = RequestMethod.POST)
    public ResponseEntity<Response> getPostListPN(@RequestBody final RequestData request) {
        SimpleResponse simpleResponse = null;
        try {
            CommonUtil util = CommonUtil.getInstance();

            Map<String, String> map = util.getLimit(request.getRequest_data().getPageno(),
                    request.getRequest_data().getLimit());

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

            queryParams.put("authorId", request.getRequest_data().getUid());
            queryParams.put("subjectId", request.getRequest_data().getSubjectId());
            queryParams.put("tId", request.getRequest_data().getTopicId());
            queryParams.put("from", map.get("from"));
            queryParams.put("to", map.get("to"));

            List<Object> readObject = null;
            if (request.getRequest_data().getSubjectId().equals("0")) {
                readObject = dao.readObjects(SibConstants.SqlMapper.SQL_GET_POST_LIST_PN, queryParams);
            } else {
                readObject = dao.readObjects(SibConstants.SqlMapper.SQL_GET_POST_LIST_SUBID_PN,
                        new Object[] { request.getRequest_data().getSubjectId(),
                                request.getRequest_data().getTopicId(), map.get(Parameters.FROM),
                                map.get(Parameters.TO) });

            }
            List<List<Object>> resParentObject = new ArrayList<List<Object>>();

            if (readObject != null) {
                for (Object object : readObject) {
                    List<Object> resChildObject = new ArrayList<Object>();
                    Map<String, Object> map1 = (Map) object;
                    String pid = (String) map1.get("pid");
                    queryParams.put("pid", pid);
                    List<Object> readObject1 = dao.readObjects(SibConstants.SqlMapper.SQL_POST_GET_TAGS,
                            queryParams);

                    Map<String, Object> tags = null;

                    try {
                        if (readObject1 != null) {
                            for (Object obj : readObject1) {
                                tags = (Map) obj;
                                Iterator<Entry<String, Object>> it = tags.entrySet().iterator();
                                while (it.hasNext()) {
                                    Map.Entry pairs = it.next();
                                    if (pairs.getKey().equals("pid")) {
                                        it.remove();
                                    }
                                }
                            }
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }

                    Map<String, Object> map2 = (Map) object;
                    String pid1 = (String) map2.get("pid");
                    queryParams.put("pid", pid1);
                    List<Object> readObject2 = dao.readObjects(SibConstants.SqlMapper.SQL_ONE_ANSWER_FORUM,
                            queryParams);

                    Map<String, Object> answer = null;

                    try {
                        if (readObject2 != null) {
                            for (Object obj : readObject2) {
                                answer = (Map) obj;
                                Iterator<Entry<String, Object>> it = answer.entrySet().iterator();
                                while (it.hasNext()) {
                                    Map.Entry pairs = it.next();
                                    if (pairs.getKey().equals("pid")) {
                                        it.remove();
                                    }
                                }
                            }
                        }
                    } catch (Exception e) {
                        logger.error(e);
                    }

                    Map<String, Object> mymap = new HashMap<String, Object>();
                    mymap.put("tags", readObject1);
                    Map<String, Object> mymap2 = new HashMap<String, Object>();
                    mymap2.put("answer", readObject2);
                    resChildObject.add(map1);
                    resChildObject.add(mymap2);
                    resChildObject.add(mymap);
                    resParentObject.add(resChildObject);
                }
            }

            String count = null;
            count = dao.getCount("GET_POST_LIST_PN_COUNT",
                    new Object[] { request.getRequest_data().getSubjectId() });

            simpleResponse = new SimpleResponse(SibConstants.SUCCESS, request.getRequest_data_type(),
                    request.getRequest_data_method(), resParentObject, count);
        } catch (Exception e) {
            e.printStackTrace();
            simpleResponse = new SimpleResponse(SibConstants.FAILURE, "Post", "getPostById", e.getMessage());
        }
        return new ResponseEntity<Response>(simpleResponse, HttpStatus.OK);
    }

    /**
     * {@inheritDoc}
     */
    @SuppressWarnings({ "rawtypes", "unchecked" })
    @Override
    @RequestMapping(value = "/getAnswerListPN", method = RequestMethod.POST)
    public ResponseEntity<Response> getAnswerListPN(@RequestBody final RequestData request) {
        SimpleResponse simpleResponse = null;
        try {
            CommonUtil util = CommonUtil.getInstance();

            Map<String, String> map = util.getLimit(request.getRequest_data().getPageno(),
                    request.getRequest_data().getLimit());

            List<Object> readObject = null;
            if (request.getRequest_data().getPid().equals("0")) {
                readObject = dao.readObjects(SibConstants.SqlMapper.SQL_GET_POST_ANSWER_LIST_PN,
                        new Object[] { Integer.parseInt(map.get("from")), Integer.parseInt(map.get("to")) });
            } else {
                readObject = dao.readObjects(SibConstants.SqlMapper.SQL_GET_POST_ANSWER_LIST_SUBID_PN,
                        new Object[] { request.getRequest_data().getPid(), Integer.parseInt(map.get("from")),
                                Integer.parseInt(map.get("to")) });
            }
            List<List<Object>> resParentObject = new ArrayList<List<Object>>();

            if (readObject != null) {
                for (Object object : readObject) {
                    List<Object> resChildObject = new ArrayList<Object>();
                    Map<String, Object> map1 = (Map) object;
                    String pid = "" + map1.get("pid");
                    List<Object> readObject1 = dao.readObjects(SibConstants.SqlMapper.SQL_POST_GET_TAGS,
                            new Object[] { pid });

                    Map<String, Object> tags = null;

                    try {
                        if (readObject1 != null) {
                            for (Object obj : readObject1) {
                                tags = (Map) obj;
                                Iterator<Entry<String, Object>> it = tags.entrySet().iterator();
                                while (it.hasNext()) {
                                    Map.Entry pairs = it.next();
                                    if (pairs.getKey().equals("pid")) {
                                        it.remove();
                                    }
                                }
                            }
                        }
                    } catch (Exception e) {
                        logger.error(e);
                    }

                    Map<String, Object> mymap = new HashMap<String, Object>();
                    mymap.put("tags", readObject1);
                    resChildObject.add(map1);
                    resChildObject.add(mymap);
                    resParentObject.add(resChildObject);
                }
            }

            String count = null;

            count = dao.getCount(SibConstants.SqlMapper.SQL_GET_POST_ANSWER_LIST_PN_COUNT,
                    new Object[] { request.getRequest_data().getPid() });

            simpleResponse = new SimpleResponse(SibConstants.SUCCESS, request.getRequest_data_type(),
                    request.getRequest_data_method(), resParentObject, count);
        } catch (Exception e) {
            e.printStackTrace();
            simpleResponse = new SimpleResponse(SibConstants.FAILURE, "Post", "getPostById", e.getMessage());
        }
        return new ResponseEntity<Response>(simpleResponse, HttpStatus.OK);
    }

    /**
     * {@inheritDoc}
     */
    @Override
    @RequestMapping(value = "/getPostListMobile", method = RequestMethod.GET)
    public ResponseEntity<Response> getPostListMobile(@RequestParam(value = "uid") final long id,
            @RequestParam final String limit, @RequestParam final String offset,
            @RequestParam final String orderType, @RequestParam final String subjectid) {
        SimpleResponse simpleResponse = null;
        try {
            Object[] queryParams = {};

            String whereClause = "";
            if (id != -1l) {
                whereClause += " AND U.userid = " + id;
            }
            if (Parameters.ANSWERED.equalsIgnoreCase(orderType)) {
                whereClause += " AND P.NUMREPLIES > 0";
            }
            if (Parameters.UNANSWERED.equalsIgnoreCase(orderType)) {
                whereClause += " AND P.NUMREPLIES = 0";
            }

            if (!"-1".equals(subjectid)) {
                whereClause += " AND P.subjectId=  " + subjectid;
            }

            whereClause += " ORDER BY P.TIMESTAMP DESC";

            if (!StringUtil.isNull(limit)) {
                whereClause += " LIMIT " + limit;
            }
            if (!StringUtil.isNull(offset)) {
                whereClause += " OFFSET " + offset;
            }
            List<Object> readObject = dao.readObjectsWhereClause(SibConstants.SqlMapper.SQL_GET_STUDENT_POSTED,
                    whereClause, queryParams);

            simpleResponse = new SimpleResponse(SibConstants.SUCCESS, "GET", "getPostListMobile", readObject);
        } catch (Exception e) {
            e.printStackTrace();
            simpleResponse = new SimpleResponse(SibConstants.FAILURE, "Post", "getPostListMobile", e.getMessage());
        }
        return new ResponseEntity<Response>(simpleResponse, HttpStatus.OK);
    }

    /**
     * {@inheritDoc}
     */
    @Override
    @RequestMapping(value = "/removePost", method = RequestMethod.POST)
    public ResponseEntity<Response> removePost(@RequestBody final RequestData request) {
        SimpleResponse simpleResponse = null;
        try {
            if (!AuthenticationFilter.isAuthed(context)) {
                simpleResponse = new SimpleResponse(SibConstants.FAILURE, "Authentication required.");
                return new ResponseEntity<Response>(simpleResponse, HttpStatus.FORBIDDEN);
            }

            Object[] queryParams = { request.getRequest_data().getPid() };
            boolean status = dao.insertUpdateObject(SibConstants.SqlMapper.SQL_REMOVE_POST, queryParams);

            if (status) {
                dao.insertUpdateObject(SibConstants.SqlMapper.SQL_REMOVE_ANSWER_BY_POST, queryParams);
            }
            simpleResponse = new SimpleResponse("" + status, request.getRequest_data_type(),
                    request.getRequest_data_method(), status);
        } catch (Exception e) {
            e.printStackTrace();
            simpleResponse = new SimpleResponse(SibConstants.FAILURE, "Post", "removePost", e.getMessage());
        }
        return new ResponseEntity<Response>(simpleResponse, HttpStatus.OK);
    }

    /**
     * {@inheritDoc}
     */
    @SuppressWarnings({ "rawtypes", "unchecked" })
    @Override
    @RequestMapping(value = "/searchPosts", method = RequestMethod.POST)
    public ResponseEntity<Response> searchPosts(@RequestBody final RequestData request) {

        SimpleResponse simpleResponse = null;
        try {
            if (!AuthenticationFilter.isAuthed(context)) {
                simpleResponse = new SimpleResponse(SibConstants.FAILURE, "Authentication required.");
                return new ResponseEntity<Response>(simpleResponse, HttpStatus.FORBIDDEN);
            }

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

            String value = request.getRequest_data().getContent().trim();
            queryParams.put("content", value);
            queryParams.put("content1", value);

            List<List<Object>> resParentObject = new ArrayList<List<Object>>();

            List<Object> readObject = null;
            readObject = dao.readObjects(SibConstants.SqlMapper.SQL_SEARCH_POST, queryParams);
            if (readObject != null) {
                for (Object object : readObject) {
                    List<Object> resChildObject = new ArrayList<Object>();
                    Map<String, Object> map = (Map) object;
                    String pid = (String) map.get("pid");
                    queryParams.put("pid", pid);
                    List<Object> readObject1 = dao.readObjects(SibConstants.SqlMapper.SQL_POST_GET_TAGS,
                            queryParams);

                    Map<String, Object> tags = null;

                    try {
                        if (readObject1 != null) {
                            for (Object obj : readObject1) {
                                tags = (Map) obj;
                                Iterator<Entry<String, Object>> it = tags.entrySet().iterator();
                                while (it.hasNext()) {
                                    Map.Entry pairs = it.next();
                                    if (pairs.getKey().equals("pid")) {
                                        it.remove();
                                    }
                                }
                            }
                        }
                    } catch (Exception e) {
                        logger.error(e);
                    }

                    Map<String, Object> mymap = new HashMap<String, Object>();
                    mymap.put("tags", readObject1);
                    resChildObject.add(map);
                    resChildObject.add(mymap);
                    resParentObject.add(resChildObject);
                }
            }

            simpleResponse = new SimpleResponse(SibConstants.SUCCESS, request.getRequest_data_type(),
                    request.getRequest_data_method(), readObject);
        } catch (Exception e) {
            e.printStackTrace();
            simpleResponse = new SimpleResponse(SibConstants.FAILURE, "Post", "removePost", e.getMessage());
        }
        return new ResponseEntity<Response>(simpleResponse, HttpStatus.OK);
    }

    /**
     * {@inheritDoc}
     */
    @Override
    @RequestMapping(value = "/editAnswer", method = RequestMethod.POST)
    public ResponseEntity<Response> editAnswer(@RequestParam("content") final String content,
            @RequestParam("aid") final String aid, @RequestParam("file") final MultipartFile[] files,
            @RequestParam("oldImagePathEdited") final String oldImagePathEdited,
            @RequestParam("oldImagePath") final String oldImagePath) {

        SimpleResponse simpleResponse = null;
        try {
            if (!AuthenticationFilter.isAuthed(context)) {
                simpleResponse = new SimpleResponse(SibConstants.FAILURE, "Authentication required.");
                return new ResponseEntity<Response>(simpleResponse, HttpStatus.FORBIDDEN);
            }

            if (StringUtil.isNull(content)) {
                simpleResponse = new SimpleResponse(SibConstants.FAILURE, "post", "editAnswer",
                        "Content is not empty.");
                return new ResponseEntity<Response>(simpleResponse, HttpStatus.OK);
            } else if (content.length() > 4000) {
                simpleResponse = new SimpleResponse(SibConstants.FAILURE, "post", "editAnswer",
                        "Content must be less than 4000 characters.");
                return new ResponseEntity<Response>(simpleResponse, HttpStatus.OK);
            }

            String error = validateFileImage(files);
            if (!StringUtil.isNull(error)) {
                simpleResponse = new SimpleResponse(SibConstants.FAILURE, "post", "editAnswer", error);
                return new ResponseEntity<Response>(simpleResponse, HttpStatus.OK);
            }
            boolean status = true;
            MultipartFile file;
            String filePathEdited = mergeImage(oldImagePath, oldImagePathEdited);
            String maxLength = environment.getProperty("file.upload.image.length");

            // Check total file length
            int totalLength = 0;
            for (String pathImage : filePathEdited.split(";")) {
                if (!StringUtil.isNull(pathImage)) {
                    String oldPathFile = environment.getProperty("directoryImageAnswer")
                            + pathImage.substring(pathImage.lastIndexOf("/"));
                    totalLength += new File(oldPathFile).length();
                }
            }

            if (files != null && files.length > 0) {
                if ((files.length + filePathEdited.split(";").length) > Integer.parseInt(maxLength)) {
                    error = "You only upload " + maxLength + " image";
                    simpleResponse = new SimpleResponse(SibConstants.FAILURE, "post", "editAnswer", error);
                    return new ResponseEntity<Response>(simpleResponse, HttpStatus.OK);
                }
                for (int i = 0; i < files.length; i++) {
                    totalLength += files[i].getSize();
                }
            }
            int maxSize = Integer.parseInt(environment.getProperty("file.upload.image.size"));
            if (totalLength > maxSize) {
                simpleResponse = new SimpleResponse(SibConstants.FAILURE, "post", "editAnswer",
                        "File size must be less than 5MB.");
            } else {
                String filePath = "";
                for (int i = 0; i < files.length; i++) {
                    file = files[i];
                    filePath += environment.getProperty("directoryGetImageAnswer")
                            + uploadFile(file, "directoryImageAnswer") + ".png";
                    if (i < files.length - 1) {
                        filePath += ";";
                    }
                }
                // remove file when edit question
                removeFileEdit(oldImagePathEdited, "directoryImageAnswer");
                String strContent = CommonUtil.filterWord(content, cachedDao.getAllWordFilter());
                dao.insertUpdateObject(SibConstants.SqlMapper.SQL_ANSWER_EDIT,
                        new Object[] { strContent, fixFilePath(filePathEdited + filePath), aid });
                simpleResponse = new SimpleResponse("" + status, "Post", "editAnswer", "");
            }

        } catch (Exception e) {
            e.printStackTrace();
            simpleResponse = new SimpleResponse(SibConstants.FAILURE, "Post", "editAnswer", e.getMessage());
        }
        return new ResponseEntity<Response>(simpleResponse, HttpStatus.OK);
    }

    /**
     * {@inheritDoc}
     */
    @Override
    @RequestMapping(value = "/removeAnswer", method = RequestMethod.POST)
    public ResponseEntity<Response> removeAnswer(@RequestBody final RequestData request) {

        SimpleResponse simpleResponse = null;
        TransactionStatus statusDB = null;
        boolean status = true;
        try {
            if (!AuthenticationFilter.isAuthed(context)) {
                simpleResponse = new SimpleResponse(SibConstants.FAILURE, "Authentication required.");
                return new ResponseEntity<Response>(simpleResponse, HttpStatus.FORBIDDEN);
            }

            Object[] queryParams = { request.getRequest_data().getAid() };
            TransactionDefinition def = new DefaultTransactionDefinition();
            statusDB = transactionManager.getTransaction(def);

            status = dao.insertUpdateObject(SibConstants.SqlMapper.SQL_SIB_NUM_REPLIES_UPDATE_DELETE, queryParams);

            status = dao.insertUpdateObject(SibConstants.SqlMapper.SQL_REMOVE_ANSWER, queryParams);
            dao.insertUpdateObject(SibConstants.SqlMapper.SQL_REMOVE_ANSWER_LIKE, queryParams);

            transactionManager.commit(statusDB);
            simpleResponse = new SimpleResponse("" + status, request.getRequest_data_type(),
                    request.getRequest_data_method(), request.getRequest_data().getAid());
        } catch (Exception e) {
            transactionManager.rollback(statusDB);
            logger.info("Delete answer Error:" + e.getMessage());
            e.printStackTrace();
            simpleResponse = new SimpleResponse(SibConstants.FAILURE, "Post", "editAnswer", e.getMessage());
        }
        return new ResponseEntity<Response>(simpleResponse, HttpStatus.OK);
    }

    /**
     * {@inheritDoc}
     */
    @Override
    @RequestMapping(value = "/updateViewQuestion", method = RequestMethod.POST)
    public @ResponseBody ResponseEntity<Response> updateViewQuestion(@RequestBody final RequestData request) {

        SimpleResponse simpleResponse = null;
        try {
            if (!AuthenticationFilter.isAuthed(context)) {
                simpleResponse = new SimpleResponse(SibConstants.FAILURE, "Authentication required.");
                return new ResponseEntity<Response>(simpleResponse, HttpStatus.FORBIDDEN);
            }

            Object[] queryParams = { request.getRequest_data().getPid() };

            boolean status = true;
            status = dao.insertUpdateObject(SibConstants.SqlMapper.SQL_UPDATE_VIEW_POST, queryParams);
            String message = "";
            if (status) {
                message = "Done";
            } else {
                message = "Fail";
            }

            simpleResponse = new SimpleResponse("" + status, request.getRequest_data_type(),
                    request.getRequest_data_method(), message);
        } catch (Exception e) {
            e.printStackTrace();
            simpleResponse = new SimpleResponse(SibConstants.FAILURE, "Post", "updateViewQuestion", e.getMessage());
        }
        return new ResponseEntity<Response>(simpleResponse, HttpStatus.OK);
    }

    /**
     * This is method get newest question by user id
     */
    @RequestMapping(value = "/getStudentPosted", method = RequestMethod.GET)
    @ResponseBody
    @Override
    public ResponseEntity<Response> getStudentPosted(@RequestParam(value = "uid") final long id,
            @RequestParam final String limit, @RequestParam final String offset,
            @RequestParam final String orderType, @RequestParam final String oldQid,
            @RequestParam final String subjectid) {
        SimpleResponse simpleResponse = null;
        try {
            Object[] queryParams = {};
            Map<String, Object> result_data = new HashMap<String, Object>();

            String whereClause = "";

            if (id != -1l) {
                whereClause += " AND U.userid = " + id;
            }
            if (Parameters.ANSWERED.equalsIgnoreCase(orderType)) {
                whereClause += " AND P.NUMREPLIES > 0";
            }
            if (Parameters.UNANSWERED.equalsIgnoreCase(orderType)) {
                whereClause += " AND P.NUMREPLIES = 0";
            }

            // if (!"-1".equals(oldQid)) {
            // whereClause += " AND P.PID > " + oldQid;
            // }

            if (!"-1".equals(subjectid)) {
                whereClause += " AND P.subjectId=  " + subjectid;
            }

            whereClause += " ORDER BY P.TIMESTAMP DESC";

            if (!StringUtil.isNull(limit)) {
                whereClause += " LIMIT " + limit;
            }
            if (!StringUtil.isNull(offset)) {
                whereClause += " OFFSET " + offset;
            }
            List<Object> readObject = dao.readObjectsWhereClause(SibConstants.SqlMapper.SQL_GET_STUDENT_POSTED,
                    whereClause, queryParams);
            if (!CollectionUtils.isEmpty(readObject)) {
                // Put list question
                result_data.put("question", readObject);

                int length = readObject.size();
                List<Object> readObjectAnswers = new ArrayList<>();
                for (int i = 0; i < length; i++) {
                    String result = readObject.get(i).toString();
                    String temp = result.substring(0, result.indexOf(","));
                    long _id = Long.parseLong(temp.substring(temp.lastIndexOf("=") + 1));
                    Object objAnwser = getAnswersList(id, _id, "", "");
                    if (objAnwser == null) {
                        readObjectAnswers.add(null);
                    } else {
                        readObjectAnswers.add(objAnwser);
                        result_data.put("answers", readObjectAnswers);
                    }
                }
            }
            simpleResponse = new SimpleResponse(SibConstants.SUCCESS, "posted", "getStudentPosted", result_data);
        } catch (Exception e) {
            e.printStackTrace();
            simpleResponse = new SimpleResponse(SibConstants.FAILURE, "Post", "getStudentPosted", e.getMessage());
        }
        return new ResponseEntity<Response>(simpleResponse, HttpStatus.OK);
    }

    /**
     * {@inheritDoc}
     */
    @RequestMapping(value = "/countQuestions", method = RequestMethod.GET)
    @ResponseBody
    @Override
    public ResponseEntity<Response> countQuestions(@RequestParam(value = "uid") final long id,
            @RequestParam final String orderType, @RequestParam final String subjectid) {
        SimpleResponse simpleResponse = null;
        try {
            Object[] queryParams = {};
            String whereClause = "";
            if (id != -1l) {
                whereClause += " AND P.authorID =  " + id;
            }
            if (Parameters.ANSWERED.equalsIgnoreCase(orderType)) {
                whereClause += " AND P.NUMREPLIES > 0";
            }
            if (Parameters.UNANSWERED.equalsIgnoreCase(orderType)) {
                whereClause += " AND P.NUMREPLIES = 0";
            }
            if (!"-1".equalsIgnoreCase(subjectid)) {
                whereClause += " AND P.subjectId = " + subjectid;
            }

            List<Object> readObject = dao.readObjectsWhereClause(
                    SibConstants.SqlMapper.SQL_GET_STUDENT_POSTED_COUNT, whereClause, queryParams);

            simpleResponse = new SimpleResponse(SibConstants.SUCCESS, "get", "countQuestions", readObject);
        } catch (Exception e) {
            e.printStackTrace();
            simpleResponse = new SimpleResponse(SibConstants.FAILURE, "Post", "countQuestions", e.getMessage());
        }
        return new ResponseEntity<Response>(simpleResponse, HttpStatus.OK);
    }

    /**
     * {@inheritDoc}
     */
    @RequestMapping(value = "/getNewestQuestion")
    @ResponseBody
    public ResponseEntity<Response> getNewestQuestion(@RequestParam(value = "page") final String from,
            @RequestParam(value = "limit") final String limit) {
        SimpleResponse simpleResponse = null;
        try {
            CommonUtil util = CommonUtil.getInstance();
            Map<String, String> limitSelect = util.getLimit(from, limit);

            Object[] queryParams = { Integer.parseInt(limitSelect.get("from")),
                    Integer.parseInt(limitSelect.get("to")) };
            List<Object> readObject = dao.readObjects(SibConstants.SqlMapper.SQL_GET_NEWEST_QUESTION, queryParams);
            String count = String.valueOf(readObject.size());
            simpleResponse = new SimpleResponse(SibConstants.SUCCESS, "get", "getNewestQuestion", readObject,
                    count);
        } catch (Exception e) {
            e.printStackTrace();
            simpleResponse = new SimpleResponse(SibConstants.FAILURE, "Post", "getNewestQuestion", e.getMessage());
        }
        return new ResponseEntity<Response>(simpleResponse, HttpStatus.OK);
    }

    /**
     * {@inheritDoc}
     */
    public Object getAnswersList(final long uid, final long id, final String limit, final String offset) {
        SimpleResponse simpleResponse = null;
        try {

            String whereClause = "";
            Object[] queryParams = { uid, id };
            whereClause += " ORDER BY X.TIMESTAMP DESC";

            if (!StringUtil.isNull(limit)) {
                whereClause += " LIMIT " + limit;
            }
            if (!StringUtil.isNull(offset)) {
                whereClause += " OFFSET " + offset;
            }

            List<Object> readObject = dao.readObjectsWhereClause(SibConstants.SqlMapper.SQL_GET_ANSWER_BY_QID,
                    whereClause, queryParams);

            simpleResponse = new SimpleResponse(SibConstants.SUCCESS, "get answer", "getAnswersList", readObject);
        } catch (Exception e) {
            e.printStackTrace();
            simpleResponse = new SimpleResponse(SibConstants.FAILURE, "Post", "getAnswersList", e.getMessage());
        }
        return new ResponseEntity<Response>(simpleResponse, HttpStatus.OK);
    }

    /**
     * {@inheritDoc}
     */
    @RequestMapping(value = "/getNewestQuestionBySubject")
    @ResponseBody
    public ResponseEntity<Response> getNewestQuestionBySubject(@RequestParam final long uid,
            @RequestParam final String limit, @RequestParam final String offset) {
        SimpleResponse simpleResponse = null;
        try {
            Object[] paramQueryGetSubjects = { uid };
            String subjectIdResult = dao
                    .readObjects(SibConstants.SqlMapper.SQL_GET_SUBJECT_REG, paramQueryGetSubjects).toString();

            String subjects = subjectIdResult.substring(subjectIdResult.indexOf("=") + 1,
                    subjectIdResult.lastIndexOf("}"));

            CommonUtil cmUtils = CommonUtil.getInstance();

            Map<String, String> pageLimit = cmUtils.getOffset(limit, offset);

            Object[] params = { uid, Integer.parseInt(pageLimit.get("limit")),
                    Integer.parseInt(pageLimit.get("offset")) };

            String whereClause = "WHERE P.subjectId IN (" + subjects
                    + ") ORDER BY P.timeStamp DESC LIMIT ? OFFSET ?;";

            List<Object> readObjectTemp = dao.readObjectsWhereClause(
                    SibConstants.SqlMapper.SQL_GET_NEWEST_QUESTION_SUBJECT, whereClause, params);
            String count = String.valueOf(readObjectTemp.size());
            simpleResponse = new SimpleResponse(SibConstants.SUCCESS, "GET", "getNewestQuestionBySubject",
                    readObjectTemp, count);
        } catch (Exception e) {
            e.printStackTrace();
            simpleResponse = new SimpleResponse(SibConstants.FAILURE, "Post", "getNewestQuestionBySubject",
                    e.getMessage());
        }
        return new ResponseEntity<Response>(simpleResponse, HttpStatus.OK);
    }

    /**
     *
     * @param uploadfile
     * @param path
     * @return
     * @throws FileNotFoundException
     */
    private String uploadFile(final MultipartFile uploadfile, final String path) throws FileNotFoundException {

        String filename = "";
        BufferedOutputStream stream = null;
        try {
            String directory = environment.getProperty(path);
            if (directory != null) {
                RandomString randomName = new RandomString();
                Date date = new Date();
                filename = randomName.random() + date.getTime();

                String filepath = Paths.get(directory, filename + "." + "png").toString();
                // Save the file locally
                File file = new File(filepath);

                File parentDir = file.getParentFile();
                if (!parentDir.exists()) {
                    parentDir.mkdirs();
                }
                stream = new BufferedOutputStream(new FileOutputStream(file));
                stream.write(uploadfile.getBytes());
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (stream != null) {
                    stream.close();
                }
            } catch (IOException e) {
                // Do nothing
            }
        }
        return filename;
    }

    /**
     * {@inheritDoc}
     */
    @Override
    @RequestMapping(value = "/getAnswerByQid", method = RequestMethod.POST)
    public ResponseEntity<Response> getAnswerByQid(@RequestBody final RequestData request) {
        SimpleResponse simpleResponse = null;
        try {
            String limit = request.getRequest_data().getLimit();
            String offset = request.getRequest_data().getOffset();
            String qid = request.getRequest_data().getPid();
            String type = request.getRequest_data().getType();
            String uid = request.getRequest_data().getUid();
            Object[] queryParams = { uid, qid };

            String entityName = SibConstants.SqlMapper.SQL_GET_ANSWER_BY_QID;

            String whereClause = "";
            if (Parameters.NEWEST.equals(type)) {
                whereClause += " ORDER BY X.TIMESTAMP DESC";
            } else if (Parameters.LIKE.equals(type)) {
                whereClause += " ORDER BY X.numlike DESC";
            } else {// oldest

                whereClause += " ORDER BY X.TIMESTAMP  ASC";
            }
            if (!StringUtil.isNull(limit)) {
                whereClause += " LIMIT " + limit;
            }
            if (!StringUtil.isNull(offset)) {
                whereClause += " OFFSET " + offset;
            }

            List<Object> readObject = dao.readObjectsWhereClause(entityName, whereClause, queryParams);

            simpleResponse = new SimpleResponse(SibConstants.SUCCESS, request.getRequest_data_type(),
                    request.getRequest_data_method(), readObject);
        } catch (Exception e) {
            e.printStackTrace();
            simpleResponse = new SimpleResponse(SibConstants.FAILURE, "Post", "getAnswerByQid", e.getMessage());
        }
        return new ResponseEntity<Response>(simpleResponse, HttpStatus.OK);
    }

    /**
     *
     * @param filename
     * @param path
     */
    // delele file
    private void delefile(final String filename, final String path) {
        String directory = environment.getProperty(path);
        String name = FilenameUtils.getName(filename);
        File file = new File(Paths.get(directory, name).toString());
        file.delete();
    }

    /**
     *
     * @param oldImagePathEdited
     * @param path
     */
    // clean file after edit image
    private void removeFileEdit(final String oldImagePathEdited, final String path) {
        if (!StringUtil.isNull(oldImagePathEdited)) {
            for (String str : oldImagePathEdited.split(";")) {
                delefile(str, path);
            }
        }
    }

    /**
     * merge Image whene edit question
     *
     * @param oldImagePath
     * @param oldImagePathEdited
     * @return
     */
    private String mergeImage(final String oldImagePath, final String oldImagePathEdited) {
        String result = "";
        if (StringUtil.isNull(oldImagePathEdited)) {
            if (!StringUtil.isNull(oldImagePath)) {
                result = oldImagePath;
            }
        } else {
            for (String str : oldImagePath.split(";")) {
                if (!StringUtil.isNull(oldImagePath)) {
                    if (!oldImagePathEdited.contains(str)) {
                        result += str + ";";
                    }
                }
            }
        }
        return result + ";";
    }

    /**
     *
     * @param str
     * @return
     */
    private String fixFilePath(final String str) {
        String result = "";
        if (StringUtil.isNull(str)) {
            return "";
        }
        if (";".equals(str.trim())) {
            return "";
        }
        String path = "";
        for (int i = 0; i < str.split(";").length; i++) {
            path = str.split(";")[i];
            if (!StringUtil.isNull(path)) {
                result += path;
                if (i < str.split(";").length - 1) {
                    result += ";";
                }
            }
        }
        return result;
    }

    /**
     * This method is validate image file type, size, length
     *
     * @param files
     *            These are file upload image
     * @return Message error
     */
    private String validateFileImage(final MultipartFile[] files) {
        String error = "";
        String name = "";
        String sample = environment.getProperty("file.upload.image.type");
        String limitSize = environment.getProperty("file.upload.image.size");
        String maxLength = environment.getProperty("file.upload.image.length");
        long totalSize = 0;
        if (files != null && files.length > 0) {
            if (files.length > Integer.parseInt(maxLength)) {
                return "You only upload " + maxLength + " image";
            }
            for (MultipartFile file : files) {
                name = file.getOriginalFilename();
                if (!StringUtil.isNull(name)) {
                    String nameExt = FilenameUtils.getExtension(name.toLowerCase());
                    boolean status = sample.contains(nameExt);
                    if (!status) {
                        return "Error Format";
                    }
                }
                totalSize += file.getSize();
            }
            if (totalSize > Long.parseLong(limitSize)) {
            }
        }
        return error;
    }
}