/*
* See the NOTICE file distributed with this work for additional
* information regarding copyright ownership.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.xwiki.contrib.mailarchive.internal.data;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Properties;
import javax.inject.Inject;
import javax.inject.Named;
import javax.inject.Singleton;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.xwiki.component.annotation.Component;
import org.xwiki.contrib.mailarchive.IMailMatcher;
import org.xwiki.contrib.mailarchive.IMailingList;
import org.xwiki.contrib.mailarchive.IMailingListGroup;
import org.xwiki.contrib.mailarchive.IType;
import org.xwiki.contrib.mailarchive.LoadingSession;
import org.xwiki.contrib.mailarchive.xwiki.IExtendedDocumentAccessBridge;
import org.xwiki.contrib.mailarchive.xwiki.ObjectEntity;
import org.xwiki.contrib.mailarchive.xwiki.internal.XWikiPersistence;
import com.xpn.xwiki.objects.BaseObject;
/**
* @version $Id$
*/
@Component
@Singleton
public class Factory implements IFactory
{
@Inject
private Logger logger;
@Inject
@Named("extended")
private IExtendedDocumentAccessBridge dab;
/**
* {@inheritDoc}
*
* @see org.xwiki.contrib.mailarchive.internal.data.IFactory#createMailServer(java.lang.String)
*/
@SuppressWarnings("deprecation")
@Override
public Server createMailServer(final String serverPrefsDoc)
{
if (!dab.exists(serverPrefsDoc)) {
logger.error("createMailServer: Page " + serverPrefsDoc + " does not exist");
return null;
}
if (!dab.exists(serverPrefsDoc, XWikiPersistence.CLASS_MAIL_SERVERS)) {
logger.error("createMailServer: Page " + serverPrefsDoc + " does not contain an object of class "
+ XWikiPersistence.CLASS_MAIL_SERVERS);
return null;
}
Server server = new Server();
try {
// Retrieve connection properties from prefs
String className = XWikiPersistence.CLASS_MAIL_SERVERS;
server.setId(dab.getStringValue(serverPrefsDoc, className, "id"));
server.setHostname(dab.getStringValue(serverPrefsDoc, className, "hostname"));
server.setPort(dab.getIntValue(serverPrefsDoc, className, "port"));
server.setProtocol(dab.getStringValue(serverPrefsDoc, className, "protocol"));
server.setUsername(dab.getStringValue(serverPrefsDoc, className, "user"));
server.setPassword(dab.getStringValue(serverPrefsDoc, className, "password"));
server.setFolder(dab.getStringValue(serverPrefsDoc, className, "folder"));
server.setAutoTrustSSLCertificates(dab.getBooleanValue(serverPrefsDoc, className, "autotrust"));
server.setEnabled("on".equals(dab.getStringValue(serverPrefsDoc, className, "state")));
server.setState(dab.getIntValue(serverPrefsDoc, className, "status"));
String additionalProperties = dab.getStringValue(serverPrefsDoc, className, "additionalProperties");
if (StringUtils.isNotBlank(additionalProperties)) {
InputStream is = new ByteArrayInputStream(additionalProperties.getBytes());
Properties props = new Properties();
try {
props.load(is);
} catch (IOException e) {
// TODO ?
}
server.setAdditionalProperties(props);
}
} catch (Exception e) {
logger.error("Could not load Server from " + serverPrefsDoc);
}
server.setWikiDoc(serverPrefsDoc);
if (server.getId() == null || server.getHostname() == null || server.getProtocol() == null) {
logger.error("createMailServer: Server " + serverPrefsDoc + " miss mandatory parameters");
return null;
} else {
logger.debug("createMailServer: Loaded Server " + server);
return server;
}
}
/**
* {@inheritDoc}
*
* @see org.xwiki.contrib.mailarchive.internal.data.IFactory#createMailStore(java.lang.String)
*/
@Override
public MailStore createMailStore(String storePrefsDoc)
{
logger.debug("Loading Mail Store from " + storePrefsDoc);
if (!dab.exists(storePrefsDoc)) {
logger.error("createMailStore: page " + storePrefsDoc + " does not exist");
return null;
}
if (!dab.exists(storePrefsDoc, XWikiPersistence.CLASS_MAIL_STORES)) {
logger.error("createMailServer: Page " + storePrefsDoc + " does not contain an object of class "
+ XWikiPersistence.CLASS_MAIL_STORES);
return null;
}
MailStore store = new MailStore();
// Retrieve connection properties from prefs
try {
String className = XWikiPersistence.CLASS_MAIL_STORES;
store.setLocation(dab.getStringValue(storePrefsDoc, className, "location"));
store.setFormat(dab.getStringValue(storePrefsDoc, className, "format"));
store.setId(dab.getStringValue(storePrefsDoc, className, "id"));
store.setFolder(dab.getStringValue(storePrefsDoc, className, "folder"));
store.setEnabled("on".equals(dab.getStringValue(storePrefsDoc, className, "state")));
store.setState(dab.getIntValue(storePrefsDoc, className, "status"));
String additionalProperties = dab.getStringValue(storePrefsDoc, className, "additionalProperties");
if (StringUtils.isNotBlank(additionalProperties)) {
InputStream is = new ByteArrayInputStream(additionalProperties.getBytes());
Properties props = new Properties();
try {
props.load(is);
} catch (IOException e) {
// TODO ?
}
store.setAdditionalProperties(props);
}
} catch (Exception e) {
logger.error("Could not load Mail Store from " + storePrefsDoc, e);
return null;
}
store.setWikiDoc(storePrefsDoc);
if (store.getId() == null || store.getLocation() == null || store.getFormat() == null) {
logger.error("createMailStore: Store " + storePrefsDoc + " miss mandatory parameters");
return null;
} else {
logger.debug("Loaded Mail Store " + store);
return store;
}
}
/**
* {@inheritDoc}
*
* @see org.xwiki.contrib.mailarchive.internal.data.IFactory#createMailType(java.lang.String, java.lang.String,
* java.lang.String, java.lang.String)
*/
@Override
public IType createMailType(final String id, final String name, final String icon)
{
Type typeobj = new Type();
typeobj.setId(id);
typeobj.setName(name);
typeobj.setIcon(icon);
return typeobj;
}
/**
* {@inheritDoc}
*
* @see org.xwiki.contrib.mailarchive.internal.data.IFactory#createMailMatcher(java.lang.String, java.lang.String,
* java.lang.String, java.lang.String, java.lang.String)
*/
@Override
public IMailMatcher createMailMatcher(String fields, String expression, Integer isAdvanced, Integer isIgnoreCase,
Integer isMultiLine)
{
MailMatcher matcherobj = new MailMatcher();
List<String> fieldsList = Arrays.asList(fields.split(","));
matcherobj.setFields(fieldsList);
matcherobj.setExpression(expression);
matcherobj.setAdvancedMode(isAdvanced != null && isAdvanced != 0);
matcherobj.setIgnoreCase(isIgnoreCase != null && isIgnoreCase != 0);
matcherobj.setMultiLine(isMultiLine != null && isMultiLine != 0);
return matcherobj;
}
/**
* {@inheritDoc}
*
* @see org.xwiki.contrib.mailarchive.internal.data.IFactory#createMailingList(java.lang.String, java.lang.String,
* java.lang.String, java.lang.String)
*/
@Override
public IMailingList createMailingList(final String pattern, final String displayName, final String tag,
final String color)
{
MailingList list = new MailingList();
list.setPattern(pattern);
list.setTag(tag);
list.setDisplayName(displayName);
list.setColor(color);
return list;
}
/**
* {@inheritDoc}
*
* @see org.xwiki.contrib.mailarchive.internal.data.IFactory#createMailingList(java.lang.String, java.lang.String,
* java.lang.String, java.lang.String)
*/
@Override
public IMailingListGroup createMailingListGroup(final String name, final List<IMailingList> mailingLists,
final String loadingUser, final String destinationWiki, final String destinationSpace)
{
MailingListGroup listgroup = new MailingListGroup();
listgroup.setName(name);
listgroup.setMailingLists(mailingLists);
listgroup.setLoadingUser(loadingUser);
listgroup.setDestinationWiki(destinationWiki);
listgroup.setDestinationSpace(destinationSpace);
return listgroup;
}
/**
* {@inheritDoc}
*
* @see org.xwiki.contrib.mailarchive.internal.data.IFactory#createLoadingSession(java.lang.String)
*/
public LoadingSession createLoadingSession(final String sessionPrefsDoc)
{
if (!dab.exists(sessionPrefsDoc)) {
logger.error("createLoadingSession: page " + sessionPrefsDoc + " does not exist");
return null;
}
if (!dab.exists(sessionPrefsDoc, XWikiPersistence.CLASS_LOADING_SESSION)) {
logger.error("createLoadingSession: Page " + sessionPrefsDoc + " does not contain an object of class "
+ XWikiPersistence.CLASS_LOADING_SESSION);
return null;
}
// Retrieve connection properties from prefs
String className = XWikiPersistence.CLASS_LOADING_SESSION;
ObjectEntity sessionObject = dab.getObjectEntity(sessionPrefsDoc, className);
return createLoadingSession(sessionObject);
}
/**
* {@inheritDoc}
*
* @see org.xwiki.contrib.mailarchive.internal.data.IFactory#createLoadingSession(java.lang.String)
*/
@Override
public LoadingSession createLoadingSession(final BaseObject xObject)
{
// Retrieve connection properties from prefs
ObjectEntity sessionObject = dab.getObjectEntity(xObject);
return createLoadingSession(sessionObject);
}
/**
* Creates a LoadingSession from an ObjectEntity.
*
* @param sessionObject
* @return
*/
private LoadingSession createLoadingSession(ObjectEntity sessionObject)
{
logger.debug("Parsing LoadingClass XObject " + sessionObject);
LoadingSession session = null;
try {
session = null;
final String id = (String) sessionObject.getFieldValue("id");
session = new LoadingSession(id);
if (sessionObject.getFieldValue("debugMode") != null
&& (Integer) sessionObject.getFieldValue("debugMode") == 1) {
session = session.debugMode();
}
if (sessionObject.getFieldValue("simulationMode") != null
&& (Integer) sessionObject.getFieldValue("simulationMode") == 1) {
session = session.simulationMode();
}
if (sessionObject.getFieldValue("loadAll") != null && (Integer) sessionObject.getFieldValue("loadAll") == 1) {
session = session.loadAll();
}
if (sessionObject.getFieldValue("recentMails") != null
&& (Integer) sessionObject.getFieldValue("recentMails") == 1) {
session = session.recentMails();
}
if (sessionObject.getFieldValue("withDelete") != null
&& (Integer) sessionObject.getFieldValue("withDelete") == 1) {
session = session.withDelete();
}
if (sessionObject.getFieldValue("maxMailsNb") != null) {
session = session.setLimit(((Long) sessionObject.getFieldValue("maxMailsNb")).intValue());
}
List<String> servers = new ArrayList<String>();
if (sessionObject.getFieldValue("servers") != null) {
servers = (List<String>) sessionObject.getFieldValue("servers");
}
List<String> stores = new ArrayList<String>();
if (sessionObject.getFieldValue("stores") != null) {
stores = (List<String>) sessionObject.getFieldValue("stores");
}
for (String serverId : servers) {
session = session.addServer(serverId);
}
for (String storeId : stores) {
session = session.addStore(storeId);
}
} catch (Throwable e) {
logger.error("Could not load LoadingSession", e);
return null;
}
logger.debug("Parsed XObject into LoadingSession " + session);
return session;
}
}