Merged HEAD-BUG-FIX (5.1/Cloud) to HEAD (5.1/Cloud)

108205: Merged 5.0.N (5.0.3) to HEAD-BUG-FIX (5.1/Cloud)
      108186:       Reverse merged 5.0.N (5.0.3)
               << Better solution found >>
               106968: Merged DEV to 5.0.N (5.0.3)
                  106962: MNT-13706 : Admin console unusable after we set any  busy port in Port Number Value for subsystem
                     - Implemented fix for Transformations (JodConverter), FTP, SMTP and IMAP.


git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@108221 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Alan Davis
2015-07-14 07:03:15 +00:00
parent 576d2a0afd
commit f13dc0a415
8 changed files with 1533 additions and 1843 deletions

View File

@@ -1,414 +1,405 @@
/*
* Copyright (C) 2005-2010 Alfresco Software Limited.
*
* This file is part of Alfresco
*
* Alfresco 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 3 of the License, or
* (at your option) any later version.
*
* Alfresco 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 Alfresco. If not, see <http://www.gnu.org/licenses/>.
*/
package org.alfresco.email.server;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.StringTokenizer;
import org.alfresco.error.AlfrescoRuntimeException;
import org.alfresco.repo.security.authentication.AuthenticationComponent;
import org.alfresco.repo.security.authentication.AuthenticationException;
import org.alfresco.service.cmr.email.EmailMessageException;
import org.alfresco.service.cmr.email.EmailService;
import org.alfresco.util.PortUtil;
import org.springframework.extensions.surf.util.AbstractLifecycleBean;
import org.alfresco.util.PropertyCheck;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationEvent;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* Base implementation of an email server.
* @since 2.2
*/
public abstract class EmailServer extends AbstractLifecycleBean
{
private static final String ERR_SENDER_BLOCKED = "email.server.err.sender_blocked";
private static final String SMTP_PORT_OCCUPIED_MESSAGE = "system.smtp.err.port_in_use";
private boolean enabled;
private String domain;
private int port;
private int maxConnections;
private Set<String> blockedSenders;
private Set<String> allowedSenders;
private boolean hideTLS = false;
private boolean enableTLS = true;
private boolean requireTLS = false;
private boolean authenticate = false;
/*
* Copyright (C) 2005-2010 Alfresco Software Limited.
*
* This file is part of Alfresco
*
* Alfresco 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 3 of the License, or
* (at your option) any later version.
*
* Alfresco 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 Alfresco. If not, see <http://www.gnu.org/licenses/>.
*/
package org.alfresco.email.server;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.StringTokenizer;
import org.alfresco.error.AlfrescoRuntimeException;
import org.alfresco.repo.security.authentication.AuthenticationComponent;
import org.alfresco.repo.security.authentication.AuthenticationException;
import org.alfresco.service.cmr.email.EmailMessageException;
import org.alfresco.service.cmr.email.EmailService;
import org.springframework.extensions.surf.util.AbstractLifecycleBean;
import org.alfresco.util.PropertyCheck;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationEvent;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* Base implementation of an email server.
* @since 2.2
*/
public abstract class EmailServer extends AbstractLifecycleBean
{
private static final String ERR_SENDER_BLOCKED = "email.server.err.sender_blocked";
private boolean enabled;
private String domain;
private int port;
private int maxConnections;
private Set<String> blockedSenders;
private Set<String> allowedSenders;
private boolean hideTLS = false;
private boolean enableTLS = true;
private boolean requireTLS = false;
private boolean authenticate = false;
private EmailService emailService;
private AuthenticationComponent authenticationComponent;
protected EmailServer()
{
this.enabled = false;
this.port = 25;
this.domain = null;
this.maxConnections = 3;
this.blockedSenders = new HashSet<String>(23);
this.allowedSenders = new HashSet<String>(23);
}
/**
* @param enabled Enable/disable server
*/
public void setEnabled(boolean enabled)
{
this.enabled = enabled;
}
protected String getDomain()
{
return domain;
}
public void setDomain(String domain)
{
this.domain = domain;
}
protected int getPort()
{
return port;
}
/**
* @param port SMTP port (25 is default)
*/
public void setPort(int port)
{
this.port = port;
}
/**
* Returns the maximum number of connection accepted by the server.
* @return the maximum number of connections
*/
protected int getMaxConnections()
{
return maxConnections;
}
/**
* Sets the maximum number of connection accepted by the server
* @param maxConnections
*/
public void setMaxConnections(int maxConnections)
{
this.maxConnections = maxConnections;
}
/**
* Set the blocked senders as a comma separated list. The entries will be trimmed of
* all whitespace.
*
* @param blockedSenders a comman separated list of blocked senders
*/
public void setBlockedSenders(String blockedSenders)
{
StringTokenizer tokenizer = new StringTokenizer(blockedSenders, ",", false);
while (tokenizer.hasMoreTokens())
{
String sender = tokenizer.nextToken().trim();
this.blockedSenders.add(sender);
}
}
/**
* @param blockedSenders a list of senders that are not allowed to email in
*/
public void setBlockedSendersList(List<String> blockedSenders)
{
this.blockedSenders.addAll(blockedSenders);
}
/**
* Set the allowed senders as a comma separated list. The entries will be trimmed of
* all whitespace.
*
* @param allowedSenders a comman separated list of blocked senders
*/
public void setAllowedSenders(String allowedSenders)
{
StringTokenizer tokenizer = new StringTokenizer(allowedSenders, ",", false);
while (tokenizer.hasMoreTokens())
{
String sender = tokenizer.nextToken().trim();
if (sender.length() == 0)
{
// Nothing
continue;
}
this.allowedSenders.add(sender);
}
}
/**
* @param allowedSenders a list of senders that are allowed to email in
*/
public void setAllowedSendersList(List<String> allowedSenders)
{
this.allowedSenders.addAll(allowedSenders);
}
/**
* @return the service interface to interact with
*/
protected EmailService getEmailService()
{
return emailService;
}
/**
* @param emailService the service interface to interact with
*/
public void setEmailService(EmailService emailService)
{
this.emailService = emailService;
}
/**
* Filter incoming message by its sender e-mail address.
*
* @param sender An e-mail address of sender
* @throws EmailMessageException if the e-mail is rejected accordingly with blocked and allowed lists
*/
protected void filterSender(String sender)
{
// Check if the sender is in the blocked list
for (String blockedSender : blockedSenders)
{
if (sender.matches(blockedSender))
{
throw new EmailMessageException(ERR_SENDER_BLOCKED, sender);
}
}
// If there are any restrictions in the allowed list, then a positive match
// is absolutely required
if (!allowedSenders.isEmpty())
{
boolean matched = false;
for (String allowedSender : allowedSenders)
{
if (sender.matches(allowedSender))
{
matched = true;
break;
}
}
if (!matched)
{
throw new EmailMessageException(ERR_SENDER_BLOCKED, sender);
}
}
}
/**
* Method is called when server is starting up.
*/
public abstract void startup();
/**
* Method is called when server is shutting down.
*/
public abstract void shutdown();
/**
* {@inheritDoc}
*/
@Override
protected void onBootstrap(ApplicationEvent event)
{
if (!enabled)
{
return;
}
// Check properties
PropertyCheck.mandatory(this, "domain", domain);
if (port <= 0 || port > 65535)
{
throw new AlfrescoRuntimeException("Property 'port' is incorrect");
}
// Check if port is occupied.
if (!PortUtil.isPortFree(port))
{
throw new AlfrescoRuntimeException(SMTP_PORT_OCCUPIED_MESSAGE, new String[] { "" + port });
}
PropertyCheck.mandatory(this, "emailService", emailService);
// Startup
startup();
}
/**
* {@inheritDoc}
*/
@Override
protected void onShutdown(ApplicationEvent event)
{
if (enabled)
{
shutdown();
}
}
private static volatile Boolean stop = false;
public static void main(String[] args)
{
if (args.length == 0)
{
usage();
return;
}
AbstractApplicationContext context = null;
try
{
context = new ClassPathXmlApplicationContext(args);
} catch (BeansException e)
{
System.err.println("Erro create context: " + e);
usage();
return;
}
try
{
if (!context.containsBean("emailServer"))
{
usage();
return;
}
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run()
{
stop = true;
synchronized (stop)
{
stop.notifyAll();
}
}
});
System.out.println("Use Ctrl-C to shutdown EmailServer");
while (!stop)
{
synchronized (stop)
{
stop.wait();
}
}
}
catch (InterruptedException e)
{
}
finally
{
context.close();
}
}
private static void usage()
{
System.err.println("Use: EmailServer configLocation1, configLocation2, ...");
System.err.println("\t configLocation - spring xml configs with EmailServer related beans (emailServer, emailServerConfiguration, emailService)");
}
/**
* authenticate with a user/password
* @param userName
* @param password
* @return true - authenticated
*/
protected boolean authenticateUserNamePassword(String userName, char[] password)
{
try
{
getAuthenticationComponent().authenticate(userName, password);
return true;
}
catch (AuthenticationException e)
{
return false;
}
}
/** Hide the TLS (Trusted Login Session) option
*
* @param hideTLS
*/
public void setHideTLS(boolean hideTLS)
{
this.hideTLS = hideTLS;
}
public boolean isHideTLS()
{
return hideTLS;
}
public void setEnableTLS(boolean enableTLS)
{
this.enableTLS = enableTLS;
}
public boolean isEnableTLS()
{
return enableTLS;
}
public void setRequireTLS(boolean requireTLS)
{
this.requireTLS = requireTLS;
}
public boolean isRequireTLS()
{
return requireTLS;
}
public void setAuthenticate(boolean enableAuthentication)
{
this.authenticate = enableAuthentication;
}
public boolean isAuthenticate()
{
return authenticate;
}
public void setAuthenticationComponent(AuthenticationComponent authenticationComponent)
{
this.authenticationComponent = authenticationComponent;
}
public AuthenticationComponent getAuthenticationComponent()
{
return authenticationComponent;
}
}
this.port = 25;
this.domain = null;
this.maxConnections = 3;
this.blockedSenders = new HashSet<String>(23);
this.allowedSenders = new HashSet<String>(23);
}
/**
* @param enabled Enable/disable server
*/
public void setEnabled(boolean enabled)
{
this.enabled = enabled;
}
protected String getDomain()
{
return domain;
}
public void setDomain(String domain)
{
this.domain = domain;
}
protected int getPort()
{
return port;
}
/**
* @param port SMTP port (25 is default)
*/
public void setPort(int port)
{
this.port = port;
}
/**
* Returns the maximum number of connection accepted by the server.
* @return the maximum number of connections
*/
protected int getMaxConnections()
{
return maxConnections;
}
/**
* Sets the maximum number of connection accepted by the server
* @param maxConnections
*/
public void setMaxConnections(int maxConnections)
{
this.maxConnections = maxConnections;
}
/**
* Set the blocked senders as a comma separated list. The entries will be trimmed of
* all whitespace.
*
* @param blockedSenders a comman separated list of blocked senders
*/
public void setBlockedSenders(String blockedSenders)
{
StringTokenizer tokenizer = new StringTokenizer(blockedSenders, ",", false);
while (tokenizer.hasMoreTokens())
{
String sender = tokenizer.nextToken().trim();
this.blockedSenders.add(sender);
}
}
/**
* @param blockedSenders a list of senders that are not allowed to email in
*/
public void setBlockedSendersList(List<String> blockedSenders)
{
this.blockedSenders.addAll(blockedSenders);
}
/**
* Set the allowed senders as a comma separated list. The entries will be trimmed of
* all whitespace.
*
* @param allowedSenders a comman separated list of blocked senders
*/
public void setAllowedSenders(String allowedSenders)
{
StringTokenizer tokenizer = new StringTokenizer(allowedSenders, ",", false);
while (tokenizer.hasMoreTokens())
{
String sender = tokenizer.nextToken().trim();
if (sender.length() == 0)
{
// Nothing
continue;
}
this.allowedSenders.add(sender);
}
}
/**
* @param allowedSenders a list of senders that are allowed to email in
*/
public void setAllowedSendersList(List<String> allowedSenders)
{
this.allowedSenders.addAll(allowedSenders);
}
/**
* @return the service interface to interact with
*/
protected EmailService getEmailService()
{
return emailService;
}
/**
* @param emailService the service interface to interact with
*/
public void setEmailService(EmailService emailService)
{
this.emailService = emailService;
}
/**
* Filter incoming message by its sender e-mail address.
*
* @param sender An e-mail address of sender
* @throws EmailMessageException if the e-mail is rejected accordingly with blocked and allowed lists
*/
protected void filterSender(String sender)
{
// Check if the sender is in the blocked list
for (String blockedSender : blockedSenders)
{
if (sender.matches(blockedSender))
{
throw new EmailMessageException(ERR_SENDER_BLOCKED, sender);
}
}
// If there are any restrictions in the allowed list, then a positive match
// is absolutely required
if (!allowedSenders.isEmpty())
{
boolean matched = false;
for (String allowedSender : allowedSenders)
{
if (sender.matches(allowedSender))
{
matched = true;
break;
}
}
if (!matched)
{
throw new EmailMessageException(ERR_SENDER_BLOCKED, sender);
}
}
}
/**
* Method is called when server is starting up.
*/
public abstract void startup();
/**
* Method is called when server is shutting down.
*/
public abstract void shutdown();
/**
* {@inheritDoc}
*/
@Override
protected void onBootstrap(ApplicationEvent event)
{
if (!enabled)
{
return;
}
// Check properties
PropertyCheck.mandatory(this, "domain", domain);
if (port <= 0 || port > 65535)
{
throw new AlfrescoRuntimeException("Property 'port' is incorrect");
}
PropertyCheck.mandatory(this, "emailService", emailService);
// Startup
startup();
}
/**
* {@inheritDoc}
*/
@Override
protected void onShutdown(ApplicationEvent event)
{
if (enabled)
{
shutdown();
}
}
private static volatile Boolean stop = false;
public static void main(String[] args)
{
if (args.length == 0)
{
usage();
return;
}
AbstractApplicationContext context = null;
try
{
context = new ClassPathXmlApplicationContext(args);
} catch (BeansException e)
{
System.err.println("Erro create context: " + e);
usage();
return;
}
try
{
if (!context.containsBean("emailServer"))
{
usage();
return;
}
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run()
{
stop = true;
synchronized (stop)
{
stop.notifyAll();
}
}
});
System.out.println("Use Ctrl-C to shutdown EmailServer");
while (!stop)
{
synchronized (stop)
{
stop.wait();
}
}
}
catch (InterruptedException e)
{
}
finally
{
context.close();
}
}
private static void usage()
{
System.err.println("Use: EmailServer configLocation1, configLocation2, ...");
System.err.println("\t configLocation - spring xml configs with EmailServer related beans (emailServer, emailServerConfiguration, emailService)");
}
/**
* authenticate with a user/password
* @param userName
* @param password
* @return true - authenticated
*/
protected boolean authenticateUserNamePassword(String userName, char[] password)
{
try
{
getAuthenticationComponent().authenticate(userName, password);
return true;
}
catch (AuthenticationException e)
{
return false;
}
}
/** Hide the TLS (Trusted Login Session) option
*
* @param hideTLS
*/
public void setHideTLS(boolean hideTLS)
{
this.hideTLS = hideTLS;
}
public boolean isHideTLS()
{
return hideTLS;
}
public void setEnableTLS(boolean enableTLS)
{
this.enableTLS = enableTLS;
}
public boolean isEnableTLS()
{
return enableTLS;
}
public void setRequireTLS(boolean requireTLS)
{
this.requireTLS = requireTLS;
}
public boolean isRequireTLS()
{
return requireTLS;
}
public void setAuthenticate(boolean enableAuthentication)
{
this.authenticate = enableAuthentication;
}
public boolean isAuthenticate()
{
return authenticate;
}
public void setAuthenticationComponent(AuthenticationComponent authenticationComponent)
{
this.authenticationComponent = authenticationComponent;
}
public AuthenticationComponent getAuthenticationComponent()
{
return authenticationComponent;
}
}

View File

@@ -83,11 +83,7 @@ import org.alfresco.jlan.util.Platform;
import org.alfresco.jlan.util.StringList;
import org.alfresco.jlan.util.X64;
import org.alfresco.repo.management.subsystems.ActivateableBean;
import org.alfresco.repo.management.subsystems.LoggableErrorEvent;
import org.alfresco.util.PortUtil;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.ApplicationEventPublisherAware;
import org.springframework.extensions.config.element.GenericConfigElement;
@@ -103,10 +99,8 @@ import org.springframework.extensions.config.element.GenericConfigElement;
* @author dward
* @author mrogers
*/
public class ServerConfigurationBean extends AbstractServerConfigurationBean implements DisposableBean, ApplicationEventPublisherAware
public class ServerConfigurationBean extends AbstractServerConfigurationBean implements DisposableBean
{
private static final String FTP_PORT_OCCUPIED_MESSAGE = "system.ftp.err.port_in_use";
private CIFSConfigBean cifsConfigBean;
private FTPConfigBean ftpConfigBean;
private NFSConfigBean nfsConfigBean;
@@ -116,8 +110,7 @@ public class ServerConfigurationBean extends AbstractServerConfigurationBean imp
private ThreadRequestPool threadPool;
protected ClusterConfigBean clusterConfigBean;
private ApplicationEventPublisher applicationEventPublisher;
/**
* Default constructor
*/
@@ -1227,13 +1220,6 @@ public class ServerConfigurationBean extends AbstractServerConfigurationBean imp
ftpConfig.setFTPPort(port);
if (ftpConfig.getFTPPort() <= 0 || ftpConfig.getFTPPort() >= 65535)
throw new AlfrescoRuntimeException("FTP server port out of valid range");
// Check if port is occupied.
if (!PortUtil.isPortFree(port))
{
applicationEventPublisher.publishEvent(new LoggableErrorEvent(this,
new AlfrescoRuntimeException(FTP_PORT_OCCUPIED_MESSAGE, new String[] { "" + port })));
}
}
else
{
@@ -2382,10 +2368,4 @@ public class ServerConfigurationBean extends AbstractServerConfigurationBean imp
}
}
@Override
public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher)
{
this.applicationEventPublisher = applicationEventPublisher;
}
}

View File

@@ -37,27 +37,12 @@ import com.icegreen.greenmail.util.ServerSetup;
import javax.net.ssl.SSLServerSocketFactory;
import javax.net.ssl.SSLServerSocket;
import org.alfresco.error.AlfrescoRuntimeException;
import org.alfresco.repo.management.subsystems.LoggableErrorEvent;
import org.alfresco.util.PortUtil;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.ApplicationEventPublisherAware;
/**
* @author Mike Shavnev
*/
public class AlfrescoImapServer extends AbstractLifecycleBean implements ApplicationEventPublisherAware
public class AlfrescoImapServer extends AbstractLifecycleBean
{
private static final String IMAP_PORT_OCCUPIED_MESSAGE = "system.imap.err.port_in_use";
private ApplicationEventPublisher applicationEventPublisher;
@Override
public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher)
{
this.applicationEventPublisher = applicationEventPublisher;
}
private class SecureImapServer extends ImapServer
{
@@ -265,13 +250,6 @@ public class AlfrescoImapServer extends AbstractLifecycleBean implements Applica
if(isImapEnabled())
{
// Check if port is occupied.
if (!PortUtil.isPortFree(port))
{
applicationEventPublisher.publishEvent(new LoggableErrorEvent(this,
new AlfrescoRuntimeException(IMAP_PORT_OCCUPIED_MESSAGE, new String[] { "" + port })));
}
AtomicReference<Exception> serverOpeningExceptionRef = new AtomicReference<Exception>();
serverImpl = new DefaultImapServer(new ServerSetup(port, host, ServerSetup.PROTOCOL_IMAP), imapManagers, serverOpeningExceptionRef);
serverImpl.startService(null);

View File

@@ -1,59 +0,0 @@
/*
* Copyright (C) 2005-2015 Alfresco Software Limited.
*
* This file is part of Alfresco
*
* Alfresco 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 3 of the License, or
* (at your option) any later version.
*
* Alfresco 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 Alfresco. If not, see <http://www.gnu.org/licenses/>.
*/
package org.alfresco.repo.management.subsystems;
import org.alfresco.error.AlfrescoRuntimeException;
import org.springframework.context.ApplicationEvent;
/**
* Alfresco custom ApplicationEvent class used for publishing errors in subsystems.
*/
public class LoggableErrorEvent extends ApplicationEvent
{
private static final String UNSPECIFIED_ERROR_MESSAGE = "system.loggable_error_event.unspecified_error";
private AlfrescoRuntimeException exception;
/**
* Create a new LoggableErrorEvent.
* @param source the component that published the event (never {@code null})
* @param exception the error to publish
*/
public LoggableErrorEvent(Object source, AlfrescoRuntimeException exception)
{
super(source);
this.exception = exception;
}
/**
* Get this LoggableErrorEvent's exception.
* @return the stored exception if not null, otherwise a new RuntimeException
*/
public AlfrescoRuntimeException getException()
{
if (exception != null)
{
return exception;
}
else
{
return new AlfrescoRuntimeException(UNSPECIFIED_ERROR_MESSAGE);
}
}
}

View File

@@ -1,71 +0,0 @@
/*
* Copyright (C) 2005-2015 Alfresco Software Limited.
*
* This file is part of Alfresco
*
* Alfresco 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 3 of the License, or
* (at your option) any later version.
*
* Alfresco 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 Alfresco. If not, see <http://www.gnu.org/licenses/>.
*/
package org.alfresco.util;
import java.io.IOException;
import java.net.ServerSocket;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
* Alfresco port-related utility functions.
*/
public class PortUtil
{
private static Log logger = LogFactory.getLog(PortUtil.class);
/**
* Check if specified port is free.
* @param port port number to check
* @return true if port is free or false if it's already in use
*/
public static boolean isPortFree(int port)
{
boolean isFree = true;
ServerSocket serverSocket = null;
try
{
serverSocket = new ServerSocket(port);
}
catch (IOException ioe)
{
isFree = false;
}
finally
{
if (serverSocket != null)
{
try
{
serverSocket.close();
}
catch (IOException ioe)
{
if (logger.isDebugEnabled())
{
logger.debug(ioe.toString());
}
}
}
}
return isFree;
}
}