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.security.Principal; 037import java.util.ArrayList; 038import java.util.Arrays; 039import java.util.Calendar; 040import java.util.List; 041import java.util.Objects; 042import java.util.stream.Collectors; 043 044import org.apache.commons.lang3.ArrayUtils; 045import org.nuxeo.ecm.core.api.DocumentModel; 046import org.nuxeo.ecm.core.api.NuxeoPrincipal; 047import org.nuxeo.ecm.core.api.SystemPrincipal; 048import org.nuxeo.ecm.core.event.Event; 049import org.nuxeo.runtime.model.DefaultComponent; 050 051/** 052 * DublinCore Storage Service Implementation. 053 * 054 * @since 10.2 055 */ 056public class DublinCoreStorageServiceImpl extends DefaultComponent implements DublinCoreStorageService { 057 058 @Override 059 public void setCreationDate(DocumentModel doc, Calendar creationDate) { 060 doc.setPropertyValue(DUBLINCORE_CREATED_DATE_PROPERTY, creationDate); 061 } 062 063 @Override 064 public void setCreationDate(DocumentModel doc, Calendar creationDate, Event event) { 065 setCreationDate(doc, creationDate); 066 } 067 068 @Override 069 public void setIssuedDate(DocumentModel doc, Calendar issuedDate) { 070 doc.setPropertyValue(DUBLINCORE_ISSUED_DATE_PROPERTY, issuedDate); 071 } 072 073 @Override 074 public void setModificationDate(DocumentModel doc, Calendar modificationDate) { 075 doc.setPropertyValue(DUBLINCORE_MODIFIED_DATE_PROPERTY, modificationDate); 076 if (doc.getPropertyValue(DUBLINCORE_CREATED_DATE_PROPERTY) == null) { 077 setCreationDate(doc, modificationDate); 078 } 079 } 080 081 @Override 082 public void setModificationDate(DocumentModel doc, Calendar modificationDate, Event event) { 083 setModificationDate(doc, modificationDate); 084 } 085 086 @Override 087 public void addContributor(DocumentModel doc, Event event) { 088 Principal principal = Objects.requireNonNull(event.getContext().getPrincipal()); 089 090 String principalName = principal.getName(); 091 if (principal instanceof SystemPrincipal) { 092 principalName = ((SystemPrincipal) principal).getOriginatingUser(); 093 if ((principalName == null || SYSTEM_USERNAME.equals(principalName)) 094 && !ABOUT_TO_CREATE.equals(event.getName())) { 095 return; 096 } 097 } 098 099 if (doc.getPropertyValue(DUBLINCORE_CREATOR_PROPERTY) == null) { 100 doc.setPropertyValue(DUBLINCORE_CREATOR_PROPERTY, principalName); 101 } 102 103 List<String> contributorsList = getSanitizedExistingContributors(doc); 104 if (!contributorsList.contains(principalName)) { 105 contributorsList.add(principalName); 106 } 107 doc.setPropertyValue(DUBLINCORE_CONTRIBUTORS_PROPERTY, (Serializable) contributorsList); 108 doc.setPropertyValue(DUBLINCORE_LAST_CONTRIBUTOR_PROPERTY, principalName); 109 } 110 111 /** 112 * Returns a "Sanitized" list of contributors according to NXP-25005 113 * 114 * @param doc The document from which the contributors list will be retrieved. 115 * @return A list of contributors without repetitions and prefixed entries. 116 */ 117 protected List<String> getSanitizedExistingContributors(DocumentModel doc) { 118 String[] contributorsArray = (String[]) doc.getPropertyValue(DUBLINCORE_CONTRIBUTORS_PROPERTY); 119 if (ArrayUtils.isEmpty(contributorsArray)) { 120 return new ArrayList<>(); 121 } 122 return Arrays.stream(contributorsArray) 123 .map(DublinCoreStorageServiceImpl::stripPrincipalPrefix) 124 .distinct() 125 .collect(Collectors.toList()); 126 } 127 128 protected static String stripPrincipalPrefix(String principal) { 129 if (principal.startsWith(NuxeoPrincipal.PREFIX)) { 130 return principal.substring(NuxeoPrincipal.PREFIX.length()); 131 } else { 132 return principal; 133 } 134 } 135 136}