001/* 002 * (C) Copyright 2006-2011 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 * bstefanescu 018 */ 019package org.nuxeo.ecm.automation.core.operations.document; 020 021import java.io.IOException; 022 023import org.nuxeo.ecm.automation.core.Constants; 024import org.nuxeo.ecm.automation.core.annotations.Context; 025import org.nuxeo.ecm.automation.core.annotations.Operation; 026import org.nuxeo.ecm.automation.core.annotations.OperationMethod; 027import org.nuxeo.ecm.automation.core.annotations.Param; 028import org.nuxeo.ecm.automation.core.collectors.DocumentModelCollector; 029import org.nuxeo.ecm.automation.core.util.DocumentHelper; 030import org.nuxeo.ecm.automation.core.util.Properties; 031import org.nuxeo.ecm.core.api.ConcurrentUpdateException; 032import org.nuxeo.ecm.core.api.CoreSession; 033import org.nuxeo.ecm.core.api.DocumentModel; 034 035/** 036 * @author <a href="mailto:bs@nuxeo.com">Bogdan Stefanescu</a> 037 */ 038@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><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>") 039public class UpdateDocument { 040 041 public static final String ID = "Document.Update"; 042 043 @Context 044 protected CoreSession session; 045 046 @Param(name = "properties") 047 protected Properties properties; 048 049 @Param(name = "save", required = false, values = "true") 050 protected boolean save = true; 051 052 @Param(name = "changeToken", required = false) 053 protected String changeToken = null; 054 055 @OperationMethod(collector = DocumentModelCollector.class) 056 public DocumentModel run(DocumentModel doc) throws ConcurrentUpdateException, IOException { 057 if (changeToken != null) { 058 // Check for dirty update 059 doc.putContextData(CoreSession.CHANGE_TOKEN, changeToken); 060 } 061 DocumentHelper.setProperties(session, doc, properties); 062 if (save) { 063 doc = session.saveDocument(doc); // may throw ConcurrentUpdateException if bad change token 064 } 065 return doc; 066 } 067 068}