]> git.aero2k.de Git - tmp/jakarta-migration.git/blob
19ba74b1a56ac0bf38206c20c15b35050b0bd6fb
[tmp/jakarta-migration.git] /
1 /**
2  * This document is a part of the source code and related artifacts for
3  * CollectionSpace, an open source collections management system for museums and
4  * related institutions:
5  *
6  * http://www.collectionspace.org http://wiki.collectionspace.org
7  *
8  * Copyright 2009 University of California at Berkeley
9  *
10  * Licensed under the Educational Community License (ECL), Version 2.0. You may
11  * not use this file except in compliance with this License.
12  *
13  * You may obtain a copy of the ECL 2.0 License at
14  *
15  * https://source.collectionspace.org/collection-space/LICENSE.txt
16  *
17  * Unless required by applicable law or agreed to in writing, software
18  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
19  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
20  * License for the specific language governing permissions and limitations under
21  * the License.
22  */
23 package org.collectionspace.services.person.nuxeo;
24
25 import java.util.List;
26 import java.util.regex.Pattern;
27 import org.collectionspace.services.common.api.Tools;
28 import org.collectionspace.services.common.document.InvalidDocumentException;
29 import org.collectionspace.services.common.document.ValidatorHandlerImpl;
30 import org.collectionspace.services.person.PersonTermGroup;
31 import org.collectionspace.services.person.PersonTermGroupList;
32 import org.collectionspace.services.person.PersonsCommon;
33 import org.slf4j.Logger;
34 import org.slf4j.LoggerFactory;
35
36 /**
37  * PersonValidatorHandler
38  *
39  * Validates data supplied when attempting to create and/or update Person
40  * records.
41  *
42  * $LastChangedRevision: $ $LastChangedDate: $
43  */
44 public class PersonValidatorHandler extends ValidatorHandlerImpl {
45
46     final Logger logger = LoggerFactory.getLogger(PersonValidatorHandler.class);
47     // 'Bad pattern' for shortIdentifiers matches any non-word characters
48     private static final Pattern SHORT_ID_BAD_PATTERN = Pattern.compile("[\\W]"); //.matcher(input).matches()
49     private static final String VALIDATION_ERROR = "The record payload was invalid. See log file for more details.";
50     private static final String SHORT_ID_BAD_CHARS_MSG =
51             "shortIdentifier must only contain standard word characters";
52     private static final String HAS_NO_TERMS_MSG =
53             "Authority items must contain at least one term.";
54     private static final String HAS_AN_EMPTY_TERM_MSG =
55             "Each term group in an authority item must contain "
56             + "a non-empty term name or "
57             + "a non-empty term display name.";
58
59     @Override
60     protected Class getCommonPartClass() {
61         return PersonsCommon.class;
62     }
63
64     @Override
65     protected void handleCreate() throws InvalidDocumentException {
66         PersonsCommon person = (PersonsCommon) getCommonPart();
67         // No guarantee that there is a common part in every post/update.
68         if (person != null) {
69             try {
70                 String shortId = person.getShortIdentifier();
71                 if (shortId != null) {
72                     CS_ASSERT(shortIdentifierContainsOnlyValidChars(shortId), SHORT_ID_BAD_CHARS_MSG);
73                 }
74                 CS_ASSERT(containsAtLeastOneTerm(person), HAS_NO_TERMS_MSG);
75                 CS_ASSERT(allTermsContainNameOrDisplayName(person), HAS_AN_EMPTY_TERM_MSG);
76             } catch (AssertionError e) {
77                 if (logger.isErrorEnabled()) {
78                     logger.error(e.getMessage(), e);
79                 }
80                 throw new InvalidDocumentException(VALIDATION_ERROR, e);
81             }
82         }
83     }
84
85     @Override
86     protected void handleGet() throws InvalidDocumentException {
87     }
88
89     @Override
90     protected void handleGetAll() throws InvalidDocumentException {
91     }
92
93     @Override
94     protected void handleUpdate() throws InvalidDocumentException {
95         PersonsCommon person = (PersonsCommon) getCommonPart();
96         // No guarantee that there is a common part in every post/update.
97         if (person != null) {
98             try {
99                 // shortIdentifier is among a set of fields that are
100                 // prevented from being changed on an update, and thus
101                 // we don't need to check its value here.
102                 CS_ASSERT(containsAtLeastOneTerm(person), HAS_NO_TERMS_MSG);
103                 CS_ASSERT(allTermsContainNameOrDisplayName(person), HAS_AN_EMPTY_TERM_MSG);
104             } catch (AssertionError e) {
105                 if (logger.isErrorEnabled()) {
106                     logger.error(e.getMessage(), e);
107                 }
108                 throw new InvalidDocumentException(VALIDATION_ERROR, e);
109             }
110         }
111     }
112
113     @Override
114     protected void handleDelete() throws InvalidDocumentException {
115     }
116
117     private boolean shortIdentifierContainsOnlyValidChars(String shortId) {
118         // Check whether any characters match the 'bad' pattern
119         if (SHORT_ID_BAD_PATTERN.matcher(shortId).find()) {
120             return false;
121         }
122         return true;
123     }
124
125     private boolean containsAtLeastOneTerm(PersonsCommon person) {
126         PersonTermGroupList termGroupList = person.getPersonTermGroupList();
127         if (termGroupList == null) {
128             return false;
129         }
130         List<PersonTermGroup> termGroups = termGroupList.getPersonTermGroup();
131         if ((termGroups == null) || (termGroups.isEmpty())) {
132             return false;
133         }
134         return true;
135     }
136
137     private boolean allTermsContainNameOrDisplayName(PersonsCommon person) {
138         PersonTermGroupList termGroupList = person.getPersonTermGroupList();
139         List<PersonTermGroup> termGroups = termGroupList.getPersonTermGroup();
140         for (PersonTermGroup termGroup : termGroups) {
141             if (Tools.isBlank(termGroup.getTermName()) || Tools.isBlank(termGroup.getTermDisplayName())) {
142                 return false;
143             }
144         }
145         return true;
146     }
147 }