⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 forummessageshell.java

📁 JiveJdon 3.0 is the application of Jdon Framework 1.4 final.
💻 JAVA
字号:
/*
 * Copyright 2003-2005 the original author or authors.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * 
 */
package com.jdon.jivejdon.service.imp.message;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import javax.transaction.TransactionManager;

import org.apache.log4j.Logger;

import com.jdon.container.visitor.data.SessionContext;
import com.jdon.container.visitor.data.SessionContextAcceptable;
import com.jdon.controller.events.EventModel;
import com.jdon.controller.pool.Poolable;
import com.jdon.jivejdon.Constants;
import com.jdon.jivejdon.auth.NoPermissionException;
import com.jdon.jivejdon.auth.ResourceAuthorization;
import com.jdon.jivejdon.manager.message.FilterManagerFacade;
import com.jdon.jivejdon.model.Account;
import com.jdon.jivejdon.model.ForumMessage;
import com.jdon.jivejdon.repository.MessageRepository;
import com.jdon.jivejdon.service.UploadService;
import com.jdon.jivejdon.service.util.JtaTransactionUtil;
import com.jdon.jivejdon.service.util.SessionContextUtil;

/**
 * ForumMessageShell is the shell of ForumMessage core implementions.
 * 
 * invoking order:
 * ForumMessageShell --> MessageContentFilter ---> ForumMessageServiceImp
 * 
 * @author <a href="mailto:banqiao@jdon.com">banq</a>
 *
 */
public class ForumMessageShell extends MessageRenderingFilter implements SessionContextAcceptable, Poolable {
    private final static Logger logger = Logger.getLogger(ForumMessageShell.class);
   
    protected SessionContext sessionContext;
    protected SessionContextUtil sessionContextUtil;
    
    protected ResourceAuthorization resourceAuthorization;
    protected JtaTransactionUtil jtaTransactionUtil;
    
    
    public ForumMessageShell(MessageRepository messageKernel, 
            SessionContextUtil sessionContextUtil,
            FilterManagerFacade filterManagerFacade,
            UploadService uploadService,
            ResourceAuthorization messageServiceAuth,
            JtaTransactionUtil jtaTransactionUtil) {
        super(messageKernel, filterManagerFacade, uploadService);     
        this.sessionContextUtil = sessionContextUtil;
        this.resourceAuthorization = messageServiceAuth;
        this.jtaTransactionUtil = jtaTransactionUtil;
    }
    

    /**
     * find a Message for modify
     */
    public ForumMessage findMessage(Long messageId) {
    	logger.debug("enter ForumMessageShell's findMessage");
        ForumMessage forumMessage = super.getMessage(messageId);
        if (forumMessage == null)
            return null;
        
        try {
            Account account = sessionContextUtil.getLoginAccount(sessionContext);
            resourceAuthorization.verifyAuthenticated(forumMessage, account);
        } catch (NoPermissionException e) {
        	logger.error("No Permission to operate it");
        } catch (Exception e) {
            logger.error(e);
            return null;
        }
        return forumMessage;
    }
      
    
    public boolean isAuthenticated(ForumMessage forumMessage){
    	boolean authenticated = false;
		try {
			Account account = sessionContextUtil.getLoginAccount(sessionContext);
			authenticated = resourceAuthorization.isAuthenticated(forumMessage,	account);
		} catch (Exception e) {	}
		return authenticated;
    }
    
    /**
	 * set the login account into the domain model
	 */
    public void createTopicMessage(EventModel em){
        ForumMessage forumMessage = (ForumMessage)em.getModelIF();
        TransactionManager tx = jtaTransactionUtil.getTransactionManager();
        try {
        	tx.begin();
            Long mIDInt = messageRepository.getNextId(Constants.MESSAGE);            
            forumMessage.setMessageId(mIDInt);
            
            beforeCreate(forumMessage);
            
            super.createTopicMessage(em);
            tx.commit();
        } catch (Exception e) {
            logger.error(e);
            em.setErrors(Constants.ERRORS);
            jtaTransactionUtil.rollback(tx);
        }
    }
    
    /**
     * set the login account into the domain model
     */
    public void createReplyMessage(EventModel em){
        ForumMessage forumMessage = (ForumMessage)em.getModelIF();
        TransactionManager tx = jtaTransactionUtil.getTransactionManager();
        try {
        	tx.begin();
            Long mIDInt = messageRepository.getNextId(Constants.MESSAGE);
            forumMessage.setMessageId(mIDInt);
            
            beforeCreate(forumMessage);
            
            super.createReplyMessage(em);
            tx.commit();
        } catch (Exception e) {
            logger.error(e);
            em.setErrors(Constants.ERRORS);
            jtaTransactionUtil.rollback(tx);
        }
    }        
    
    private void beforeCreate(ForumMessage forumMessage) throws Exception{
        try {
            //the poster
            Account account = sessionContextUtil.getLoginAccount(sessionContext);
            forumMessage.setAccount(account);
            
            //upload
            forumMessage.setUploadFiles(loadUploadFiles());
            
        } catch (Exception e) {
            logger.error(e);
            throw new Exception(e);
        }
    }
    
    private Collection loadUploadFiles(){
        logger.debug(" FormMessageShell.loadUploadFiles ");
        Collection uploads = null;
        try {
            uploads  = (List)sessionContext.getArrtibute(UploadService.UPLOAD_NAME);
            if (uploads == null) return  new ArrayList();
            logger.debug(" uploads size="+ uploads.size());
            sessionContext.remove(UploadService.UPLOAD_NAME);
        } catch (Exception e) {
            logger.error(e);
        }
        return uploads;
    }
    
    /**
     *    1. auth check: amdin and the owner can modify this nessage.
     *    2. if the message has childern, only admin can update it.
     *    before business logic, we must get a true message from persistence layer,
     *    now the ForumMessage packed in EventModel object is not full, it is 
     *    a DTO from prensentation layer.
     * 
     *   
     */
    public void updateMessage(EventModel em){
        ForumMessage modForumMessage = (ForumMessage)em.getModelIF();
        ForumMessage forumMessage = getMessage(modForumMessage.getMessageId());
        if (forumMessage == null) return;
        TransactionManager tx = jtaTransactionUtil.getTransactionManager();     
        try {
            Account account = sessionContextUtil.getLoginAccount(sessionContext);
            resourceAuthorization.verifyAuthenticated(forumMessage, account);
            
            //upload
            modForumMessage.setUploadFiles(loadUploadFiles());
            tx.begin();
            super.updateMessage(em);
            tx.commit();
        } catch (NoPermissionException e) {
            em.setErrors(e.getMessage());   
        } catch (Exception e) {
            logger.error(e);
            jtaTransactionUtil.rollback(tx);
        }
    }
    
    /**
     * delete a message
     * the auth is same as to the updateMessage
     * 
     * 
     */
    public void deleteMessage(EventModel em) {
        ForumMessage forumMessage = (ForumMessage)em.getModelIF();
        forumMessage = getMessage(forumMessage.getMessageId());
        if (forumMessage == null) return;        
        
        TransactionManager tx = jtaTransactionUtil.getTransactionManager();
        try {
            Account account = sessionContextUtil.getLoginAccount(sessionContext);
            resourceAuthorization.verifyAuthenticated(forumMessage, account);
            
            tx.begin();
            super.deleteMessage(em);
            tx.commit();
        } catch (NoPermissionException e) {
            em.setErrors(e.getMessage());   
        } catch (Exception e) {
            logger.error(e);
            jtaTransactionUtil.rollback(tx);
        }
    }
    
    /**
     * only admin can deletedeleteRecursiveMessage, so 
     * we only setup it in jivejdon_permisiion.xml
     */
    public void deleteRecursiveMessage(EventModel em){
        ForumMessage forumMessage = (ForumMessage)em.getModelIF();
        forumMessage = getMessage(forumMessage.getMessageId());
        if (forumMessage == null) return;        
        
        TransactionManager tx = jtaTransactionUtil.getTransactionManager();
        try {
            Account account = sessionContextUtil.getLoginAccount(sessionContext);
            resourceAuthorization.verifyAuthenticated(forumMessage, account);
            
            tx.begin();
            super.deleteRecursiveMessage(em);
            tx.commit();
        } catch (NoPermissionException e) {
            em.setErrors(e.getMessage());   
        } catch (Exception e) {
            logger.error(e);
            jtaTransactionUtil.rollback(tx);
        }
                

    }
    
    /**
     * @return Returns the sessionContext.
     */
    public SessionContext getSessionContext() {
        return sessionContext;
    }

    /**
     * @param sessionContext The sessionContext to set.
     */
    public void setSessionContext(SessionContext sessionContext) {
        this.sessionContext = sessionContext;
    }
    
    
    
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -