org.drools.task.service.IcalBaseTest.java Source code

Java tutorial

Introduction

Here is the source code for org.drools.task.service.IcalBaseTest.java

Source

/**
 * Copyright 2010 JBoss Inc
 *
 * 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 org.drools.task.service;

import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.StringReader;
import java.util.Date;
import java.util.Map;

import javax.mail.BodyPart;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimeMessage.RecipientType;

import org.apache.commons.collections.map.HashedMap;
import org.drools.task.BaseTest;
import org.drools.task.MockUserInfo;
import org.drools.task.Task;
import org.drools.task.service.responsehandlers.BlockingAddTaskResponseHandler;
import org.drools.task.service.responsehandlers.BlockingTaskOperationResponseHandler;
import org.subethamail.wiser.Wiser;
import org.subethamail.wiser.WiserMessage;

public abstract class IcalBaseTest extends BaseTest {

    protected TaskServer server;
    protected TaskClient client;
    private Wiser wiser;
    private String emailHost;
    private String emailPort;

    public void testSendWithStartandEndDeadline() throws Exception {
        Map vars = new HashedMap();
        vars.put("users", users);
        vars.put("groups", groups);
        vars.put("now", new Date());

        String str = "(with (new Task()) { priority = 55, taskData = (with( new TaskData()) { createdOn = now, createdBy = users['tony'], activationTime = now}), ";
        str += "peopleAssignments = (with ( new PeopleAssignments() ) {potentialOwners = [users['steve' ], users['tony' ]]}), ";
        str += "names = [ new I18NText( 'en-UK', 'This is my task name')],";
        str += "subjects = [ new I18NText( 'en-UK', 'This is my task subject')],";
        str += "descriptions = [ new I18NText( 'en-UK', 'This is my task description')],";
        str += "deadlines = (with (new Deadlines() ) {";
        str += "    startDeadlines = [ ";
        str += "       (with (new Deadline()) {";
        str += "           date = now";
        str += "       } ) ],";
        str += "    endDeadlines = [";
        str += "        (with (new Deadline()) {";
        str += "             date = new Date( now.time + ( 1000 * 60 * 60 * 24 ) )"; // set to tomorrow
        str += "        } ) ]";
        str += "} ) })";

        MockUserInfo userInfo = new MockUserInfo();
        userInfo.getEmails().put(users.get("tony"), "tony@domain.com");
        userInfo.getEmails().put(users.get("steve"), "steve@domain.com");

        userInfo.getLanguages().put(users.get("tony"), "en-UK");
        userInfo.getLanguages().put(users.get("steve"), "en-UK");
        taskService.setUserinfo(userInfo);

        BlockingAddTaskResponseHandler addTaskResponseHandler = new BlockingAddTaskResponseHandler();
        Task task = (Task) eval(new StringReader(str), vars);
        client.addTask(task, null, addTaskResponseHandler);

        long taskId = addTaskResponseHandler.getTaskId();

        BlockingTaskOperationResponseHandler responseHandler = new BlockingTaskOperationResponseHandler();
        client.claim(taskId, users.get("steve").getId(), responseHandler);
        responseHandler.waitTillDone(5000);

        assertEquals(2, getWiser().getMessages().size());

        assertEquals("steve@domain.com", getWiser().getMessages().get(0).getEnvelopeReceiver());
        assertEquals("steve@domain.com", getWiser().getMessages().get(1).getEnvelopeReceiver());

        String subject = "Summary\n-------\n\nThis is my task subject\n\n";
        String description = "Description\n-----------\n\nThis is my task description";

        MimeMessage msg = ((WiserMessage) getWiser().getMessages().get(0)).getMimeMessage();
        assertEqualsIgnoreWhitespace("multipart/alternative;boundary=\"----=_Part_", msg.getContentType(), 0, 47);
        assertEquals("tony@domain.com", ((InternetAddress) msg.getFrom()[0]).getAddress());
        assertEquals("tony@domain.com", ((InternetAddress) msg.getReplyTo()[0]).getAddress());
        assertEquals("steve@domain.com", ((InternetAddress) msg.getRecipients(RecipientType.TO)[0]).getAddress());
        assertEquals("Task Assignment Start Event: This is my task name", msg.getSubject());

        MimeMultipart multiPart = (MimeMultipart) msg.getContent();

        BodyPart messageBodyPart = multiPart.getBodyPart(0);
        assertEquals("text/plain; charset=UTF8;", messageBodyPart.getDataHandler().getContentType());
        String content = new String(getBytes(messageBodyPart.getDataHandler().getInputStream()));
        assertEqualsIgnoreWhitespace(subject + description, content);

        messageBodyPart = multiPart.getBodyPart(1);
        assertEquals("text/calendar; charset=UTF8; name=ical-Start-1.ics",
                messageBodyPart.getDataHandler().getContentType());
        content = new String(getBytes(messageBodyPart.getDataHandler().getInputStream()));
        assertEqualsIgnoreWhitespace(
                "BEGIN:VCALENDARPRODID:-//iCal4j 1.0//ENCALSCALE:GREGORIANVERSION:2.0METHOD:REQUESTBEGIN:VEVENTDTSTART;TZID=UTC:",
                content.substring(0, 123));
        assertEqualsIgnoreWhitespace(
                "SUMMARY:\"Task Start : This is my task subject\"DESCRIPTION:\"This is my task description\"PRIORITY:55END:VEVENTEND:VCALENDAR",
                content.substring(content.length() - 131, content.length()));

        msg = ((WiserMessage) getWiser().getMessages().get(1)).getMimeMessage();
        assertEqualsIgnoreWhitespace("multipart/alternative;boundary=\"----=_Part_", msg.getContentType(), 0, 47);
        assertEquals("tony@domain.com", ((InternetAddress) msg.getFrom()[0]).getAddress());
        assertEquals("tony@domain.com", ((InternetAddress) msg.getReplyTo()[0]).getAddress());
        assertEquals("steve@domain.com", ((InternetAddress) msg.getRecipients(RecipientType.TO)[0]).getAddress());
        assertEquals("Task Assignment End Event: This is my task name", msg.getSubject());

        multiPart = (MimeMultipart) msg.getContent();

        messageBodyPart = multiPart.getBodyPart(0);
        assertEquals("text/plain; charset=UTF8;", messageBodyPart.getDataHandler().getContentType());
        content = new String(getBytes(messageBodyPart.getDataHandler().getInputStream()));
        assertEqualsIgnoreWhitespace(subject + description, content);

        messageBodyPart = multiPart.getBodyPart(1);
        assertEquals("text/calendar; charset=UTF8; name=ical-End-1.ics",
                messageBodyPart.getDataHandler().getContentType());
        content = new String(getBytes(messageBodyPart.getDataHandler().getInputStream()));
        assertEqualsIgnoreWhitespace(
                "BEGIN:VCALENDARPRODID:-//iCal4j 1.0//ENCALSCALE:GREGORIANVERSION:2.0METHOD:REQUESTBEGIN:VEVENTDTSTART;TZID=UTC:",
                content.substring(0, 123));
        assertEqualsIgnoreWhitespace(
                "SUMMARY:\"Task End : This is my task subject\"DESCRIPTION:\"This is my task description\"PRIORITY:55END:VEVENTEND:VCALENDAR",
                content.substring(content.length() - 131, content.length()));
    }

    public void testSendWithStartDeadline() throws Exception {
        Map vars = new HashedMap();
        vars.put("users", users);
        vars.put("groups", groups);
        vars.put("now", new Date());

        String str = "(with (new Task()) { priority = 55, taskData = (with( new TaskData()) { createdOn = now, createdBy = users['tony'], activationTime = now}), ";
        str += "peopleAssignments = (with ( new PeopleAssignments() ) {potentialOwners = [users['steve' ], users['tony' ]]}), ";
        str += "names = [ new I18NText( 'en-UK', 'This is my task name')],";
        str += "subjects = [ new I18NText( 'en-UK', 'This is my task subject')],";
        str += "descriptions = [ new I18NText( 'en-UK', 'This is my task description')],";
        str += "deadlines = (with (new Deadlines() ) {";
        str += "    startDeadlines = [ ";
        str += "       (with (new Deadline()) {";
        str += "           date = now";
        str += "       } ) ]";
        str += "} ) })";

        MockUserInfo userInfo = new MockUserInfo();
        userInfo.getEmails().put(users.get("tony"), "tony@domain.com");
        userInfo.getEmails().put(users.get("steve"), "steve@domain.com");

        userInfo.getLanguages().put(users.get("tony"), "en-UK");
        userInfo.getLanguages().put(users.get("steve"), "en-UK");
        taskService.setUserinfo(userInfo);

        BlockingAddTaskResponseHandler addTaskResponseHandler = new BlockingAddTaskResponseHandler();
        Task task = (Task) eval(new StringReader(str), vars);
        client.addTask(task, null, addTaskResponseHandler);

        long taskId = addTaskResponseHandler.getTaskId();

        BlockingTaskOperationResponseHandler responseHandler = new BlockingTaskOperationResponseHandler();
        client.claim(taskId, users.get("steve").getId(), responseHandler);
        responseHandler.waitTillDone(5000);

        assertEquals(1, getWiser().getMessages().size());

        assertEquals("steve@domain.com", getWiser().getMessages().get(0).getEnvelopeReceiver());

        String subject = "Summary\n-------\n\nThis is my task subject\n\n";
        String description = "Description\n-----------\n\nThis is my task description";

        MimeMessage msg = ((WiserMessage) getWiser().getMessages().get(0)).getMimeMessage();
        assertEqualsIgnoreWhitespace("multipart/alternative;boundary=\"----=_Part_", msg.getContentType(), 0, 47);
        assertEquals("tony@domain.com", ((InternetAddress) msg.getFrom()[0]).getAddress());
        assertEquals("tony@domain.com", ((InternetAddress) msg.getReplyTo()[0]).getAddress());
        assertEquals("steve@domain.com", ((InternetAddress) msg.getRecipients(RecipientType.TO)[0]).getAddress());
        assertEquals("Task Assignment Start Event: This is my task name", msg.getSubject());

        MimeMultipart multiPart = (MimeMultipart) msg.getContent();

        BodyPart messageBodyPart = multiPart.getBodyPart(0);
        assertEquals("text/plain; charset=UTF8;", messageBodyPart.getDataHandler().getContentType());
        String content = new String(getBytes(messageBodyPart.getDataHandler().getInputStream()));
        assertEqualsIgnoreWhitespace(subject + description, content);

        messageBodyPart = multiPart.getBodyPart(1);
        assertEquals("text/calendar; charset=UTF8; name=ical-Start-1.ics",
                messageBodyPart.getDataHandler().getContentType());
        content = new String(getBytes(messageBodyPart.getDataHandler().getInputStream()));
        assertEqualsIgnoreWhitespace(
                "BEGIN:VCALENDARPRODID:-//iCal4j 1.0//ENCALSCALE:GREGORIANVERSION:2.0METHOD:REQUESTBEGIN:VEVENTDTSTART;TZID=UTC:",
                content.substring(0, 123));
        assertEqualsIgnoreWhitespace(
                "SUMMARY:\"Task Start : This is my task subject\"DESCRIPTION:\"This is my task description\"PRIORITY:55END:VEVENTEND:VCALENDAR",
                content.substring(content.length() - 131, content.length()));
    }

    public void testSendWithEndDeadline() throws Exception {
        Map vars = new HashedMap();
        vars.put("users", users);
        vars.put("groups", groups);
        vars.put("now", new Date());

        String str = "(with (new Task()) { priority = 55, taskData = (with( new TaskData()) { createdOn = now, createdBy = users['tony'], activationTime = now}), ";
        str += "peopleAssignments = (with ( new PeopleAssignments() ) {potentialOwners = [users['steve' ], users['tony' ]]}), ";
        str += "names = [ new I18NText( 'en-UK', 'This is my task name')],";
        str += "subjects = [ new I18NText( 'en-UK', 'This is my task subject')],";
        str += "descriptions = [ new I18NText( 'en-UK', 'This is my task description')],";
        str += "deadlines = (with (new Deadlines() ) {";
        str += "    endDeadlines = [";
        str += "        (with (new Deadline()) {";
        str += "             date = new Date( now.time + ( 1000 * 60 * 60 * 24 ) )"; // set to tomorrow
        str += "        } ) ]";
        str += "} ) })";

        MockUserInfo userInfo = new MockUserInfo();
        userInfo.getEmails().put(users.get("tony"), "tony@domain.com");
        userInfo.getEmails().put(users.get("steve"), "steve@domain.com");

        userInfo.getLanguages().put(users.get("tony"), "en-UK");
        userInfo.getLanguages().put(users.get("steve"), "en-UK");
        taskService.setUserinfo(userInfo);

        BlockingAddTaskResponseHandler addTaskResponseHandler = new BlockingAddTaskResponseHandler();
        Task task = (Task) eval(new StringReader(str), vars);
        client.addTask(task, null, addTaskResponseHandler);

        long taskId = addTaskResponseHandler.getTaskId();

        BlockingTaskOperationResponseHandler responseHandler = new BlockingTaskOperationResponseHandler();
        client.claim(taskId, users.get("steve").getId(), responseHandler);

        responseHandler.waitTillDone(5000);

        assertEquals(1, getWiser().getMessages().size());

        assertEquals("steve@domain.com", getWiser().getMessages().get(0).getEnvelopeReceiver());

        String subject = "Summary\n-------\n\nThis is my task subject\n\n";
        String description = "Description\n-----------\n\nThis is my task description";

        MimeMessage msg = ((WiserMessage) getWiser().getMessages().get(0)).getMimeMessage();
        assertEqualsIgnoreWhitespace("multipart/alternative;boundary=\"----=_Part_", msg.getContentType(), 0, 47);
        assertEquals("tony@domain.com", ((InternetAddress) msg.getFrom()[0]).getAddress());
        assertEquals("tony@domain.com", ((InternetAddress) msg.getReplyTo()[0]).getAddress());
        assertEquals("steve@domain.com", ((InternetAddress) msg.getRecipients(RecipientType.TO)[0]).getAddress());
        assertEquals("Task Assignment End Event: This is my task name", msg.getSubject());

        MimeMultipart multiPart = (MimeMultipart) msg.getContent();

        BodyPart messageBodyPart = multiPart.getBodyPart(0);
        assertEquals("text/plain; charset=UTF8;", messageBodyPart.getDataHandler().getContentType());
        String content = new String(getBytes(messageBodyPart.getDataHandler().getInputStream()));
        assertEqualsIgnoreWhitespace(subject + description, content);

        messageBodyPart = multiPart.getBodyPart(1);
        assertEquals("text/calendar; charset=UTF8; name=ical-End-1.ics",
                messageBodyPart.getDataHandler().getContentType());
        content = new String(getBytes(messageBodyPart.getDataHandler().getInputStream()));
        assertEqualsIgnoreWhitespace(
                "BEGIN:VCALENDARPRODID:-//iCal4j 1.0//ENCALSCALE:GREGORIANVERSION:2.0METHOD:REQUESTBEGIN:VEVENTDTSTART;TZID=UTC:",
                content.substring(0, 123));
        assertEqualsIgnoreWhitespace(
                "SUMMARY:\"Task End : This is my task subject\"DESCRIPTION:\"This is my task description\"PRIORITY:55END:VEVENTEND:VCALENDAR",
                content.substring(content.length() - 131, content.length()));
    }

    public void testSendWithNoDeadline() throws Exception {
        Map vars = new HashedMap();
        vars.put("users", users);
        vars.put("groups", groups);
        vars.put("now", new Date());

        String str = "(with (new Task()) { priority = 55, taskData = (with( new TaskData()) { createdOn = now, createdBy = users['tony'], activationTime = now}), ";
        str += "peopleAssignments = (with ( new PeopleAssignments() ) {potentialOwners = [users['steve' ], users['tony' ]]}), ";
        str += "names = [ new I18NText( 'en-UK', 'This is my task name')],";
        str += "subjects = [ new I18NText( 'en-UK', 'This is my task subject')],";
        str += "descriptions = [ new I18NText( 'en-UK', 'This is my task description')]";
        str += "})";

        MockUserInfo userInfo = new MockUserInfo();
        userInfo.getEmails().put(users.get("tony"), "tony@domain.com");
        userInfo.getEmails().put(users.get("steve"), "steve@domain.com");

        userInfo.getLanguages().put(users.get("tony"), "en-UK");
        userInfo.getLanguages().put(users.get("steve"), "en-UK");
        taskService.setUserinfo(userInfo);

        BlockingAddTaskResponseHandler addTaskResponseHandler = new BlockingAddTaskResponseHandler();
        Task task = (Task) eval(new StringReader(str), vars);
        client.addTask(task, null, addTaskResponseHandler);

        long taskId = addTaskResponseHandler.getTaskId();

        BlockingTaskOperationResponseHandler responseHandler = new BlockingTaskOperationResponseHandler();
        client.claim(taskId, users.get("steve").getId(), responseHandler);

        responseHandler.waitTillDone(5000);

        assertEquals(0, getWiser().getMessages().size());
    }

    private static void assertEqualsIgnoreWhitespace(final String expected, final String actual) {
        assertEqualsIgnoreWhitespace(expected, actual, 0, actual.length());
    }

    private static void assertEqualsIgnoreWhitespace(final String expected, final String actual, int beginIndex,
            int endIndex) {
        final String cleanExpected = expected.replaceAll("\\s+", "").replaceAll("\\n", "").replaceAll("\\r", "");

        final String cleanActual = actual.substring(beginIndex, endIndex).replaceAll("\\s+", "")
                .replaceAll("\\n", "").replaceAll("\\r", "");
        assertEquals(cleanExpected, cleanActual);
    }

    private static byte[] getBytes(InputStream inputStream) throws Exception {
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream(1024);
        byte[] bytes = new byte[512];

        // Read bytes from the input stream in bytes.length-sized chunks and write
        // them into the output stream
        int readBytes;
        while ((readBytes = inputStream.read(bytes)) > 0) {
            outputStream.write(bytes, 0, readBytes);
        }

        // Convert the contents of the output stream into a byte array
        byte[] byteData = outputStream.toByteArray();

        // Close the streams
        inputStream.close();
        outputStream.close();

        return byteData;
    }

    public void setWiser(Wiser wiser) {
        this.wiser = wiser;
    }

    public Wiser getWiser() {
        return wiser;
    }

    public void setEmailHost(String emailHost) {
        this.emailHost = emailHost;
    }

    public String getEmailHost() {
        return emailHost;
    }

    public void setEmailPort(String emailPort) {
        this.emailPort = emailPort;
    }

    public String getEmailPort() {
        return emailPort;
    }

}