You are viewing a plain text version of this content. The canonical link for it is here.
Posted to adffaces-commits@incubator.apache.org by ma...@apache.org on 2007/03/07 14:44:48 UTC

svn commit: r515587 [5/19] - in /incubator/adffaces/branches/matzew-core-1.0.0-incubation: ./ examples/ examples/trinidad-demo/ examples/trinidad-demo/src/ examples/trinidad-demo/src/conf/ examples/trinidad-demo/src/main/ examples/trinidad-demo/src/mai...

Propchange: incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/email/MessageData.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/email/MessageData.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Added: incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/email/MessageDataModel.java
URL: http://svn.apache.org/viewvc/incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/email/MessageDataModel.java?view=auto&rev=515587
==============================================================================
--- incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/email/MessageDataModel.java (added)
+++ incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/email/MessageDataModel.java Wed Mar  7 06:44:35 2007
@@ -0,0 +1,211 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you 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.apache.myfaces.trinidaddemo.email;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import javax.faces.application.FacesMessage;
+import javax.faces.context.FacesContext;
+import javax.faces.model.DataModel;
+
+import javax.mail.FetchProfile;
+import javax.mail.Folder;
+import javax.mail.Message;
+import javax.mail.MessagingException;
+
+/**
+ * Implementation of DataModel that creates "MessageData" objects
+ * (cached MessageData instances).
+ * As we don't support sorting, and JavaMail only identifies
+ * messages by index, we only need to implement DataModel.
+ * @todo We don't currently deliver DataModelEvents.
+ */
+public class MessageDataModel extends DataModel
+{
+  public MessageDataModel(
+    Folder       folder,
+    FetchProfile fetchProfile,
+    int          blockSize)
+  {
+    setWrappedData(folder);
+    _blockSize = blockSize;
+    _fetchProfile   = fetchProfile;
+  }
+
+  @Override
+  public int getRowCount()
+  {
+    return _count;
+  }
+
+  @Override
+  public boolean isRowAvailable()
+  {
+    int index = getRowIndex();
+    return (index >= 0) && (index < getRowCount());
+  }
+
+  @Override
+  public Object getRowData()
+  {
+    if (!isRowAvailable())
+      return null;
+
+    int index = getRowIndex();
+    
+    // Flip the indices around
+    pageInRowIndex(index);
+    return _loaded[index];
+  }
+
+  @Override
+  public void setRowIndex(int index)
+  {
+    if (index < -1)
+      throw new IllegalArgumentException();
+
+    _rowIndex = index;
+  }
+
+  @Override
+  public int getRowIndex()
+  {
+    return _rowIndex;
+  }
+
+  @Override
+  public Object getWrappedData()
+  {
+    return _folder;
+  }
+
+  @Override
+  public void setWrappedData(Object data)
+  {
+    Folder newFolder = (Folder) data;
+    _folder = newFolder;
+    _rowIndex = -1;
+
+    if (newFolder != null)
+    {
+      try
+      {
+        _count = _folder.getMessageCount();
+      }
+      // Need to handle more cleanly
+      catch (MessagingException me)
+      {
+        _count = 0;
+        _LOG.log(Level.SEVERE, "Could not get message count",  me);
+      }
+    }
+    else
+    {
+      _count = 0;
+    }
+
+    _loaded = new MessageData[_count];
+  }
+
+  private int _getFlippedIndex(int index)
+  {
+    return getRowCount() - index - 1;
+  }
+
+  /**
+   * Pages in a row index, making sure that it (and all other
+   * messages in its block) are available.
+   */
+  public void pageInRowIndex(int index)
+  {
+    if (_loaded[index] == null)
+    {
+
+      try
+      {
+        if (_LOG.isLoggable(Level.FINEST))
+        {
+          _LOG.finest("total messages before open:"+_folder.getMessageCount());
+        }
+
+        _folder.open(Folder.READ_ONLY);
+        // after the folder is opened, the count may change:
+        _count = _folder.getMessageCount();
+
+        // Calculate "from" and "to", zero-indexed
+        // Round down to the start of the block
+        int fromIndex = (index / _blockSize) * _blockSize;
+        int toIndex = fromIndex + _blockSize - 1;
+        if (toIndex >= _count)
+          toIndex = _count - 1;
+
+        try
+        {
+          // Retrieve the messages from the one-indexed Javamail API
+          int jmFromIndex = _getFlippedIndex(toIndex) + 1;
+          int jmToIndex = _getFlippedIndex(fromIndex) + 1;
+          if (_LOG.isLoggable(Level.FINEST))
+            _LOG.finest("fetching messages from:"+jmFromIndex+
+                        " to:"+jmToIndex+
+                        " total:"+ getRowCount() +
+                        " actual total:"+_folder.getMessageCount());
+          Message[] messages = _folder.getMessages(
+                                  jmFromIndex,
+                                  jmToIndex);
+          _folder.fetch(messages, _fetchProfile);
+          for (int i = 0; i < messages.length; i++)
+          {
+            Message message = messages[messages.length - i - 1];
+            _loaded[i + fromIndex] = new MessageData(message);
+          }
+        }
+        finally
+        {
+          _folder.close(false);
+        }
+      }
+      // This is poor;  for starters, the page is likely
+      // already displaying, so it's too late to show an error message.
+      // We should try paging in rows up front via a RangeChangeListener to
+      // catch the earlier and provide useful errors.
+      catch (MessagingException me)
+      {
+        _LOG.log(Level.SEVERE, me.getMessage(), me);
+        FacesMessage errorMessage = new FacesMessage(
+                          FacesMessage.SEVERITY_ERROR,
+                          me.getMessage(),
+                          me.getStackTrace().toString());
+
+        FacesContext context = FacesContext.getCurrentInstance();
+        context.addMessage(null, errorMessage);
+      }
+    }
+  }
+
+  private Folder    _folder;
+  private int       _rowIndex;
+  private int       _count;
+  private int       _blockSize;
+  private MessageData[] _loaded;
+  private FetchProfile _fetchProfile;
+
+  static private final Logger _LOG =
+    Logger.getLogger(MessageDataModel.class.getName());
+}

Propchange: incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/email/MessageDataModel.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/email/MessageDataModel.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Added: incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/email/MessageUtils.java
URL: http://svn.apache.org/viewvc/incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/email/MessageUtils.java?view=auto&rev=515587
==============================================================================
--- incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/email/MessageUtils.java (added)
+++ incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/email/MessageUtils.java Wed Mar  7 06:44:35 2007
@@ -0,0 +1,112 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you 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.apache.myfaces.trinidaddemo.email;
+
+import java.text.MessageFormat;
+import java.util.Locale;
+import java.util.ResourceBundle;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import javax.faces.application.FacesMessage;
+import javax.faces.context.FacesContext;
+
+public class MessageUtils
+{
+  static public FacesMessage getErrorMessage(
+    FacesContext          context,
+    String                key,
+    Object[]              params)
+  {
+    return getMessage(context, key, FacesMessage.SEVERITY_ERROR, params);
+  }
+
+  static public FacesMessage getMessage(
+    FacesContext          context,
+    String                key,
+    FacesMessage.Severity severity,
+    Object[]              params)
+  {
+    Locale locale = context.getViewRoot().getLocale();
+    ResourceBundle bundle = ResourceBundle.getBundle(
+        "org.apache.myfaces.trinidaddemo.email.resource.EmailDemoBundle",
+        locale,
+        Thread.currentThread().getContextClassLoader());
+
+    String summary;
+    String detail;
+
+    try
+    {
+      summary = bundle.getString(key);
+    }
+    catch (Exception e)
+    {
+      _LOG.log(Level.SEVERE, "Can't load key " + key, e);
+      summary = "???" + key + "???";
+    }
+
+    try
+    {
+      detail = bundle.getString(key + "_detail");
+    }
+    catch (Exception e)
+    {
+      detail = null;
+    }
+
+    summary = _format(summary, params);
+    detail = _format(detail, params);
+
+    return new FacesMessage(severity, summary, detail);
+  }
+
+  static public String getString(FacesContext context, String key)
+  {
+    try
+    {
+      Locale locale = context.getViewRoot().getLocale();
+      ResourceBundle bundle = ResourceBundle.getBundle(
+        "org.apache.myfaces.trinidaddemo.email.resource.EmailDemoBundle",
+        locale,
+        Thread.currentThread().getContextClassLoader());
+      return bundle.getString(key);
+    }
+    catch (Exception e)
+    {
+      _LOG.log(Level.SEVERE, "Can't load key " + key, e);
+      return "???" + key + "???";
+    }
+  }
+
+
+  static private String _format(String mask, Object[] params)
+  {
+    if ((mask == null) || (params == null))
+      return mask;
+
+    return MessageFormat.format(mask, params);
+  }
+
+  private MessageUtils()
+  {
+  }
+
+  static private final Logger _LOG =
+    Logger.getLogger(MessageUtils.class.getName());
+}

Propchange: incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/email/MessageUtils.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/email/MessageUtils.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Added: incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/email/MessagesBackingBean.java
URL: http://svn.apache.org/viewvc/incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/email/MessagesBackingBean.java?view=auto&rev=515587
==============================================================================
--- incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/email/MessagesBackingBean.java (added)
+++ incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/email/MessagesBackingBean.java Wed Mar  7 06:44:35 2007
@@ -0,0 +1,208 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you 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.apache.myfaces.trinidaddemo.email;
+
+import javax.faces.application.FacesMessage;
+import javax.faces.context.FacesContext;
+import javax.faces.event.ActionEvent;
+
+import javax.mail.Flags;
+import javax.mail.Folder;
+import javax.mail.Message;
+import javax.mail.MessagingException;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.apache.myfaces.trinidad.component.UIXTable;
+import org.apache.myfaces.trinidad.event.RangeChangeEvent;
+
+/**
+ * Backing bean for the "messages" page.
+ */
+public class MessagesBackingBean
+{
+  public MessagesBackingBean()
+  {
+  }
+
+  public String compact() throws MessagingException
+  {
+    Folder folder = _folderData.getFolder();
+    
+    folder.open(Folder.READ_WRITE);
+    // It would be much more efficient to simply trim out
+    // the list of "expunged" messages from the data model;
+    // instead, we're refreshing the list.
+    folder.expunge();
+    folder.close(true);
+
+    return refresh();
+  }
+
+
+  public String refresh()
+  {
+    _folderData.flush();
+    first();
+    return null;
+  }
+
+
+  public void setFolder(FolderData folder)
+  {
+    _folderData = folder;
+  }
+
+  public FolderData getFolder()
+  {
+    return _folderData;
+  }
+
+  public void setMessagesTable(UIXTable table)
+  {
+    _messagesTable = table;
+  }
+
+  public UIXTable getMessagesTable()
+  {
+    return _messagesTable;
+  }
+
+  public boolean isFirstEnabled()
+  {
+    return _messagesTable.getFirst() > 0;
+  }
+
+  public boolean isLastEnabled()
+  {
+    return (_messagesTable.getFirst() + _messagesTable.getRows()) <  
+                _messagesTable.getRowCount();
+  }
+
+  public String first()
+  {
+    _messagesTable.setFirst(0);
+    return null;
+  }
+
+  public String last()
+  {
+    // The last row is the row count minus 1
+    int lastRow = _messagesTable.getRowCount() - 1;
+    if (lastRow >= 0)
+    {
+      int rows = _messagesTable.getRows();
+      _messagesTable.setFirst((lastRow / rows) * rows);
+    }
+
+    return null;
+  }
+
+  /**
+   * Remember the "first" row for the table.  If we didn't
+   * do this, there wouldn't be any issue as we page from
+   * row to row within this page.  The problem comes when
+   * we <em>return</em> to this folder (after showing a message,
+   * for example).  There ought to be a better solution to this
+   * problem.
+   */ 
+  public void saveFirst(RangeChangeEvent event)
+  {
+    _folderData.setStartIndex(event.getNewStart());
+  }
+
+  public void performDelete(ActionEvent event)
+  {
+    Iterator<?> selection = _messagesTable.getSelectedRowKeys().iterator();
+    // Nothing was selected
+    if (selection.hasNext())
+    {
+      try
+      {
+        // Save the old row key
+        Object oldRowKey = _messagesTable.getRowKey();
+
+        Folder folder = _folderData.getFolder();
+        folder.open(Folder.READ_WRITE);
+        List<Message> messageList = new ArrayList<Message>();
+        try
+        {
+          while (selection.hasNext())
+          {
+            String rowKey = (String) selection.next();
+            _messagesTable.setRowKey(rowKey);
+            MessageData message = (MessageData) _messagesTable.getRowData();
+            if (message == null)
+            {
+              _LOG.log(Level.WARNING, "Couldn't find message for row {0}",
+                       rowKey);
+            }
+            else
+            {
+              _LOG.log(Level.FINE, "Attempting to delete message {0}",
+                       message.getSubject());
+              // Get the actual Message object
+              messageList.add(message.getMessage());
+            }
+          }
+
+          Message[] messages = 
+            messageList.toArray(new Message[messageList.size()]);
+          folder.setFlags(messages, new Flags(Flags.Flag.DELETED), true);
+          // clear the selection:
+          _messagesTable.getSelectedRowKeys().clear();
+          // refresh the folder so that the little 'deleted' icons show up:
+          refresh();
+        }
+        finally
+        {
+          // Restore the old key
+          _messagesTable.setRowKey(oldRowKey);
+          folder.close(false);
+        }
+      }
+      catch (MessagingException me)
+      {
+        _LOG.log(Level.WARNING, "Couldn't delete", me);
+        FacesContext context = FacesContext.getCurrentInstance();
+        FacesMessage message =
+           MessageUtils.getErrorMessage(context,
+                                        "COULD_NOT_DELETE",
+                                        new Object[]{me.getMessage()});
+        context.addMessage(null, message);
+
+      }
+    }
+    else
+    {
+      _LOG.fine("No messages were selected.");
+    }
+  }
+
+  private UIXTable _messagesTable;
+  private FolderData _folderData;
+
+  static private final Logger _LOG =
+    Logger.getLogger(MessagesBackingBean.class.getName());
+}

Propchange: incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/email/MessagesBackingBean.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/email/MessagesBackingBean.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Added: incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/email/NewMessageBackingBean.java
URL: http://svn.apache.org/viewvc/incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/email/NewMessageBackingBean.java?view=auto&rev=515587
==============================================================================
--- incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/email/NewMessageBackingBean.java (added)
+++ incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/email/NewMessageBackingBean.java Wed Mar  7 06:44:35 2007
@@ -0,0 +1,435 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you 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.apache.myfaces.trinidaddemo.email;
+
+import java.io.InputStream;
+import java.io.IOException;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Properties;
+import java.util.StringTokenizer;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import javax.activation.DataHandler;
+import javax.activation.DataSource;
+
+import javax.mail.BodyPart;
+import javax.mail.Folder;
+import javax.mail.Message;
+import javax.mail.MessagingException;
+import javax.mail.Multipart;
+import javax.mail.Session;
+import javax.mail.Store;
+import javax.mail.Transport;
+
+import javax.mail.internet.AddressException;
+import javax.mail.internet.InternetAddress;
+import javax.mail.internet.MimeBodyPart;
+import javax.mail.internet.MimeMessage;
+import javax.mail.internet.MimeMultipart;
+
+
+import javax.faces.application.FacesMessage;
+import javax.faces.component.UIComponent;
+import javax.faces.context.FacesContext;
+import javax.faces.validator.ValidatorException;
+
+import org.apache.myfaces.trinidad.model.UploadedFile;
+
+/**
+ * Backing bean for the "show message" page.  Provides some
+ * getters for things that aren't quite JavaBeans on the Message API.
+ */
+public class NewMessageBackingBean
+{
+  public NewMessageBackingBean()
+  {
+  }
+
+  public void setAccount(AccountData account)
+  {
+    _account = account;
+  }
+
+  public AccountData getAccount()
+  {
+    return _account;
+  }
+
+  public void validateEmailList(FacesContext context,
+                                UIComponent  component,
+                                Object       value) throws ValidatorException
+  {
+    if (value == null)
+      return;
+
+    try
+    {
+      _getEmailList(value.toString());
+    }
+    catch (AddressException ae)
+    {
+      throw new ValidatorException(
+       MessageUtils.getErrorMessage(context,
+                                    "EMAIL_LIST_ERROR",
+                                    new Object[]{ae.getRef()}));
+
+    }
+  }
+
+  public String getTo()
+  {
+    return _to;
+  }
+
+  public void setTo(String to)
+  {
+    _to = to;
+  }
+
+
+  public String getCc()
+  {
+    return _cc;
+  }
+
+  public void setCc(String cc)
+  {
+    _cc = cc;
+  }
+
+  public String getContent()
+  {
+    return _content;
+  }
+
+  public void setContent(String content)
+  {
+    _content = content;
+  }
+
+  public String getSubject()
+  {
+    return _subject;
+  }
+
+  public void setSubject(String subject)
+  {
+    _subject = subject;
+  }
+
+  public UploadedFile getAttachment1()
+  {
+    return _attachment1;
+  }
+
+  public void setAttachment1(UploadedFile attachment1)
+  {
+    _attachment1 = attachment1;
+  }
+
+  public UploadedFile getAttachment2()
+  {
+    return _attachment2;
+  }
+
+  public void setAttachment2(UploadedFile attachment2)
+  {
+    _attachment2 = attachment2;
+  }
+
+
+  public UploadedFile getAttachment3()
+  {
+    return _attachment3;
+  }
+
+  public void setAttachment3(UploadedFile attachment3)
+  {
+    _attachment3 = attachment3;
+  }
+
+  public String send()
+  {
+    Session session = _getSession();
+    Message msg = _setupMessage(new MimeMessage(session));
+    if (msg == null)
+    {
+      _LOG.info("Could not create Message object for " + getSubject());
+      return null;
+    }
+
+    try
+    {
+      Transport.send(msg);
+    }
+    catch (MessagingException me)
+    {
+      _showSendException(me);
+      return null;
+    }
+
+    _LOG.info("Sent succesfully");
+
+    try
+    {
+      Store store = _account.getStore();
+      // =-=AEW Hardcoding "Sent" as the folder to save "Sent" messages
+      Folder folder = store.getFolder("Sent");
+      if (folder == null)
+      {
+        // Can "folder" be null here?
+        throw new IllegalStateException("\"Sent\" folder was null");
+      }
+      else
+      {
+        if (!folder.exists())
+          folder.create(Folder.HOLDS_MESSAGES);
+
+        folder.appendMessages(new Message[]{msg});
+      }
+    }
+    // Need to do something better;  like a "Warning: message sent, but not
+    // saved" message for the user?
+    catch (Exception e)
+    {
+      _LOG.log(Level.WARNING, "Couldn't save message in \"Sent\" folder", e);
+    }
+
+    return "sentMessage";
+  }
+
+
+  private Session _getSession()
+  {
+    Properties props = new Properties(System.getProperties());
+    if (_account.getSmtpServer() != null)
+      props.put("mail.smtp.host", _account.getSmtpServer());
+    return Session.getInstance(props, null);
+  }
+
+  public String saveAsDraft()
+  {
+    _LOG.info("Beginning send of message " + getSubject());
+
+    Session session = _getSession();
+    Message msg = _setupMessage(new MimeMessage(session));
+    if (msg == null)
+    {
+      _LOG.info("Could not create Message object for " + getSubject());
+      return null;
+    }
+
+    try
+    {
+      Store store = _account.getStore();
+      // =-=AEW Hardcoding "Drafts" as the folder to save drafts
+      Folder folder = store.getFolder("Drafts");
+      if (folder == null)
+      {
+        // Can "folder" be null here?
+        throw new IllegalStateException("\"Drafts\" folder was null");
+      }
+      else
+      {
+        if (!folder.exists())
+          folder.create(Folder.HOLDS_MESSAGES);
+        
+        folder.appendMessages(new Message[]{msg});
+      }
+    }
+    // Need to do something better...
+    catch (Exception e)
+    {
+      _showSendException(e);
+      return null;
+    }
+    
+    // And go back to the current message folder
+    // =-=aew Should be a "popView" thing
+    return "messages";
+  }
+
+  /**
+   * Set up a new message.
+   */
+  private Message _setupMessage(Message msg)
+  {
+    try
+    {
+      String username = _account.getUsername();
+      String from = username + "@" + _account.getDomain();
+      List<InternetAddress> to = _getEmailList(getTo());
+      
+      List<InternetAddress> cc = null;
+      String ccString = getCc();
+      if(ccString != null) 
+      {
+        cc = _getEmailList(ccString);  
+      }
+      
+      msg.setFrom(new InternetAddress(from));
+      if ((to != null) && !to.isEmpty())
+        msg.setRecipients(Message.RecipientType.TO,
+                          to.toArray(new InternetAddress[0]));
+
+      if ((cc != null) && !cc.isEmpty())
+        msg.setRecipients(Message.RecipientType.CC,
+                          cc.toArray(new InternetAddress[0]));
+      msg.setSubject(_subject == null ? "" : _subject);
+      if ((_attachment1 == null) &&
+          (_attachment2 == null) &&
+          (_attachment3 == null))
+      {
+        msg.setText(_content == null ? "" : _content);
+      }
+      // Multipart.
+      else
+      {
+        // Create the message part
+        BodyPart messageBodyPart = new MimeBodyPart();
+
+        // Fill the message
+        messageBodyPart.setText(_content == null ? "" : _content);
+
+        Multipart multipart = new MimeMultipart();
+        multipart.addBodyPart(messageBodyPart);
+
+        if (_attachment1 != null)
+          _addAttachment(multipart, _attachment1);
+        if (_attachment2 != null)
+          _addAttachment(multipart, _attachment2);
+        if (_attachment3 != null)
+          _addAttachment(multipart, _attachment3);
+
+        // Put all the parts in the message
+        msg.setContent(multipart);
+      }
+
+      String mailer = "OracleAdfEmailDemo";
+      msg.setHeader("X-Mailer", mailer);
+      msg.setSentDate(new Date());
+
+      return msg;
+    }
+    catch(AddressException ae)
+    {
+       _showSendException(ae);
+    }
+    catch(MessagingException me)
+    {
+      _showSendException(me);
+    }
+    catch(Exception e)
+    {
+      _showSendException(e);
+    }
+
+    return null;
+  }
+
+  private void _showSendException(Exception e)
+  {
+    FacesContext context = FacesContext.getCurrentInstance();
+    context.addMessage(null,
+                       new FacesMessage(FacesMessage.SEVERITY_ERROR,
+                                        e.getMessage(), null));
+    _LOG.log(Level.WARNING, "Couldn't send message", e);
+  }
+
+  private void _addAttachment(Multipart multipart, UploadedFile file)
+    throws MessagingException
+  {
+    BodyPart messageBodyPart = new MimeBodyPart();
+    DataSource source = new UploadedFileDataSource(file);
+    messageBodyPart.setDataHandler(new DataHandler(source));
+    messageBodyPart.setFileName(file.getFilename());
+    multipart.addBodyPart(messageBodyPart);
+  }
+
+  static private List<InternetAddress> _getEmailList(String values)
+    throws AddressException
+  {
+    ArrayList<InternetAddress> list = new ArrayList<InternetAddress>();
+    StringTokenizer tokens = new StringTokenizer(values.toString(), ",");
+    while (tokens.hasMoreTokens())
+    {
+      String token = tokens.nextToken().trim();
+
+      InternetAddress address = new InternetAddress(token);
+
+      // JavaMail 1.3 API:
+      //InternetAddress address = new InternetAddress(token, false);
+      //address.validate();
+      
+      list.add(address);
+    }
+
+    return list;
+  }
+
+  private AccountData _account;
+
+  private String _subject;
+  private String _to;
+  private String _cc;
+  private String _content;
+  private UploadedFile _attachment1;
+  private UploadedFile _attachment2;
+  private UploadedFile _attachment3;
+
+  private static final class UploadedFileDataSource implements DataSource
+  {
+    public UploadedFileDataSource(UploadedFile file)
+    {
+      _file = file;
+      _LOG.info("Source for uploaded file " + file.getFilename() + " with " + file.getLength() + " bytes");
+    }
+
+    public String getContentType()
+    {
+      return _file.getContentType();
+    }
+
+    public InputStream getInputStream() throws IOException
+    {
+      return _file.getInputStream();
+    }
+
+    public String getName()
+    {
+      return _file.getFilename();
+    }
+
+    public java.io.OutputStream getOutputStream()
+    {
+      return null;
+    }
+
+    private final UploadedFile _file;
+  }
+
+
+  static private final Logger _LOG =
+    Logger.getLogger(ShowMessageBackingBean.class.getName());
+
+}

Propchange: incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/email/NewMessageBackingBean.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/email/NewMessageBackingBean.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Added: incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/email/PreferencesData.java
URL: http://svn.apache.org/viewvc/incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/email/PreferencesData.java?view=auto&rev=515587
==============================================================================
--- incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/email/PreferencesData.java (added)
+++ incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/email/PreferencesData.java Wed Mar  7 06:44:35 2007
@@ -0,0 +1,270 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you 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.apache.myfaces.trinidaddemo.email;
+
+import java.util.ArrayList;
+import java.util.List;
+import javax.faces.model.SelectItem;
+
+/**
+ * Bean which provides preferences data
+ *
+ * @version 1.0
+ */
+public class PreferencesData
+{
+  /**
+   * Branding type for "regular" branding, which includes the
+   * corporate brand, a large product brand, and global button
+   * icons.
+   */
+  public static String REGULAR_BRANDING = "regular";
+
+  /**
+   * Branding type for "medium" branding, which includes the
+   * corporate brand, a smaller product brand, and no global
+   * button icons
+   */
+  public static String MEDIUM_BRANDING = "medium";
+
+  /**
+   * Branding type for "small" branding, which includes the
+   * corporate brand, no product brand, and no global
+   * button icons
+   */
+  public static String SMALL_BRANDING = "small";
+
+  /**
+   * Creates a PreferencesData object with default preferences
+   */
+  public PreferencesData()
+  {
+    // need public accesibility mode constants declared in Trinidad!
+    _branding = REGULAR_BRANDING;
+    _rowsShown = _DEFAULT_ROWS_SHOWN;
+    _displayFolderTree = true;
+    _displaySenderColumn = true;
+    _displayDateColumn = true;
+    _displaySizeColumn = true;
+    _skinFamily = "oracle";
+    _accessibilityMode = "default";
+  }
+
+
+  /**
+   * @todo Provide internationalized list.
+   */
+  public List<SelectItem> getSkinFamilyItems()
+  {
+    return _SKIN_FAMILIES;
+  }
+
+
+  /**
+   * @todo Provide internationalized list.
+   */
+  public List<SelectItem> getAccessibilityModeItems()
+  {
+    return _ACCESSIBILITY_MODES;
+  }
+
+  /**
+   * Returns the skin-family for the application.
+   */
+  public String getSkinFamily()
+  {
+    return _skinFamily;
+  }
+
+
+  /**
+   * Returns the skin-family for the application.
+   */
+  public void setSkinFamily(String skinFamily)
+  {
+    _skinFamily = skinFamily;
+  }
+
+  /**
+   * Returns the AccessibilityMode for this user
+   */
+  public String getAccessibilityMode()
+  {
+    return _accessibilityMode;
+  }
+
+
+  /**
+   * Returns the branding type: REGULAR_BRANDING,
+   * MEDIUM_BRANDING or SMALL_BRANDING
+   */
+  public String getBranding()
+  {
+    return _branding;
+  }
+
+  /**
+   * Returns the numbers of rows to display in the messages table.
+   */
+  public int getRowsShown()
+  {
+    return _rowsShown;
+  }
+
+  /**
+   * Gets whether the SideBar with the folder tree is displayed
+   */
+  public boolean getDisplayFolderTree()
+  {
+    return _displayFolderTree;
+  }
+
+  /**
+   * Sets whether the SideBar with the folder tree is displayed
+   */
+  public void setDisplayFolderTree(boolean isDisplayed)
+  {
+    _displayFolderTree = isDisplayed;
+  }
+
+  /**
+   * Gets whether the sender column is displayed
+   */
+  public boolean getDisplaySenderColumn()
+  {
+    return _displaySenderColumn;
+  }
+
+  /**
+   * Sets whether the sender column is displayed
+   */
+  public void setDisplaySenderColumn(boolean isDisplayed)
+  {
+    _displaySenderColumn = isDisplayed;
+  }
+
+  /**
+   * Gets whether the date column is displayed
+   */
+  public boolean getDisplayDateColumn()
+  {
+    return _displayDateColumn;
+  }
+
+  /**
+   * Sets whether the date column is displayed
+   */
+  public void setDisplayDateColumn(boolean isDisplayed)
+  {
+    _displayDateColumn = isDisplayed;
+  }
+
+  /**
+   * Gets whether the size column is displayed
+   */
+  public boolean getDisplaySizeColumn()
+  {
+    return _displaySizeColumn;
+  }
+
+  /**
+   * Sets whether the size column is displayed
+   */
+  public void setDisplaySizeColumn(boolean isDisplayed)
+  {
+    _displaySizeColumn = isDisplayed;
+  }
+
+  /**
+   * Gets whether the user wants to preview the email message underneath
+   * the message list
+   */
+  public boolean isPreviewMessageMode()
+  {
+    return _isPreviewMessageMode;
+  }
+
+  /**
+   * Sets whether the user wants to preview the email message underneath
+   * the message list
+   */
+  public void setPreviewMessageMode(boolean enable)
+  {
+    _isPreviewMessageMode = enable;
+  }
+
+  /**
+   * Sets the AccessibilityMode for this user.
+   */
+  public void setAccessibilityMode(String accessibilityMode)
+  {
+    _accessibilityMode = accessibilityMode;
+  }
+
+  /**
+   * Sets the branding.  Must be one of: REGULAR_BRANDING,
+   * MEDIUM_BRANDING, or SMALL_BRANDING.
+   */
+  public void setBranding(String branding)
+  {
+    // assert (REGULAR_BRANDING.equals(branding) ||
+  //    MEDIUM_BRANDING.equals(branding)  ||
+  //    SMALL_BRANDING.equals(branding));
+
+    _branding = branding;
+  }
+
+  /**
+   * Sets the number of rows to show in the messages table.
+   */
+  public void setRowsShown(int rowsShown)
+  {
+    // assert rowsShown > 0;
+
+    if (rowsShown > 0)
+      _rowsShown = rowsShown;
+  }
+
+  private String  _accessibilityMode;  // The accessibility mode
+  private String  _branding;          // The branding type
+  private String  _skinFamily;          // The skin-family
+  private int     _rowsShown;         // How many rows to show
+  private boolean _displayFolderTree;
+  private boolean _displaySenderColumn;
+  private boolean _displayDateColumn;
+  private boolean _displaySizeColumn;
+  private boolean _isPreviewMessageMode = false;
+
+  private static final int _DEFAULT_ROWS_SHOWN = 25;
+
+  private static final List<SelectItem> _ACCESSIBILITY_MODES = new ArrayList<SelectItem>();
+  static
+  {
+    _ACCESSIBILITY_MODES.add(new SelectItem("default", "Default"));
+    _ACCESSIBILITY_MODES.add(new SelectItem("inaccessible", "None"));
+    _ACCESSIBILITY_MODES.add(new SelectItem("screenReader", "Screen Readers"));
+  }
+
+  private static final List<SelectItem> _SKIN_FAMILIES = new ArrayList<SelectItem>();
+  static
+  {
+    _SKIN_FAMILIES.add(new SelectItem("oracle", "Oracle"));
+    _SKIN_FAMILIES.add(new SelectItem("minimal", "Minimal"));
+  }
+}

Propchange: incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/email/PreferencesData.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/email/PreferencesData.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Added: incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/email/RelativeDateConverter.java
URL: http://svn.apache.org/viewvc/incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/email/RelativeDateConverter.java?view=auto&rev=515587
==============================================================================
--- incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/email/RelativeDateConverter.java (added)
+++ incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/email/RelativeDateConverter.java Wed Mar  7 06:44:35 2007
@@ -0,0 +1,98 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you 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.apache.myfaces.trinidaddemo.email;
+
+import java.text.DateFormat;
+import java.text.MessageFormat;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.Locale;
+import java.util.TimeZone;
+import javax.faces.component.UIComponent;
+import javax.faces.convert.Converter;
+import javax.faces.context.FacesContext;
+
+import org.apache.myfaces.trinidad.context.RequestContext;
+
+public class RelativeDateConverter implements Converter
+{
+  public RelativeDateConverter()
+  {
+  }
+
+  public String getAsString(FacesContext context, UIComponent component,
+                            Object value)
+  {
+    if (value == null)
+      return null;
+
+    if (!(value instanceof Date))
+      return value.toString();
+
+    Date date = (Date) value;
+
+    RequestContext afContext = RequestContext.getCurrentInstance();
+    TimeZone tz = afContext.getTimeZone();
+    if (tz == null)
+      tz = TimeZone.getDefault();
+
+    Locale locale = context.getViewRoot().getLocale();
+    if (_isToday(date, tz, locale))
+    {
+      DateFormat format = DateFormat.getTimeInstance(DateFormat.SHORT,
+                                                     locale);
+      String dateString = format.format(date);
+      String todayMask = MessageUtils.getString(context, "TODAY_MASK");
+      return MessageFormat.format(todayMask, new Object[]{dateString});
+    }
+    else
+    {
+      DateFormat format = DateFormat.getDateTimeInstance(DateFormat.SHORT,
+                                                         DateFormat.SHORT,
+                                                         locale);
+      return format.format(date);
+    }
+  }
+
+  public Object getAsObject(FacesContext context, UIComponent component,
+                            String value)
+  {
+    throw new UnsupportedOperationException();
+  }
+
+  static private boolean _isToday(Date date, TimeZone tz, Locale locale)
+  {
+    Calendar calendar = Calendar.getInstance(tz, locale);
+    calendar.setTime(date);
+
+    int year = calendar.get(Calendar.YEAR);
+    int dayOfYear = calendar.get(Calendar.DAY_OF_YEAR);
+
+    calendar.setTime(new Date());
+    if ((year == calendar.get(Calendar.YEAR)) &&
+        (dayOfYear == calendar.get(Calendar.DAY_OF_YEAR)))
+    {
+      return true;
+    }
+    else
+    {
+      return false;
+    }
+  }
+}

Propchange: incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/email/RelativeDateConverter.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/email/RelativeDateConverter.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Added: incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/email/ReplyToMessageBackingBean.java
URL: http://svn.apache.org/viewvc/incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/email/ReplyToMessageBackingBean.java?view=auto&rev=515587
==============================================================================
--- incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/email/ReplyToMessageBackingBean.java (added)
+++ incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/email/ReplyToMessageBackingBean.java Wed Mar  7 06:44:35 2007
@@ -0,0 +1,116 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you 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.apache.myfaces.trinidaddemo.email;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import javax.mail.Address;
+import javax.mail.Folder;
+import javax.mail.Message;
+import javax.mail.MessagingException;
+import javax.mail.internet.InternetAddress;
+
+import org.apache.myfaces.trinidad.context.RequestContext;
+
+/**
+ * Backing bean for the "reply-to message" page.
+ * @todo For now, the original contents are not included in the reply
+ * We could add a preference so the user can choose to include
+ * the original contents in replies
+ */
+public class ReplyToMessageBackingBean extends NewMessageBackingBean
+{
+  public ReplyToMessageBackingBean()
+  {
+    // if the user pressed the Reply button, then the pageFlowScope's
+    // replyToAll value will be false. If the user pressed the
+    // Reply to All button, then the pageFlowScope's replyToAll value
+    // will be true. We set this in the showMessage.jspx page.
+    RequestContext afContext = RequestContext.getCurrentInstance();
+
+    Object replyToAll = afContext.getPageFlowScope().get("replyToAll");
+
+    _setUpReplyToMessage("true".equals(replyToAll));
+  }
+
+  private void _setUpReplyToMessage(boolean replyToAll)
+  {
+    RequestContext afContext = RequestContext.getCurrentInstance();
+
+    MessageData message =
+      (MessageData) afContext.getPageFlowScope().get("message");
+
+    if (message == null) return;
+    Message msg = message.getMessage();
+
+    try
+    {
+        msg.getFolder().open(Folder.READ_ONLY);
+        Message replyMessage = msg.reply(replyToAll);
+
+        setSubject(replyMessage.getSubject());
+        Address[] replyToAddresses = replyMessage.getAllRecipients();
+        setTo(_getAddressString(replyToAddresses));
+
+    }
+    catch (MessagingException e)
+    {
+      _LOG.log(Level.WARNING, "Couldn't create reply-to message", e);
+    }
+    finally
+    {
+
+        try
+        {
+          msg.getFolder().close(false);
+        }
+        catch (Exception e)
+        {
+
+        }
+
+    }
+  }
+
+  /**
+   * Given Address[], return a comma-separated string of the email addresses.
+   * @param replyToAddresses
+   * @return return a comma-separated string of the email addresses.
+   */
+  private String _getAddressString(Address[] replyToAddresses)
+  {
+
+    StringBuffer to = new StringBuffer(100);
+
+    for (int i = 0; i < replyToAddresses.length; i++)
+    {
+      if (i > 0)
+        to.append(",");
+      to.append(((InternetAddress)replyToAddresses[i]).getAddress());
+    }
+
+    return to.toString();
+
+  }
+
+  static private final Logger _LOG =
+    Logger.getLogger(ReplyToMessageBackingBean.class.getName());
+
+}

Propchange: incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/email/ReplyToMessageBackingBean.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/email/ReplyToMessageBackingBean.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Added: incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/email/ShowMessageBackingBean.java
URL: http://svn.apache.org/viewvc/incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/email/ShowMessageBackingBean.java?view=auto&rev=515587
==============================================================================
--- incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/email/ShowMessageBackingBean.java (added)
+++ incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/email/ShowMessageBackingBean.java Wed Mar  7 06:44:35 2007
@@ -0,0 +1,161 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you 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.apache.myfaces.trinidaddemo.email;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import javax.mail.Folder;
+import javax.mail.MessagingException;
+import javax.mail.Part;
+
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletResponse;
+
+import javax.faces.context.FacesContext;
+
+import org.apache.myfaces.trinidad.context.RequestContext;
+
+/**
+ * Backing bean for the "show message" page. Provides support
+ * for downloading attachments, and hides the fact that the "message"
+ * comes in pageFlowScope from the actual page content.
+ */
+public class ShowMessageBackingBean
+{
+  public ShowMessageBackingBean()
+  {
+    // Code necessary because of:
+    //   https://javaserverfaces.dev.java.net/issues/show_bug.cgi?id=22
+    RequestContext afContext = RequestContext.getCurrentInstance();
+    setMessage((MessageData) afContext.getPageFlowScope().get("message"));
+  }
+
+  public MessageData getMessage()
+  {
+    return _message;
+  }
+
+  public void setAttachmentToDownload(Part attachment)
+  {
+    _attachmentToDownload = attachment;
+  }
+
+
+  public Part getAttachmentToDownload()
+  {
+    return _attachmentToDownload;
+  }
+
+
+  public void setMessage(MessageData message)
+  {
+    try
+    {
+      _LOG.log(Level.INFO, "Displaying message {0}", message.getSubject());
+    }
+    catch (MessagingException me)
+    {
+      _LOG.log(Level.SEVERE, "Can't get the subject", me);
+    }
+
+    _message = message;
+  }
+
+  public String downloadAttachment() throws IOException, MessagingException
+  {
+    if (_attachmentToDownload == null)
+    {
+      _LOG.severe("No attachment available");
+      return null;
+    }
+
+    _message.getMessage().getFolder().open(Folder.READ_ONLY);
+
+    InputStream in = _attachmentToDownload.getInputStream();
+
+    FacesContext context = FacesContext.getCurrentInstance();
+    // Get the ServletResponse;  nothing on ExternalContext is sufficient
+    ServletResponse response = (ServletResponse)
+      context.getExternalContext().getResponse();
+    response.setContentType(_attachmentToDownload.getContentType());
+
+    // If the size of the attachment is known, pass that on.
+    int size = _attachmentToDownload.getSize();
+    if (size >= 0)
+    {
+      response.setContentLength(size);
+    }
+
+    if (_LOG.isLoggable(Level.INFO))
+      _LOG.info("Downloading content+ [size=" + size +",contentType=" +
+                _attachmentToDownload.getContentType() + "]");
+
+    if (response instanceof HttpServletResponse)
+    {
+      String filename = _attachmentToDownload.getFileName();
+      if (filename != null)
+      {
+        ((HttpServletResponse) response).setHeader(
+            "Content-disposition",
+            "attachment; filename=\"" + filename + "\"");
+      }
+    }
+
+    // Pass the text along, 128K at a time.
+    try
+    {
+      OutputStream out = response.getOutputStream();
+      try
+      {
+        byte[] buffer = new byte[131072];
+        while (true)
+        {
+          int count = in.read(buffer);
+          if (count < 0)
+            break;
+
+          out.write(buffer, 0, count);
+        }
+      }
+      // Close up the response
+      finally
+      {
+        // And tell JSF that we handled everything
+        context.responseComplete();
+        out.close();
+      }
+    }
+    // And make sure the folder got closed
+    finally
+    {
+      _message.getMessage().getFolder().close(false);
+    }
+
+    return null;
+  }
+
+  private MessageData _message;
+  private Part        _attachmentToDownload;
+
+  static private final Logger _LOG =
+    Logger.getLogger(ShowMessageBackingBean.class.getName());
+}

Propchange: incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/email/ShowMessageBackingBean.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/email/ShowMessageBackingBean.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Added: incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/email/resource/EmailDemoBundle.java
URL: http://svn.apache.org/viewvc/incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/email/resource/EmailDemoBundle.java?view=auto&rev=515587
==============================================================================
--- incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/email/resource/EmailDemoBundle.java (added)
+++ incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/email/resource/EmailDemoBundle.java Wed Mar  7 06:44:35 2007
@@ -0,0 +1,44 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you 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.apache.myfaces.trinidaddemo.email.resource;
+
+import java.util.ListResourceBundle;
+
+public class EmailDemoBundle extends ListResourceBundle
+{
+  @Override
+  public Object[][] getContents()
+  {
+    return _CONTENTS;
+  }
+
+  static private final Object[][] _CONTENTS =
+  {
+    {"TODAY_MASK", "Today, {0}"},
+    {"EMAIL_LIST_ERROR", "Illegal email address."},
+    {"EMAIL_LIST_ERROR_detail", "{0} is not a legal email address."},
+    {"MESSAGE_SENT", "The message was sent successfully."},
+    {"COULD_NOT_DELETE", "Deletion failed."},
+    {"COULD_NOT_DELETE_detail", "The server returned an error: {0}."},
+    {"EMAIL_DEMO_TITLE", "Trinidad Email Demo"},   
+
+    
+  };
+}
+

Propchange: incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/email/resource/EmailDemoBundle.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/email/resource/EmailDemoBundle.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Added: incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/nav/DemoNavigationItem.java
URL: http://svn.apache.org/viewvc/incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/nav/DemoNavigationItem.java?view=auto&rev=515587
==============================================================================
--- incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/nav/DemoNavigationItem.java (added)
+++ incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/nav/DemoNavigationItem.java Wed Mar  7 06:44:35 2007
@@ -0,0 +1,106 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you 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.apache.myfaces.trinidaddemo.nav;
+
+import java.io.Serializable;
+import java.util.List;
+
+
+public class DemoNavigationItem implements Serializable
+{
+  public DemoNavigationItem()
+  {}
+
+
+  public void setLabel(String label)
+  {
+    _label = label;
+  }
+
+  public String getLabel()
+  {
+    return _label;
+  }
+
+  public void setOutcome(String outcome)
+  {
+    _outcome = outcome;
+  }
+
+  public String getOutcome()
+  {
+    return _outcome;
+  }
+
+  public void setViewId(String viewId)
+  {
+    _viewId = viewId;
+  }
+
+  public String getViewId()
+  {
+    return _viewId;
+  }
+
+  // calling this 'ico' instead of 'icon' due to tree bug
+  public void setIco(String icon)
+  {
+    _icon = icon;
+  }
+
+  // calling this 'ico' instead of 'icon' due to tree bug
+  public String getIco()
+  {
+    return _icon;
+  }
+
+
+  public void setDestination(String destination)
+  {
+    _destination = destination;
+  }
+
+  public String getDestination()
+  {
+    return _destination;
+  }
+
+  public List<?> getChildren()
+  {
+    return _children;
+  }
+
+  public void setChildren(List<?> children)
+  {
+    _children = children;
+  }
+
+
+
+
+  private String  _label       = null;
+  private String  _outcome     = null;
+  private String  _viewId      = null;
+  private String  _destination = null;
+  private String  _icon        = null;
+  private List<?> _children    = null;
+
+
+
+}

Propchange: incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/nav/DemoNavigationItem.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/nav/DemoNavigationItem.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Added: incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/nav/MenuModelAdapter.java
URL: http://svn.apache.org/viewvc/incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/nav/MenuModelAdapter.java?view=auto&rev=515587
==============================================================================
--- incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/nav/MenuModelAdapter.java (added)
+++ incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/nav/MenuModelAdapter.java Wed Mar  7 06:44:35 2007
@@ -0,0 +1,85 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you 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.apache.myfaces.trinidaddemo.nav;
+
+import java.util.List;
+
+import org.apache.myfaces.trinidad.model.ViewIdPropertyMenuModel;
+
+/**
+ * This class facilitates calling ViewIdPropertyMenuModel.addViewId via
+ * an "aliasList".
+ */
+public class MenuModelAdapter implements java.io.Serializable
+{
+  public MenuModelAdapter()
+  {
+  }
+
+  private ViewIdPropertyMenuModel _model = null;
+  private List<Object> _aliasList = null;
+  private boolean _aliasListAdded = false;
+
+  /**
+   *
+   * @param model an instance of ViewIdPropertyMenuModel
+   */
+  public void setModel(ViewIdPropertyMenuModel model)
+  {
+    _model = model;
+    _aliasListAdded = false;
+
+  }
+
+  public ViewIdPropertyMenuModel getModel()
+  {
+    if (_model != null && !_aliasListAdded)
+    {
+      _aliasListAdded = true;
+      if(_aliasList != null && !_aliasList.isEmpty())
+      {
+        int size = _aliasList.size();
+        if (size % 2 == 1)
+          size = size - 1;
+
+        for ( int i = 0; i < size; i=i+2)
+        {
+          _model.addViewId(_aliasList.get(i).toString(),
+                         _aliasList.get(i+1).toString());
+        }
+      }
+    }
+    return _model;
+  }
+
+  public List<Object> getAliasList()
+  {
+    return _aliasList;
+  }
+
+  /**
+   * aliasList is just a list of viewId strings grouped into pairs.
+   * We iterate over the list like so:
+   * ViewIdPropertyMenuModel.addViewId(aliasList.get(i), aliasList.get(i+1))
+   */
+  public void setAliasList(List<Object> aliasList)
+  {
+    _aliasList = aliasList;
+  }
+}

Propchange: incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/nav/MenuModelAdapter.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/nav/MenuModelAdapter.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Added: incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/resource/SkinBundle.java
URL: http://svn.apache.org/viewvc/incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/resource/SkinBundle.java?view=auto&rev=515587
==============================================================================
--- incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/resource/SkinBundle.java (added)
+++ incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/resource/SkinBundle.java Wed Mar  7 06:44:35 2007
@@ -0,0 +1,37 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you 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.apache.myfaces.trinidaddemo.resource;
+
+import java.util.ListResourceBundle;
+
+public class SkinBundle extends ListResourceBundle
+{
+  @Override
+  public Object[][] getContents()
+  {
+    return _CONTENTS;
+  }
+
+  static private final Object[][] _CONTENTS =
+  {
+    {"af_tableSelectMany.SELECT_COLUMN_HEADER", "Select A Lot"},
+    {"af_tableSelectOne.SELECT_COLUMN_HEADER", "Select Just One"},
+  };
+}
+

Propchange: incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/resource/SkinBundle.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/resource/SkinBundle.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Added: incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/survey/AnswerValidator.java
URL: http://svn.apache.org/viewvc/incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/survey/AnswerValidator.java?view=auto&rev=515587
==============================================================================
--- incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/survey/AnswerValidator.java (added)
+++ incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/survey/AnswerValidator.java Wed Mar  7 06:44:35 2007
@@ -0,0 +1,183 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you 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.apache.myfaces.trinidaddemo.survey;
+
+import javax.faces.component.StateHolder;
+import javax.faces.component.UIComponent;
+import javax.faces.context.FacesContext;
+import javax.faces.application.FacesMessage;
+import javax.faces.validator.Validator;
+
+public class AnswerValidator implements Validator, StateHolder
+{
+
+  public void setQuestionIndex(String index) 
+  {
+    _questionIndex = index;
+  }
+
+  public String getQuestionIndex()
+  {
+    return _questionIndex;
+  }
+
+  public void validate(FacesContext context, UIComponent component, Object value) {
+
+   String userResponse = (String.valueOf(value)).toUpperCase();
+   String correctResponse = lookupAnswer().toUpperCase();
+
+   if(!userResponse.equals(correctResponse))
+   {
+        FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_ERROR,
+                                            "Incorrect Response",
+                                            lookupCorrectAnswerMsg());
+
+        context.addMessage(component.getClientId(context), msg);
+   }
+   else
+   {
+      FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_INFO,
+                                            "Correct Response",
+                                            "CORRECT!");
+        context.addMessage(component.getClientId(context), msg);
+   }
+ } // end validate()
+
+ // -------------------------------------------------------- Private Methods
+ private String lookupCorrectAnswerMsg()
+  {
+    // based on the current question index
+    // get the answer message from the appropriate question bean
+
+    if (_questionIndex.equals("0"))
+    {
+      return _surveyBean.getQ0().getCorrectAnswerMessage();
+    }
+    else if (_questionIndex.equals("1"))
+    {
+      return _surveyBean.getQ1().getCorrectAnswerMessage();
+    }
+    else if (_questionIndex.equals("2"))
+    {
+      return _surveyBean.getQ2().getCorrectAnswerMessage();
+    }
+    else if (_questionIndex.equals("3A"))
+    {
+      return String.valueOf(_surveyBean.getQ3().getCorrectAnswerMessage(0));
+    }
+    else if (_questionIndex.equals("3B"))
+    {
+      return String.valueOf(_surveyBean.getQ3().getCorrectAnswerMessage(1));
+    }
+    else if (_questionIndex.equals("3C"))
+    {
+      return String.valueOf(_surveyBean.getQ3().getCorrectAnswerMessage(2));
+    }
+    else if (_questionIndex.equals("3D"))
+    {
+      return String.valueOf(_surveyBean.getQ3().getCorrectAnswerMessage(3));
+    }
+    else if (_questionIndex.equals("4"))
+    {
+      return _surveyBean.getQ4().getCorrectAnswerMessage();
+    }
+    else
+    {
+      return ""; // error: passed in incorrect questionindex
+    }
+  } // end getCorrectAnswerMsg()
+
+  private String lookupAnswer()
+  {
+
+    // based on the current question index
+    // get the answer string from the appropriate question bean
+
+    if (_questionIndex.equals("0"))
+    {
+      return String.valueOf(_surveyBean.getQ0().getCorrectIndex());
+    }
+    else if (_questionIndex.equals("1"))
+    {
+      return _surveyBean.getQ1().getCorrectAnswer();
+    }
+    else if (_questionIndex.equals("2"))
+    {
+      return String.valueOf(_surveyBean.getQ2().getCorrectIndex());
+    }
+    else if (_questionIndex.equals("3A"))
+    {
+      return String.valueOf(_surveyBean.getQ3().getCheckbox0());
+    }
+    else if (_questionIndex.equals("3B"))
+    {
+      return String.valueOf(_surveyBean.getQ3().getCheckbox1());
+    }
+    else if (_questionIndex.equals("3C"))
+    {
+      return String.valueOf(_surveyBean.getQ3().getCheckbox2());
+    }
+    else if (_questionIndex.equals("3D"))
+    {
+      return String.valueOf(_surveyBean.getQ3().getCheckbox3());
+    }
+    else if (_questionIndex.equals("4"))
+    {
+      return String.valueOf(_surveyBean.getQ4().getCorrectIndex());
+    }
+    else
+    {
+      return ""; // error: passed in incorrect questionindex
+    }
+  } // end loookupAnswer()
+
+
+  //-------------------------------------------------  StateHolder Methods
+
+  public Object saveState(FacesContext context)
+  {
+    Object values[] = new Object[1];
+    values[0] = _questionIndex;
+    return (values);
+  }
+
+
+  public void restoreState(FacesContext context, Object state)
+  {
+    Object values[] = (Object[]) state;
+    _questionIndex = (String) values[0];
+  }
+
+   public boolean isTransient()
+  {
+    return (_transientValue);
+  }
+
+  public void setTransient(boolean transientValue)
+  {
+    _transientValue = transientValue;
+  }
+
+  
+
+  private String      _questionIndex =  "";
+  private SurveyBean  _surveyBean = new SurveyBean();
+  private boolean     _transientValue = false;
+  
+} // end class AnswerValidator

Propchange: incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/survey/AnswerValidator.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/survey/AnswerValidator.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Added: incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/survey/AnswerValidatorTag.java
URL: http://svn.apache.org/viewvc/incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/survey/AnswerValidatorTag.java?view=auto&rev=515587
==============================================================================
--- incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/survey/AnswerValidatorTag.java (added)
+++ incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/survey/AnswerValidatorTag.java Wed Mar  7 06:44:35 2007
@@ -0,0 +1,59 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you 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.apache.myfaces.trinidaddemo.survey;
+
+import javax.faces.webapp.ValidatorTag;
+import javax.faces.validator.Validator;
+import javax.servlet.jsp.JspException;
+
+public class AnswerValidatorTag extends ValidatorTag
+{
+
+  private String _questionIndex = "";
+  private final String ID = "survey answer validator";
+
+  public AnswerValidatorTag()
+  {
+      super();
+      super.setValidatorId(ID);
+  }
+
+  public void setQuestionIndex(String index)
+  {
+    _questionIndex = index;
+  }
+
+  public String getQuestionIndex()
+  {
+    return _questionIndex;
+  }
+
+  @Override
+  protected Validator createValidator() throws JspException {
+
+      AnswerValidator validator = (AnswerValidator)super.createValidator();
+      validator.setQuestionIndex(_questionIndex);
+
+      //System.out.println("just instantiated " + validator + " with: " + validator.getQuestionIndex());
+      return validator;
+
+  }
+
+
+} // end AnswerValidatorTag

Propchange: incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/survey/AnswerValidatorTag.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/survey/AnswerValidatorTag.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Added: incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/survey/CheckboxQuestionBean.java
URL: http://svn.apache.org/viewvc/incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/survey/CheckboxQuestionBean.java?view=auto&rev=515587
==============================================================================
--- incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/survey/CheckboxQuestionBean.java (added)
+++ incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/survey/CheckboxQuestionBean.java Wed Mar  7 06:44:35 2007
@@ -0,0 +1,253 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you 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.apache.myfaces.trinidaddemo.survey;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+
+/***
+ *  class CheckboxQuestionBean
+ *
+ * This bean represents a single multiple-answer checkbox style question.
+ * It has fields for the question prompt, a list of choices, and all the
+ * correct checkboxes in the answer.
+ *
+ * [Note: Due to a lack of support for dynamically iterating through data in
+ * early releases of Trinidad, this bean contains special get methods that help
+ * iterate through the list of choices for printing out on the screen.]
+ *
+ * ***/
+
+public class CheckboxQuestionBean implements QuestionBean, Serializable
+{
+
+ /** The question prompt as a String object */
+ private String   _prompt;
+
+ /** arbitrary number of possible answer choices (Strings) */
+ private ArrayList<String>  _choices;
+
+
+  /** An integer that represents the correct checkbox choices */
+  private int   _correctAnswer;
+
+  /** the booleans to represent the correct choices */
+  private boolean   _checkbox0;
+  private boolean   _checkbox1;
+  private boolean   _checkbox2;
+  private boolean   _checkbox3;
+
+  // a debug flag
+  private boolean debug = false;
+
+
+
+  /**
+    *  Class constructor (no arguments).
+    */
+  public CheckboxQuestionBean()
+  {
+  }
+
+    /**
+     *  Class constructor.
+     */
+    public CheckboxQuestionBean(
+        String prompt,
+        ArrayList<String> choices,
+        int correctAnswer,
+        boolean checkbox0,
+        boolean checkbox1,
+        boolean checkbox2,
+        boolean checkbox3)
+    {
+      _prompt = prompt;
+      _choices = choices;
+      _correctAnswer = correctAnswer;
+
+      _checkbox0 = checkbox0;
+      _checkbox1 = checkbox1;
+      _checkbox2 = checkbox2;
+      _checkbox3 = checkbox3;
+    }
+
+
+  /*** Accessors ***/
+
+ /**
+   *  returns the question prompt.
+   *
+   *  @return the question prompt
+   */
+ public String getPrompt()
+ {
+    // after getting the prompt, we want to initialize the iterator index
+    // for the answers
+  return _prompt;
+ }
+
+
+  public String getText1()
+  {
+    return _choices.get(0);
+  }
+  
+  public String getText2()
+  {
+    return _choices.get(1);
+  }
+  
+  public String getText3()
+  {
+    return _choices.get(2);
+  }
+  
+  public String getText4()
+  {
+    return _choices.get(3);
+  }
+
+  /*** util functions ***/
+
+ 
+  /**
+   * typical toString method
+   *
+   * @return a String representation of a QuestionBean
+   */
+  @Override
+  public String toString()
+  {
+    String str = _prompt + "; " + _choices.toString();
+    return str;
+  }
+
+
+  /**
+   * returns a message describing the correct answer choices.
+   *
+   * @return a message describing the correct answer choices
+   */
+ public String getCorrectAnswerMessage()
+ {
+    String message = "The correct answer is: ";
+    String bitMap = Integer.toBinaryString(_correctAnswer);
+    int i,j;
+    boolean atLeastOneSelected = false;
+
+    // since toBinaryString() library method does not put in leading zeros,
+    // we need to make sure bitMap is as long as NUMBER_OF_ANSWER_CHOICES
+    while (bitMap.length() < SurveyBean.NUMBER_OF_ANSWER_CHOICES)
+    {
+      // prepend leading zeros
+      bitMap = '0' + bitMap;
+    }
+
+    // beginning with the NUMBER_OF_ANSWER_CHOICES-th bit from the right
+    // check until the end of the string
+    for (i=bitMap.length()-SurveyBean.NUMBER_OF_ANSWER_CHOICES, j=0;
+          i<bitMap.length() && j<_choices.size();
+          i++, j++)
+    {
+      // if the considered bit is 1
+      if (debug)
+      {
+        System.out.println("in cbqb, bitMap is: " + bitMap + ", getting " + i + "th char, which is: " + bitMap.charAt(i));
+      }
+      if( bitMap.charAt(i) == '1')
+      {
+         // it's a correct solution
+         message = message + _choices.get(j) + " & ";
+         atLeastOneSelected = true;
+      }
+    } //end for loop
+
+    if (atLeastOneSelected)
+    {
+      // remove extra " & " from end of message
+      message = message.substring(0, message.length()-3);
+    }
+
+    return message;
+ }
+
+
+  /**
+   * Returns a message describing the correct answer for a particular checkbox.
+   *
+   * @param   checkboxNum the index of the checkbox
+   *
+   * @return a message describing the correct answer choices
+   */
+ public String getCorrectAnswerMessage(int checkboxNum)
+ {
+    String message = "INCORRECT";
+//    String message = "The correct answer is: ";
+//
+//    switch (checkboxNum)
+//    {
+//      case(0):
+//        message = message + getCheckbox0();
+//        break;
+//      case(1):
+//        message = message + getCheckbox1();
+//        break;
+//      case(2):
+//        message = message + getCheckbox2();
+//        break;
+//      case(3):
+//        message = message + getCheckbox3();
+//        break;
+//    }
+
+    return message;
+ }
+
+/*** IDE generated accessors ***/
+
+  public boolean getCheckbox0()
+  {
+    return _checkbox0;
+  }
+
+
+  public boolean getCheckbox1()
+  {
+    return _checkbox1;
+  }
+
+
+  public boolean getCheckbox2()
+  {
+    return _checkbox2;
+  }
+
+
+  public boolean getCheckbox3()
+  {
+    return _checkbox3;
+  }
+
+
+  public int getCorrectAnswer()
+  {
+    return _correctAnswer;
+  }
+
+}

Propchange: incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/survey/CheckboxQuestionBean.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/adffaces/branches/matzew-core-1.0.0-incubation/examples/trinidad-demo/src/main/java/org/apache/myfaces/trinidaddemo/survey/CheckboxQuestionBean.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL