/*
* ====================================================================
* Copyright (c) 2004-2012 TMate Software Ltd. All rights reserved.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
* are also available at http://svnkit.com/license.html
* If newer versions of this license are posted there, you may use a
* newer version instead, at your option.
* ====================================================================
*/
package org.tmatesoft.svn.core.internal.io.svn;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ConnectException;
import java.net.Socket;
import java.net.SocketTimeoutException;
import java.net.UnknownHostException;
import org.tmatesoft.svn.core.SVNErrorCode;
import org.tmatesoft.svn.core.SVNErrorMessage;
import org.tmatesoft.svn.core.SVNException;
import org.tmatesoft.svn.core.SVNURL;
import org.tmatesoft.svn.core.internal.util.SVNSocketFactory;
import org.tmatesoft.svn.core.internal.wc.SVNErrorManager;
import org.tmatesoft.svn.util.SVNDebugLog;
import org.tmatesoft.svn.util.SVNLogType;
/**
* @version 1.3
* @author TMate Software Ltd.
*/
public class SVNPlainConnector implements ISVNConnector {
private static final int DEFAULT_SVN_TIMEOUT = 0;
private Socket mySocket;
private OutputStream myOutputStream;
private InputStream myInputStream;
public void open(SVNRepositoryImpl repository) throws SVNException {
if (mySocket != null) {
return;
}
SVNURL location = repository.getLocation();
try {
int connectTimeout = repository.getAuthenticationManager() != null ? repository.getAuthenticationManager().getConnectTimeout(repository) : DEFAULT_SVN_TIMEOUT;
int readTimeout = repository.getAuthenticationManager() != null ? repository.getAuthenticationManager().getReadTimeout(repository) : DEFAULT_SVN_TIMEOUT;
mySocket = SVNSocketFactory.createPlainSocket(location.getHost(), location.getPort(), connectTimeout, readTimeout, repository.getCanceller());
} catch (SocketTimeoutException e) {
SVNErrorMessage err = SVNErrorMessage.create(SVNErrorCode.RA_SVN_IO_ERROR, "timed out waiting for server", null, SVNErrorMessage.TYPE_ERROR, e);
SVNErrorManager.error(err, e, SVNLogType.NETWORK);
} catch (UnknownHostException e) {
SVNErrorMessage err = SVNErrorMessage.create(SVNErrorCode.RA_SVN_IO_ERROR, "Unknown host " + e.getMessage(), null, SVNErrorMessage.TYPE_ERROR, e);
SVNErrorManager.error(err, e, SVNLogType.NETWORK);
} catch (ConnectException e) {
SVNErrorMessage err = SVNErrorMessage.create(SVNErrorCode.RA_SVN_IO_ERROR, "connection refused by the server", null, SVNErrorMessage.TYPE_ERROR, e);
SVNErrorManager.error(err, e, SVNLogType.NETWORK);
} catch (IOException e) {
SVNErrorMessage err = SVNErrorMessage.create(SVNErrorCode.RA_SVN_IO_ERROR, e.getLocalizedMessage());
SVNErrorManager.error(err, e, SVNLogType.NETWORK);
}
}
public void close(SVNRepositoryImpl repository) throws SVNException {
if (mySocket != null) {
try {
mySocket.shutdownInput();
} catch (IOException e) {
//
}
try {
mySocket.shutdownOutput();
} catch (IOException e) {
//
}
try {
mySocket.close();
} catch (IOException ex) {
SVNErrorManager.error(SVNErrorMessage.create(SVNErrorCode.RA_SVN_IO_ERROR, ex.getMessage(), ex), SVNLogType.NETWORK);
} finally {
mySocket = null;
myInputStream = null;
myOutputStream = null;
}
}
}
public boolean isStale() {
try {
SVNDebugLog.getDefaultLog().logFine(SVNLogType.NETWORK, "checking whether connection is stale.");
boolean result = mySocket != null && SVNSocketFactory.isSocketStale(mySocket);
SVNDebugLog.getDefaultLog().logFine(SVNLogType.NETWORK, "connection is stale: " + result);
return result;
} catch (IOException e) {
SVNDebugLog.getDefaultLog().logFine(SVNLogType.NETWORK, "failure during stale check");
SVNDebugLog.getDefaultLog().logFine(SVNLogType.NETWORK, e);
return true;
}
}
public boolean isConnected(SVNRepositoryImpl repos) throws SVNException {
return mySocket != null && mySocket.isConnected();
}
public InputStream getInputStream() throws IOException {
if (myInputStream == null) {
myInputStream = mySocket.getInputStream();
myInputStream = new BufferedInputStream(myInputStream);
}
return myInputStream;
}
public OutputStream getOutputStream() throws IOException {
if (myOutputStream == null) {
myOutputStream = new BufferedOutputStream(mySocket.getOutputStream());
}
return myOutputStream;
}
public void free() {
}
public boolean occupy() {
return true;
}
public void handleExceptionOnOpen(SVNRepositoryImpl repository, SVNException exception) throws SVNException {
throw exception;
}
}