/*
* See the NOTICE file distributed with this work for additional
* information regarding copyright ownership.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package com.xpn.xwiki.internal.filter.input;
import java.lang.reflect.ParameterizedType;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import javax.inject.Inject;
import javax.inject.Provider;
import javax.inject.Singleton;
import org.slf4j.Logger;
import org.suigeneris.jrcs.rcs.Version;
import org.xwiki.component.annotation.Component;
import org.xwiki.component.util.DefaultParameterizedType;
import org.xwiki.filter.FilterEventParameters;
import org.xwiki.filter.FilterException;
import org.xwiki.filter.event.model.WikiDocumentFilter;
import org.xwiki.filter.event.xwiki.XWikiWikiDocumentFilter;
import org.xwiki.filter.instance.input.DocumentInstanceInputProperties;
import org.xwiki.filter.instance.input.EntityEventGenerator;
import org.xwiki.filter.instance.internal.input.AbstractBeanEntityEventGenerator;
import com.xpn.xwiki.XWikiContext;
import com.xpn.xwiki.XWikiException;
import com.xpn.xwiki.doc.XWikiAttachment;
import com.xpn.xwiki.doc.XWikiDocument;
import com.xpn.xwiki.internal.filter.XWikiDocumentFilter;
import com.xpn.xwiki.objects.BaseObject;
import com.xpn.xwiki.objects.classes.BaseClass;
/**
* @version $Id: 0841d40a5f119781bdeef62abc5358fff3696bd2 $
* @since 6.2M1
*/
@Component
@Singleton
public class XWikiDocumentLocaleEventGenerator
extends AbstractBeanEntityEventGenerator<XWikiDocument, XWikiDocumentFilter, DocumentInstanceInputProperties>
{
/**
* The role of this component.
*/
public static final ParameterizedType ROLE = new DefaultParameterizedType(null, EntityEventGenerator.class,
XWikiDocument.class, DocumentInstanceInputProperties.class);
@Inject
private Provider<XWikiContext> xcontextProvider;
@Inject
private Logger logger;
@Inject
private EntityEventGenerator<XWikiAttachment> attachmentEventGenerator;
@Inject
private EntityEventGenerator<BaseClass> classEventGenerator;
@Inject
private EntityEventGenerator<BaseObject> objectEventGenerator;
@Override
public void write(XWikiDocument document, Object filter, XWikiDocumentFilter documentFilter,
DocumentInstanceInputProperties properties) throws FilterException
{
XWikiContext xcontext = this.xcontextProvider.get();
// > WikiDocumentLocale
FilterEventParameters localeParameters = new FilterEventParameters();
if (properties.isWithJRCSRevisions()) {
try {
localeParameters.put(XWikiWikiDocumentFilter.PARAMETER_JRCSREVISIONS,
document.getDocumentArchive(xcontext).getArchive(xcontext));
} catch (XWikiException e) {
this.logger.error("Document [{}] has malformed history", document.getDocumentReference(), e);
}
}
localeParameters.put(WikiDocumentFilter.PARAMETER_CREATION_AUTHOR, document.getCreator());
localeParameters.put(WikiDocumentFilter.PARAMETER_CREATION_DATE, document.getCreationDate());
localeParameters.put(WikiDocumentFilter.PARAMETER_LASTREVISION, document.getVersion());
documentFilter.beginWikiDocumentLocale(document.getLocale(), localeParameters);
if (properties.isWithRevisions()) {
try {
for (Version version : document.getRevisions(xcontext)) {
XWikiDocument revisionDocument =
xcontext.getWiki().getDocument(document, version.toString(), xcontext);
writeRevision(revisionDocument, filter, documentFilter, properties);
}
} catch (XWikiException e) {
this.logger.error("Failed to get document [{}] history", document.getDocumentReference(), e);
}
}
writeRevision(document, filter, documentFilter, properties);
// < WikiDocumentLocale
documentFilter.endWikiDocumentLocale(document.getLocale(), FilterEventParameters.EMPTY);
}
private void writeRevision(XWikiDocument document, Object filter, XWikiDocumentFilter documentFilter,
DocumentInstanceInputProperties properties) throws FilterException
{
// > WikiDocumentRevision
FilterEventParameters revisionParameters = new FilterEventParameters();
if (document.getRelativeParentReference() != null) {
revisionParameters.put(WikiDocumentFilter.PARAMETER_PARENT, document.getRelativeParentReference());
}
revisionParameters.put(WikiDocumentFilter.PARAMETER_TITLE, document.getTitle());
if (!document.getCustomClass().isEmpty()) {
revisionParameters.put(WikiDocumentFilter.PARAMETER_CUSTOMCLASS, document.getCustomClass());
}
if (!document.getDefaultTemplate().isEmpty()) {
revisionParameters.put(WikiDocumentFilter.PARAMETER_DEFAULTTEMPLATE, document.getDefaultTemplate());
}
if (!document.getValidationScript().isEmpty()) {
revisionParameters.put(WikiDocumentFilter.PARAMETER_VALIDATIONSCRIPT, document.getValidationScript());
}
revisionParameters.put(WikiDocumentFilter.PARAMETER_SYNTAX, document.getSyntax());
revisionParameters.put(WikiDocumentFilter.PARAMETER_HIDDEN, document.isHidden());
revisionParameters.put(WikiDocumentFilter.PARAMETER_REVISION_AUTHOR, document.getAuthor());
revisionParameters.put(WikiDocumentFilter.PARAMETER_REVISION_COMMENT, document.getComment());
revisionParameters.put(WikiDocumentFilter.PARAMETER_REVISION_DATE, document.getDate());
revisionParameters.put(WikiDocumentFilter.PARAMETER_REVISION_MINOR, document.isMinorEdit());
revisionParameters.put(WikiDocumentFilter.PARAMETER_CONTENT_AUTHOR, document.getContentAuthor());
revisionParameters.put(WikiDocumentFilter.PARAMETER_CONTENT_DATE, document.getContentUpdateDate());
revisionParameters.put(WikiDocumentFilter.PARAMETER_CONTENT, document.getContent());
if (properties.isWithWikiDocumentContentHTML()) {
try {
XWikiContext xcontext = this.xcontextProvider.get();
revisionParameters.put(WikiDocumentFilter.PARAMETER_CONTENT_HTML,
document.getRenderedContent(xcontext));
} catch (XWikiException e) {
this.logger.error("Failed to render content of document [{}] as HTML", document.getDocumentReference(),
e);
}
}
documentFilter.beginWikiDocumentRevision(document.getVersion(), revisionParameters);
// Attachments
if (properties.isWithWikiAttachments()) {
List<XWikiAttachment> sortedAttachments = new ArrayList<XWikiAttachment>(document.getAttachmentList());
Collections.sort(sortedAttachments, new Comparator<XWikiAttachment>()
{
@Override
public int compare(XWikiAttachment attachement1, XWikiAttachment attachement2)
{
if (attachement1 == null || attachement2 == null) {
int result = 0;
if (attachement1 != null) {
result = -1;
} else if (attachement2 != null) {
result = 1;
}
return result;
}
return attachement1.getFilename().compareTo(attachement2.getFilename());
}
});
for (XWikiAttachment attachment : sortedAttachments) {
((XWikiAttachmentEventGenerator) this.attachmentEventGenerator).write(attachment, filter,
documentFilter, properties);
}
}
// Document Class
if (properties.isWithWikiClass()) {
BaseClass xclass = document.getXClass();
if (!xclass.getFieldList().isEmpty()) {
((BaseClassEventGenerator) this.classEventGenerator).write(xclass, filter, documentFilter, properties);
}
}
// Objects (THEIR ORDER IS MOLDED IN STONE!)
if (properties.isWithWikiObjects()) {
for (List<BaseObject> xobjects : document.getXObjects().values()) {
for (BaseObject xobject : xobjects) {
if (xobject != null) {
((BaseObjectEventGenerator) this.objectEventGenerator).write(xobject, filter, documentFilter,
properties);
}
}
}
}
// < WikiDocumentRevision
documentFilter.endWikiDocumentRevision(document.getVersion(), revisionParameters);
}
}