This is an automated email from the git hooks/post-receive script. New commit to branch feature/GIT in repository scmwebeditor. See http://git.nuiton.org/scmwebeditor.git commit 40513dcf959d64dbe664a2e430b52105271ffafd Author: Hugo PIGEON <hpigeon@codelutin.com> Date: Tue May 5 11:14:03 2015 +0200 Use of providers which give information about the SCMs features --- .../org/nuiton/scmwebeditor/GitConnection.java | 47 ++----------- .../java/org/nuiton/scmwebeditor/GitProvider.java | 77 ++++++++++++++++++++++ .../OperationNotSupportedException.java | 11 ++++ .../org/nuiton/scmwebeditor/ScmConnection.java | 14 ++-- .../nuiton/scmwebeditor/ScmConnectionFactory.java | 58 ---------------- .../java/org/nuiton/scmwebeditor/ScmProvider.java | 30 +++++++++ .../nuiton/scmwebeditor/ScmWebEditorConfig.java | 24 +++++-- .../scmwebeditor/ScmWebEditorConfigOption.java | 4 +- .../java/org/nuiton/scmwebeditor/SvnProvider.java | 38 +++++++++++ .../actions/AbstractScmWebEditorAction.java | 40 +++++++++++ .../nuiton/scmwebeditor/actions/BrowseAction.java | 50 +++++++------- .../nuiton/scmwebeditor/actions/EditAction.java | 13 +--- .../nuiton/scmwebeditor/actions/LogoutAction.java | 13 +--- .../nuiton/scmwebeditor/actions/ResetAction.java | 14 +--- .../actions/ScmWebEditorCommitAction.java | 11 +--- .../actions/ScmWebEditorMainAction.java | 11 +--- .../nuiton/scmwebeditor/actions/UploadAction.java | 20 ++---- src/main/resources/scmwebeditor.properties | 2 +- src/main/webapp/WEB-INF/content/outConnection.jsp | 4 +- 19 files changed, 281 insertions(+), 200 deletions(-) diff --git a/src/main/java/org/nuiton/scmwebeditor/GitConnection.java b/src/main/java/org/nuiton/scmwebeditor/GitConnection.java index bc85e1d..34d5ca7 100644 --- a/src/main/java/org/nuiton/scmwebeditor/GitConnection.java +++ b/src/main/java/org/nuiton/scmwebeditor/GitConnection.java @@ -22,7 +22,6 @@ package org.nuiton.scmwebeditor; import com.google.common.collect.Lists; -import com.jgeppert.struts2.jquery.tree.result.TreeNode; import org.apache.commons.io.FileUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -31,7 +30,6 @@ import org.eclipse.jgit.api.errors.*; import org.eclipse.jgit.diff.DiffEntry; import org.eclipse.jgit.lib.Constants; import org.eclipse.jgit.lib.ObjectId; -import org.eclipse.jgit.lib.Ref; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.revwalk.RevCommit; import org.eclipse.jgit.revwalk.RevTree; @@ -48,7 +46,10 @@ import java.io.FileNotFoundException; import java.io.IOException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; -import java.util.*; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; public class GitConnection implements ScmConnection { @@ -712,46 +713,6 @@ public class GitConnection implements ScmConnection { /** - * Gives a list of a remote repository's branches - * @param address the URL to the remote repository - * @param username the username to connect with - * @param password the password to connect with - * @return a list of the repository's branches - */ - public static List<String> getBranches(String address, String username, String password) { - - List<String> branches = new ArrayList<String>(); - - CredentialsProvider credentials = new UsernamePasswordCredentialsProvider(username, password); - - LsRemoteCommand lsRemote = new LsRemoteCommand(null); - lsRemote.setRemote(address); - lsRemote.setTags(false); - lsRemote.setHeads(true); - lsRemote.setCredentialsProvider(credentials); - - try { - Collection<Ref> lsRemoteResult = lsRemote.call(); - branches = new ArrayList<String>(); - - for (Ref branch : lsRemoteResult) { - - // we only take the name of the branch, not "refs/heads/" - String name = branch.getName(); - name = name.substring(name.indexOf("/") + 1); - name = name.substring(name.indexOf("/") + 1); - - branches.add(name); - } - } catch (GitAPIException e) { - log.error("The repository at address " + address + " doesn't exist", e); - } - - return branches; - } - - - /** * Changing for another branch * @param branchName the new branch's name * @throws IOException if reaching the repository is not possible diff --git a/src/main/java/org/nuiton/scmwebeditor/GitProvider.java b/src/main/java/org/nuiton/scmwebeditor/GitProvider.java new file mode 100644 index 0000000..e3a8278 --- /dev/null +++ b/src/main/java/org/nuiton/scmwebeditor/GitProvider.java @@ -0,0 +1,77 @@ +package org.nuiton.scmwebeditor; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.eclipse.jgit.api.LsRemoteCommand; +import org.eclipse.jgit.api.errors.GitAPIException; +import org.eclipse.jgit.lib.Ref; +import org.eclipse.jgit.transport.CredentialsProvider; +import org.eclipse.jgit.transport.UsernamePasswordCredentialsProvider; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +public class GitProvider implements ScmProvider { + + private static final Log log = LogFactory.getLog(GitProvider.class); + + protected String address; + + + @Override + public boolean supportsBranches() { + return true; + } + + @Override + public List<String> listBranches(String address, String username, String password) throws OperationNotSupportedException { + + List<String> branches = new ArrayList<String>(); + + CredentialsProvider credentials = new UsernamePasswordCredentialsProvider(username, password); + + LsRemoteCommand lsRemote = new LsRemoteCommand(null); + lsRemote.setRemote(address); + lsRemote.setTags(false); + lsRemote.setHeads(true); + lsRemote.setCredentialsProvider(credentials); + + try { + Collection<Ref> lsRemoteResult = lsRemote.call(); + branches = new ArrayList<String>(); + + for (Ref branch : lsRemoteResult) { + + // we only take the name of the branch, not "refs/heads/" + String name = branch.getName(); + name = name.substring(name.indexOf("/") + 1); + name = name.substring(name.indexOf("/") + 1); + + branches.add(name); + } + } catch (GitAPIException e) { + log.error("The repository at address " + address + " doesn't exist", e); + } + + return branches; + } + + @Override + public ScmConnection getConnection(String address, String sessionId) { + + GitConnection gitConn = null; + this.address = address; + + try { + gitConn = new GitConnection(address, sessionId); + } catch (IOException e) { + if (log.isErrorEnabled()) { + log.error("Can not connect to Git repository at " + address); + } + } + + return gitConn; + } +} diff --git a/src/main/java/org/nuiton/scmwebeditor/OperationNotSupportedException.java b/src/main/java/org/nuiton/scmwebeditor/OperationNotSupportedException.java new file mode 100644 index 0000000..4cbc2dc --- /dev/null +++ b/src/main/java/org/nuiton/scmwebeditor/OperationNotSupportedException.java @@ -0,0 +1,11 @@ +package org.nuiton.scmwebeditor; + +/** + * An exception called when the requested operation is not supported by the SCM + */ +public class OperationNotSupportedException extends Exception { + + public OperationNotSupportedException(String message) { + super(message); + } +} \ No newline at end of file diff --git a/src/main/java/org/nuiton/scmwebeditor/ScmConnection.java b/src/main/java/org/nuiton/scmwebeditor/ScmConnection.java index 54b5c09..a95025a 100644 --- a/src/main/java/org/nuiton/scmwebeditor/ScmConnection.java +++ b/src/main/java/org/nuiton/scmwebeditor/ScmConnection.java @@ -14,7 +14,7 @@ public interface ScmConnection { * @param dto the DTO which contains all the parameters * @return a DTO which contains all the results */ - public BrowseResultDto browse(BrowseDto dto); + BrowseResultDto browse(BrowseDto dto); /** @@ -22,7 +22,7 @@ public interface ScmConnection { * @param dto the DTO which contains all the parameters * @return a DTO which contains all the results */ - public CommitResultDto commit(CommitDto dto); + CommitResultDto commit(CommitDto dto); /** @@ -30,7 +30,7 @@ public interface ScmConnection { * @param dto the DTO which contains all the parameters * @return a DTO which contains all the results */ - public UploadResultDto uploadFile(UploadDto dto); + UploadResultDto uploadFile(UploadDto dto); /** @@ -40,7 +40,7 @@ public interface ScmConnection { * @param password the user's password for the SCM * @return a String which contains the file's content */ - public String getFileContent(String path, String username, String password) throws AuthenticationException; + String getFileContent(String path, String username, String password) throws AuthenticationException; /** @@ -50,20 +50,20 @@ public interface ScmConnection { * @param password the user's password for the SCM * @return a String which contains the head revision's number */ - public String getHeadRevisionNumber(String path, String username, String password) throws AuthenticationException; + String getHeadRevisionNumber(String path, String username, String password) throws AuthenticationException; /** * Gives the repository's unique identifier * @return the repository's unique identifier */ - public String getRepositoryId(); + String getRepositoryId(); /** * Gives the name of the edited file * @return the name of the edited file */ - public String getFileName(); + String getFileName(); } diff --git a/src/main/java/org/nuiton/scmwebeditor/ScmConnectionFactory.java b/src/main/java/org/nuiton/scmwebeditor/ScmConnectionFactory.java deleted file mode 100644 index faac19c..0000000 --- a/src/main/java/org/nuiton/scmwebeditor/ScmConnectionFactory.java +++ /dev/null @@ -1,58 +0,0 @@ -package org.nuiton.scmwebeditor; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.tmatesoft.svn.core.SVNException; - -import java.io.IOException; - -/** - * Allows to create a ScmConnection - */ -public class ScmConnectionFactory { - - private static final Log log = LogFactory.getLog(ScmConnectionFactory.class); - - - /** - * Creates a new ScmConnection, the type of SCM is deduced with the repository's address - * @param address the SCM's address - * @param type the name of the SCM tu use - * @param sessionId the user's session ID - * @return a ScmConnection of the correct type to use the repository at the given address - */ - public static ScmConnection createScmConnection(String address, String type, - String sessionId) throws ScmNotFoundException { - - ScmConnection scmConn = null; - - if (type != null) { - - if (type.equals("Git")) { - - try { - scmConn = new GitConnection(address, sessionId); - } catch (IOException e) { - if (log.isErrorEnabled()) { - log.error("Can not reach the repository", e); - } - } - } else if (type.equals("SVN")) { - - try { - scmConn = new SvnConnection(address); - } catch (SVNException e) { - if (log.isErrorEnabled()) { - log.error("Can not reach the repository", e); - } - } - } else { - throw new ScmNotFoundException("The given SCM type was not recognized"); - } - } else { - throw new ScmNotFoundException("The given SCM type is null"); - } - - return scmConn; - } -} diff --git a/src/main/java/org/nuiton/scmwebeditor/ScmProvider.java b/src/main/java/org/nuiton/scmwebeditor/ScmProvider.java new file mode 100644 index 0000000..9da89d5 --- /dev/null +++ b/src/main/java/org/nuiton/scmwebeditor/ScmProvider.java @@ -0,0 +1,30 @@ +package org.nuiton.scmwebeditor; + +import java.util.List; + +public interface ScmProvider { + + /** + * Tells whether the SCM supports branches + * @return true if the SCM supports branches + */ + boolean supportsBranches(); + + /** + * Makes a list of the repository's branches + * @param address the repository's address + * @param username the username used to connect to the SCM + * @param password the password used to connect to the SCM + * @return a list of the repository's branches + * @throws OperationNotSupportedException if the SCM doesn't support branches + */ + List<String> listBranches(String address, String username, String password) throws OperationNotSupportedException; + + /** + * Gives the connection to the SCM + * @param address the repository's address + * @param sessionId the HTTP session ID which will be used to separate each user's local files + * @return the connection to the SCM + */ + ScmConnection getConnection(String address, String sessionId); +} diff --git a/src/main/java/org/nuiton/scmwebeditor/ScmWebEditorConfig.java b/src/main/java/org/nuiton/scmwebeditor/ScmWebEditorConfig.java index 578b8f1..f1b2d41 100644 --- a/src/main/java/org/nuiton/scmwebeditor/ScmWebEditorConfig.java +++ b/src/main/java/org/nuiton/scmwebeditor/ScmWebEditorConfig.java @@ -26,8 +26,9 @@ import org.apache.commons.logging.LogFactory; import org.nuiton.config.ApplicationConfig; import org.nuiton.config.ArgumentsParserException; -import java.util.Arrays; +import java.util.HashMap; import java.util.List; +import java.util.Map; public class ScmWebEditorConfig { @@ -65,10 +66,25 @@ public class ScmWebEditorConfig { return getConfig().getOption(key); } - public static List<String> getSupportedScms() { + public static Map<String, String> getProviders() { - String key = ScmWebEditorConfigOption.SUPPORTED_SCMS.getKey(); - return getConfig().getOptionAsList(key).getOption(); + String key = ScmWebEditorConfigOption.PROVIDERS.getKey(); + Map<String, String> providers = new HashMap<String, String>(); + + List<String> options = getConfig().getOptionAsList(key).getOption(); + + for (String option : options) { + String[] nameClass = option.split(":"); + if (nameClass.length == 2) { + providers.put(nameClass[0], nameClass[1]); + } else { + if (log.isErrorEnabled()) { + log.error("Can not read option : " + option); + } + } + } + + return providers; } public static String getKey() { diff --git a/src/main/java/org/nuiton/scmwebeditor/ScmWebEditorConfigOption.java b/src/main/java/org/nuiton/scmwebeditor/ScmWebEditorConfigOption.java index dac5a80..dca0634 100644 --- a/src/main/java/org/nuiton/scmwebeditor/ScmWebEditorConfigOption.java +++ b/src/main/java/org/nuiton/scmwebeditor/ScmWebEditorConfigOption.java @@ -24,13 +24,15 @@ package org.nuiton.scmwebeditor; import org.nuiton.config.ApplicationConfig; import org.nuiton.config.ConfigOptionDef; +import java.util.List; + public enum ScmWebEditorConfigOption implements ConfigOptionDef { CONFIG_FILE(ApplicationConfig.CONFIG_FILE_NAME, "The file name", "scmwebeditor.properties", String.class, false, false), EDITABLE_FILES("swe.editableFiles", "description", "Files types that are editable", String.class, true, true), COOKIES_PRIVATE_KEY("swe.cookiePrivateKey", "Private key for cookies", null, String.class, true, true), LOCAL_REPOSITORIES_PATH("swe.localRepositoriesPath", "The path where the local repositories will be stored", "/var/local/swe", String.class, false, true), - SUPPORTED_SCMS("swe.supportedScms", "The SCMs that can be used", null, String.class, false, true); + PROVIDERS("swe.providers", "The SCMs that can be used", null, List.class, false, true); private final String key; diff --git a/src/main/java/org/nuiton/scmwebeditor/SvnProvider.java b/src/main/java/org/nuiton/scmwebeditor/SvnProvider.java new file mode 100644 index 0000000..82ff0f4 --- /dev/null +++ b/src/main/java/org/nuiton/scmwebeditor/SvnProvider.java @@ -0,0 +1,38 @@ +package org.nuiton.scmwebeditor; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.tmatesoft.svn.core.SVNException; + +import java.util.List; + +public class SvnProvider implements ScmProvider { + + private static final Log log = LogFactory.getLog(SvnProvider.class); + + @Override + public boolean supportsBranches() { + return false; + } + + @Override + public List<String> listBranches(String address, String username, String password) throws OperationNotSupportedException { + throw new OperationNotSupportedException("SVN repositories don't have branches"); + } + + @Override + public ScmConnection getConnection(String address, String sessionId) { + + SvnConnection svnConn = null; + + try { + svnConn = new SvnConnection(address); + } catch (SVNException e) { + if (log.isErrorEnabled()) { + log.error("Can not connect to SVN repository at " + address, e); + } + } + + return svnConn; + } +} diff --git a/src/main/java/org/nuiton/scmwebeditor/actions/AbstractScmWebEditorAction.java b/src/main/java/org/nuiton/scmwebeditor/actions/AbstractScmWebEditorAction.java index b835376..486e28a 100644 --- a/src/main/java/org/nuiton/scmwebeditor/actions/AbstractScmWebEditorAction.java +++ b/src/main/java/org/nuiton/scmwebeditor/actions/AbstractScmWebEditorAction.java @@ -31,7 +31,9 @@ import org.apache.tika.exception.TikaException; import org.apache.tika.metadata.Metadata; import org.apache.tika.parser.AutoDetectParser; import org.apache.tika.sax.BodyContentHandler; +import org.nuiton.scmwebeditor.ScmProvider; import org.nuiton.scmwebeditor.ScmSession; +import org.nuiton.scmwebeditor.ScmWebEditorConfig; import org.nuiton.web.struts2.BaseAction; import org.xml.sax.SAXException; @@ -348,6 +350,44 @@ public abstract class AbstractScmWebEditorAction extends BaseAction implements S return scmSession; } + /** + * Gives an instance of the provider for the given SCM type + * @param scmType the type of SCM to use + * @return the provider for the given SCM + */ + public ScmProvider getProvider(String scmType) { + + Map<String, String> providers = ScmWebEditorConfig.getProviders(); + String providerClassName = providers.get(scmType); + ScmProvider provider = null; + + if (providerClassName != null) { + try { + + Class<?> providerClass = Class.forName(providerClassName); + provider = (ScmProvider) providerClass.newInstance(); + + } catch (ClassNotFoundException e) { + + if (log.isErrorEnabled()) { + log.error("Can not find SCM " + scmType, e); + } + } catch (InstantiationException e) { + + if (log.isErrorEnabled()) { + log.error("Can not instantiate class " + providerClassName, e); + } + } catch (IllegalAccessException e) { + + if (log.isErrorEnabled()) { + log.error("Can not access to class " + providerClassName, e); + } + } + } + + return provider; + } + public String getUsername(String url) { return getScmSession().getUsername(url); } diff --git a/src/main/java/org/nuiton/scmwebeditor/actions/BrowseAction.java b/src/main/java/org/nuiton/scmwebeditor/actions/BrowseAction.java index 02a5cd8..50cdd2a 100644 --- a/src/main/java/org/nuiton/scmwebeditor/actions/BrowseAction.java +++ b/src/main/java/org/nuiton/scmwebeditor/actions/BrowseAction.java @@ -27,7 +27,10 @@ import org.apache.commons.logging.LogFactory; import org.apache.shiro.codec.Base64; import org.apache.shiro.crypto.BlowfishCipherService; import org.apache.struts2.interceptor.ServletResponseAware; -import org.nuiton.scmwebeditor.*; +import org.nuiton.scmwebeditor.OperationNotSupportedException; +import org.nuiton.scmwebeditor.ScmConnection; +import org.nuiton.scmwebeditor.ScmProvider; +import org.nuiton.scmwebeditor.ScmWebEditorConfig; import org.nuiton.scmwebeditor.dto.BrowseDto; import org.nuiton.scmwebeditor.dto.BrowseResultDto; @@ -144,23 +147,15 @@ public class BrowseAction extends AbstractScmWebEditorAction implements ServletR HttpSession session = request.getSession(); String sessionId = session.getId(); - ScmConnection scmConn; - try { - scmConn = ScmConnectionFactory.createScmConnection(address, scmType, sessionId); - } catch (ScmNotFoundException e) { - error = true; - if (log.isErrorEnabled()) { - log.error("Can not create a connection to the SCM", e); - } - return SUCCESS; - } + ScmProvider provider = getProvider(scmType); - // getting the files and directories - if (scmConn == null) { + if (provider == null) { error = true; return ROOT; } + ScmConnection scmConn = provider.getConnection(address, sessionId); + // putting all the parameters into a DTO BrowseDto dto = new BrowseDto(); dto.setUsername(username); @@ -237,21 +232,22 @@ public class BrowseAction extends AbstractScmWebEditorAction implements ServletR } if (username != null && pw != null) { - BlowfishCipherService bf = new BlowfishCipherService(); - byte[] privateKey = Base64.decode(ScmWebEditorConfig.getKey()); + if (!username.equals("anonymous") && !pw.equals("anonymous")) { + + BlowfishCipherService bf = new BlowfishCipherService(); + byte[] privateKey = Base64.decode(ScmWebEditorConfig.getKey()); - Cookie authCookie = new Cookie(repositoryUUID, bf.encrypt((username + "," + pw).getBytes(), privateKey).toBase64()); - authCookie.setMaxAge(60 * 60 * 24 * 365); - response.addCookie(authCookie); + Cookie authCookie = new Cookie(repositoryUUID, bf.encrypt((username + "," + pw).getBytes(), privateKey).toBase64()); + authCookie.setMaxAge(60 * 60 * 24 * 365); + response.addCookie(authCookie); - getScmSession().addScmUser(repositoryUUID, username, pw); + getScmSession().addScmUser(repositoryUUID, username, pw); + } } return SUCCESS; } - - // FIXME rendre indépendant de Git public String getBranchesJSON() { if (username == null) { @@ -261,7 +257,17 @@ public class BrowseAction extends AbstractScmWebEditorAction implements ServletR pw = "anonymous"; } - branches = GitConnection.getBranches(address, username, pw); + ScmProvider provider = getProvider(scmType); + + try { + branches = provider.listBranches(address, username, pw); + } catch (OperationNotSupportedException e) { + if (log.isDebugEnabled()) { + log.debug("The SCM " + scmType + " does not support branches", e); + } + } + + // generating the JSON data String json = ""; if (branches.size() > 0) { diff --git a/src/main/java/org/nuiton/scmwebeditor/actions/EditAction.java b/src/main/java/org/nuiton/scmwebeditor/actions/EditAction.java index a83c0a6..9cc7ad7 100644 --- a/src/main/java/org/nuiton/scmwebeditor/actions/EditAction.java +++ b/src/main/java/org/nuiton/scmwebeditor/actions/EditAction.java @@ -6,8 +6,7 @@ import org.apache.commons.logging.LogFactory; import org.apache.shiro.codec.Base64; import org.apache.shiro.crypto.BlowfishCipherService; import org.nuiton.scmwebeditor.ScmConnection; -import org.nuiton.scmwebeditor.ScmConnectionFactory; -import org.nuiton.scmwebeditor.ScmNotFoundException; +import org.nuiton.scmwebeditor.ScmProvider; import org.nuiton.scmwebeditor.ScmWebEditorConfig; import javax.naming.AuthenticationException; @@ -24,14 +23,8 @@ public class EditAction extends ScmWebEditorMainAction { HttpSession session = request.getSession(); String sessionId = session.getId(); - ScmConnection scmConn = null; - try { - scmConn = ScmConnectionFactory.createScmConnection(address, scmType, sessionId); - } catch (ScmNotFoundException e) { - if (log.isErrorEnabled()) { - log.error("Can not create a connection to the SCM", e); - } - } + ScmProvider provider = getProvider(scmType); + ScmConnection scmConn = provider.getConnection(address, sessionId); format = scmConn.getFileName().substring(scmConn.getFileName().lastIndexOf(".") + 1); diff --git a/src/main/java/org/nuiton/scmwebeditor/actions/LogoutAction.java b/src/main/java/org/nuiton/scmwebeditor/actions/LogoutAction.java index b9d9450..3dde582 100644 --- a/src/main/java/org/nuiton/scmwebeditor/actions/LogoutAction.java +++ b/src/main/java/org/nuiton/scmwebeditor/actions/LogoutAction.java @@ -26,8 +26,7 @@ import org.apache.commons.logging.LogFactory; import org.apache.struts2.interceptor.ServletRequestAware; import org.apache.struts2.interceptor.ServletResponseAware; import org.nuiton.scmwebeditor.ScmConnection; -import org.nuiton.scmwebeditor.ScmConnectionFactory; -import org.nuiton.scmwebeditor.ScmNotFoundException; +import org.nuiton.scmwebeditor.ScmProvider; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; @@ -68,14 +67,8 @@ public class LogoutAction extends AbstractScmWebEditorAction implements ServletR String sessionId = request.getSession().getId(); - ScmConnection scmConn = null; - try { - scmConn = ScmConnectionFactory.createScmConnection(address, scmType, sessionId); - } catch (ScmNotFoundException e) { - if (log.isErrorEnabled()) { - log.error("Can not create a connection to the SCM", e); - } - } + ScmProvider provider = getProvider(scmType); + ScmConnection scmConn = provider.getConnection(address, sessionId); // getting the repository unique identifier if it is possible String repositoryId = scmConn.getRepositoryId(); diff --git a/src/main/java/org/nuiton/scmwebeditor/actions/ResetAction.java b/src/main/java/org/nuiton/scmwebeditor/actions/ResetAction.java index 455d99d..e1761e6 100644 --- a/src/main/java/org/nuiton/scmwebeditor/actions/ResetAction.java +++ b/src/main/java/org/nuiton/scmwebeditor/actions/ResetAction.java @@ -24,8 +24,7 @@ package org.nuiton.scmwebeditor.actions; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.nuiton.scmwebeditor.ScmConnection; -import org.nuiton.scmwebeditor.ScmConnectionFactory; -import org.nuiton.scmwebeditor.ScmNotFoundException; +import org.nuiton.scmwebeditor.ScmProvider; import javax.naming.AuthenticationException; @@ -76,15 +75,8 @@ public class ResetAction extends AbstractScmWebEditorAction { String sessionId = request.getSession().getId(); - ScmConnection scmConn = null; - try { - scmConn = ScmConnectionFactory.createScmConnection(address, scmType, sessionId); - } catch (ScmNotFoundException e) { - error = e.getMessage(); - if (log.isErrorEnabled()) { - log.error("Can not create a connection to the SCM", e); - } - } + ScmProvider provider = getProvider(scmType); + ScmConnection scmConn = provider.getConnection(address, sessionId); // getting the repository unique identifier if it is possible String repositoryId = scmConn.getRepositoryId(); diff --git a/src/main/java/org/nuiton/scmwebeditor/actions/ScmWebEditorCommitAction.java b/src/main/java/org/nuiton/scmwebeditor/actions/ScmWebEditorCommitAction.java index f517121..d3d82c7 100644 --- a/src/main/java/org/nuiton/scmwebeditor/actions/ScmWebEditorCommitAction.java +++ b/src/main/java/org/nuiton/scmwebeditor/actions/ScmWebEditorCommitAction.java @@ -250,15 +250,8 @@ public class ScmWebEditorCommitAction extends AbstractScmWebEditorAction impleme HttpSession session = request.getSession(); String sessionId = session.getId(); - ScmConnection scmConn = null; - try { - scmConn = ScmConnectionFactory.createScmConnection(address, scmType, sessionId); - } catch (ScmNotFoundException e) { - if (log.isErrorEnabled()) { - log.error("Can not create a connection to the SCM", e); - } - } - + ScmProvider provider = getProvider(scmType); + ScmConnection scmConn = provider.getConnection(address, sessionId); String login = getUsername(); String password = getPw(); diff --git a/src/main/java/org/nuiton/scmwebeditor/actions/ScmWebEditorMainAction.java b/src/main/java/org/nuiton/scmwebeditor/actions/ScmWebEditorMainAction.java index 8eebc14..645532a 100644 --- a/src/main/java/org/nuiton/scmwebeditor/actions/ScmWebEditorMainAction.java +++ b/src/main/java/org/nuiton/scmwebeditor/actions/ScmWebEditorMainAction.java @@ -21,20 +21,15 @@ */ package org.nuiton.scmwebeditor.actions; +import com.google.common.collect.Lists; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.apache.shiro.codec.Base64; -import org.apache.shiro.crypto.BlowfishCipherService; import org.apache.struts2.interceptor.ServletResponseAware; import org.nuiton.scmwebeditor.*; -import javax.naming.AuthenticationException; -import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletResponse; -import javax.servlet.http.HttpSession; -import java.io.IOException; -import java.util.LinkedList; import java.util.List; +import java.util.Set; public class ScmWebEditorMainAction extends AbstractScmWebEditorAction implements ServletResponseAware { @@ -142,7 +137,7 @@ public class ScmWebEditorMainAction extends AbstractScmWebEditorAction implement return badLogin; } - public List<String> getSupportedScms() { return ScmWebEditorConfig.getSupportedScms(); } + public List<String> getSupportedScmsName() { return Lists.newArrayList(ScmWebEditorConfig.getProviders().keySet()); } /** * We check whether the parameters are empty diff --git a/src/main/java/org/nuiton/scmwebeditor/actions/UploadAction.java b/src/main/java/org/nuiton/scmwebeditor/actions/UploadAction.java index 033af28..cd2ca54 100644 --- a/src/main/java/org/nuiton/scmwebeditor/actions/UploadAction.java +++ b/src/main/java/org/nuiton/scmwebeditor/actions/UploadAction.java @@ -23,19 +23,14 @@ package org.nuiton.scmwebeditor.actions; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.apache.shiro.codec.Base64; -import org.apache.shiro.crypto.BlowfishCipherService; import org.apache.struts2.interceptor.ServletRequestAware; import org.nuiton.scmwebeditor.ScmConnection; -import org.nuiton.scmwebeditor.ScmConnectionFactory; import org.nuiton.scmwebeditor.ScmNotFoundException; -import org.nuiton.scmwebeditor.ScmWebEditorConfig; +import org.nuiton.scmwebeditor.ScmProvider; import org.nuiton.scmwebeditor.dto.UploadDto; import org.nuiton.scmwebeditor.dto.UploadResultDto; -import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.io.File; @@ -154,15 +149,14 @@ public class UploadAction extends AbstractScmWebEditorAction implements ServletR HttpSession session = request.getSession(); String sessionId = session.getId(); - ScmConnection scmConn = null; - try { - scmConn = ScmConnectionFactory.createScmConnection(address, scmType, sessionId); - } catch (ScmNotFoundException e) { - if (log.isErrorEnabled()) { - log.error("Can not create a connection to the SCM", e); - } + ScmProvider provider = getProvider(scmType); + + if (provider == null) { + error = true; + return ERROR; } + ScmConnection scmConn = provider.getConnection(address, sessionId); // if the repository is not protected for writing, we get its UUID String repositoryUUID = scmConn.getRepositoryId(); diff --git a/src/main/resources/scmwebeditor.properties b/src/main/resources/scmwebeditor.properties index 5e66892..2f19baf 100644 --- a/src/main/resources/scmwebeditor.properties +++ b/src/main/resources/scmwebeditor.properties @@ -22,4 +22,4 @@ swe.editableFiles=text,xml,javascript,sh,x-tex,x-java swe.cookiePrivateKey=ZvcCyhfRTVZoQz3B/IpYdw== swe.localRepositoriesPath=/var/local/swe -swe.supportedScms=SVN,Git +swe.providers=SVN:org.nuiton.scmwebeditor.SvnProvider,Git:org.nuiton.scmwebeditor.GitProvider diff --git a/src/main/webapp/WEB-INF/content/outConnection.jsp b/src/main/webapp/WEB-INF/content/outConnection.jsp index 56783f6..6f3de64 100644 --- a/src/main/webapp/WEB-INF/content/outConnection.jsp +++ b/src/main/webapp/WEB-INF/content/outConnection.jsp @@ -117,15 +117,13 @@ value="%{search}" > </sj:submit> - - <input type="submit"/> </p> </center> <label> <s:text name="scm.outConnection.scmType"/> - <s:select id="scmType" name="scmType" list="supportedScms"/> + <s:select id="scmType" name="scmType" list="supportedScmsName"/> </label> <div id="branches"> -- To stop receiving notification emails like this one, please contact nuiton.org SCM administrator <admin+scm@nuiton.org>.