001/*
002 * (C) Copyright 2006-2013 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 *     Benjamin JALON <bjalon@nuxeo.com>
018 */
019package org.nuxeo.ecm.automation.core.operations.document;
020
021import java.io.Serializable;
022import java.util.ArrayList;
023import java.util.Arrays;
024import java.util.List;
025
026import org.apache.commons.logging.Log;
027import org.apache.commons.logging.LogFactory;
028import org.nuxeo.ecm.automation.OperationException;
029import org.nuxeo.ecm.automation.core.Constants;
030import org.nuxeo.ecm.automation.core.annotations.Context;
031import org.nuxeo.ecm.automation.core.annotations.Operation;
032import org.nuxeo.ecm.automation.core.annotations.OperationMethod;
033import org.nuxeo.ecm.automation.core.annotations.Param;
034import org.nuxeo.ecm.automation.core.collectors.DocumentModelCollector;
035import org.nuxeo.ecm.core.api.CoreSession;
036import org.nuxeo.ecm.core.api.DocumentModel;
037import org.nuxeo.ecm.core.api.model.Property;
038import org.nuxeo.ecm.core.schema.types.Type;
039
040/**
041 * @author <a href="mailto:bjalon@nuxeo.com">Benjamin JALON</a>
042 * @since 5.7
043 */
044@Operation(id = RemoveEntryOfMultiValuedProperty.ID, category = Constants.CAT_DOCUMENT, label = "Remove Entry Of Multivalued Property", description = "Remove the first entry of the giving value in the multivalued xpath, does nothing if does not exist: <ul<li>if 'is Remove All' is check, all entry instance in the list.</li><li>if not will remove just the first one found</li></ul><p>Save parameter automatically saves the document in the database. It has to be turned off when this operation is used in the context of the empty document created, about to create, before document modification, document modified events.</p>", aliases = { "RemoveEntryOfMultivaluedProperty" })
045public class RemoveEntryOfMultiValuedProperty extends AbstractOperationMultiValuedProperty {
046
047    public static final String ID = "Document.RemoveEntryOfMultivaluedProperty";
048
049    public static final Log log = LogFactory.getLog(RemoveEntryOfMultiValuedProperty.class);
050
051    @Context
052    protected CoreSession session;
053
054    @Param(name = "xpath")
055    protected String xpath;
056
057    @Param(name = "value")
058    protected Serializable value;
059
060    @Param(name = "save", required = false, values = { "true" })
061    protected boolean save = true;
062
063    @Param(name = "is Remove All", required = false, values = { "true" })
064    protected boolean isRemoveAll = true;
065
066    @OperationMethod(collector = DocumentModelCollector.class)
067    public DocumentModel run(DocumentModel doc) throws OperationException {
068
069        Property p = doc.getProperty(xpath);
070        Type type = p.getType();
071        checkFieldType(type, value);
072
073        List<Serializable> array = Arrays.asList((Serializable[]) p.getValue());
074
075        if (array == null) {
076            log.info(String.format("Value \"%s\" not found in %s, can't remove it", value, doc.getPathAsString()));
077            return doc;
078        }
079        List<Serializable> list = new ArrayList<>(array);
080
081        if (!list.contains(value)) {
082            log.info(String.format("Value \"%s\" not found in %s, can't remove it", value, doc.getPathAsString()));
083            return doc;
084        }
085
086        do {
087            list.remove(value);
088            p.setValue(list);
089        } while (list.contains(value) && isRemoveAll);
090
091        if (save) {
092            doc = session.saveDocument(doc);
093            session.save();
094        }
095
096        return doc;
097    }
098
099}