/*
* Copyright 2000-2013 Enonic AS
* http://www.enonic.com/license
*/
package com.enonic.vertical.adminweb.handlers;
import java.io.IOException;
import java.io.StringWriter;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import javax.mail.MessagingException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.xml.transform.Source;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.dom.DOMSource;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.lang.StringUtils;
import org.joda.time.DateTime;
import org.springframework.beans.factory.annotation.Autowired;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import com.enonic.esl.containers.ExtendedMap;
import com.enonic.esl.util.DateUtil;
import com.enonic.esl.xml.XMLTool;
import com.enonic.vertical.adminweb.AdminStore;
import com.enonic.vertical.adminweb.VerticalAdminException;
import com.enonic.vertical.adminweb.VerticalAdminLogger;
import com.enonic.vertical.adminweb.handlers.xmlbuilders.SimpleContentXMLBuilder;
import com.enonic.vertical.engine.AccessRight;
import com.enonic.vertical.engine.VerticalEngineException;
import com.enonic.cms.core.content.AssignmentDataParser;
import com.enonic.cms.core.content.category.CategoryEntity;
import com.enonic.cms.core.content.category.CategoryKey;
import com.enonic.cms.core.content.command.ImportContentCommand;
import com.enonic.cms.core.content.contenttype.ContentTypeKey;
import com.enonic.cms.core.content.imports.ImportJob;
import com.enonic.cms.core.content.imports.ImportResult;
import com.enonic.cms.core.content.imports.ImportResultXmlCreator;
import com.enonic.cms.core.content.mail.ImportedContentAssignmentMailTemplate;
import com.enonic.cms.core.mail.MailRecipient;
import com.enonic.cms.core.security.user.User;
import com.enonic.cms.core.security.user.UserEntity;
import com.enonic.cms.core.service.AdminService;
final public class SimpleContentHandlerServlet
extends ContentBaseHandlerServlet
{
@Autowired
public void setSimpleContentXMLBuilder( final SimpleContentXMLBuilder builder )
{
setContentXMLBuilder( builder );
}
public void handlerCustom( HttpServletRequest request, HttpServletResponse response, HttpSession session, AdminService admin,
ExtendedMap formItems, String operation )
throws VerticalAdminException, VerticalEngineException, MessagingException
{
User user = securityService.getLoggedInAdminConsoleUser();
try
{
if ( "fileimportform".equals( operation ) )
{
fileImportForm( request, response, formItems );
}
else if ( "fileimport".equals( operation ) )
{
fileImport( user, request, response, formItems );
}
else if ( "xml".equals( operation ) )
{
viewXML( response, formItems );
}
else if ( "linkcontentineditor".equals( operation ) )
{
linkContentInEditor( response, request, formItems );
}
else
{
super.handlerCustom( request, response, session, adminService, formItems, operation );
}
}
catch ( IOException e )
{
VerticalAdminLogger.errorAdmin( "I/O error: %t", e );
}
}
private void linkContentInEditor( HttpServletResponse response, HttpServletRequest request, ExtendedMap formItems )
{
User user = securityService.getLoggedInAdminConsoleUser();
int contentKey = formItems.getInt( "key" );
int categoryKey = formItems.getInt( "cat" );
int unitKey = adminService.getUnitKey( categoryKey );
Document xmlContent = adminService.getContent( user, contentKey, 0, 1, 0 ).getAsDOMDocument();
Document doc = XMLTool.createDocument( "contents" );
XMLTool.mergeDocuments( doc, xmlContent );
Document xmlCategory = adminService.getSuperCategoryNames( categoryKey, false, true ).getAsDOMDocument();
XMLTool.mergeDocuments( doc, xmlCategory, true );
Map<String, Object> xslParams = new HashMap<String, Object>();
xslParams.put( "content", "true" );
xslParams.put( "unitname", unitKey );
transformXML( request, response, doc, "editor/contentpopup_selected.xsl", xslParams );
}
private void viewXML( HttpServletResponse response, ExtendedMap formItems )
throws VerticalAdminException, IOException
{
User user = securityService.getLoggedInAdminConsoleUser();
// get xsl
int key = formItems.getInt( "key" );
String xmlData = adminService.getContent( user, key, 0, 1, 0 ).getAsString();
response.getWriter().write( xmlData );
}
private void fileImport( User oldUser, HttpServletRequest request, HttpServletResponse response, ExtendedMap formItems )
throws VerticalAdminException, MessagingException
{
int categoryKey = formItems.getInt( "cat" );
int unitKey = formItems.getInt( "selectedunitkey" );
try
{
String importName = formItems.getString( "importname" );
FileItem fileItem = formItems.getFileItem( "importfile" );
Date publishFrom = null;
Date publishTo = null;
if ( formItems.containsKey( "date_pubdata_publishfrom" ) )
{
try
{
StringBuffer date = new StringBuffer( formItems.getString( "date_pubdata_publishfrom" ) );
date.append( ' ' );
date.append( formItems.getString( "time_pubdata_publishfrom", "00:00" ) );
publishFrom = DateUtil.parseDateTime( date.toString() );
if ( formItems.containsKey( "date_pubdata_publishto" ) )
{
date = new StringBuffer( formItems.getString( "date_pubdata_publishto" ) );
date.append( ' ' );
date.append( formItems.getString( "time_pubdata_publishto", "00:00" ) );
publishTo = DateUtil.parseDateTime( date.toString() );
}
}
catch ( Exception pe )
{
String message = "Failed to parse publish from or to date: %t";
VerticalAdminLogger.errorAdmin( message, pe );
}
}
Document doc = XMLTool.createDocument( "data" );
XMLTool.mergeDocuments( doc, adminService.getSuperCategoryNames( categoryKey, true, true ).getAsDOMDocument(), true );
Map<String, Object> xslParams = new HashMap<String, Object>();
xslParams.put( "cat", formItems.getString( "cat" ) );
xslParams.put( "page", formItems.getString( "page" ) );
addCommonParameters( adminService, null, request, xslParams, unitKey, -1 );
final CategoryEntity categoryToImportTo = categoryDao.findByKey( new CategoryKey( categoryKey ) );
if ( categoryToImportTo == null )
{
throw new IllegalArgumentException( "Category does not exist " + categoryKey );
}
final ImportContentCommand importContentCommand = new ImportContentCommand();
importContentCommand.importer = this.securityService.getUser( oldUser );
importContentCommand.categoryToImportTo = categoryToImportTo;
importContentCommand.importName = importName;
importContentCommand.publishFrom = publishFrom != null ? new DateTime( publishFrom ) : null;
importContentCommand.publishTo = publishTo != null ? new DateTime( publishTo ) : null;
importContentCommand.inputStream = fileItem.getInputStream();
AssignmentDataParser assignmentDataParser = new AssignmentDataParser( formItems );
String assigneeKeyString = assignmentDataParser.getAssigneeKey();
if ( StringUtils.isNotBlank( assigneeKeyString ) )
{
UserEntity assignee = userDao.findByKey( assigneeKeyString );
if ( assignee == null )
{
throw new IllegalArgumentException( "Assignee not found: " + assigneeKeyString );
}
String assignmentDescr = assignmentDataParser.getAssignmentDescription();
Date assignmentDueDate = assignmentDataParser.getAssignmentDueDate();
importContentCommand.assigneeKey = assignee.getKey();
importContentCommand.assignmentDescription = assignmentDescr;
importContentCommand.assignmentDueDate = assignmentDueDate;
}
final ImportJob importJob = importJobFactory.createImportJob( importContentCommand );
final ImportResult report = importJob.start();
final ImportResultXmlCreator reportCreator = new ImportResultXmlCreator();
reportCreator.setIncludeContentInformation( false );
final boolean sendAssignmentMail = report.getAssigned().size() > 0 && importJob.getAssignee() != null;
if ( sendAssignmentMail )
{
sendAssignmentMail( oldUser, assignmentDataParser, importJob, report );
}
XMLTool.mergeDocuments( doc, reportCreator.getReport( report ).getAsString(), true );
transformXML( request, response, doc, "fileimport_report.xsl", xslParams );
}
catch ( IOException e )
{
VerticalAdminLogger.errorAdmin( "I/O error: %t", e );
}
}
private void sendAssignmentMail( User oldUser, AssignmentDataParser assignmentDataParser, ImportJob importJob, ImportResult report )
throws IOException, MessagingException
{
ImportedContentAssignmentMailTemplate mailTemplate =
new ImportedContentAssignmentMailTemplate( report.getAssigned().keySet(), contentDao );
mailTemplate.setAssignmentDescription( assignmentDataParser.getAssignmentDescription() );
mailTemplate.setAssignmentDueDate( assignmentDataParser.getAssignmentDueDate() );
UserEntity assigner = userDao.findByKey( oldUser.getKey() );
mailTemplate.setAssigner( assigner );
mailTemplate.setFrom( new MailRecipient( assigner.getDisplayName(), assigner.getEmail() ) );
mailTemplate.addRecipient( importJob.getAssignee() );
sendMailService.sendMail( mailTemplate );
}
private void fileImportForm( HttpServletRequest request, HttpServletResponse response, ExtendedMap formItems )
throws VerticalAdminException
{
User user = securityService.getLoggedInAdminConsoleUser();
int categoryKey = formItems.getInt( "cat" );
int unitKey = formItems.getInt( "selectedunitkey" );
int contentTypeKey = adminService.getContentTypeKeyByCategory( categoryKey );
Document doc = XMLTool.createDocument( "data" );
XMLTool.mergeDocuments( doc, adminService.getSuperCategoryNames( categoryKey, true, true ).getAsDOMDocument(), true );
XMLTool.mergeDocuments( doc, adminService.getAccessRights( user, AccessRight.CATEGORY, categoryKey, true ).getAsDOMDocument() );
XMLTool.mergeDocuments( doc, adminService.getContentTypeModuleData( contentTypeKey ).getAsDOMDocument() );
Map<String, Object> xslParams = new HashMap<String, Object>();
xslParams.put( "cat", formItems.getString( "cat" ) );
xslParams.put( "page", formItems.getString( "page" ) );
xslParams.put( "_current_user_key", user.getKey().toString() );
addCommonParameters( adminService, null, request, xslParams, unitKey, -1 );
transformXML( request, response, doc, "fileimport_form.xsl", xslParams );
}
protected void addCustomData( HttpSession session, User user, AdminService admin, Document doc, int contentKey, int contentTypeKey,
ExtendedMap formItems, ExtendedMap parameters )
{
parameters.put( "current_uid", user.getName() );
}
private final static String FORM_TEMPLATE = "__build_form_xsl.xsl";
protected DOMSource buildXSL( HttpSession session, AdminService admin, int contentTypeKey, final ExtendedMap parameters )
throws VerticalAdminException
{
DOMSource result = null;
try
{
Document sourceDoc = admin.getContentTypeModuleData( contentTypeKey ).getAsDOMDocument();
// Set whether fields are indexed or not
Document indexDoc =
XMLTool.domparse( admin.getIndexingParametersXML( contentTypeKey > -1 ? new ContentTypeKey( contentTypeKey ) : null ) );
Element[] indexingParams = XMLTool.getElements( indexDoc.getDocumentElement(), "index" );
Element browseElem = XMLTool.getElement( sourceDoc.getDocumentElement(), "browse" );
Element[] fields = XMLTool.getElements( browseElem, "field" );
for ( Element field : fields )
{
String xpath = XMLTool.getElementText( XMLTool.getElement( field, "xpath" ) );
boolean indexed = false;
// Check whether this xpath is in the index doc
if ( xpath != null )
{
for ( Element indexingParam : indexingParams )
{
if ( ( xpath ).equals( indexingParam.getAttribute( "xpath" ) ) )
{
indexed = true;
}
}
}
field.setAttribute( "indexed", String.valueOf( indexed ) );
}
Element rootElement = sourceDoc.getDocumentElement();
// check for xsl:
boolean enablePreview = false;
Element previewXSLElement = XMLTool.getElement( rootElement, "previewxsl" );
if ( previewXSLElement != null )
{
String cdata = XMLTool.getElementText( previewXSLElement );
if ( cdata.length() > 0 )
{
enablePreview = true;
}
}
// extract module xml:
Element moduleElement = XMLTool.getElement( rootElement, "config" );
sourceDoc = XMLTool.createDocument();
sourceDoc.appendChild( sourceDoc.importNode( moduleElement, true ) );
StringWriter swriter = new StringWriter();
Map<String, Object> xslParams = new HashMap<String, Object>();
xslParams.putAll( parameters );
xslParams.put( "xsl_prefix", "" );
xslParams.put( "enablepreview", String.valueOf( enablePreview ) );
Source xslFile = AdminStore.getStylesheet( session, FORM_TEMPLATE );
transformXML( session, swriter, new DOMSource( sourceDoc ), xslFile, xslParams );
xslParams.putAll( parameters );
result = new DOMSource( XMLTool.domparse( swriter.toString() ) );
result.setSystemId( xslFile.getSystemId() );
}
catch ( TransformerConfigurationException e )
{
VerticalAdminLogger.errorAdmin( "XSLT error: %t", e );
}
catch ( TransformerException e )
{
VerticalAdminLogger.errorAdmin( "XSLT error: %t", e );
}
return result;
}
}