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}