WikiDynamicInputs.java
/*
* Copyright (c) 2002-2023, City of Paris
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright notice
* and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice
* and the following disclaimer in the documentation and/or other materials
* provided with the distribution.
*
* 3. Neither the name of 'Mairie de Paris' nor 'Lutece' nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
* License 1.0
*/
package fr.paris.lutece.plugins.wiki.web;
import com.fasterxml.jackson.databind.ObjectMapper;
import fr.paris.lutece.plugins.wiki.business.*;
import fr.paris.lutece.plugins.wiki.service.ContentDeserializer;
import fr.paris.lutece.plugins.wiki.service.RoleService;
import fr.paris.lutece.plugins.wiki.service.WikiLocaleService;
import fr.paris.lutece.plugins.wiki.service.parser.SpecialChar;
import fr.paris.lutece.plugins.wiki.utils.auth.WikiAnonymousUser;
import fr.paris.lutece.portal.service.security.LuteceUser;
import fr.paris.lutece.portal.service.security.UserNotSignedException;
import fr.paris.lutece.portal.service.util.AppLogService;
import fr.paris.lutece.plugins.wiki.service.parser.LuteceHtmlParser;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.IOException;
import java.util.HashMap;
/**
* Upload application
*/
public class WikiDynamicInputs
{
public static HttpServletResponse modifyPage( HttpServletRequest request, HttpServletResponse response ) throws IOException, UserNotSignedException
{
StringBuilder sb = new StringBuilder( );
BufferedReader reader = request.getReader( );
String line;
while ( ( line = reader.readLine( ) ) != null )
{
sb.append( line );
}
String requestBody = sb.toString( );
String wikiPageUrl = "";
try
{
ContentDeserializer newContent = ContentDeserializer.deserializeWikiContent( requestBody );
Topic topic = TopicHome.findByPageName( newContent.getTopicPageName( ) );
LuteceUser user = WikiAnonymousUser.checkUser( request );
if ( RoleService.hasEditRole( request, topic ) )
{
Integer nVersionId = newContent.getTopicVersion( );
int nTopicId = topic.getIdTopic( );
String strComment = newContent.getEditComment( );
String strLocale = newContent.getLanguage( );
wikiPageUrl = newContent.getWikiPageUrl( );
String strParentPageName = newContent.getParentPageName( );
String strViewRole = newContent.getViewRole( );
String strEditRole = newContent.getEditRole( );
String strPageTitle = newContent.getTopicTitle( );
String strContent = newContent.getTopicContent( );
String htmlContent = newContent.getWikiHtmlContent( );
TopicVersion topicVersion = new TopicVersion( );
if ( nVersionId != 0 )
{
topicVersion = TopicVersionHome.findByPrimaryKey( nVersionId );
}
topicVersion.setUserName( user.getName( ) );
topicVersion.setIdTopic( nTopicId );
topicVersion.setUserName( user.getName( ) );
topicVersion.setEditComment( strComment );
htmlContent = LuteceHtmlParser.parseHtml( htmlContent, wikiPageUrl, strPageTitle );
WikiContent content = new WikiContent( );
if ( nVersionId == 0 )
{
for ( String locale : WikiLocaleService.getLanguages( ) )
{
content.setPageTitle( strPageTitle + "_" + locale );
content.setContentLabellingMarkdownLanguage( strContent );
content.setHtmlWikiContent( htmlContent );
topicVersion.addLocalizedWikiContent( locale, content );
}
}
content.setPageTitle( strPageTitle );
content.setContentLabellingMarkdownLanguage( strContent );
content.setHtmlWikiContent( htmlContent );
topicVersion.addLocalizedWikiContent( strLocale, content );
TopicVersionHome.addTopicVersion( topicVersion );
topic.setViewRole( strViewRole );
topic.setEditRole( strEditRole );
topic.setParentPageName( strParentPageName );
TopicHome.update( topic );
}
}
catch( Exception e )
{
AppLogService.error( "Error saving topic version automatically", e );
}
ObjectMapper mapper = new ObjectMapper();
HashMap<String, String> result = new HashMap<String, String>( );
result.put( "action", "publish" );
result.put( "url", SpecialChar.renderWiki( wikiPageUrl ) );
String res = mapper.writeValueAsString( result );
response.getWriter( ).write( res );
return response;
}
}