001/*
002 * (C) Copyright 2006-2018 Nuxeo SA (http://nuxeo.com/) and others.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 *     http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 *
016 * Contributors:
017 *     Nuxeo - initial API and implementation
018 *     Thierry Delprat (td@nuxeo.com)
019 *     Nuno Cunha (ncunha@nuxeo.com)
020 *
021 * $Id: JOOoConvertPluginImpl.java 18651 2007-05-13 20:28:53Z sfermigier $
022 */
023
024package org.nuxeo.ecm.platform.dublincore.service;
025
026import static org.nuxeo.ecm.core.api.event.DocumentEventTypes.ABOUT_TO_CREATE;
027import static org.nuxeo.ecm.core.api.security.SecurityConstants.SYSTEM_USERNAME;
028import static org.nuxeo.ecm.platform.dublincore.constants.DublinCoreConstants.DUBLINCORE_CONTRIBUTORS_PROPERTY;
029import static org.nuxeo.ecm.platform.dublincore.constants.DublinCoreConstants.DUBLINCORE_CREATED_DATE_PROPERTY;
030import static org.nuxeo.ecm.platform.dublincore.constants.DublinCoreConstants.DUBLINCORE_CREATOR_PROPERTY;
031import static org.nuxeo.ecm.platform.dublincore.constants.DublinCoreConstants.DUBLINCORE_ISSUED_DATE_PROPERTY;
032import static org.nuxeo.ecm.platform.dublincore.constants.DublinCoreConstants.DUBLINCORE_LAST_CONTRIBUTOR_PROPERTY;
033import static org.nuxeo.ecm.platform.dublincore.constants.DublinCoreConstants.DUBLINCORE_MODIFIED_DATE_PROPERTY;
034
035import java.io.Serializable;
036import java.util.ArrayList;
037import java.util.Arrays;
038import java.util.Calendar;
039import java.util.List;
040import java.util.Objects;
041import java.util.stream.Collectors;
042
043import org.apache.commons.lang3.ArrayUtils;
044import org.nuxeo.ecm.core.api.DocumentModel;
045import org.nuxeo.ecm.core.api.NuxeoPrincipal;
046import org.nuxeo.ecm.core.api.SystemPrincipal;
047import org.nuxeo.ecm.core.event.Event;
048import org.nuxeo.runtime.model.DefaultComponent;
049
050/**
051 * DublinCore Storage Service Implementation.
052 *
053 * @since 10.2
054 */
055public class DublinCoreStorageServiceImpl extends DefaultComponent implements DublinCoreStorageService {
056
057    @Override
058    public void setCreationDate(DocumentModel doc, Calendar creationDate) {
059        doc.setPropertyValue(DUBLINCORE_CREATED_DATE_PROPERTY, creationDate);
060    }
061
062    @Override
063    public void setCreationDate(DocumentModel doc, Calendar creationDate, Event event) {
064        setCreationDate(doc, creationDate);
065    }
066
067    @Override
068    public void setIssuedDate(DocumentModel doc, Calendar issuedDate) {
069        doc.setPropertyValue(DUBLINCORE_ISSUED_DATE_PROPERTY, issuedDate);
070    }
071
072    @Override
073    public void setModificationDate(DocumentModel doc, Calendar modificationDate) {
074        doc.setPropertyValue(DUBLINCORE_MODIFIED_DATE_PROPERTY, modificationDate);
075        if (doc.getPropertyValue(DUBLINCORE_CREATED_DATE_PROPERTY) == null) {
076            setCreationDate(doc, modificationDate);
077        }
078    }
079
080    @Override
081    public void setModificationDate(DocumentModel doc, Calendar modificationDate, Event event) {
082        setModificationDate(doc, modificationDate);
083    }
084
085    @Override
086    public void addContributor(DocumentModel doc, Event event) {
087        NuxeoPrincipal principal = Objects.requireNonNull(event.getContext().getPrincipal());
088
089        String principalName = principal.getName();
090        if (principal instanceof SystemPrincipal) {
091            principalName = ((SystemPrincipal) principal).getActingUser();
092            if (SYSTEM_USERNAME.equals(principalName) && !ABOUT_TO_CREATE.equals(event.getName())) {
093                return;
094            }
095        }
096
097        if (doc.getPropertyValue(DUBLINCORE_CREATOR_PROPERTY) == null) {
098            doc.setPropertyValue(DUBLINCORE_CREATOR_PROPERTY, principalName);
099        }
100
101        List<String> contributorsList = getSanitizedExistingContributors(doc);
102        if (!contributorsList.contains(principalName)) {
103            contributorsList.add(principalName);
104        }
105        doc.setPropertyValue(DUBLINCORE_CONTRIBUTORS_PROPERTY, (Serializable) contributorsList);
106        doc.setPropertyValue(DUBLINCORE_LAST_CONTRIBUTOR_PROPERTY, principalName);
107    }
108
109    /**
110     * Returns a "Sanitized" list of contributors according to NXP-25005
111     *
112     * @param doc The document from which the contributors list will be retrieved.
113     * @return A list of contributors without repetitions and prefixed entries.
114     */
115    protected List<String> getSanitizedExistingContributors(DocumentModel doc) {
116        String[] contributorsArray = (String[]) doc.getPropertyValue(DUBLINCORE_CONTRIBUTORS_PROPERTY);
117        if (ArrayUtils.isEmpty(contributorsArray)) {
118            return new ArrayList<>();
119        }
120        return Arrays.stream(contributorsArray)
121                     .map(DublinCoreStorageServiceImpl::stripPrincipalPrefix)
122                     .distinct()
123                     .collect(Collectors.toList());
124    }
125
126    protected static String stripPrincipalPrefix(String principal) {
127        if (principal.startsWith(NuxeoPrincipal.PREFIX)) {
128            return principal.substring(NuxeoPrincipal.PREFIX.length());
129        } else {
130            return principal;
131        }
132    }
133
134}