package com.asolutions.scmsshd.commands.git;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Properties;
import org.apache.sshd.server.CommandFactory.Command;
import org.apache.sshd.server.CommandFactory.ExitCallback;
import org.apache.sshd.server.CommandFactory.SessionAware;
import org.apache.sshd.server.session.ServerSession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.asolutions.scmsshd.authorizors.AuthorizationLevel;
import com.asolutions.scmsshd.commands.FilteredCommand;
import com.asolutions.scmsshd.commands.handlers.ISCMCommandHandler;
import com.asolutions.scmsshd.converters.path.IPathToProjectNameConverter;
import com.asolutions.scmsshd.sshd.IProjectAuthorizer;
import com.asolutions.scmsshd.sshd.UnparsableProjectException;
public class SCMCommand implements Command, SessionAware{
protected final Logger log = LoggerFactory.getLogger(getClass());
private InputStream inputStream;
private OutputStream outputStream;
private OutputStream errorStream;
private ExitCallback exitCallback;
private ServerSession session;
private FilteredCommand filteredCommand;
private IProjectAuthorizer projectAuthorizer;
private IPathToProjectNameConverter pathToProjectNameConverter;
private ISCMCommandHandler sCMCommandHandler;
private Properties configuration;
public SCMCommand() {
super();
}
public SCMCommand(FilteredCommand filteredCommand,
IProjectAuthorizer projectAuthorizer,
ISCMCommandHandler anSCMCommandHandler,
IPathToProjectNameConverter pathToProjectNameConverter,
Properties configuration) {
this.filteredCommand = filteredCommand;
this.projectAuthorizer = projectAuthorizer;
this.sCMCommandHandler = anSCMCommandHandler;
this.pathToProjectNameConverter = pathToProjectNameConverter;
this.configuration = configuration;
}
public ExitCallback getExitCallback() {
return exitCallback;
}
public OutputStream getOutputStream() {
return outputStream;
}
public InputStream getInputStream() {
return inputStream;
}
public OutputStream getErrorStream() {
return errorStream;
}
public ServerSession getSession() {
return session;
}
public void setErrorStream(OutputStream err) {
this.errorStream = err;
}
public void setExitCallback(ExitCallback callback) {
this.exitCallback = callback;
}
public void setSession(ServerSession session) {
this.session = session;
}
public void setInputStream(InputStream in) {
this.inputStream = in;
}
public void setOutputStream(OutputStream out) {
this.outputStream = out;
}
public String getUsername() {
if (session != null){
return session.getUsername();
}
else {
return null;
}
}
public FilteredCommand getFilteredCommand() {
return filteredCommand;
}
public IProjectAuthorizer getProjectAuthorizer() {
return projectAuthorizer;
}
public IPathToProjectNameConverter getPathToProjectNameConverter() {
return pathToProjectNameConverter;
}
public ISCMCommandHandler getSCMCommandHandler() {
return sCMCommandHandler;
}
public void start() throws IOException {
new Thread("Execute:" + System.currentTimeMillis()) {
@Override
public void run() {
runImpl();
}
}.start();
}
protected void runImpl()
{
try {
String argument = filteredCommand.getArgument();
String project = pathToProjectNameConverter.convert(argument);
String username = getUsername();
AuthorizationLevel result = projectAuthorizer.userIsAuthorizedForProject(username, project);
if (result != null)
{
sCMCommandHandler.execute(filteredCommand,
getInputStream(),
getOutputStream(),
getErrorStream(),
getExitCallback(),
getConfiguration(),
result);
}
else
{
getExitCallback().onExit(1);
}
} catch (UnparsableProjectException e) {
log.error("Error running impl" , e);
}
}
public Properties getConfiguration() {
return configuration;
}
}