001package org.nuxeo.elasticsearch.audit.pageprovider;
002
003import java.util.ArrayList;
004import java.util.List;
005
006import org.apache.commons.logging.Log;
007import org.apache.commons.logging.LogFactory;
008import org.nuxeo.ecm.core.api.CoreSession;
009import org.nuxeo.ecm.core.api.DocumentModel;
010import org.nuxeo.ecm.core.api.SortInfo;
011import org.nuxeo.ecm.platform.audit.api.document.AdditionalDocumentAuditParams;
012import org.nuxeo.ecm.platform.audit.api.document.DocumentAuditHelper;
013
014public class ESDocumentHistoryPageProvider extends ESAuditPageProvider {
015
016    private static final long serialVersionUID = 1L;
017
018    protected Log log = LogFactory.getLog(ESDocumentHistoryPageProvider.class);
019
020    protected Object[] newParams;
021
022    protected static String singleQuery = "            {\n" + "                \"bool\" : {\n"
023            + "                  \"must\" : {\n" + "                    \"match\" : {\n"
024            + "                      \"docUUID\" : {\n" + "                        \"query\" : \"?\",\n"
025            + "                        \"type\" : \"boolean\"\n" + "                      }\n"
026            + "                    }\n" + "                  }\n" + "                }\n"
027            + "              }          \n" + "";
028
029    protected static String complexQuery = "{\n" + "    \"filtered\" : {\n" + "        \"query\" : {\n"
030            + "            \"match_all\" : { }\n" + "        },\n" + "        \"filter\" : {\n"
031            + "            \"or\" : [\n" + "                {\n"
032            + "                    \"term\" : { \"docUUID\" : \"?\" }\n" + "                },\n"
033            + "                {\n" + "                    \"bool\" : {\n" + "                      \"must\" : [{\n"
034            + "                        \"term\" : { \"docUUID\" : \"?\" }\n" + "                      },\n"
035            + "                      {\n" + "                        \"range\" : {\n"
036            + "                          \"eventDate\" :  { \"lte\" : \"?\"}\n" + "                        }\n"
037            + "                      }]\n" + "                  }\n" + "                }\n" + "            ]\n"
038            + "        }\n" + "    }\n" + "}\n" + "\n" + "";
039
040    @Override
041    protected String getFixedPart() {
042        if (getParameters().length == 3) {
043            return complexQuery;
044        } else {
045            return singleQuery;
046        }
047    }
048
049    @Override
050    public List<SortInfo> getSortInfos() {
051
052        List<SortInfo> sort = super.getSortInfos();
053        if (sort == null || sort.size() == 0) {
054            sort = new ArrayList<SortInfo>();
055            sort.add(new SortInfo("eventDate", true));
056            sort.add(new SortInfo("id", true));
057        }
058        return sort;
059    }
060
061    @Override
062    public Object[] getParameters() {
063        if (newParams == null) {
064            Object[] params = super.getParameters();
065            if (params.length != 1) {
066                log.error(this.getClass().getSimpleName()
067                        + " Expect only one parameter the document uuid, unexpected behavior may occur");
068            }
069            CoreSession session;
070            String uuid;
071            if (params[0] instanceof DocumentModel) {
072                DocumentModel doc = (DocumentModel) params[0];
073                uuid = doc.getId();
074                session = doc.getCoreSession();
075            } else {
076                session = (CoreSession) getProperties().get(CORE_SESSION_PROPERTY);
077                uuid = params[0].toString();
078            }
079            if (session != null) {
080                AdditionalDocumentAuditParams additionalParams = DocumentAuditHelper.getAuditParamsForUUID(uuid,
081                        session);
082                if (additionalParams != null) {
083                    newParams = new Object[] { uuid, additionalParams.getTargetUUID(), additionalParams.getMaxDate() };
084                } else {
085                    newParams = new Object[] { uuid };
086                }
087            } else {
088                log.warn("No core session found: cannot compute all info to get complete audit entries");
089                return params;
090            }
091        }
092        return newParams;
093    }
094
095    @Override
096    public boolean hasChangedParameters(Object[] parameters) {
097        return getParametersChanged(this.parameters, parameters);
098    }
099
100}