001/*
002 * Copyright (c) 2006-2011 Nuxeo SA (http://nuxeo.com/) and others.
003 *
004 * All rights reserved. This program and the accompanying materials
005 * are made available under the terms of the Eclipse Public License v1.0
006 * which accompanies this distribution, and is available at
007 * http://www.eclipse.org/legal/epl-v10.html
008 *
009 * Contributors:
010 *     bstefanescu
011 */
012package org.nuxeo.ecm.automation.core.operations.document;
013
014import java.io.IOException;
015
016import org.nuxeo.ecm.automation.ConflictOperationException;
017import org.nuxeo.ecm.automation.core.Constants;
018import org.nuxeo.ecm.automation.core.annotations.Context;
019import org.nuxeo.ecm.automation.core.annotations.Operation;
020import org.nuxeo.ecm.automation.core.annotations.OperationMethod;
021import org.nuxeo.ecm.automation.core.annotations.Param;
022import org.nuxeo.ecm.automation.core.collectors.DocumentModelCollector;
023import org.nuxeo.ecm.automation.core.util.DocumentHelper;
024import org.nuxeo.ecm.automation.core.util.Properties;
025import org.nuxeo.ecm.core.api.CoreSession;
026import org.nuxeo.ecm.core.api.DocumentModel;
027
028/**
029 * @author <a href="mailto:bs@nuxeo.com">Bogdan Stefanescu</a>
030 */
031@Operation(id = UpdateDocument.ID, category = Constants.CAT_DOCUMENT, label = "Update Properties", description = "Set multiple properties on the input document. The properties are specified as <i>key=value</i> pairs separated by a new line. The key used for a property is the property xpath. To specify multi-line values you can use a \\ character followed by a new line. <p>Example:<pre>dc:title=The Document Title<br>dc:description=foo bar</pre>For updating a date, you will need to expose the value as ISO 8601 format, for instance : <p>Example:<pre>dc:title=The Document Title<br>dc:issued=@{org.nuxeo.ecm.core.schema.utils.DateParser.formatW3CDateTime(CurrentDate.date)}</pre><p>Returns back the updated document.<p>To update a multi-valued field with multiple values:<pre>custom:multivalued=a,b,c,d</pre>")
032public class UpdateDocument {
033
034    public static final String ID = "Document.Update";
035
036    @Context
037    protected CoreSession session;
038
039    @Param(name = "properties")
040    protected Properties properties;
041
042    @Param(name = "save", required = false, values = "true")
043    protected boolean save = true;
044
045    @Param(name = "changeToken", required = false)
046    protected String changeToken = null;
047
048    @OperationMethod(collector = DocumentModelCollector.class)
049    public DocumentModel run(DocumentModel doc) throws ConflictOperationException, IOException {
050
051        if (changeToken != null) {
052            // Check for dirty update
053            String repoToken = doc.getChangeToken();
054            if (!changeToken.equals(repoToken)) {
055                throw new ConflictOperationException(doc);
056            }
057        }
058
059        DocumentHelper.setProperties(session, doc, properties);
060        if (save) {
061            doc = session.saveDocument(doc);
062        }
063        return doc;
064    }
065
066}