remove deprecated stuff

This commit is contained in:
Sebastian Sdorra
2014-01-03 10:34:34 +01:00
parent 39ad99f5e9
commit aec7773239
82 changed files with 168 additions and 10455 deletions

View File

@@ -95,19 +95,6 @@ public class RunMojo extends AbstractBaseScmMojo
return contextPath;
}
/**
* Method description
*
*
* @return
* @deprecated use {@link #getLoggingConfiguration()} instead
*/
@Deprecated
public String getLoggginConfiguration()
{
return loggginConfiguration;
}
/**
* Method description
*
@@ -209,19 +196,6 @@ public class RunMojo extends AbstractBaseScmMojo
this.contextPath = contextPath;
}
/**
* Method description
*
*
* @param loggginConfiguration
* @deprecated use {@link #setLoggingConfiguration(java.lang.String)} instead
*/
@Deprecated
public void setLoggginConfiguration(String loggginConfiguration)
{
this.loggginConfiguration = loggginConfiguration;
}
/**
* Method description
*

View File

@@ -37,7 +37,6 @@ package sonia.scm;
import sonia.scm.security.PermissionDescriptor;
import sonia.scm.user.User;
import sonia.scm.web.security.WebSecurityContext;
//~--- JDK imports ------------------------------------------------------------
@@ -66,48 +65,6 @@ public class ScmState
*/
public ScmState() {}
/**
* Constructs {@link ScmState} object.
*
*
* @param provider - context provider
* @param securityContext - security context of the current user
* @param repositoryTypes - available repository types
* @param clientConfig - client configuration
*/
@Deprecated
public ScmState(SCMContextProvider provider,
WebSecurityContext securityContext, Collection<Type> repositoryTypes,
ScmClientConfig clientConfig)
{
this(provider, securityContext, repositoryTypes, null, clientConfig);
}
/**
* Constructs {@link ScmState} object.
*
*
* @param provider - context provider
* @param securityContext - security context of the current user
* @param repositoryTypes - available repository types
* @param clientConfig - client configuration
* @param defaultUserType = Default user type
*
* @since 1.14
*/
@Deprecated
public ScmState(SCMContextProvider provider,
WebSecurityContext securityContext, Collection<Type> repositoryTypes,
String defaultUserType, ScmClientConfig clientConfig)
{
this.version = provider.getVersion();
this.user = securityContext.getUser();
this.groups = securityContext.getGroups();
this.repositoryTypes = repositoryTypes;
this.clientConfig = clientConfig;
this.defaultUserType = defaultUserType;
}
/**
* Constructs {@link ScmState} object.
*

View File

@@ -59,13 +59,6 @@ public class ServletContainerDetector
//~--- constructors ---------------------------------------------------------
/**
* Constructs a new ServletContainerDetector.
* @deprecated Use {@link ServletContainerDetector#detect(HttpServletRequest)} instead.
*/
@Deprecated
public ServletContainerDetector() {}
/**
* Constructs a new ServletContainerDetector depending on the ServletRequest.
* @param req The ServletRequest.
@@ -80,18 +73,6 @@ public class ServletContainerDetector
/**
* Detects the ServletContainer.
*
* @deprecated Use {@link ServletContainerDetector#detect(HttpServletRequest)} instead.
* @return the detected ServletContainer
*/
@Deprecated
public static ServletContainer detect()
{
return new ServletContainerDetector().detectContainer();
}
/**
* Alternate detection of ServletContainer using DefaultServletDetection.
*
* @param req The used Servlet instance.
* @return the detected ServletContainer.
* @since 1.32
@@ -211,14 +192,7 @@ public class ServletContainerDetector
{
final String value = System.getProperty("com.sun.aas.instanceRoot");
if (value != null)
{
return true;
}
else
{
return false;
}
return value != null;
}
/**
@@ -348,13 +322,14 @@ public class ServletContainerDetector
*/
private boolean detect(final String clazz)
{
boolean result = false;
try
{
final ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();
systemClassLoader.loadClass(clazz);
return true;
result = true;
}
catch (final ClassNotFoundException cnfe)
{
@@ -362,13 +337,10 @@ public class ServletContainerDetector
if (classObj.getResource(clazz) != null)
{
return true;
}
else
{
return false;
result = true;
}
}
return result;
}
/**

View File

@@ -174,13 +174,6 @@ public class ScmConfiguration
this.enableRepositoryArchive = other.enableRepositoryArchive;
this.loginAttemptLimit = other.loginAttemptLimit;
this.loginAttemptLimitTimeout = other.loginAttemptLimitTimeout;
// deprecated fields
this.servername = other.servername;
this.sslPort = other.sslPort;
this.enableSSL = other.enableSSL;
this.enablePortForward = other.enablePortForward;
this.forwardPort = other.forwardPort;
}
/**
@@ -243,19 +236,6 @@ public class ScmConfiguration
return dateFormat;
}
/**
* Returns the forwarding port.
*
*
* @return forwarding port
* @deprecated use {@link #getBaseUrl()}
*/
@Deprecated
public int getForwardPort()
{
return forwardPort;
}
/**
* Returns maximum allowed login attempts.
*
@@ -362,31 +342,6 @@ public class ScmConfiguration
return proxyUser;
}
/**
* Returns the servername of the SCM-Manager host.
*
*
* @return servername of the SCM-Manager host
* @deprecated use {@link #getBaseUrl()}
*/
public String getServername()
{
return servername;
}
/**
* Returns the ssl port.
*
*
* @return ssl port
* @deprecated use {@link #getBaseUrl()} and {@link #isForceBaseUrl()}
*/
@Deprecated
public int getSslPort()
{
return sslPort;
}
/**
* Returns true if the anonymous access to the SCM-Manager is enabled.
*
@@ -409,19 +364,6 @@ public class ScmConfiguration
return disableGroupingGrid;
}
/**
* Returns true if port forwarding is enabled.
*
*
* @return true if port forwarding is enabled
* @deprecated use {@link #getBaseUrl()}
*/
@Deprecated
public boolean isEnablePortForward()
{
return enablePortForward;
}
/**
* Returns true if proxy is enabled.
*
@@ -445,19 +387,6 @@ public class ScmConfiguration
return enableRepositoryArchive;
}
/**
* Returns true if ssl is enabled.
*
*
* @return true if ssl is enabled
* @deprecated use {@link #getBaseUrl()} and {@link #isForceBaseUrl()}
*/
@Deprecated
public boolean isEnableSSL()
{
return enableSSL;
}
/**
* Returns true if force base url is enabled.
*
@@ -539,19 +468,6 @@ public class ScmConfiguration
this.disableGroupingGrid = disableGroupingGrid;
}
/**
* Method description
*
*
* @param enablePortForward
* @deprecated use {@link #setBaseUrl(String)}
*/
@Deprecated
public void setEnablePortForward(boolean enablePortForward)
{
this.enablePortForward = enablePortForward;
}
/**
* Method description
*
@@ -575,19 +491,6 @@ public class ScmConfiguration
this.enableRepositoryArchive = enableRepositoryArchive;
}
/**
* Method description
*
*
* @param enableSSL
* @deprecated use {@link #setBaseUrl(String)} and {$link #setForceBaseUrl(boolean)}
*/
@Deprecated
public void setEnableSSL(boolean enableSSL)
{
this.enableSSL = enableSSL;
}
/**
* Method description
*
@@ -600,19 +503,6 @@ public class ScmConfiguration
this.forceBaseUrl = forceBaseUrl;
}
/**
* Method description
*
*
* @param forwardPort
* @deprecated use {@link #setBaseUrl(String)}
*/
@Deprecated
public void setForwardPort(int forwardPort)
{
this.forwardPort = forwardPort;
}
/**
* Set maximum allowed login attempts.
*
@@ -709,31 +599,6 @@ public class ScmConfiguration
this.proxyUser = proxyUser;
}
/**
* Method description
*
*
* @param servername
* @deprecated use {@link #setBaseUrl(String)}
*/
public void setServername(String servername)
{
this.servername = servername;
}
/**
* Method description
*
*
* @param sslPort
* @deprecated use {@link #setBaseUrl(String)} and {@link #setForceBaseUrl(boolean)}
*/
@Deprecated
public void setSslPort(int sslPort)
{
this.sslPort = sslPort;
}
//~--- fields ---------------------------------------------------------------
/** Field description */
@@ -754,10 +619,6 @@ public class ScmConfiguration
@XmlElement(name = "force-base-url")
private boolean forceBaseUrl;
/** @deprecated use {@link #baseUrl} */
@Deprecated
private int forwardPort = 80;
/**
* Maximum allowed login attempts.
*
@@ -798,21 +659,6 @@ public class ScmConfiguration
/** Field description */
private String proxyUser;
/** @deprecated use {@link #baseUrl} */
private String servername = "localhost";
/** @deprecated use {@link #baseUrl} and {@link #forceBaseUrl} */
@Deprecated
private boolean enableSSL = false;
/** @deprecated use {@link #baseUrl} */
@Deprecated
private boolean enablePortForward = false;
/** @deprecated use {@link #baseUrl} and {@link #forceBaseUrl} */
@Deprecated
private int sslPort = 8181;
/** Configuration change listeners */
@XmlTransient
private Set<ConfigChangedListener> listeners =

View File

@@ -42,18 +42,6 @@ package sonia.scm.filter;
public class GZipFilterConfig
{
/**
* Returns true if the response should be buffered.
*
*
* @return true if the response should be buffered
* @deprecated use {@link #isBufferResponse()} instead.
*/
@Deprecated
public boolean isBufferRequest()
{
return bufferResponse;
}
/**
* Returns true if the response should be buffered.
@@ -68,19 +56,6 @@ public class GZipFilterConfig
//~--- set methods ----------------------------------------------------------
/**
* Enables or disables response buffering. Default buffering is enabled.
*
* @param bufferResponse true to enabled response buffering.
*
* @deprecated use {@link #setBufferResponse(boolean)} instead.
*/
@Deprecated
public void setBufferRequest(boolean bufferResponse)
{
this.bufferResponse = bufferResponse;
}
/**
* Enables or disables response buffering. Default buffering is enabled.
*

View File

@@ -1,230 +0,0 @@
/**
* Copyright (c) 2010, Sebastian Sdorra
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* 3. Neither the name of SCM-Manager; nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* http://bitbucket.org/sdorra/scm-manager
*
*/
package sonia.scm.plugin.ext;
//~--- non-JDK imports --------------------------------------------------------
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import sonia.scm.util.IOUtil;
//~--- JDK imports ------------------------------------------------------------
import java.io.IOException;
import java.io.InputStream;
import java.util.Collection;
import java.util.jar.JarEntry;
import java.util.jar.JarInputStream;
/**
*
* @author Sebastian Sdorra
* @deprecated use {@link DefaultExtensionScanner} instead
*/
@Deprecated
public class JARExtensionScanner implements ExtensionScanner
{
/** the logger for JARExtensionScanner */
private static final Logger logger =
LoggerFactory.getLogger(JARExtensionScanner.class);
//~--- methods --------------------------------------------------------------
/**
* Method description
*
*
*
* @param classLoader
* @param extensionObjects
* @param inputStream
* @param packages
*
* @throws IOException
*/
@Override
public void processExtensions(ClassLoader classLoader,
Collection<ExtensionObject> extensionObjects,
InputStream inputStream,
Collection<String> packages)
throws IOException
{
JarInputStream input = null;
try
{
input = new JarInputStream(inputStream);
JarEntry entry = input.getNextJarEntry();
while (entry != null)
{
if (!entry.isDirectory())
{
processEntry(classLoader, extensionObjects, packages, entry);
}
entry = input.getNextJarEntry();
}
}
finally
{
IOUtil.close(input);
}
}
/**
* Method description
*
*
* @param classLoader
* @param name
*
* @return
*/
private Class<?> createClass(ClassLoader classLoader, String name)
{
Class<?> clazz = null;
try
{
clazz = classLoader.loadClass(name);
}
catch (Exception ex)
{
logger.error(ex.getMessage(), ex);
}
return clazz;
}
/**
* Method description
*
*
*
* @param classLoader
* @param extensionObjects
* @param packages
* @param entry
*/
private void processEntry(ClassLoader classLoader,
Collection<ExtensionObject> extensionObjects,
Collection<String> packages, JarEntry entry)
{
String name = entry.getName();
if (name.endsWith(".class"))
{
name = getClassName(name);
if (isManagedClass(packages, name))
{
Class<?> managedClass = createClass(classLoader, name);
if (managedClass != null)
{
processManagedClass(extensionObjects, managedClass);
}
}
}
}
/**
* Method description
*
*
* @param extensionObjects
* @param managedClass
*/
private void processManagedClass(
Collection<ExtensionObject> extensionObjects, Class<?> managedClass)
{
Extension extension = managedClass.getAnnotation(Extension.class);
if (extension != null)
{
if (logger.isDebugEnabled())
{
logger.debug("found extension class {}", managedClass.getName());
}
extensionObjects.add(new ExtensionObject(extension, managedClass));
}
}
//~--- get methods ----------------------------------------------------------
/**
* Method description
*
*
* @param name
*
* @return
*/
private String getClassName(String name)
{
return name.replaceAll("/", ".").substring(0, name.length() - 6);
}
/**
* Method description
*
*
* @param packages
* @param name
*
* @return
*/
private boolean isManagedClass(Collection<String> packages, String name)
{
boolean result = false;
for (String pkg : packages)
{
if (name.startsWith(pkg))
{
result = true;
break;
}
}
return result;
}
}

View File

@@ -187,35 +187,6 @@ public abstract class AbstractRepositoryHandler<C extends SimpleRepositoryConfig
//~--- get methods ----------------------------------------------------------
/**
* Method description
*
*
* @param repository
*
* @return
* @since 1.8
*/
@Override
public BlameViewer getBlameViewer(Repository repository)
{
return null;
}
/**
* Method description
*
*
*
* @param repository
* @return
*/
@Override
public ChangesetViewer getChangesetViewer(Repository repository)
{
return null;
}
/**
* Method description
*
@@ -227,22 +198,6 @@ public abstract class AbstractRepositoryHandler<C extends SimpleRepositoryConfig
return config;
}
/**
* Method description
*
*
* @param repository
*
* @return
*
* @throws RepositoryException
*/
@Override
public DiffViewer getDiffViewer(Repository repository)
throws RepositoryException
{
return null;
}
/**
* Method description
@@ -259,21 +214,6 @@ public abstract class AbstractRepositoryHandler<C extends SimpleRepositoryConfig
"import handler is not supported by this repository handler");
}
/**
* Method description
*
*
* @param repository
*
* @return
* @since 1.5
*/
@Override
public RepositoryBrowser getRepositoryBrowser(Repository repository)
{
return null;
}
/**
* Returns true if the plugin is configured and enabled.
*

View File

@@ -1,162 +0,0 @@
/**
* Copyright (c) 2010, Sebastian Sdorra
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* 3. Neither the name of SCM-Manager; nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* http://bitbucket.org/sdorra/scm-manager
*
*/
package sonia.scm.repository;
//~--- non-JDK imports --------------------------------------------------------
import sonia.scm.SCMContextProvider;
import sonia.scm.Type;
//~--- JDK imports ------------------------------------------------------------
import java.io.IOException;
import java.util.Collection;
/**
*
* @author Sebastian Sdorra
* @deprecated use {@link RepositoryManagerDecorator} instead.
*/
@Deprecated
public abstract class AbstractRepositoryManagerDecorator
implements RepositoryManager
{
/**
* Constructs ...
*
*
* @param orginal
*/
public AbstractRepositoryManagerDecorator(RepositoryManager orginal)
{
this.orginal = orginal;
}
//~--- methods --------------------------------------------------------------
/**
* Method description
*
*
* @param listener
*/
@Override
public void addListener(RepositoryListener listener)
{
orginal.addListener(listener);
}
/**
* Method description
*
*
* @param listeners
*/
@Override
public void addListeners(Collection<RepositoryListener> listeners)
{
orginal.addListeners(listeners);
}
/**
* Method description
*
*
* @throws IOException
*/
@Override
public void close() throws IOException
{
orginal.close();
}
/**
* Method description
*
*
* @param context
*/
@Override
public void init(SCMContextProvider context)
{
orginal.init(context);
}
/**
* Method description
*
*
* @param listener
*/
@Override
public void removeListener(RepositoryListener listener)
{
orginal.addListener(listener);
}
//~--- get methods ----------------------------------------------------------
/**
* Method description
*
*
* @param type
*
* @return
*/
@Override
public RepositoryHandler getHandler(String type)
{
return orginal.getHandler(type);
}
/**
* Method description
*
*
* @return
*/
@Override
public Collection<Type> getTypes()
{
return orginal.getTypes();
}
//~--- fields ---------------------------------------------------------------
/** Field description */
protected RepositoryManager orginal;
}

View File

@@ -1,71 +0,0 @@
/**
* Copyright (c) 2010, Sebastian Sdorra
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* 3. Neither the name of SCM-Manager; nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* http://bitbucket.org/sdorra/scm-manager
*
*/
package sonia.scm.repository;
//~--- non-JDK imports --------------------------------------------------------
import sonia.scm.repository.api.RepositoryService;
//~--- JDK imports ------------------------------------------------------------
import java.io.IOException;
/**
* Interface description
*
*
* @author Sebastian Sdorra
* @since 1.8
*
* @deprecated use {@link RepositoryService#getBlameCommand()} instead.
*/
@Deprecated
public interface BlameViewer
{
/**
* Method description
*
*
* @param revision
* @param path
*
* @return
*
* @throws IOException
* @throws RepositoryException
*/
public BlameResult getBlame(String revision, String path)
throws IOException, RepositoryException;
}

View File

@@ -1,63 +0,0 @@
/**
* Copyright (c) 2010, Sebastian Sdorra
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* 3. Neither the name of SCM-Manager; nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* http://bitbucket.org/sdorra/scm-manager
*
*/
package sonia.scm.repository;
//~--- non-JDK imports --------------------------------------------------------
import sonia.scm.repository.api.RepositoryService;
/**
*
* @author Sebastian Sdorra
* @since 1.8
*
* @deprecated use {@link RepositoryService#getBlameCommand()} instead.
*/
@Deprecated
public interface BlameViewerProvider
{
/**
* Method description
*
*
*
* @param repository
* @return null if BlameViewer is not supported
*
* @throws RepositoryException
*/
public BlameViewer getBlameViewer(Repository repository)
throws RepositoryException;
}

View File

@@ -1,308 +0,0 @@
/**
* Copyright (c) 2010, Sebastian Sdorra
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* 3. Neither the name of SCM-Manager; nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* http://bitbucket.org/sdorra/scm-manager
*
*/
package sonia.scm.repository;
//~--- non-JDK imports --------------------------------------------------------
import com.google.inject.Inject;
import com.google.inject.Singleton;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import sonia.scm.NotSupportedFeatuerException;
import sonia.scm.cache.Cache;
import sonia.scm.cache.CacheManager;
import sonia.scm.repository.api.RepositoryService;
import sonia.scm.util.AssertUtil;
//~--- JDK imports ------------------------------------------------------------
import java.io.IOException;
/**
* Class description
*
* @author Sebastian Sdorra
* @since 1.8
*
* @deprecated use {@link RepositoryService#getBlameCommand()} instead.
*/
@Singleton
@Deprecated
public class BlameViewerUtil extends PartCacheClearHook
{
/** Field description */
public static final String CACHE_NAME = "sonia.cache.repository.blame";
/** the logger for BlameViewerUtil */
private static final Logger logger =
LoggerFactory.getLogger(BlameViewerUtil.class);
//~--- constructors ---------------------------------------------------------
/**
* Constructs ...
*
*
* @param repositoryManager
* @param cacheManager
*/
@Inject
public BlameViewerUtil(RepositoryManager repositoryManager,
CacheManager cacheManager)
{
this.repositoryManager = repositoryManager;
this.cache = cacheManager.getCache(BlameViewerCacheKey.class,
BlameResult.class, CACHE_NAME);
init(repositoryManager, cache);
}
//~--- get methods ----------------------------------------------------------
/**
* Method description
*
*
* @param repositoryId
* @param revision
* @param path
*
* @return
*
*
* @throws IOException
* @throws NotSupportedFeatuerException
* @throws RepositoryException
*/
public BlameResult getBlame(String repositoryId, String revision, String path)
throws RepositoryException, NotSupportedFeatuerException, IOException
{
AssertUtil.assertIsNotEmpty(repositoryId);
Repository repository = repositoryManager.get(repositoryId);
if (repository == null)
{
throw new RepositoryNotFoundException(
"could not find repository with id ".concat(repositoryId));
}
return getBlame(repository, revision, path);
}
/**
* Method description
*
*
* @param repository
* @param revision
* @param path
*
* @return
*
*
* @throws IOException
* @throws NotSupportedFeatuerException
* @throws RepositoryException
*/
public BlameResult getBlame(Repository repository, String revision,
String path)
throws RepositoryException, NotSupportedFeatuerException, IOException
{
AssertUtil.assertIsNotNull(repository);
BlameViewer viewer = repositoryManager.getBlameViewer(repository);
if (viewer == null)
{
throw new NotSupportedFeatuerException(
"BlameViewer is not supported for type ".concat(
repository.getType()));
}
BlameViewerCacheKey key = new BlameViewerCacheKey(repository.getId(),
revision, path);
BlameResult result = cache.get(key);
if (result == null)
{
result = viewer.getBlame(revision, path);
cache.put(key, result);
}
else if (logger.isDebugEnabled())
{
logger.debug("fetch blameviewer results from cache");
}
return result;
}
//~--- inner classes --------------------------------------------------------
/**
* Class description
*
*
* @version Enter version here...
* @author Enter your name here...
*/
private static class BlameViewerCacheKey implements RepositoryCacheKey
{
/**
* Constructs ...
*
*
* @param repositoryId
* @param revision
* @param path
*/
public BlameViewerCacheKey(String repositoryId, String revision,
String path)
{
this.repositoryId = repositoryId;
this.revision = revision;
this.path = path;
}
//~--- methods ------------------------------------------------------------
/**
* Method description
*
*
* @param obj
*
* @return
*/
@Override
public boolean equals(Object obj)
{
if (obj == null)
{
return false;
}
if (getClass() != obj.getClass())
{
return false;
}
final BlameViewerCacheKey other = (BlameViewerCacheKey) obj;
if ((this.repositoryId == null)
? (other.repositoryId != null)
: !this.repositoryId.equals(other.repositoryId))
{
return false;
}
if ((this.revision == null)
? (other.revision != null)
: !this.revision.equals(other.revision))
{
return false;
}
if ((this.path == null)
? (other.path != null)
: !this.path.equals(other.path))
{
return false;
}
return true;
}
/**
* Method description
*
*
* @return
*/
@Override
public int hashCode()
{
int hash = 3;
hash = 53 * hash + ((this.repositoryId != null)
? this.repositoryId.hashCode()
: 0);
hash = 53 * hash + ((this.revision != null)
? this.revision.hashCode()
: 0);
hash = 53 * hash + ((this.path != null)
? this.path.hashCode()
: 0);
return hash;
}
//~--- get methods --------------------------------------------------------
/**
* Method description
*
*
* @return
*/
@Override
public String getRepositoryId()
{
return repositoryId;
}
//~--- fields -------------------------------------------------------------
/** Field description */
private String path;
/** Field description */
private String repositoryId;
/** Field description */
private String revision;
}
//~--- fields ---------------------------------------------------------------
/** Field description */
private Cache<BlameViewerCacheKey, BlameResult> cache;
/** Field description */
private RepositoryManager repositoryManager;
}

View File

@@ -1,106 +0,0 @@
/**
* Copyright (c) 2010, Sebastian Sdorra
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* 3. Neither the name of SCM-Manager; nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* http://bitbucket.org/sdorra/scm-manager
*
*/
package sonia.scm.repository;
//~--- non-JDK imports --------------------------------------------------------
import sonia.scm.repository.api.RepositoryService;
//~--- JDK imports ------------------------------------------------------------
import java.io.IOException;
/**
*
* @author Sebastian Sdorra
*
* @deprecated use {@link RepositoryService#getLogCommand()} instead.
*/
@Deprecated
public interface ChangesetViewer
{
/**
* Method description
*
*
* @param revision
*
* @return
*
* @since 1.12
*
* @throws IOException
* @throws RepositoryException
*/
public Changeset getChangeset(String revision)
throws IOException, RepositoryException;
/**
* Method description
*
*
*
*
* @param start
* @param max
*
* @return
*
* @throws IOException
* @throws RepositoryException
*/
public ChangesetPagingResult getChangesets(int start, int max)
throws IOException, RepositoryException;
/**
* Method description
*
*
*
*
* @param path
* @param revision
* @param start
* @param max
*
* @return
*
* @throws IOException
* @throws RepositoryException
*/
public ChangesetPagingResult getChangesets(String path, String revision,
int start, int max)
throws IOException, RepositoryException;
}

View File

@@ -1,63 +0,0 @@
/**
* Copyright (c) 2010, Sebastian Sdorra
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* 3. Neither the name of SCM-Manager; nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* http://bitbucket.org/sdorra/scm-manager
*
*/
package sonia.scm.repository;
//~--- non-JDK imports --------------------------------------------------------
import sonia.scm.repository.api.RepositoryService;
/**
*
* @author Sebastian Sdorra
* @since 1.8
*
* @deprecated use {@link RepositoryService#getLogCommand()} instead.
*/
@Deprecated
public interface ChangesetViewerProvider
{
/**
* Method description
*
*
*
* @param repository
* @return null if ChangesetViewer is not supported
*
* @throws RepositoryException
*/
public ChangesetViewer getChangesetViewer(Repository repository)
throws RepositoryException;
}

View File

@@ -1,679 +0,0 @@
/**
* Copyright (c) 2010, Sebastian Sdorra
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* 3. Neither the name of SCM-Manager; nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* http://bitbucket.org/sdorra/scm-manager
*
*/
package sonia.scm.repository;
//~--- non-JDK imports --------------------------------------------------------
import com.google.inject.Inject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import sonia.scm.NotSupportedFeatuerException;
import sonia.scm.cache.Cache;
import sonia.scm.cache.CacheManager;
import sonia.scm.repository.api.RepositoryService;
import sonia.scm.util.AssertUtil;
import sonia.scm.util.Util;
//~--- JDK imports ------------------------------------------------------------
import java.io.IOException;
import java.util.Arrays;
import java.util.Set;
/**
*
* @author Sebastian Sdorra
* @since 1.6
*
* @deprecated use {@link RepositoryService#getLogCommand()} instead.
*/
@Deprecated
public class ChangesetViewerUtil extends PartCacheClearHook
{
/** Field description */
public static final String CACHE_NAME = "sonia.cache.repository.changesets";
/** the logger for ChangesetViewerUtil */
private static final Logger logger =
LoggerFactory.getLogger(ChangesetViewerUtil.class);
//~--- constructors ---------------------------------------------------------
/**
* Constructs ...
*
*
* @param repositoryManager
* @param cacheManager
* @param changesetPreProcessorSet
* @param changesetPreProcessorFactorySet
*/
@Inject
public ChangesetViewerUtil(
RepositoryManager repositoryManager, CacheManager cacheManager,
Set<ChangesetPreProcessor> changesetPreProcessorSet,
Set<ChangesetPreProcessorFactory> changesetPreProcessorFactorySet)
{
this.repositoryManager = repositoryManager;
this.changesetPreProcessorSet = changesetPreProcessorSet;
this.changesetPreProcessorFactorySet = changesetPreProcessorFactorySet;
cache = cacheManager.getCache(ChangesetViewerCacheKey.class,
ChangesetPagingResult.class, CACHE_NAME);
init(repositoryManager, cache);
}
//~--- get methods ----------------------------------------------------------
/**
* Method description
*
*
* @param repository
* @param revision
*
* @return
*
* @since 1.12
*
*
* @throws IOException
* @throws NotSupportedFeatuerException
* @throws RepositoryException
*/
public Changeset getChangeset(Repository repository, String revision)
throws RepositoryException, IOException, NotSupportedFeatuerException
{
AssertUtil.assertIsNotNull(repository);
ChangesetViewer viewer = repositoryManager.getChangesetViewer(repository);
if (viewer == null)
{
throw new NotSupportedFeatuerException(
"ChangesetViewer is not supported for type ".concat(
repository.getType()));
}
Changeset changeset = null;
ChangesetViewerCacheKey key =
new ChangesetViewerCacheKey(repository.getId(), null, revision, -1, -1);
ChangesetPagingResult result = cache.get(key);
if (result == null)
{
changeset = viewer.getChangeset(revision);
if (changeset != null)
{
prepareForReturn(repository, changeset);
result = new ChangesetPagingResult(1, Arrays.asList(changeset));
cache.put(key, result);
}
else
{
throw new RepositoryException("could not find changeset");
}
}
else
{
if (logger.isDebugEnabled())
{
logger.debug("fetch changesetviewer result from cache");
}
changeset = result.getChangesets().get(0);
}
return changeset;
}
/**
* Method description
*
*
* @param repositoryId
* @param revision
*
* @return
*
* @since 1.12
*
*
* @throws IOException
* @throws NotSupportedFeatuerException
* @throws RepositoryException
* @throws RepositoryNotFoundException
*/
public Changeset getChangeset(String repositoryId, String revision)
throws RepositoryNotFoundException, IOException, RepositoryException,
NotSupportedFeatuerException
{
AssertUtil.assertIsNotEmpty(repositoryId);
Repository repository = repositoryManager.get(repositoryId);
if (repository == null)
{
throw new RepositoryNotFoundException(
"could not find repository with id ".concat(repositoryId));
}
return getChangeset(repository, revision);
}
/**
* Method description
*
*
* @param repositoryId
* @param start
* @param max
*
* @return
*
*
* @throws IOException
* @throws NotSupportedFeatuerException
* @throws RepositoryException
*/
public ChangesetPagingResult getChangesets(String repositoryId, int start,
int max)
throws IOException, RepositoryException, NotSupportedFeatuerException
{
AssertUtil.assertIsNotEmpty(repositoryId);
Repository repository = repositoryManager.get(repositoryId);
if (repository == null)
{
throw new RepositoryNotFoundException(
"could not find repository with id ".concat(repositoryId));
}
return getChangesets(repository, start, max);
}
/**
* Method description
*
*
* @param repositoryId
* @param path
* @param revision
* @param start
* @param max
*
* @return
*
*
* @throws IOException
* @throws NotSupportedFeatuerException
* @throws RepositoryException
*/
public ChangesetPagingResult getChangesets(String repositoryId, String path,
String revision, int start, int max)
throws IOException, RepositoryException, NotSupportedFeatuerException
{
AssertUtil.assertIsNotEmpty(repositoryId);
Repository repository = repositoryManager.get(repositoryId);
if (repository == null)
{
throw new RepositoryNotFoundException(
"could not find repository with id ".concat(repositoryId));
}
return getChangesets(repository, path, revision, start, max);
}
/**
* Method description
*
*
* @param repository
* @param start
* @param max
*
* @return
*
*
* @throws IOException
* @throws NotSupportedFeatuerException
* @throws RepositoryException
*/
public ChangesetPagingResult getChangesets(Repository repository, int start,
int max)
throws IOException, RepositoryException, NotSupportedFeatuerException
{
AssertUtil.assertIsNotNull(repository);
ChangesetViewer viewer = repositoryManager.getChangesetViewer(repository);
if (viewer == null)
{
throw new NotSupportedFeatuerException(
"ChangesetViewer is not supported for type ".concat(
repository.getType()));
}
ChangesetViewerCacheKey key =
new ChangesetViewerCacheKey(repository.getId(), start, max);
ChangesetPagingResult result = cache.get(key);
if (result == null)
{
result = viewer.getChangesets(start, max);
if (result != null)
{
if (Util.isNotEmpty(result.getChangesets()))
{
prepareForReturn(repository, result);
}
cache.put(key, result);
}
else
{
throw new RepositoryException("could not fetch changesets");
}
}
else if (logger.isDebugEnabled())
{
logger.debug("fetch changesetviewer results from cache");
}
return result;
}
/**
* Method description
*
*
* @param repository
* @param path
* @param revision
* @param start
* @param max
*
* @return
*
*
* @throws IOException
* @throws NotSupportedFeatuerException
* @throws RepositoryException
*/
public ChangesetPagingResult getChangesets(Repository repository,
String path, String revision, int start, int max)
throws IOException, RepositoryException, NotSupportedFeatuerException
{
AssertUtil.assertIsNotNull(repository);
ChangesetViewer viewer = repositoryManager.getChangesetViewer(repository);
if (viewer == null)
{
throw new NotSupportedFeatuerException(
"ChangesetViewer is not supported for type ".concat(
repository.getType()));
}
ChangesetViewerCacheKey key =
new ChangesetViewerCacheKey(repository.getId(), path, revision, start,
max);
ChangesetPagingResult result = cache.get(key);
if (result == null)
{
result = viewer.getChangesets(path, revision, start, max);
if (result != null)
{
if (Util.isNotEmpty(result.getChangesets()))
{
prepareForReturn(repository, result);
}
cache.put(key, result);
}
else
{
throw new RepositoryException("could not fetch changesets");
}
}
else if (logger.isDebugEnabled())
{
logger.debug("fetch changesetviewer results from cache");
}
return result;
}
//~--- methods --------------------------------------------------------------
/**
* Method description
*
*
*
* @param repository
* @param changesets
*/
private void callPreProcessorFactories(Repository repository,
ChangesetPagingResult changesets)
{
if (Util.isNotEmpty(changesetPreProcessorFactorySet))
{
for (ChangesetPreProcessorFactory factory :
changesetPreProcessorFactorySet)
{
ChangesetPreProcessor cpp = factory.createPreProcessor(repository);
if (cpp != null)
{
for (Changeset c : changesets.getChangesets())
{
cpp.process(c);
}
}
}
}
}
/**
* Method description
*
*
* @param repository
* @param c
*/
private void callPreProcessorFactories(Repository repository, Changeset c)
{
if (Util.isNotEmpty(changesetPreProcessorFactorySet))
{
for (ChangesetPreProcessorFactory factory :
changesetPreProcessorFactorySet)
{
ChangesetPreProcessor cpp = factory.createPreProcessor(repository);
if (cpp != null)
{
cpp.process(c);
}
}
}
}
/**
* Method description
*
*
* @param changesets
*/
private void callPreProcessors(ChangesetPagingResult changesets)
{
if (Util.isNotEmpty(changesetPreProcessorSet))
{
for (Changeset c : changesets.getChangesets())
{
callPreProcessors(c);
}
}
}
/**
* Method description
*
*
* @param c
*/
private void callPreProcessors(Changeset c)
{
for (ChangesetPreProcessor cpp : changesetPreProcessorSet)
{
cpp.process(c);
}
}
/**
* Method description
*
*
* @param repository
* @param result
*/
private void prepareForReturn(Repository repository,
ChangesetPagingResult result)
{
EscapeUtil.escape(result);
callPreProcessors(result);
callPreProcessorFactories(repository, result);
}
/**
* Method description
*
*
* @param repository
* @param changeset
*/
private void prepareForReturn(Repository repository, Changeset changeset)
{
EscapeUtil.escape(changeset);
callPreProcessors(changeset);
callPreProcessorFactories(repository, changeset);
}
//~--- inner classes --------------------------------------------------------
/**
* Class description
*
*
* @version Enter version here..., 11/07/24
* @author Enter your name here...
*/
private class ChangesetViewerCacheKey implements RepositoryCacheKey
{
/**
* Constructs ...
*
*
* @param repository
* @param start
* @param max
*/
public ChangesetViewerCacheKey(String repository, int start, int max)
{
this(repository, null, null, start, max);
}
/**
* Constructs ...
*
*
* @param repository
* @param path
* @param revision
* @param start
* @param max
*/
public ChangesetViewerCacheKey(String repository, String path,
String revision, int start, int max)
{
this.repository = repository;
this.path = path;
this.revision = revision;
this.start = start;
this.max = max;
}
//~--- methods ------------------------------------------------------------
/**
* Method description
*
*
* @param obj
*
* @return
*/
@Override
public boolean equals(Object obj)
{
if (obj == null)
{
return false;
}
if (getClass() != obj.getClass())
{
return false;
}
final ChangesetViewerCacheKey other = (ChangesetViewerCacheKey) obj;
if ((this.revision == null)
? (other.revision != null)
: !this.revision.equals(other.revision))
{
return false;
}
if (this.max != other.max)
{
return false;
}
if ((this.path == null)
? (other.path != null)
: !this.path.equals(other.path))
{
return false;
}
if ((this.repository == null)
? (other.repository != null)
: !this.repository.equals(other.repository))
{
return false;
}
if (this.start != other.start)
{
return false;
}
return true;
}
/**
* Method description
*
*
* @return
*/
@Override
public int hashCode()
{
int hash = 5;
hash = 47 * hash + ((this.revision != null)
? this.revision.hashCode()
: 0);
hash = 47 * hash + this.max;
hash = 47 * hash + ((this.path != null)
? this.path.hashCode()
: 0);
hash = 47 * hash + ((this.repository != null)
? this.repository.hashCode()
: 0);
hash = 47 * hash + this.start;
return hash;
}
//~--- get methods --------------------------------------------------------
/**
* Method description
*
*
* @return
*/
@Override
public String getRepositoryId()
{
return repository;
}
//~--- fields -------------------------------------------------------------
/** Field description */
private int max;
/** Field description */
private String path;
/** Field description */
private String repository;
/** Field description */
private String revision;
/** Field description */
private int start;
}
//~--- fields ---------------------------------------------------------------
/** Field description */
private Cache<ChangesetViewerCacheKey, ChangesetPagingResult> cache;
/** Field description */
private Set<ChangesetPreProcessorFactory> changesetPreProcessorFactorySet;
/** Field description */
private Set<ChangesetPreProcessor> changesetPreProcessorSet;
/** Field description */
private RepositoryManager repositoryManager;
}

View File

@@ -1,66 +0,0 @@
/**
* Copyright (c) 2010, Sebastian Sdorra
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* 3. Neither the name of SCM-Manager; nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* http://bitbucket.org/sdorra/scm-manager
*
*/
package sonia.scm.repository;
//~--- JDK imports ------------------------------------------------------------
import java.io.IOException;
import java.io.OutputStream;
import sonia.scm.repository.api.RepositoryService;
/**
*
* @author Sebastian Sdorra
* @since 1.8
*
* @deprecated use {@link RepositoryService#getDiffCommand()} instead.
*/
@Deprecated
public interface DiffViewer
{
/**
* Method description
*
*
* @param revision
* @param path
* @param output
*
* @throws IOException
* @throws RepositoryException
*/
public void getDiff(String revision, String path, OutputStream output)
throws IOException, RepositoryException;
}

View File

@@ -1,63 +0,0 @@
/**
* Copyright (c) 2010, Sebastian Sdorra
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* 3. Neither the name of SCM-Manager; nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* http://bitbucket.org/sdorra/scm-manager
*
*/
package sonia.scm.repository;
//~--- non-JDK imports --------------------------------------------------------
import sonia.scm.repository.api.RepositoryService;
/**
*
* @author Sebastian Sdorra
* @since 1.8
*
* @deprecated use {@link RepositoryService#getDiffCommand()} instead.
*/
@Deprecated
public interface DiffViewerProvider
{
/**
* Method description
*
*
*
* @param repository
* @return null if DiffViewer is not supported
*
* @throws RepositoryException
*/
public DiffViewer getDiffViewer(Repository repository)
throws RepositoryException;
}

View File

@@ -48,7 +48,6 @@ import sonia.scm.security.RepositoryPermission;
import sonia.scm.security.Role;
import sonia.scm.security.ScmSecurityException;
import sonia.scm.util.AssertUtil;
import sonia.scm.web.security.WebSecurityContext;
/**
*
@@ -73,93 +72,6 @@ public final class PermissionUtil
//~--- methods --------------------------------------------------------------
/**
* Method description
*
*
* @param repository
* @param securityContext
* @param pt
* @deprecated
*/
@Deprecated
public static void assertPermission(Repository repository,
WebSecurityContext securityContext, PermissionType pt)
{
assertPermission(repository, pt);
}
/**
* Method description
*
*
* @param repository
* @param securityContextProvider
* @param pt
*/
@Deprecated
public static void assertPermission(Repository repository,
Provider<WebSecurityContext> securityContextProvider, PermissionType pt)
{
assertPermission(repository, securityContextProvider.get(), pt);
}
/**
* Method description
*
*
* @param repository
* @param pt
*
* @since 1.21
*/
@Deprecated
public static void assertPermission(Repository repository, PermissionType pt)
{
if (!hasPermission(null, repository, pt))
{
throw new ScmSecurityException("action denied");
}
}
//~--- get methods ----------------------------------------------------------
/**
* Method description
*
*
* @param repository
* @param securityContextProvider
* @param pt
*
* @return
* @deprecated
*/
@Deprecated
public static boolean hasPermission(Repository repository,
Provider<WebSecurityContext> securityContextProvider, PermissionType pt)
{
return hasPermission(null, repository, pt);
}
/**
* Method description
*
*
* @param repository
* @param securityContext
* @param pt
*
* @return
* @deprecated use {@link #hasPermission(ScmConfiguration, Repository, PermissionType)} instead
*/
@Deprecated
public static boolean hasPermission(Repository repository,
WebSecurityContext securityContext, PermissionType pt)
{
return hasPermission(null, repository, pt);
}
/**
* Method description
*
@@ -207,25 +119,6 @@ public final class PermissionUtil
return result;
}
/**
* Returns true if the repository is writable.
*
*
* @param configuration SCM-Manager main configuration
* @param repository repository to check
* @param securityContext current user security context
*
* @return true if the repository is writable
* @since 1.14
* @deprecated use {@link #isWritable(ScmConfiguration, Repository)} instead
*/
@Deprecated
public static boolean isWritable(ScmConfiguration configuration,
Repository repository, WebSecurityContext securityContext)
{
return isWritable(configuration, repository);
}
/**
* Returns true if the repository is writable.
*

View File

@@ -160,7 +160,6 @@ public class Repository extends BasicPropertiesAware implements ModelObject
repository.setLastModified(lastModified);
repository.setDescription(description);
repository.setPermissions(permissions);
repository.setUrl(url);
repository.setPublicReadable(publicReadable);
repository.setArchived(archived);
}
@@ -213,7 +212,6 @@ public class Repository extends BasicPropertiesAware implements ModelObject
&& Objects.equal(archived, other.archived)
&& Objects.equal(permissions, other.permissions)
&& Objects.equal(type, other.type)
&& Objects.equal(url, other.url)
&& Objects.equal(creationDate, other.creationDate)
&& Objects.equal(lastModified, other.lastModified)
&& Objects.equal(properties, other.properties);
@@ -230,7 +228,7 @@ public class Repository extends BasicPropertiesAware implements ModelObject
public int hashCode()
{
return Objects.hashCode(id, name, contact, description, publicReadable,
archived, permissions, type, url, creationDate, lastModified, properties);
archived, permissions, type, creationDate, lastModified, properties);
}
/**
@@ -252,7 +250,6 @@ public class Repository extends BasicPropertiesAware implements ModelObject
.add("archived", archived)
.add("permissions", permissions)
.add("type", type)
.add("url", url)
.add("lastModified", lastModified)
.add("creationDate", creationDate)
.add("properties", properties)
@@ -359,19 +356,6 @@ public class Repository extends BasicPropertiesAware implements ModelObject
return type;
}
/**
* Returns the base url of the {@link Repository}.
*
*
* @return base url
* @deprecated use {@link #createUrl(String)}
*/
@Deprecated
public String getUrl()
{
return url;
}
/**
* Returns true if the repository is archived.
*
@@ -529,19 +513,6 @@ public class Repository extends BasicPropertiesAware implements ModelObject
this.type = type;
}
/**
* Sets the base url of the {@link Repository}
*
*
* @param url base url
* @deprecated
*/
@Deprecated
public void setUrl(String url)
{
this.url = url;
}
//~--- fields ---------------------------------------------------------------
/** Field description */
@@ -574,9 +545,4 @@ public class Repository extends BasicPropertiesAware implements ModelObject
/** Field description */
private String type;
/**
* @deprecated use {@link #createUrl(java.lang.String)} instead
*/
private String url;
}

View File

@@ -1,85 +0,0 @@
/**
* Copyright (c) 2010, Sebastian Sdorra
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* 3. Neither the name of SCM-Manager; nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* http://bitbucket.org/sdorra/scm-manager
*
*/
package sonia.scm.repository;
//~--- non-JDK imports --------------------------------------------------------
import sonia.scm.repository.api.RepositoryService;
//~--- JDK imports ------------------------------------------------------------
import java.io.IOException;
import java.io.OutputStream;
/**
*
* @author Sebastian Sdorra
* @since 1.5
*
* @deprecated use {@link RepositoryService#getBrowseCommand()} instead.
*/
@Deprecated
public interface RepositoryBrowser
{
/**
* Method description
*
*
* @param revision
* @param path
* @param output
*
*
* @throws IOException
* @throws RepositoryException
*/
public void getContent(String revision, String path, OutputStream output)
throws IOException, RepositoryException;
/**
* Method description
*
*
* @param revision
* @param path
*
* @return
*
* @throws IOException
* @throws RepositoryException
*/
public BrowserResult getResult(String revision, String path)
throws IOException, RepositoryException;
}

View File

@@ -1,63 +0,0 @@
/**
* Copyright (c) 2010, Sebastian Sdorra
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* 3. Neither the name of SCM-Manager; nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* http://bitbucket.org/sdorra/scm-manager
*
*/
package sonia.scm.repository;
//~--- non-JDK imports --------------------------------------------------------
import sonia.scm.repository.api.RepositoryService;
/**
*
* @author Sebastian Sdorra
* @since 1.5
*
* @deprecated use {@link RepositoryService#getBrowseCommand()} instead.
*/
@Deprecated
public interface RepositoryBrowserProvider
{
/**
* Method description
*
*
* @param repository
*
* @return null if RepositoryBrowser is not supported
*
* @throws RepositoryException
*/
public RepositoryBrowser getRepositoryBrowser(Repository repository)
throws RepositoryException;
}

View File

@@ -1,419 +0,0 @@
/**
* Copyright (c) 2010, Sebastian Sdorra
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* 3. Neither the name of SCM-Manager; nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* http://bitbucket.org/sdorra/scm-manager
*
*/
package sonia.scm.repository;
//~--- non-JDK imports --------------------------------------------------------
import com.google.inject.Inject;
import com.google.inject.Singleton;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import sonia.scm.NotSupportedFeatuerException;
import sonia.scm.cache.Cache;
import sonia.scm.cache.CacheManager;
import sonia.scm.repository.api.RepositoryService;
import sonia.scm.util.AssertUtil;
import sonia.scm.util.Util;
//~--- JDK imports ------------------------------------------------------------
import java.io.IOException;
import java.util.Collections;
import java.util.List;
import java.util.Set;
/**
*
* @author Sebastian Sdorra
* @since 1.6
*
* @deprecated use {@link RepositoryService#getBrowseCommand()} instead.
*/
@Singleton
@Deprecated
public class RepositoryBrowserUtil extends PartCacheClearHook
{
/** Field description */
public static final String CACHE_NAME = "sonia.cache.repository.browser";
/** the logger for RepositoryBrowserUtil */
private static final Logger logger =
LoggerFactory.getLogger(RepositoryBrowserUtil.class);
//~--- constructors ---------------------------------------------------------
/**
* Constructs ...
*
*
* @param repositoryManager
* @param cacheManager
* @param preProcessorSet
* @param preProcessorFactorySet
*/
@Inject
public RepositoryBrowserUtil(
RepositoryManager repositoryManager, CacheManager cacheManager,
Set<FileObjectPreProcessor> preProcessorSet,
Set<FileObjectPreProcessorFactory> preProcessorFactorySet)
{
this.repositoryManager = repositoryManager;
this.cache = cacheManager.getCache(RepositoryBrowserCacheKey.class,
BrowserResult.class, CACHE_NAME);
this.preProcessorSet = preProcessorSet;
this.preProcessorFactorySet = preProcessorFactorySet;
init(repositoryManager, cache);
}
//~--- get methods ----------------------------------------------------------
/**
* Method description
*
*
* @param repositoryId
* @param revision
* @param path
*
* @return
*
* @throws IOException
* @throws NotSupportedFeatuerException
* @throws RepositoryException
*/
public BrowserResult getResult(String repositoryId, String revision,
String path)
throws RepositoryException, NotSupportedFeatuerException, IOException
{
AssertUtil.assertIsNotEmpty(repositoryId);
Repository repository = repositoryManager.get(repositoryId);
if (repository == null)
{
throw new RepositoryNotFoundException(
"could not find repository with id ".concat(repositoryId));
}
return getResult(repository, revision, path);
}
/**
* Method description
*
*
* @param repository
* @param revision
* @param path
*
* @return
*
* @throws IOException
* @throws NotSupportedFeatuerException
* @throws RepositoryException
*/
public BrowserResult getResult(Repository repository, String revision,
String path)
throws RepositoryException, NotSupportedFeatuerException, IOException
{
AssertUtil.assertIsNotNull(repository);
RepositoryBrowser browser =
repositoryManager.getRepositoryBrowser(repository);
if (browser == null)
{
throw new NotSupportedFeatuerException(
"RepositoryBrowser is not supported for type ".concat(
repository.getType()));
}
RepositoryBrowserCacheKey key =
new RepositoryBrowserCacheKey(repository.getId(), revision, path);
BrowserResult result = cache.get(key);
if (result == null)
{
result = browser.getResult(revision, path);
if (result != null)
{
sort(result);
EscapeUtil.escape(result);
callPreProcessors(result);
callPreProcessorFactories(repository, result);
}
else
{
result = new BrowserResult();
}
cache.put(key, result);
}
else if (logger.isDebugEnabled())
{
logger.debug("fetch repositorybrowser results from cache");
}
return result;
}
//~--- methods --------------------------------------------------------------
/**
* Method description
*
*
* @param fopp
* @param result
*/
private void callPreProcessor(FileObjectPreProcessor fopp,
BrowserResult result)
{
if (fopp != null)
{
List<FileObject> foList = result.getFiles();
if (Util.isNotEmpty(foList))
{
for (FileObject fo : foList)
{
fopp.process(fo);
}
}
}
}
/**
* Method description
*
*
*
* @param repository
* @param result
*/
private void callPreProcessorFactories(Repository repository,
BrowserResult result)
{
if (Util.isNotEmpty(preProcessorFactorySet))
{
for (FileObjectPreProcessorFactory factory : preProcessorFactorySet)
{
FileObjectPreProcessor fopp = factory.createPreProcessor(repository);
callPreProcessor(fopp, result);
}
}
}
/**
* Method description
*
*
*
* @param result
*/
private void callPreProcessors(BrowserResult result)
{
if (Util.isNotEmpty(preProcessorSet))
{
for (FileObjectPreProcessor fopp : preProcessorSet)
{
callPreProcessor(fopp, result);
}
}
}
/**
* Method description
*
*
* @param result
*/
private void sort(BrowserResult result)
{
List<FileObject> files = result.getFiles();
if (files != null)
{
Collections.sort(files, FileObjectNameComparator.instance);
}
}
//~--- inner classes --------------------------------------------------------
/**
* Class description
*
*
* @version Enter version here..., 11/08/03
* @author Enter your name here...
*/
private static class RepositoryBrowserCacheKey implements RepositoryCacheKey
{
/**
* Constructs ...
*
*
* @param repositoryId
* @param revision
* @param path
*/
public RepositoryBrowserCacheKey(String repositoryId, String revision,
String path)
{
this.repositoryId = repositoryId;
this.revision = revision;
this.path = path;
}
//~--- methods ------------------------------------------------------------
/**
* Method description
*
*
* @param obj
*
* @return
*/
@Override
public boolean equals(Object obj)
{
if (obj == null)
{
return false;
}
if (getClass() != obj.getClass())
{
return false;
}
final RepositoryBrowserCacheKey other = (RepositoryBrowserCacheKey) obj;
if ((this.repositoryId == null)
? (other.repositoryId != null)
: !this.repositoryId.equals(other.repositoryId))
{
return false;
}
if ((this.revision == null)
? (other.revision != null)
: !this.revision.equals(other.revision))
{
return false;
}
if ((this.path == null)
? (other.path != null)
: !this.path.equals(other.path))
{
return false;
}
return true;
}
/**
* Method description
*
*
* @return
*/
@Override
public int hashCode()
{
int hash = 3;
hash = 53 * hash + ((this.repositoryId != null)
? this.repositoryId.hashCode()
: 0);
hash = 53 * hash + ((this.revision != null)
? this.revision.hashCode()
: 0);
hash = 53 * hash + ((this.path != null)
? this.path.hashCode()
: 0);
return hash;
}
//~--- get methods --------------------------------------------------------
/**
* Method description
*
*
* @return
*/
@Override
public String getRepositoryId()
{
return repositoryId;
}
//~--- fields -------------------------------------------------------------
/** Field description */
private String path;
/** Field description */
private String repositoryId;
/** Field description */
private String revision;
}
//~--- fields ---------------------------------------------------------------
/** Field description */
private Cache<RepositoryBrowserCacheKey, BrowserResult> cache;
/** Field description */
private Set<FileObjectPreProcessorFactory> preProcessorFactorySet;
/** Field description */
private Set<FileObjectPreProcessor> preProcessorSet;
/** Field description */
private RepositoryManager repositoryManager;
}

View File

@@ -50,9 +50,7 @@ import sonia.scm.plugin.ExtensionPoint;
@ExtensionPoint
public interface RepositoryHandler
extends Handler<Repository, RepositoryException>,
ListenerSupport<ConfigChangedListener>,
RepositoryBrowserProvider, ChangesetViewerProvider,
DiffViewerProvider, BlameViewerProvider
ListenerSupport<ConfigChangedListener>
{
/**

View File

@@ -57,9 +57,8 @@ import javax.servlet.http.HttpServletRequest;
*/
public interface RepositoryManager
extends TypeManager<Repository, RepositoryException>,
ListenerSupport<RepositoryListener>, RepositoryBrowserProvider,
RepositoryHookSupport, ChangesetViewerProvider,
BlameViewerProvider, DiffViewerProvider
ListenerSupport<RepositoryListener>,
RepositoryHookSupport
{
/**

View File

@@ -37,7 +37,6 @@ package sonia.scm.repository;
import sonia.scm.ManagerDecorator;
import sonia.scm.Type;
import sonia.scm.group.GroupManager;
//~--- JDK imports ------------------------------------------------------------
@@ -223,39 +222,6 @@ public class RepositoryManagerDecorator
return decorated.get(type, name);
}
/**
* {@inheritDoc}
*
*
* @param repository
*
* @return
*
* @throws RepositoryException
*/
@Override
public BlameViewer getBlameViewer(Repository repository)
throws RepositoryException
{
return decorated.getBlameViewer(repository);
}
/**
* {@inheritDoc}
*
*
* @param repository
*
* @return
*
* @throws RepositoryException
*/
@Override
public ChangesetViewer getChangesetViewer(Repository repository)
throws RepositoryException
{
return decorated.getChangesetViewer(repository);
}
/**
* {@inheritDoc}
@@ -282,22 +248,6 @@ public class RepositoryManagerDecorator
return decorated;
}
/**
* {@inheritDoc}
*
*
* @param repository
*
* @return
*
* @throws RepositoryException
*/
@Override
public DiffViewer getDiffViewer(Repository repository)
throws RepositoryException
{
return decorated.getDiffViewer(repository);
}
/**
* {@inheritDoc}
@@ -356,22 +306,6 @@ public class RepositoryManagerDecorator
return decorated.getHandler(type);
}
/**
* {@inheritDoc}
*
*
* @param repository
*
* @return
*
* @throws RepositoryException
*/
@Override
public RepositoryBrowser getRepositoryBrowser(Repository repository)
throws RepositoryException
{
return decorated.getRepositoryBrowser(repository);
}
/**
* {@inheritDoc}
@@ -388,5 +322,5 @@ public class RepositoryManagerDecorator
//~--- fields ---------------------------------------------------------------
/** Field description */
private RepositoryManager decorated;
private final RepositoryManager decorated;
}

View File

@@ -76,57 +76,6 @@ public final class RepositoryUtil
//~--- methods --------------------------------------------------------------
/**
* Method description
*
*
* @param configuration
* @param repositoryManager
* @param repository
*
* @since 1.16
*/
public static void appendUrl(ScmConfiguration configuration,
RepositoryManager repositoryManager, Repository repository)
{
RepositoryHandler handler =
repositoryManager.getHandler(repository.getType());
if (handler != null)
{
String url = handler.createResourcePath(repository);
url = HttpUtil.getCompleteUrl(configuration, url);
repository.setUrl(url);
}
}
/**
* Method description
*
*
*
* @param request
* @param repositoryManager
* @param repository
*
* @since 1.16
*/
public static void appendUrl(HttpServletRequest request,
RepositoryManager repositoryManager, Repository repository)
{
RepositoryHandler handler =
repositoryManager.getHandler(repository.getType());
if (handler != null)
{
String url = handler.createResourcePath(repository);
url = HttpUtil.getCompleteUrl(request, url);
repository.setUrl(url);
}
}
/**
* Method description
*

View File

@@ -123,26 +123,6 @@ public final class RepositoryServiceFactory
//~--- constructors ---------------------------------------------------------
/**
* Constructs a new {@link RepositoryServiceFactory}. This constructor
* should not be called manually, it should only be used by the injection
* container.
*
* @param cacheManager cache manager
* @param repositoryManager manager for repositories
* @param resolvers a set of {@link RepositoryServiceResolver}
* @param preProcessorUtil helper object for pre processor handling
*
* @deprecated
*/
@Deprecated
public RepositoryServiceFactory(CacheManager cacheManager,
RepositoryManager repositoryManager,
Set<RepositoryServiceResolver> resolvers, PreProcessorUtil preProcessorUtil)
{
this(null, cacheManager, repositoryManager, resolvers, preProcessorUtil);
}
/**
* Constructs a new {@link RepositoryServiceFactory}. This constructor
* should not be called manually, it should only be used by the injection

View File

@@ -1,149 +0,0 @@
/**
* Copyright (c) 2010, Sebastian Sdorra
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* 3. Neither the name of SCM-Manager; nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* http://bitbucket.org/sdorra/scm-manager
*
*/
package sonia.scm.security;
//~--- non-JDK imports --------------------------------------------------------
import org.apache.shiro.crypto.hash.SimpleHash;
/**
*
* @author Sebastian Sdorra
* @since 1.13
* @deprecated use {@link SimpleHash} instead.
*/
@Deprecated
public interface HashBuilder
{
/**
* Method description
*
*
* @return
*/
public HashBuilder appendSalt();
/**
* Method description
*
*
* @return
*/
public HashBuilder createSalt();
/**
* Method description
*
*
* @param length
*
* @return
*/
public HashBuilder createSalt(int length);
/**
* Method description
*
*
* @return
*/
public HashBuilder enableLabel();
/**
* Method description
*
*
* @return
*/
public byte[] toByteArray();
/**
* Method description
*
*
* @return
*/
public String toHexString();
//~--- get methods ----------------------------------------------------------
/**
* Method description
*
*
* @return
*/
public String getHexSalt();
/**
* Method description
*
*
* @return
*/
public byte[] getSalt();
//~--- set methods ----------------------------------------------------------
/**
* Method description
*
*
* @param iterations
*
* @return
*/
public HashBuilder setIterations(int iterations);
/**
* Method description
*
*
* @param salt
*
* @return
*/
public HashBuilder setSalt(byte[] salt);
/**
* Method description
*
*
* @param value
*
* @return
*/
public HashBuilder setValue(String value);
}

View File

@@ -1,130 +0,0 @@
/**
* Copyright (c) 2010, Sebastian Sdorra
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* 3. Neither the name of SCM-Manager; nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* http://bitbucket.org/sdorra/scm-manager
*
*/
package sonia.scm.security;
//~--- non-JDK imports --------------------------------------------------------
import org.apache.shiro.crypto.hash.Md5Hash;
/**
*
* @author Sebastian Sdorra
* @since 1.13
* @deprecated use {@link Md5Hash} instead.
*/
@Deprecated
public class MD5HashBuilder extends MessageDigestHashBuilder
{
/** Field description */
public static final String DIGEST = "MD5";
//~--- constructors ---------------------------------------------------------
/**
* Constructs ...
*
*/
public MD5HashBuilder()
{
super(DIGEST, null, null, 0, false, false);
}
/**
* Constructs ...
*
*
* @param value
*/
public MD5HashBuilder(String value)
{
super(DIGEST, value, null, 0, false, false);
}
/**
* Constructs ...
*
*
* @param value
* @param salt
*/
public MD5HashBuilder(String value, byte[] salt)
{
super(DIGEST, value, salt, 0, false, false);
}
/**
* Constructs ...
*
*
* @param value
* @param salt
* @param iterations
*/
public MD5HashBuilder(String value, byte[] salt, int iterations)
{
super(DIGEST, value, salt, iterations, false, false);
}
/**
* Constructs ...
*
*
* @param value
* @param salt
* @param iterations
* @param appendSalt
*/
public MD5HashBuilder(String value, byte[] salt, int iterations,
boolean appendSalt)
{
super(DIGEST, value, salt, iterations, appendSalt, false);
}
/**
* Constructs ...
*
*
* @param value
* @param salt
* @param iterations
* @param appendSalt
* @param enableLabel
*/
public MD5HashBuilder(String value, byte[] salt, int iterations,
boolean appendSalt, boolean enableLabel)
{
super(DIGEST, value, salt, iterations, appendSalt, enableLabel);
}
}

View File

@@ -1,501 +0,0 @@
/**
* Copyright (c) 2010, Sebastian Sdorra
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* 3. Neither the name of SCM-Manager; nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* http://bitbucket.org/sdorra/scm-manager
*
*/
package sonia.scm.security;
//~--- non-JDK imports --------------------------------------------------------
import org.apache.shiro.crypto.hash.SimpleHash;
import sonia.scm.util.Util;
//~--- JDK imports ------------------------------------------------------------
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
*
* @author Sebastian Sdorra
* @since 1.13
* @deprecated use {@link SimpleHash} instead.
*/
@Deprecated
public class MessageDigestHashBuilder implements HashBuilder
{
/** Field description */
public static final int DEFAULT_SALT_LENGTH = 8;
/** Field description */
public static final String ENCODING = "UTF-8";
/** Field description */
public static final String RANDOM_INSTANCE = "SHA1PRNG";
/** Field description */
private static Pattern PATTERN = Pattern.compile("\\{([^\\}]+)\\}(.*)");
//~--- constructors ---------------------------------------------------------
/**
* Constructs ...
*
*
* @param digest
* @param value
* @param salt
* @param iterations
* @param appendSalt
* @param enableLabel
*/
public MessageDigestHashBuilder(String digest, String value, byte[] salt,
int iterations, boolean appendSalt, boolean enableLabel)
{
this.digest = digest;
this.value = value;
this.salt = salt;
this.iterations = iterations;
this.appendSalt = appendSalt;
this.enableLable = enableLabel;
}
//~--- methods --------------------------------------------------------------
/**
* Method description
*
*
* @param hash
*
* @return
*/
public static Extractor createExtractor(String hash)
{
return new Extractor(hash);
}
/**
* Method description
*
*
* @return
*/
@Override
public HashBuilder appendSalt()
{
this.appendSalt = true;
return this;
}
/**
* Method description
*
*
* @return
*/
@Override
public HashBuilder createSalt()
{
return createSalt(DEFAULT_SALT_LENGTH);
}
/**
* Method description
*
*
* @param length
*
* @return
*/
@Override
public HashBuilder createSalt(int length)
{
try
{
SecureRandom random = SecureRandom.getInstance(RANDOM_INSTANCE);
this.salt = new byte[length];
random.nextBytes(salt);
}
catch (NoSuchAlgorithmException ex)
{
throw new SecurityException("could not find secure random instance");
}
return this;
}
/**
* Method description
*
*
* @return
*/
@Override
public HashBuilder enableLabel()
{
this.enableLable = true;
return this;
}
/**
* Method description
*
*
* @return
*/
@Override
public byte[] toByteArray()
{
byte[] input = null;
try
{
MessageDigest md = MessageDigest.getInstance(digest);
md.reset();
if (salt != null)
{
md.update(salt);
}
input = md.digest(value.getBytes(ENCODING));
if (iterations > 0)
{
for (int i = 0; i < iterations; i++)
{
md.reset();
input = md.digest(input);
}
}
if ((salt != null) && appendSalt)
{
byte[] content = new byte[input.length + salt.length];
System.arraycopy(input, 0, content, 0, input.length);
System.arraycopy(salt, 0, content, input.length, salt.length);
input = content;
}
}
catch (UnsupportedEncodingException ex)
{
throw new SecurityException("unknown encoding", ex);
}
catch (NoSuchAlgorithmException ex)
{
throw new SecurityException("unknown digest", ex);
}
return input;
}
/**
* Method description
*
*
* @return
*/
@Override
public String toHexString()
{
String hexString = null;
if (enableLable)
{
StringBuilder buffer = new StringBuilder();
buffer.append("{").append(digest).append("}");
buffer.append(Util.toString(toByteArray()));
hexString = buffer.toString();
}
else
{
hexString = Util.toString(toByteArray());
}
return hexString;
}
//~--- get methods ----------------------------------------------------------
/**
* Method description
*
*
* @return
*/
@Override
public String getHexSalt()
{
String hexSalt = null;
if (salt != null)
{
hexSalt = Util.toString(salt);
}
return hexSalt;
}
/**
* Method description
*
*
* @return
*/
@Override
public byte[] getSalt()
{
return salt;
}
//~--- set methods ----------------------------------------------------------
/**
* Method description
*
*
* @param iterations
*
* @return
*/
@Override
public HashBuilder setIterations(int iterations)
{
this.iterations = iterations;
return this;
}
/**
* Method description
*
*
* @param salt
*
* @return
*/
@Override
public HashBuilder setSalt(byte[] salt)
{
this.salt = salt;
return this;
}
/**
* Method description
*
*
* @param value
*
* @return
*/
@Override
public HashBuilder setValue(String value)
{
this.value = value;
return this;
}
//~--- inner classes --------------------------------------------------------
/**
* Class description
*
*
* @version Enter version here..., 12/02/17
* @author Enter your name here...
*/
public static class Extractor
{
/**
* Constructs ...
*
*
* @param hash
*/
public Extractor(String hash)
{
this.hash = hash;
}
//~--- get methods --------------------------------------------------------
/**
* Method description
*
*
* @return
*/
public MessageDigestHashBuilder getHashBuilder()
{
return getHashBuilder(-1);
}
/**
* Method description
*
*
* @param saltLength
*
* @return
*/
public MessageDigestHashBuilder getHashBuilder(int saltLength)
{
MessageDigestHashBuilder hashBuilder = null;
Matcher m = PATTERN.matcher(hash);
if (m.matches())
{
String digest = m.group(1);
if (digest != null)
{
byte[] salt = null;
if (saltLength > 0)
{
String hashWithoutPrefix = m.group(2);
salt = getSalt(hashWithoutPrefix, saltLength);
}
hashBuilder = new MessageDigestHashBuilder(digest, null, salt, 0,
salt != null, true);
}
}
return hashBuilder;
}
/**
* Method description
*
*
* @return
*/
public String getLabel()
{
String label = null;
Matcher m = PATTERN.matcher(hash);
if (m.matches())
{
label = m.group(1);
}
return label;
}
/**
* Method description
*
*
* @param length
*
* @return
*/
public byte[] getSalt(int length)
{
Matcher m = PATTERN.matcher(hash);
String hashWithoutPrefix = hash;
if (m.matches())
{
hashWithoutPrefix = m.group(2);
}
return getSalt(hashWithoutPrefix, length);
}
/**
* Method description
*
*
* @param hashWithoutPrefix
* @param length
*
* @return
*/
private byte[] getSalt(String hashWithoutPrefix, int length)
{
byte[] content = Util.fromHexString(hashWithoutPrefix);
byte[] salt = new byte[length];
System.arraycopy(content, content.length - length, salt, 0, length);
return salt;
}
//~--- fields -------------------------------------------------------------
/** Field description */
private String hash;
}
//~--- fields ---------------------------------------------------------------
/** Field description */
private boolean appendSalt;
/** Field description */
private String digest;
/** Field description */
private boolean enableLable;
/** Field description */
private int iterations;
/** Field description */
private byte[] salt;
/** Field description */
private String value;
}

View File

@@ -1,130 +0,0 @@
/**
* Copyright (c) 2010, Sebastian Sdorra
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* 3. Neither the name of SCM-Manager; nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* http://bitbucket.org/sdorra/scm-manager
*
*/
package sonia.scm.security;
//~--- non-JDK imports --------------------------------------------------------
import org.apache.shiro.crypto.hash.Sha1Hash;
/**
*
* @author Sebastian Sdorra
* @since 1.13
* @deprecated use {@link Sha1Hash} instead.
*/
@Deprecated
public class SHA1HashBuilder extends MessageDigestHashBuilder
{
/** Field description */
public static final String DIGEST = "SHA-1";
//~--- constructors ---------------------------------------------------------
/**
* Constructs ...
*
*/
public SHA1HashBuilder()
{
super(DIGEST, null, null, 0, false, false);
}
/**
* Constructs ...
*
*
* @param value
*/
public SHA1HashBuilder(String value)
{
super(DIGEST, value, null, 0, false, false);
}
/**
* Constructs ...
*
*
* @param value
* @param salt
*/
public SHA1HashBuilder(String value, byte[] salt)
{
super(DIGEST, value, salt, 0, false, false);
}
/**
* Constructs ...
*
*
* @param value
* @param salt
* @param iterations
*/
public SHA1HashBuilder(String value, byte[] salt, int iterations)
{
super(DIGEST, value, salt, iterations, false, false);
}
/**
* Constructs ...
*
*
* @param value
* @param salt
* @param iterations
* @param appendSalt
*/
public SHA1HashBuilder(String value, byte[] salt, int iterations,
boolean appendSalt)
{
super(DIGEST, value, salt, iterations, appendSalt, false);
}
/**
* Constructs ...
*
*
* @param value
* @param salt
* @param iterations
* @param appendSalt
* @param enableLabel
*/
public SHA1HashBuilder(String value, byte[] salt, int iterations,
boolean appendSalt, boolean enableLabel)
{
super(DIGEST, value, salt, iterations, appendSalt, enableLabel);
}
}

View File

@@ -1,130 +0,0 @@
/**
* Copyright (c) 2010, Sebastian Sdorra
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* 3. Neither the name of SCM-Manager; nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* http://bitbucket.org/sdorra/scm-manager
*
*/
package sonia.scm.security;
//~--- non-JDK imports --------------------------------------------------------
import org.apache.shiro.crypto.hash.Sha512Hash;
/**
*
* @author Sebastian Sdorra
* @since 1.13
* @deprecated use {@link Sha512Hash} instead.
*/
@Deprecated
public class SHA512HashBuilder extends MessageDigestHashBuilder
{
/** Field description */
public static final String DIGEST = "SHA-512";
//~--- constructors ---------------------------------------------------------
/**
* Constructs ...
*
*/
public SHA512HashBuilder()
{
super(DIGEST, null, null, 0, false, false);
}
/**
* Constructs ...
*
*
* @param value
*/
public SHA512HashBuilder(String value)
{
super(DIGEST, value, null, 0, false, false);
}
/**
* Constructs ...
*
*
* @param value
* @param salt
*/
public SHA512HashBuilder(String value, byte[] salt)
{
super(DIGEST, value, salt, 0, false, false);
}
/**
* Constructs ...
*
*
* @param value
* @param salt
* @param iterations
*/
public SHA512HashBuilder(String value, byte[] salt, int iterations)
{
super(DIGEST, value, salt, iterations, false, false);
}
/**
* Constructs ...
*
*
* @param value
* @param salt
* @param iterations
* @param appendSalt
*/
public SHA512HashBuilder(String value, byte[] salt, int iterations,
boolean appendSalt)
{
super(DIGEST, value, salt, iterations, appendSalt, false);
}
/**
* Constructs ...
*
*
* @param value
* @param salt
* @param iterations
* @param appendSalt
* @param enableLabel
*/
public SHA512HashBuilder(String value, byte[] salt, int iterations,
boolean appendSalt, boolean enableLabel)
{
super(DIGEST, value, salt, iterations, appendSalt, enableLabel);
}
}

View File

@@ -1,58 +0,0 @@
/**
* Copyright (c) 2010, Sebastian Sdorra
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* 3. Neither the name of SCM-Manager; nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* http://bitbucket.org/sdorra/scm-manager
*
*/
package sonia.scm.security;
//~--- non-JDK imports --------------------------------------------------------
import org.apache.shiro.SecurityUtils;
import sonia.scm.user.User;
/**
*
* @author Sebastian Sdorra
* @deprecated use {@link SecurityUtils#getSubject()} instead.
*/
@Deprecated
public interface SecurityContext
{
/**
* Method description
*
*
* @return
*/
public User getUser();
}

View File

@@ -1,65 +0,0 @@
/**
* Copyright (c) 2010, Sebastian Sdorra
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* 3. Neither the name of SCM-Manager; nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* http://bitbucket.org/sdorra/scm-manager
*
*/
package sonia.scm.template;
//~--- JDK imports ------------------------------------------------------------
import java.io.IOException;
import java.io.Writer;
import java.util.Map;
/**
*
* @author Sebastian Sdorra
* @deprecated use {@link TemplateEngineFactory}
*/
@Deprecated
public interface TemplateHandler
{
/**
* Method description
*
*
* @param templateName
* @param writer
* @param params
*
* @throws IOException
*/
public void render(String templateName, Writer writer,
Map<String, ? extends Object> params)
throws IOException;
}

View File

@@ -397,7 +397,7 @@ public class User extends BasicPropertiesAware implements Principal, ModelObject
@Override
public boolean isValid()
{
return ValidationUtil.isUsernameValid(name) && Util.isNotEmpty(displayName)
return ValidationUtil.isNameValid(name) && Util.isNotEmpty(displayName)
&& Util.isNotEmpty(type)
&& ((Util.isEmpty(mail)) || ValidationUtil.isMailAddressValid(mail));
}

View File

@@ -35,16 +35,11 @@ package sonia.scm.util;
//~--- non-JDK imports --------------------------------------------------------
import com.google.inject.Provider;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.subject.Subject;
import sonia.scm.SCMContext;
import sonia.scm.security.Role;
import sonia.scm.security.ScmSecurityException;
import sonia.scm.security.SecurityContext;
import sonia.scm.user.User;
/**
*
@@ -61,21 +56,6 @@ public final class SecurityUtil
//~--- methods --------------------------------------------------------------
/**
* Method description
*
*
* @param contextProvider
* @deprecated use {@link Subject#checkRole(java.lang.String)} with {
* @link Role#ADMIN} instead.
*/
@Deprecated
public static void assertIsAdmin(
Provider<? extends SecurityContext> contextProvider)
{
assertIsAdmin();
}
/**
* This method is only present for compatibility reasons.
* Use {@link Subject#checkRole(java.lang.String)} with {
@@ -96,133 +76,4 @@ public final class SecurityUtil
throw new ScmSecurityException("admin account is required");
}
}
/**
* Method description
*
*
* @param context
* @deprecated use {@link Subject#checkRole(java.lang.String)} with {
* @link Role#ADMIN} instead.
*/
@Deprecated
public static void assertIsAdmin(SecurityContext context)
{
assertIsAdmin();
}
/**
* Method description
*
*
* @param contextProvider
*/
public static void assertIsNotAnonymous(
Provider<? extends SecurityContext> contextProvider)
{
if (isAnonymous(contextProvider))
{
throw new ScmSecurityException("anonymous is not allowed here");
}
}
/**
* Method description
*
*
* @param context
*/
public static void assertIsNotAnonymous(SecurityContext context)
{
if (isAnonymous(context))
{
throw new ScmSecurityException("anonymous is not allowed here");
}
}
//~--- get methods ----------------------------------------------------------
/**
* Method description
*
*
* @param contextProvider
*
* @return
*/
public static User getCurrentUser(
Provider<? extends SecurityContext> contextProvider)
{
AssertUtil.assertIsNotNull(contextProvider);
SecurityContext context = contextProvider.get();
AssertUtil.assertIsNotNull(context);
User user = context.getUser();
if (user == null)
{
throw new ScmSecurityException("user is not authenticated");
}
return user;
}
/**
* Method description
*
*
* @param contextProvider
*
* @return
*/
public static boolean isAdmin(
Provider<? extends SecurityContext> contextProvider)
{
return isAdmin(contextProvider.get());
}
/**
* Method description
*
*
* @param contextProvider
*
* @return
*/
public static boolean isAdmin(SecurityContext contextProvider)
{
AssertUtil.assertIsNotNull(contextProvider);
return (contextProvider.getUser() != null)
&& contextProvider.getUser().isAdmin();
}
/**
* Method description
*
*
* @param contextProvider
*
* @return
*/
public static boolean isAnonymous(
Provider<? extends SecurityContext> contextProvider)
{
return isAnonymous(contextProvider.get());
}
/**
* Method description
*
*
* @param context
*
* @return
*/
public static boolean isAnonymous(SecurityContext context)
{
return SCMContext.USER_ANONYMOUS.equals(context.getUser().getName());
}
}

View File

@@ -36,8 +36,6 @@ package sonia.scm.util;
//~--- non-JDK imports --------------------------------------------------------
import sonia.scm.Platform;
import sonia.scm.ServletContainer;
import sonia.scm.ServletContainerDetector;
/**
*
@@ -116,19 +114,6 @@ public final class SystemUtil
return platform;
}
/**
* Method description
*
*
* @return
* @deprecated use {@link ServletContainerDetector#detect(javax.servlet.http.HttpServletRequest)) instead
*/
@Deprecated
public static ServletContainer getServletContainer()
{
return ServletContainerDetector.detect();
}
/**
* Method description
*

View File

@@ -175,21 +175,6 @@ public final class ValidationUtil
return result;
}
/**
* Method description
*
*
* @param username
*
* @return
* @deprecated use {@link #isNameValid(String)}
*/
@Deprecated
public static boolean isUsernameValid(String username)
{
return isNameValid(username);
}
/**
* Method description
*

View File

@@ -1,219 +0,0 @@
/**
* Copyright (c) 2010, Sebastian Sdorra
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* 3. Neither the name of SCM-Manager; nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* http://bitbucket.org/sdorra/scm-manager
*
*/
package sonia.scm.web.cgi;
//~--- non-JDK imports --------------------------------------------------------
import sonia.scm.config.ScmConfiguration;
import sonia.scm.util.HttpUtil;
//~--- JDK imports ------------------------------------------------------------
import java.io.File;
import java.io.IOException;
import java.util.Enumeration;
import java.util.Locale;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
*
* @author Sebastian Sdorra
* @deprecated use {@link CGIExecutorFactory}
*/
@Deprecated
public abstract class AbstractCGIServlet extends HttpServlet
{
/** Field description */
private static final long serialVersionUID = -8638099037069714140L;
//~--- constructors ---------------------------------------------------------
/**
* Constructs ...
*
*
* @param configuration
*/
public AbstractCGIServlet(ScmConfiguration configuration)
{
this.configuration = configuration;
}
//~--- get methods ----------------------------------------------------------
/**
* Method description
*
*
* @param req
*
* @return
*
* @throws IOException
* @throws ServletException
*/
protected abstract File getCommand(HttpServletRequest req)
throws ServletException, IOException;
//~--- methods --------------------------------------------------------------
/**
* Method description
*
*
* @throws ServletException
*/
@Override
public void init() throws ServletException
{
cgiRunner = new CGIRunner(getServletContext(), null, isExitStateIgnored());
baseEnvironment = createBaseEnvironment();
}
/**
* Method description
*
*
* @return
*
* @throws ServletException
*/
protected EnvList createBaseEnvironment() throws ServletException
{
EnvList env = new EnvList();
Enumeration e = getInitParameterNames();
while (e.hasMoreElements())
{
String n = (String) e.nextElement();
if ((n != null) && n.startsWith("ENV_"))
{
env.set(n.substring(4), getInitParameter(n));
}
}
if (!env.containsKey("SystemRoot"))
{
String os = System.getProperty("os.name");
if ((os != null)
&& (os.toLowerCase(Locale.ENGLISH).indexOf("windows") != -1))
{
env.set("SystemRoot", "C:\\WINDOWS");
}
}
return env;
}
/**
* Method description
*
*
*
* @param request
* @param baseEnvironment
*
* @return
*
* @throws ServletException
*/
protected EnvList createRequestEnvironment(HttpServletRequest request,
EnvList baseEnvironment)
throws ServletException
{
return new EnvList(baseEnvironment);
}
/**
* Method description
*
*
* @param req
* @param resp
*
* @throws IOException
* @throws ServletException
*/
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
{
cgiRunner.exec(createRequestEnvironment(req, baseEnvironment),
getCmdPrefix(), getCommand(req), req.getPathInfo(), req, resp,
HttpUtil.getServerPort(configuration, req));
}
//~--- get methods ----------------------------------------------------------
/**
* Method description
*
*
* @return
*/
protected String getCmdPrefix()
{
return null;
}
/**
* Method description
*
*
* @return
*/
protected boolean isExitStateIgnored()
{
return false;
}
//~--- fields ---------------------------------------------------------------
/** Field description */
private EnvList baseEnvironment;
/** Field description */
private CGIRunner cgiRunner;
/** Field description */
private ScmConfiguration configuration;
}

View File

@@ -1,573 +0,0 @@
/**
* Copyright (c) 2010, Sebastian Sdorra
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* 3. Neither the name of SCM-Manager; nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* http://bitbucket.org/sdorra/scm-manager
*
*/
package sonia.scm.web.cgi;
//~--- non-JDK imports --------------------------------------------------------
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import sonia.scm.logging.LoggingOutputStream;
import sonia.scm.util.IOUtil;
import sonia.scm.util.Util;
//~--- JDK imports ------------------------------------------------------------
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Enumeration;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Based on org.eclipse.jetty.servlets.CGI
*
* @author Sebastian Sdorra
* @deprecated use {@link CGIExecutorFactory}
*/
@Deprecated
public class CGIRunner
{
/** Field description */
public static final int BUFFERSIZE = 2 * 8192;
/** Field description */
private static final Logger logger = LoggerFactory.getLogger(CGIRunner.class);
//~--- constructors ---------------------------------------------------------
/**
* Constructs ...
*
*
* @param context
* @param defaultCmdPrefix
* @param ignoreExitState
*/
public CGIRunner(ServletContext context, String defaultCmdPrefix,
boolean ignoreExitState)
{
this(context, defaultCmdPrefix, ignoreExitState, false);
}
/**
* Constructs ...
*
*
* @param context
* @param defaultCmdPrefix
* @param ignoreExitState
* @param asyncRequestInput
*/
public CGIRunner(ServletContext context, String defaultCmdPrefix,
boolean ignoreExitState, boolean asyncRequestInput)
{
this.context = context;
this.defaultCmdPrefix = defaultCmdPrefix;
this.ignoreExitState = ignoreExitState;
this.asyncRequestInput = asyncRequestInput;
}
//~--- methods --------------------------------------------------------------
/**
* Method description
*
*
* @param environment
* @param command
* @param pathInfo
* @param req
* @param res
* @param serverPort
*
* @throws IOException
*/
public void exec(EnvList environment, File command, String pathInfo,
HttpServletRequest req, HttpServletResponse res,
int serverPort)
throws IOException
{
exec(environment, defaultCmdPrefix, command, pathInfo, req, res,
serverPort);
}
/**
* Method description
*
*
*
* @param environment
* @param cmdPrefix
* @param command
* @param pathInfo
* @param req
* @param res
* @param serverPort
*
* @throws IOException
*/
public void exec(EnvList environment, String cmdPrefix, File command,
String pathInfo, HttpServletRequest req,
HttpServletResponse res, int serverPort)
throws IOException
{
String path = command.getAbsolutePath();
File dir = command.getParentFile();
String scriptName = req.getRequestURI().substring(0,
req.getRequestURI().length() - pathInfo.length());
String scriptPath = context.getRealPath(scriptName);
String pathTranslated = req.getPathTranslated();
int len = req.getContentLength();
if (len < 0)
{
len = 0;
}
if (Util.isEmpty(pathTranslated))
{
pathTranslated = path;
}
// these ones are from "The WWW Common Gateway Interface Version 1.1"
// look at :
// http://Web.Golux.Com/coar/cgi/draft-coar-cgi-v11-03-clean.html#6.1.1
environment.set("AUTH_TYPE", req.getAuthType());
environment.set("CONTENT_LENGTH", Integer.toString(len));
environment.set("CONTENT_TYPE", req.getContentType());
environment.set("GATEWAY_INTERFACE", "CGI/1.1");
environment.set("PATH_INFO", pathInfo);
environment.set("PATH_TRANSLATED", pathTranslated);
environment.set("QUERY_STRING", req.getQueryString());
environment.set("REMOTE_ADDR", req.getRemoteAddr());
environment.set("REMOTE_HOST", req.getRemoteHost());
// The identity information reported about the connection by a
// RFC 1413 [11] request to the remote agent, if
// available. Servers MAY choose not to support this feature, or
// not to request the data for efficiency reasons.
// "REMOTE_IDENT" => "NYI"
environment.set("REMOTE_USER", req.getRemoteUser());
environment.set("REQUEST_METHOD", req.getMethod());
environment.set("SCRIPT_NAME", scriptName);
environment.set("SCRIPT_FILENAME", scriptPath);
environment.set("SERVER_NAME", req.getServerName());
environment.set("SERVER_PORT", Integer.toString(serverPort));
environment.set("SERVER_PROTOCOL", req.getProtocol());
environment.set("SERVER_SOFTWARE", context.getServerInfo());
Enumeration enm = req.getHeaderNames();
while (enm.hasMoreElements())
{
String name = (String) enm.nextElement();
String value = req.getHeader(name);
environment.set("HTTP_" + name.toUpperCase().replace('-', '_'), value);
}
// these extra ones were from printenv on www.dev.nomura.co.uk
environment.set("HTTPS", (req.isSecure()
? "ON"
: "OFF"));
// "DOCUMENT_ROOT" => root + "/docs",
// "SERVER_URL" => "NYI - http://us0245",
// "TZ" => System.getProperty("user.timezone"),
// are we meant to decode args here ? or does the script get them
// via PATH_INFO ? if we are, they should be decoded and passed
// into exec here...
String execCmd = path;
if ((execCmd.charAt(0) != '"') && (execCmd.indexOf(' ') >= 0))
{
execCmd = "\"" + execCmd + "\"";
}
if (cmdPrefix != null)
{
execCmd = cmdPrefix + " " + execCmd;
}
if (logger.isDebugEnabled())
{
logger.debug("execute cgi: ".concat(execCmd));
if (logger.isTraceEnabled())
{
logger.trace(environment.toString());
}
}
Process p = (dir == null)
? Runtime.getRuntime().exec(execCmd, environment.getEnvArray())
: Runtime.getRuntime().exec(execCmd, environment.getEnvArray(),
dir);
passRequestInputToProcess(req, p, len);
// hook processes output to browser's input (sync)
// if browser closes stream, we should detect it and kill process...
OutputStream os = null;
try
{
// read any headers off the top of our input stream
// NOTE: Multiline header items not supported!
String line = null;
InputStream inFromCgi = p.getInputStream();
if (logger.isTraceEnabled())
{
logger.trace("CGI-Response Header:");
}
// br=new BufferedReader(new InputStreamReader(inFromCgi));
// while ((line=br.readLine())!=null)
while ((line = getTextLineFromStream(inFromCgi)).length() > 0)
{
if (logger.isTraceEnabled())
{
logger.trace(" ".concat(line));
}
if (!line.startsWith("HTTP"))
{
int k = line.indexOf(':');
if (k > 0)
{
String key = line.substring(0, k).trim();
String value = line.substring(k + 1).trim();
if ("Location".equals(key))
{
res.sendRedirect(res.encodeRedirectURL(value));
}
else if ("Status".equals(key))
{
String[] token = value.split(" ");
int status = Integer.parseInt(token[0]);
res.setStatus(status);
}
else
{
// add remaining header items to our response header
res.addHeader(key, value);
}
}
}
}
// copy cgi content to response stream...
os = res.getOutputStream();
IOUtil.copy(inFromCgi, os);
p.waitFor();
if (!ignoreExitState)
{
int exitValue = p.exitValue();
if (0 != exitValue)
{
StringBuilder msg = new StringBuilder("Non-zero exit status (");
msg.append(exitValue).append(") from CGI program: ").append(path);
logger.warn(msg.toString());
if (!res.isCommitted())
{
res.sendError(500, "Failed to exec CGI");
}
}
}
}
catch (IOException e)
{
// browser has probably closed its input stream - we
// terminate and clean up...
logger.debug("CGI: Client closed connection!");
}
catch (InterruptedException ie)
{
logger.debug("CGI: interrupted!");
}
finally
{
IOUtil.close(os);
os = null;
p.destroy();
// Log.debug("CGI: terminated!");
}
}
//~--- get methods ----------------------------------------------------------
/**
* Method description
*
*
* @return
*/
public String getCmdPrefix()
{
return defaultCmdPrefix;
}
/**
* Method description
*
*
* @return
*/
public ServletContext getContext()
{
return context;
}
/**
* Method description
*
*
* @return
*/
public boolean isIgnoreExitState()
{
return ignoreExitState;
}
//~--- set methods ----------------------------------------------------------
/**
* Method description
*
*
* @param cmdPrefix
*/
public void setCmdPrefix(String cmdPrefix)
{
this.defaultCmdPrefix = cmdPrefix;
}
/**
* Method description
*
*
* @param context
*/
public void setContext(ServletContext context)
{
this.context = context;
}
/**
* Method description
*
*
* @param ignoreExitState
*/
public void setIgnoreExitState(boolean ignoreExitState)
{
this.ignoreExitState = ignoreExitState;
}
//~--- methods --------------------------------------------------------------
/**
* Method description
*
*
* @param in
* @param out
* @param byteCount
*
* @throws IOException
*/
private void copy(InputStream in, OutputStream out, long byteCount)
throws IOException
{
byte buffer[] = new byte[BUFFERSIZE];
int len = BUFFERSIZE;
if (byteCount >= 0)
{
while (byteCount > 0)
{
int max = (byteCount < BUFFERSIZE)
? (int) byteCount
: BUFFERSIZE;
len = in.read(buffer, 0, max);
if (len == -1)
{
break;
}
byteCount -= len;
out.write(buffer, 0, len);
}
}
else
{
while (true)
{
len = in.read(buffer, 0, BUFFERSIZE);
if (len < 0)
{
break;
}
out.write(buffer, 0, len);
}
}
}
/**
* Method description
*
*
* @param request
* @param p
* @param length
*
* @throws IOException
*/
private void passRequestInputToProcess(HttpServletRequest request, Process p,
int length)
throws IOException
{
final InputStream inFromReq = request.getInputStream();
final OutputStream outToCgi = p.getOutputStream();
final int inLength = length;
IOUtil.copyThread(p.getErrorStream(),
new LoggingOutputStream(logger,
LoggingOutputStream.LEVEL_ERROR));
if (asyncRequestInput)
{
new Thread(new Runnable()
{
@Override
public void run()
{
try
{
if (inLength > 0)
{
copy(inFromReq, outToCgi, inLength);
}
}
catch (IOException ex)
{
logger.debug(ex.getMessage(), ex);
}
finally
{
IOUtil.close(inFromReq);
IOUtil.close(outToCgi);
}
}
}).start();
}
else
{
try
{
if (inLength > 0)
{
copy(inFromReq, outToCgi, inLength);
}
}
finally
{
IOUtil.close(inFromReq);
IOUtil.close(outToCgi);
}
}
}
//~--- get methods ----------------------------------------------------------
/**
* Method description
*
*
* @param is
*
* @return
*
* @throws IOException
*/
private String getTextLineFromStream(InputStream is) throws IOException
{
StringBuilder buffer = new StringBuilder();
int b;
while ((b = is.read()) != -1 && (b != (int) '\n'))
{
buffer.append((char) b);
}
return buffer.toString().trim();
}
//~--- fields ---------------------------------------------------------------
/** Field description */
private boolean asyncRequestInput = false;
/** Field description */
private ServletContext context;
/** Field description */
private String defaultCmdPrefix;
/** Field description */
private boolean ignoreExitState;
}

View File

@@ -26,9 +26,28 @@
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*/
package sonia.scm.web.filter;
//~--- non-JDK imports --------------------------------------------------------
import com.google.inject.Inject;
import com.google.inject.Singleton;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.subject.Subject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import sonia.scm.user.User;
//~--- JDK imports ------------------------------------------------------------
import java.io.IOException;
import java.util.Set;
import javax.servlet.FilterChain;
@@ -36,16 +55,6 @@ import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.subject.Subject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import sonia.scm.user.User;
import com.google.inject.Inject;
import com.google.inject.Singleton;
/**
* This filter calls all AutoLoginModule objects to try an auto-login. It can be
* used on its own, usually at the global context ('/*') or as a base class like
@@ -54,15 +63,14 @@ import com.google.inject.Singleton;
* @author Clemens Rabe
*/
@Singleton
public class AutoLoginFilter extends HttpFilter {
public class AutoLoginFilter extends HttpFilter
{
/** the logger for AutoLoginFilter */
private static final Logger logger = LoggerFactory
.getLogger(AutoLoginFilter.class);
private static final Logger logger =
LoggerFactory.getLogger(AutoLoginFilter.class);
@Deprecated
public AutoLoginFilter() {
}
//~--- constructors ---------------------------------------------------------
/**
* Constructor.
@@ -71,23 +79,43 @@ public class AutoLoginFilter extends HttpFilter {
* - The auto-login modules.
*/
@Inject
public AutoLoginFilter(Set<AutoLoginModule> autoLoginModules) {
public AutoLoginFilter(Set<AutoLoginModule> autoLoginModules)
{
this.autoLoginModules = autoLoginModules;
}
//~--- methods --------------------------------------------------------------
/**
* Method description
*
*
* @param request
* @param response
* @param chain
*
* @throws IOException
* @throws ServletException
*/
@Override
protected void doFilter(HttpServletRequest request,
HttpServletResponse response, FilterChain chain)
throws IOException, ServletException {
throws IOException, ServletException
{
User user = getAuthenticatedUser(request, response);
if (user == null)
{
chain.doFilter(request, response);
}
else
chain.doFilter(
new SecurityHttpServletRequestWrapper(request, user),
{
chain.doFilter(new SecurityHttpServletRequestWrapper(request, user),
response);
}
}
//~--- get methods ----------------------------------------------------------
/**
* Check all known AutoLoginModule objects to authenticate the user using
@@ -100,27 +128,37 @@ public class AutoLoginFilter extends HttpFilter {
* @return The user or null if no user was found.
*/
protected User getAuthenticatedUser(HttpServletRequest request,
HttpServletResponse response) {
HttpServletResponse response)
{
Subject subject = SecurityUtils.getSubject();
User user = null;
if (subject.isAuthenticated() || subject.isRemembered()) {
if (logger.isTraceEnabled()) {
if (subject.isAuthenticated() || subject.isRemembered())
{
if (logger.isTraceEnabled())
{
logger.trace("user is allready authenticated");
}
user = subject.getPrincipals().oneByType(User.class);
} else {
}
else
{
// Try the known filters first
for (AutoLoginModule filter : autoLoginModules) {
for (AutoLoginModule filter : autoLoginModules)
{
user = filter.authenticate(request, response, subject);
if (user != null) {
if (logger.isTraceEnabled()) {
if (user != null)
{
if (logger.isTraceEnabled())
{
logger.trace(
"user {} successfully authenticated by authentication filter",
user.getName());
}
break;
}
}
@@ -129,9 +167,10 @@ public class AutoLoginFilter extends HttpFilter {
return user;
}
//~--- fields ---------------------------------------------------------------
/**
* Set of AutoLoginModule objects.
*/
private Set<AutoLoginModule> autoLoginModules;
private final Set<AutoLoginModule> autoLoginModules;
}

View File

@@ -52,8 +52,6 @@ import sonia.scm.config.ScmConfiguration;
import sonia.scm.user.User;
import sonia.scm.util.HttpUtil;
import sonia.scm.util.Util;
import sonia.scm.web.security.AuthenticationHandler;
import sonia.scm.web.security.WebSecurityContext;
//~--- JDK imports ------------------------------------------------------------
@@ -90,16 +88,6 @@ public class BasicAuthenticationFilter extends AutoLoginFilter
//~--- constructors ---------------------------------------------------------
/**
* Constructs ...
*
*
* @param securityContextProvider
* @deprecated use the constructor with out arguments instead.
*/
@Deprecated
public BasicAuthenticationFilter(
Provider<WebSecurityContext> securityContextProvider) {}
/**
* Constructs a new basic authenticaton filter
@@ -281,5 +269,5 @@ public class BasicAuthenticationFilter extends AutoLoginFilter
//~--- fields ---------------------------------------------------------------
/** Field description */
private ScmConfiguration configuration;
private final ScmConfiguration configuration;
}

View File

@@ -53,7 +53,6 @@ import sonia.scm.repository.Repository;
import sonia.scm.security.ScmSecurityException;
import sonia.scm.util.HttpUtil;
import sonia.scm.util.Util;
import sonia.scm.web.security.WebSecurityContext;
//~--- JDK imports ------------------------------------------------------------
@@ -93,21 +92,6 @@ public abstract class PermissionFilter extends HttpFilter
this.configuration = configuration;
}
/**
* Constructs a new permission filter
*
* @param configuration global scm-manager configuration
* @param securityContextProvider security context provider
*
* @deprecated {@link #PermissionFilter(ScmConfiguration)} instead
*/
@Deprecated
public PermissionFilter(ScmConfiguration configuration,
Provider<WebSecurityContext> securityContextProvider)
{
this.configuration = configuration;
}
//~--- get methods ----------------------------------------------------------
/**

View File

@@ -45,7 +45,6 @@ import org.slf4j.LoggerFactory;
import sonia.scm.config.ScmConfiguration;
import sonia.scm.repository.Repository;
import sonia.scm.repository.RepositoryProvider;
import sonia.scm.web.security.WebSecurityContext;
//~--- JDK imports ------------------------------------------------------------
@@ -82,24 +81,6 @@ public abstract class ProviderPermissionFilter extends PermissionFilter
this.repositoryProvider = repositoryProvider;
}
/**
* Constructs ...
*
*
*
* @param configuration
* @param securityContextProvider
* @param repositoryProvider
* @deprecated
*/
@Deprecated
public ProviderPermissionFilter(ScmConfiguration configuration,
Provider<WebSecurityContext> securityContextProvider,
RepositoryProvider repositoryProvider)
{
this(configuration, repositoryProvider);
}
//~--- get methods ----------------------------------------------------------
/**
@@ -136,5 +117,5 @@ public abstract class ProviderPermissionFilter extends PermissionFilter
//~--- fields ---------------------------------------------------------------
/** Field description */
private RepositoryProvider repositoryProvider;
private final RepositoryProvider repositoryProvider;
}

View File

@@ -35,12 +35,10 @@ package sonia.scm.web.filter;
//~--- non-JDK imports --------------------------------------------------------
import com.google.inject.Provider;
import sonia.scm.config.ScmConfiguration;
import sonia.scm.repository.Repository;
import sonia.scm.repository.RepositoryManager;
import sonia.scm.web.security.WebSecurityContext;
//~--- JDK imports ------------------------------------------------------------
@@ -77,24 +75,6 @@ public abstract class RegexPermissionFilter extends PermissionFilter
this.repositoryManager = repositoryManager;
}
/**
* Constructs ...
*
*
*
* @param configuration
* @param securityContextProvider
* @param repositoryManager
* @deprecated
*/
@Deprecated
public RegexPermissionFilter(ScmConfiguration configuration,
Provider<WebSecurityContext> securityContextProvider,
RepositoryManager repositoryManager)
{
this(configuration, repositoryManager);
}
//~--- get methods ----------------------------------------------------------
/**

View File

@@ -1,79 +0,0 @@
/**
* Copyright (c) 2010, Sebastian Sdorra
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* 3. Neither the name of SCM-Manager; nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* http://bitbucket.org/sdorra/scm-manager
*
*/
package sonia.scm.web.proxy;
//~--- JDK imports ------------------------------------------------------------
import java.net.URL;
/**
*
* @author Sebastian Sdorra
* @since 1.8
* @deprecated use {@link ProxyConfigurationProvider} instead.
*/
@Deprecated
public class BasicProxyURLProvider implements ProxyURLProvider
{
/**
* Constructs ...
*
*
* @param url
*/
public BasicProxyURLProvider(URL url)
{
this.url = url;
}
//~--- get methods ----------------------------------------------------------
/**
* Method description
*
*
* @return
*/
@Override
public URL getProxyURL()
{
return url;
}
//~--- fields ---------------------------------------------------------------
/** Field description */
private URL url;
}

View File

@@ -1,190 +0,0 @@
/**
* Copyright (c) 2010, Sebastian Sdorra
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* 3. Neither the name of SCM-Manager; nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* http://bitbucket.org/sdorra/scm-manager
*
*/
package sonia.scm.web.proxy;
//~--- non-JDK imports --------------------------------------------------------
import com.google.inject.Inject;
import com.google.inject.Singleton;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import sonia.scm.util.AssertUtil;
import sonia.scm.util.IOUtil;
//~--- JDK imports ------------------------------------------------------------
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
*
* @author Sebastian Sdorra
* @since 1.8
* @deprecated use {@link ProxyServlet} instead
*/
@Singleton
@Deprecated
public class ProxyServet extends HttpServlet
{
/** the logger for MyProxy */
private static final Logger logger =
LoggerFactory.getLogger(ProxyServet.class);
/** Field description */
private static final long serialVersionUID = -8069773175342430809L;
//~--- constructors ---------------------------------------------------------
/**
* Constructs ...
*
*
* @param urlProvider
*/
@Inject
public ProxyServet(ProxyURLProvider urlProvider)
{
this.urlProvider = urlProvider;
}
//~--- methods --------------------------------------------------------------
/**
* Method description
*
*
* @param request
* @param response
*/
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response)
{
doPost(request, response);
}
/**
* Method description
*
*
* @param request
* @param response
*/
@Override
public void doPost(HttpServletRequest request, HttpServletResponse response)
{
BufferedInputStream webToProxyBuf = null;
BufferedOutputStream proxyToClientBuf = null;
HttpURLConnection con;
try
{
URL url = urlProvider.getProxyURL();
AssertUtil.assertIsNotNull(url);
if (logger.isInfoEnabled())
{
logger.info("proxy request for {}", url.toString());
}
con = (HttpURLConnection) url.openConnection();
con.setDoOutput(true);
con.setDoInput(true);
con.setUseCaches(true);
for (Enumeration e = request.getHeaderNames(); e.hasMoreElements(); )
{
String headerName = e.nextElement().toString();
con.setRequestProperty(headerName, request.getHeader(headerName));
}
con.connect();
response.setStatus(con.getResponseCode());
for (Iterator i = con.getHeaderFields().entrySet().iterator();
i.hasNext(); )
{
Map.Entry mapEntry = (Map.Entry) i.next();
if (mapEntry.getKey() != null)
{
response.setHeader(mapEntry.getKey().toString(),
((List) mapEntry.getValue()).get(0).toString());
}
}
webToProxyBuf = new BufferedInputStream(con.getInputStream());
proxyToClientBuf = new BufferedOutputStream(response.getOutputStream());
int oneByte;
while ((oneByte = webToProxyBuf.read()) != -1)
{
proxyToClientBuf.write(oneByte);
}
con.disconnect();
}
catch (Exception ex)
{
logger.error("could not proxy request", ex);
}
finally
{
IOUtil.close(webToProxyBuf);
IOUtil.close(proxyToClientBuf);
}
}
//~--- fields ---------------------------------------------------------------
/** Field description */
private ProxyURLProvider urlProvider;
}

View File

@@ -1,57 +0,0 @@
/**
* Copyright (c) 2010, Sebastian Sdorra
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* 3. Neither the name of SCM-Manager; nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* http://bitbucket.org/sdorra/scm-manager
*
*/
package sonia.scm.web.proxy;
//~--- JDK imports ------------------------------------------------------------
import java.net.URL;
/**
*
* @author Sebastian Sdorra
* @since 1.8
* @deprecated use {@link ProxyConfigurationProvider} instead.
*/
@Deprecated
public interface ProxyURLProvider
{
/**
* Method description
*
*
* @return
*/
public URL getProxyURL();
}

View File

@@ -1,99 +0,0 @@
/**
* Copyright (c) 2010, Sebastian Sdorra
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* 3. Neither the name of SCM-Manager; nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* http://bitbucket.org/sdorra/scm-manager
*
*/
package sonia.scm.web.security;
//~--- non-JDK imports --------------------------------------------------------
import sonia.scm.security.SecurityContext;
import sonia.scm.user.User;
//~--- JDK imports ------------------------------------------------------------
import java.util.Collection;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.shiro.SecurityUtils;
/**
*
* @author Sebastian Sdorra
* @deprecated use {@link SecurityUtils#getSecurityManager()} instead.
*/
@Deprecated
public interface WebSecurityContext extends SecurityContext
{
/**
* Method description
*
*
* @param request
* @param response
* @param username
* @param password
*
* @return
*/
public User authenticate(HttpServletRequest request,
HttpServletResponse response, String username,
String password);
/**
* Method description
*
*
* @param request
* @param response
*/
public void logout(HttpServletRequest request, HttpServletResponse response);
//~--- get methods ----------------------------------------------------------
/**
* Method description
*
*
* @return
*/
public Collection<String> getGroups();
/**
* Method description
*
*
* @return
*/
public boolean isAuthenticated();
}

View File

@@ -1,300 +0,0 @@
/**
* Copyright (c) 2010, Sebastian Sdorra
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* 3. Neither the name of SCM-Manager; nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* http://bitbucket.org/sdorra/scm-manager
*
*/
package sonia.scm.repository;
//~--- non-JDK imports --------------------------------------------------------
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import sonia.scm.config.ScmConfiguration;
import sonia.scm.security.ScmSecurityException;
import sonia.scm.user.User;
import sonia.scm.web.security.WebSecurityContext;
import static org.junit.Assert.*;
import static org.mockito.Mockito.*;
//~--- JDK imports ------------------------------------------------------------
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
/**
*
* @author Sebastian Sdorra
*/
@Ignore
public class PermissionUtilTest
{
/**
* Constructs ...
*
*/
public PermissionUtilTest()
{
admams.getUser().setAdmin(true);
}
//~--- methods --------------------------------------------------------------
/**
* Method description
*
*/
@Test(expected = ScmSecurityException.class)
public void assertFailedPermissionTest()
{
PermissionUtil.assertPermission(repository, dent, PermissionType.WRITE);
}
/**
* Method description
*
*/
@Test
public void assertPermissionTest()
{
PermissionUtil.assertPermission(repository, dent, PermissionType.READ);
PermissionUtil.assertPermission(repository, perfect, PermissionType.READ);
PermissionUtil.assertPermission(repository, perfect, PermissionType.WRITE);
PermissionUtil.assertPermission(repository, marvin, PermissionType.READ);
PermissionUtil.assertPermission(repository, marvin, PermissionType.WRITE);
PermissionUtil.assertPermission(repository, marvin, PermissionType.OWNER);
PermissionUtil.assertPermission(repository, admams, PermissionType.READ);
PermissionUtil.assertPermission(repository, admams, PermissionType.WRITE);
PermissionUtil.assertPermission(repository, admams, PermissionType.OWNER);
}
/**
* Method description
*
*/
@Before
public void before()
{
repository = new Repository();
Permission[] permissions = new Permission[] {
new Permission("dent", PermissionType.READ),
new Permission("perfect", PermissionType.WRITE),
new Permission("marvin", PermissionType.OWNER) };
repository.setPermissions(Arrays.asList(permissions));
}
/**
* Method description
*
*/
@Test
public void testGroupPermissions()
{
WebSecurityContext dent = mockGroupCtx(new User("dent", "Arthur Dent",
"arthur.dent@hitchhiker.com"), "devel", "qa");
WebSecurityContext ford = mockGroupCtx(new User("ford", "Ford Prefect",
"ford.prefect@hitchhiker.com"), "devel");
WebSecurityContext zaphod = mockGroupCtx(new User("zaphod",
"Zaphod Beeblebrox",
"zaphod.beeblebrox@hitchhiker.com"), "qa");
WebSecurityContext trillian = mockGroupCtx(new User("trillian",
"Trillian Astra",
"trillian.astra@hitchhiker.com"));
Repository r = new Repository();
r.setPermissions(
new ArrayList<Permission>(
Arrays.asList(
new Permission("dent"),
new Permission("devel", PermissionType.WRITE, true),
new Permission("qa", PermissionType.READ, true))));
// member of both devel and qa
assertTrue(PermissionUtil.hasPermission(r, dent, PermissionType.READ));
assertTrue(PermissionUtil.hasPermission(r, dent, PermissionType.WRITE));
assertFalse(PermissionUtil.hasPermission(r, dent, PermissionType.OWNER));
// now, additionally the owner
r.getPermissions().add(new Permission("dent", PermissionType.OWNER));
assertTrue(PermissionUtil.hasPermission(r, dent, PermissionType.OWNER));
// member of just devel
assertTrue(PermissionUtil.hasPermission(r, ford, PermissionType.READ));
assertTrue(PermissionUtil.hasPermission(r, ford, PermissionType.WRITE));
assertFalse(PermissionUtil.hasPermission(r, ford, PermissionType.OWNER));
// member of just qa
assertTrue(PermissionUtil.hasPermission(r, zaphod, PermissionType.READ));
assertFalse(PermissionUtil.hasPermission(r, zaphod, PermissionType.WRITE));
assertFalse(PermissionUtil.hasPermission(r, zaphod, PermissionType.OWNER));
// member of no groups
assertFalse(PermissionUtil.hasPermission(r, trillian, PermissionType.READ));
assertFalse(PermissionUtil.hasPermission(r, trillian,
PermissionType.WRITE));
assertFalse(PermissionUtil.hasPermission(r, trillian,
PermissionType.OWNER));
}
/**
* Method description
*
*/
@Test
public void testIsWritable()
{
ScmConfiguration configuration = new ScmConfiguration();
configuration.setEnableRepositoryArchive(true);
assertTrue(PermissionUtil.isWritable(configuration, repository, perfect));
repository.setArchived(true);
assertFalse(PermissionUtil.isWritable(configuration, repository, perfect));
assertFalse(PermissionUtil.isWritable(configuration, repository, admams));
configuration.setEnableRepositoryArchive(false);
assertTrue(PermissionUtil.isWritable(configuration, repository, perfect));
assertTrue(PermissionUtil.isWritable(configuration, repository, admams));
assertFalse(PermissionUtil.isWritable(configuration, repository, dent));
configuration.setEnableRepositoryArchive(true);
repository.setArchived(false);
assertTrue(PermissionUtil.isWritable(configuration, repository, perfect));
assertTrue(PermissionUtil.isWritable(configuration, repository, admams));
assertFalse(PermissionUtil.isWritable(configuration, repository, dent));
}
//~--- get methods ----------------------------------------------------------
/**
* Method description
*
*/
@Test
public void hasPermissionTest()
{
assertTrue(PermissionUtil.hasPermission(repository, dent,
PermissionType.READ));
assertTrue(PermissionUtil.hasPermission(repository, perfect,
PermissionType.READ));
assertTrue(PermissionUtil.hasPermission(repository, perfect,
PermissionType.WRITE));
assertFalse(PermissionUtil.hasPermission(repository, dent,
PermissionType.WRITE));
assertFalse(PermissionUtil.hasPermission(repository, slarti,
PermissionType.WRITE));
assertFalse(PermissionUtil.hasPermission(repository, slarti,
PermissionType.READ));
assertTrue(PermissionUtil.hasPermission(repository, marvin,
PermissionType.READ));
assertTrue(PermissionUtil.hasPermission(repository, marvin,
PermissionType.WRITE));
assertTrue(PermissionUtil.hasPermission(repository, marvin,
PermissionType.OWNER));
assertTrue(PermissionUtil.hasPermission(repository, admams,
PermissionType.READ));
assertTrue(PermissionUtil.hasPermission(repository, admams,
PermissionType.WRITE));
assertTrue(PermissionUtil.hasPermission(repository, admams,
PermissionType.OWNER));
}
//~--- methods --------------------------------------------------------------
/**
* Method description
*
*
* @param user
*
* @return
*/
private WebSecurityContext mockCtx(User user)
{
WebSecurityContext context = mock(WebSecurityContext.class);
when(context.getUser()).thenReturn(user);
return context;
}
/**
* Method description
*
*
* @param user
* @param groups
*
* @return
*/
private WebSecurityContext mockGroupCtx(User user, String... groups)
{
WebSecurityContext context = mockCtx(user);
Set<String> groupSet = new HashSet<String>(Arrays.asList(groups));
when(context.getGroups()).thenReturn(groupSet);
return context;
}
//~--- fields ---------------------------------------------------------------
/** Field description */
private WebSecurityContext dent = mockCtx(new User("dent", "Arthur Dent",
"arthur.dent@hitchhiker.com"));
/** Field description */
private WebSecurityContext perfect = mockCtx(new User("perfect",
"Ford Prefect",
"ford.perfect@hitchhiker.com"));
/** Field description */
private Repository repository;
/** Field description */
private WebSecurityContext slarti = mockCtx(new User("slarti",
"Slartibartfaß",
"slartibartfass@hitchhiker.com"));
/** Field description */
private WebSecurityContext marvin = mockCtx(new User("marvin", "Marvin",
"paranoid.android@hitchhiker.com"));
/** Field description */
private WebSecurityContext admams = mockCtx(new User("adams",
"Douglas Adams",
"douglas.adams@hitchhiker.com"));
}

View File

@@ -1,207 +0,0 @@
/**
* Copyright (c) 2010, Sebastian Sdorra
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* 3. Neither the name of SCM-Manager; nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* http://bitbucket.org/sdorra/scm-manager
*
*/
package sonia.scm.security;
//~--- non-JDK imports --------------------------------------------------------
import org.junit.Test;
import static org.hamcrest.Matchers.*;
import static org.junit.Assert.*;
//~--- JDK imports ------------------------------------------------------------
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
*
* @author Sebastian Sdorra
*/
public abstract class HashBuilderTestBase
{
/**
* Method description
*
*
* @return
*/
public abstract HashBuilder createHashBuilder();
//~--- get methods ----------------------------------------------------------
/**
* Method description
*
*
* @return
*/
protected abstract String getLable();
//~--- methods --------------------------------------------------------------
/**
* Method description
*
*/
@Test
public void testCreateIteratedSaltedHash()
{
HashBuilder hashBuilder = createHashBuilder();
String hash = hashBuilder.setIterations(1000).createSalt().setValue(
"hitcheker").toHexString();
byte[] salt = hashBuilder.getSalt();
hashBuilder = createHashBuilder();
String otherHash = hashBuilder.setIterations(1000).setSalt(salt).setValue(
"hitcheker").toHexString();
checkHash("hitcheker", hash, otherHash);
}
/**
* Method description
*
*/
@Test
public void testCreateLabledHash()
{
HashBuilder hashBuilder = createHashBuilder();
String hash = hashBuilder.enableLabel().setValue("hitcheker").toHexString();
System.out.println(hash);
checkHash("hitcheker", hash);
Pattern p = Pattern.compile("\\{([^\\}]+)\\}.*");
Matcher m = p.matcher(hash);
assertTrue(m.matches());
String lable = m.group(1);
assertNotNull(lable);
assertEquals(getLable(), lable);
}
/**
* Method description
*
*/
@Test
public void testCreateSalt()
{
HashBuilder hashBuilder = createHashBuilder();
assertNotNull(hashBuilder);
byte[] salt = hashBuilder.createSalt().getSalt();
assertNotNull(salt);
byte[] otherSalt = hashBuilder.createSalt().getSalt();
assertNotNull(otherSalt);
assertEquals(salt.length, otherSalt.length);
assertThat(salt, not(equalTo(otherSalt)));
salt = hashBuilder.createSalt(4).getSalt();
assertEquals(4, salt.length);
}
/**
* Method description
*
*/
@Test
public void testCreateSaltedHash()
{
HashBuilder hashBuilder = createHashBuilder();
String hash = hashBuilder.createSalt().setValue("hitcheker").toHexString();
byte[] salt = hashBuilder.getSalt();
hashBuilder = createHashBuilder();
String otherHash =
hashBuilder.setSalt(salt).setValue("hitcheker").toHexString();
checkHash("hitcheker", hash, otherHash);
}
/**
* Method description
*
*/
@Test
public void testCreateSimpleHash()
{
HashBuilder hashBuilder = createHashBuilder();
String hash = hashBuilder.setValue("hitcheker").toHexString();
hashBuilder = createHashBuilder();
String otherHash = hashBuilder.setValue("hitcheker").toHexString();
checkHash("hitcheker", hash, otherHash);
}
/**
* Method description
*
*
* @param plain
* @param hash
*/
private void checkHash(String plain, String hash)
{
assertNotNull(hash);
assertThat(hash, not(equalTo(plain)));
}
/**
* Method description
*
*
* @param plain
* @param hash
* @param otherHash
*/
private void checkHash(String plain, String hash, String otherHash)
{
checkHash(plain, hash);
assertNotNull(otherHash);
assertThat(otherHash, not(equalTo("hitcheker")));
assertEquals(hash, otherHash);
}
}

View File

@@ -1,67 +0,0 @@
/**
* Copyright (c) 2010, Sebastian Sdorra
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* 3. Neither the name of SCM-Manager; nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* http://bitbucket.org/sdorra/scm-manager
*
*/
package sonia.scm.security;
/**
*
* @author Sebastian Sdorra
*/
public class MD5HashBuilderTest extends HashBuilderTestBase
{
/**
* Method description
*
*
* @return
*/
@Override
public HashBuilder createHashBuilder()
{
return new MD5HashBuilder();
}
//~--- get methods ----------------------------------------------------------
/**
* Method description
*
*
* @return
*/
@Override
protected String getLable()
{
return MD5HashBuilder.DIGEST;
}
}

View File

@@ -1,64 +0,0 @@
/**
* Copyright (c) 2010, Sebastian Sdorra
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* 3. Neither the name of SCM-Manager; nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* http://bitbucket.org/sdorra/scm-manager
*
*/
package sonia.scm.security;
//~--- non-JDK imports --------------------------------------------------------
import org.junit.Test;
import static org.junit.Assert.*;
/**
*
* @author Sebastian Sdorra
*/
public class MessageDigestHashBuilderTest
{
/**
* Method description
*
*/
@Test
public void testExtractor()
{
MessageDigestHashBuilder hashBuilder = new SHA1HashBuilder("hitcheker");
String hash =
hashBuilder.enableLabel().createSalt().appendSalt().toHexString();
assertNotNull(hash);
hashBuilder =
MessageDigestHashBuilder.createExtractor(hash).getHashBuilder(8);
assertEquals(hash, hashBuilder.setValue("hitcheker").toHexString());
}
}

View File

@@ -1,87 +0,0 @@
/**
* Copyright (c) 2010, Sebastian Sdorra
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* 3. Neither the name of SCM-Manager; nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* http://bitbucket.org/sdorra/scm-manager
*
*/
package sonia.scm.security;
//~--- non-JDK imports --------------------------------------------------------
import org.junit.Test;
import static org.junit.Assert.*;
/**
*
* @author Sebastian Sdorra
*/
public class SHA1HashBuilderTest extends HashBuilderTestBase
{
/**
* Method description
*
*
* @return
*/
@Override
public HashBuilder createHashBuilder()
{
return new SHA1HashBuilder();
}
/**
* Method description
*
*/
@Test
public void testCompatibility()
{
MessageDigestEncryptionHandler mdeh = new MessageDigestEncryptionHandler();
String hash = mdeh.encrypt("trillian123");
String newHash = createHashBuilder().setValue("trillian123").toHexString();
assertEquals(hash, newHash);
}
//~--- get methods ----------------------------------------------------------
/**
* Method description
*
*
* @return
*/
@Override
protected String getLable()
{
return SHA1HashBuilder.DIGEST;
}
}

View File

@@ -1,67 +0,0 @@
/**
* Copyright (c) 2010, Sebastian Sdorra
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* 3. Neither the name of SCM-Manager; nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* http://bitbucket.org/sdorra/scm-manager
*
*/
package sonia.scm.security;
/**
*
* @author Sebastian Sdorra
*/
public class SHA512HashBuilderTest extends HashBuilderTestBase
{
/**
* Method description
*
*
* @return
*/
@Override
public HashBuilder createHashBuilder()
{
return new SHA512HashBuilder();
}
//~--- get methods ----------------------------------------------------------
/**
* Method description
*
*
* @return
*/
@Override
protected String getLable()
{
return SHA512HashBuilder.DIGEST;
}
}

View File

@@ -1,178 +0,0 @@
/**
* Copyright (c) 2010, Sebastian Sdorra
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* 3. Neither the name of SCM-Manager; nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* http://bitbucket.org/sdorra/scm-manager
*
*/
package sonia.scm.repository;
//~--- non-JDK imports --------------------------------------------------------
import org.eclipse.jgit.api.BlameCommand;
import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.blame.BlameResult;
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.PersonIdent;
import org.eclipse.jgit.revwalk.RevCommit;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import sonia.scm.util.AssertUtil;
//~--- JDK imports ------------------------------------------------------------
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
/**
* Class description
*
*
* @author Sebastian Sdorra
*/
public class GitBlameViewer implements BlameViewer
{
/** the logger for GitChangesetViewer */
private static final Logger logger =
LoggerFactory.getLogger(GitChangesetViewer.class);
//~--- constructors ---------------------------------------------------------
/**
* Constructs ...
*
*
* @param handler
* @param repository
*/
public GitBlameViewer(GitRepositoryHandler handler, Repository repository)
{
this.handler = handler;
this.repository = repository;
}
//~--- get methods ----------------------------------------------------------
/**
* Method description
*
*
* @param revision
* @param path
*
* @return
*/
@Override
public sonia.scm.repository.BlameResult getBlame(String revision, String path)
{
AssertUtil.assertIsNotEmpty(path);
BlameResult gitBlameResult = null;
sonia.scm.repository.BlameResult blameResult = null;
org.eclipse.jgit.lib.Repository gr = null;
File directory = handler.getDirectory(repository);
Git git = null;
try
{
gr = GitUtil.open(directory);
git = new Git(gr);
BlameCommand blame = git.blame();
blame.setFilePath(path);
ObjectId revId = GitUtil.getRevisionId(gr, revision);
blame.setStartCommit(revId);
gitBlameResult = blame.call();
AssertUtil.assertIsNotNull(gitBlameResult);
List<BlameLine> blameLines = new ArrayList<BlameLine>();
int total = gitBlameResult.getResultContents().size();
int i = 0;
for (; i < total; i++)
{
RevCommit commit = gitBlameResult.getSourceCommit(i);
if (commit != null)
{
PersonIdent author = gitBlameResult.getSourceAuthor(i);
BlameLine blameLine = new BlameLine();
blameLine.setLineNumber(i + 1);
blameLine.setAuthor(new Person(author.getName(),
author.getEmailAddress()));
blameLine.setDescription(commit.getShortMessage());
long when = GitUtil.getCommitTime(commit);
blameLine.setWhen(when);
String rev = commit.getId().getName();
blameLine.setRevision(rev);
String content = gitBlameResult.getResultContents().getString(i);
blameLine.setCode(content);
blameLines.add(blameLine);
}
}
blameResult = new sonia.scm.repository.BlameResult(i, blameLines);
}
catch (IOException ex)
{
logger.error("could not open repository", ex);
}
catch (GitAPIException ex)
{
logger.error("could not create blame view", ex);
}
return blameResult;
}
//~--- fields ---------------------------------------------------------------
/** Field description */
private GitRepositoryHandler handler;
/** Field description */
private Repository repository;
}

View File

@@ -1,311 +0,0 @@
/**
* Copyright (c) 2010, Sebastian Sdorra
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* 3. Neither the name of SCM-Manager; nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* http://bitbucket.org/sdorra/scm-manager
*
*/
package sonia.scm.repository;
//~--- non-JDK imports --------------------------------------------------------
import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.api.errors.NoHeadException;
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.revwalk.RevCommit;
import org.eclipse.jgit.revwalk.RevWalk;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import sonia.scm.util.IOUtil;
//~--- JDK imports ------------------------------------------------------------
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
/**
*
* @author Sebastian Sdorra
*/
public class GitChangesetViewer implements ChangesetViewer
{
/** the logger for GitChangesetViewer */
private static final Logger logger =
LoggerFactory.getLogger(GitChangesetViewer.class);
//~--- constructors ---------------------------------------------------------
/**
* Constructs ...
*
*
* @param handler
* @param repository
*/
public GitChangesetViewer(GitRepositoryHandler handler, Repository repository)
{
this.handler = handler;
this.repository = repository;
}
//~--- get methods ----------------------------------------------------------
/**
* Method description
*
*
* @param revision
*
* @return
*/
@Override
public Changeset getChangeset(String revision)
{
if (logger.isDebugEnabled())
{
logger.debug("fetch changeset {}", revision);
}
Changeset changeset = null;
File directory = handler.getDirectory(repository);
org.eclipse.jgit.lib.Repository gr = null;
GitChangesetConverter converter = null;
try
{
gr = GitUtil.open(directory);
if (!gr.getAllRefs().isEmpty())
{
RevWalk revWalk = new RevWalk(gr);
ObjectId id = GitUtil.getRevisionId(gr, revision);
RevCommit commit = revWalk.parseCommit(id);
if (commit != null)
{
converter = new GitChangesetConverter(gr, revWalk);
changeset = converter.createChangeset(commit);
}
else if (logger.isWarnEnabled())
{
logger.warn("could not find revision {}", revision);
}
}
}
catch (IOException ex)
{
logger.error("could not open repository", ex);
}
finally
{
IOUtil.close(converter);
GitUtil.close(gr);
}
return changeset;
}
/**
* Method description
*
*
* @param start
* @param max
*
* @return
*/
@Override
public ChangesetPagingResult getChangesets(int start, int max)
{
if (logger.isDebugEnabled())
{
logger.debug("fetch changesets. start: {}, max: {}", start, max);
}
ChangesetPagingResult changesets = null;
File directory = handler.getDirectory(repository);
org.eclipse.jgit.lib.Repository gr = null;
GitChangesetConverter converter = null;
try
{
gr = GitUtil.open(directory);
int counter = 0;
List<Changeset> changesetList = new ArrayList<Changeset>();
if (!gr.getAllRefs().isEmpty())
{
converter = new GitChangesetConverter(gr);
Git git = new Git(gr);
ObjectId headId = GitUtil.getRepositoryHead(gr);
if (headId != null)
{
for (RevCommit commit : git.log().add(headId).call())
{
if ((counter >= start) && (counter < start + max))
{
changesetList.add(converter.createChangeset(commit));
}
counter++;
}
}
else if (logger.isWarnEnabled())
{
logger.warn("could not find repository head of repository {}",
repository.getName());
}
}
changesets = new ChangesetPagingResult(counter, changesetList);
}
catch (NoHeadException ex)
{
logger.error("could not read changesets", ex);
}
catch (GitAPIException ex)
{
logger.error("could not read changesets", ex);
}
catch (IOException ex)
{
logger.error("could not open repository", ex);
}
finally
{
IOUtil.close(converter);
GitUtil.close(gr);
}
return changesets;
}
/**
* Method description
*
*
* @param path
* @param revision
* @param start
* @param max
*
* @return
*/
@Override
public ChangesetPagingResult getChangesets(String path, String revision,
int start, int max)
{
if (logger.isDebugEnabled())
{
logger.debug(
"fetch changesets for path {} and revision {}. start: {}, max: {}",
new Object[] { path,
revision, start, max });
}
ChangesetPagingResult changesets = null;
File directory = handler.getDirectory(repository);
org.eclipse.jgit.lib.Repository gr = null;
GitChangesetConverter converter = null;
try
{
gr = GitUtil.open(directory);
int counter = 0;
List<Changeset> changesetList = new ArrayList<Changeset>();
if (!gr.getAllRefs().isEmpty())
{
converter = new GitChangesetConverter(gr);
Git git = new Git(gr);
ObjectId revisionId = GitUtil.getRevisionId(gr, revision);
if (revisionId != null)
{
for (RevCommit commit :
git.log().add(revisionId).addPath(path).call())
{
if ((counter >= start) && (counter < start + max))
{
changesetList.add(converter.createChangeset(commit));
}
counter++;
}
}
else if (logger.isWarnEnabled())
{
logger.warn("could not find repository head of repository {}",
repository.getName());
}
}
changesets = new ChangesetPagingResult(counter, changesetList);
}
catch (NoHeadException ex)
{
logger.error("could not read changesets", ex);
}
catch (GitAPIException ex)
{
logger.error("could not read changesets", ex);
}
catch (IOException ex)
{
logger.error("could not open repository", ex);
}
finally
{
IOUtil.close(converter);
GitUtil.close(gr);
}
return changesets;
}
//~--- fields ---------------------------------------------------------------
/** Field description */
private GitRepositoryHandler handler;
/** Field description */
private Repository repository;
}

View File

@@ -1,174 +0,0 @@
/**
* Copyright (c) 2010, Sebastian Sdorra
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* 3. Neither the name of SCM-Manager; nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* http://bitbucket.org/sdorra/scm-manager
*
*/
package sonia.scm.repository;
//~--- non-JDK imports --------------------------------------------------------
import org.eclipse.jgit.diff.DiffEntry;
import org.eclipse.jgit.diff.DiffFormatter;
import org.eclipse.jgit.revwalk.RevCommit;
import org.eclipse.jgit.revwalk.RevTree;
import org.eclipse.jgit.revwalk.RevWalk;
import org.eclipse.jgit.treewalk.EmptyTreeIterator;
import org.eclipse.jgit.treewalk.TreeWalk;
import org.eclipse.jgit.treewalk.filter.PathFilter;
import sonia.scm.util.Util;
//~--- JDK imports ------------------------------------------------------------
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.util.List;
/**
*
* @author Sebastian Sdorra
*/
public class GitDiffViewer implements DiffViewer
{
/**
* Constructs ...
*
*
* @param directory
*/
public GitDiffViewer(File directory)
{
this.directory = directory;
}
/**
* Constructs ...
*
*
* @param handler
* @param repository
*/
public GitDiffViewer(GitRepositoryHandler handler, Repository repository)
{
this(handler.getDirectory(repository));
}
//~--- get methods ----------------------------------------------------------
/**
* Method description
*
*
* @param revision
* @param path
* @param output
*
* @throws IOException
* @throws RepositoryException
*/
@Override
public void getDiff(String revision, String path, OutputStream output)
throws IOException, RepositoryException
{
org.eclipse.jgit.lib.Repository gr = GitUtil.open(directory);
RevWalk walk = null;
TreeWalk treeWalk = null;
DiffFormatter formatter = null;
try
{
walk = new RevWalk(gr);
RevCommit commit = walk.parseCommit(gr.resolve(revision));
walk.markStart(commit);
commit = walk.next();
treeWalk = new TreeWalk(gr);
treeWalk.reset();
treeWalk.setRecursive(true);
if (Util.isNotEmpty(path))
{
treeWalk.setFilter(PathFilter.create(path));
}
if (commit.getParentCount() > 0)
{
RevTree tree = commit.getParent(0).getTree();
if (tree != null)
{
treeWalk.addTree(tree);
}
else
{
treeWalk.addTree(new EmptyTreeIterator());
}
}
else
{
treeWalk.addTree(new EmptyTreeIterator());
}
treeWalk.addTree(commit.getTree());
formatter = new DiffFormatter(new BufferedOutputStream(output));
formatter.setRepository(gr);
List<DiffEntry> entries = DiffEntry.scan(treeWalk);
for (DiffEntry e : entries)
{
if (!e.getOldId().equals(e.getNewId()))
{
formatter.format(e);
}
}
formatter.flush();
}
finally
{
GitUtil.release(walk);
GitUtil.release(treeWalk);
GitUtil.release(formatter);
GitUtil.close(gr);
}
}
//~--- fields ---------------------------------------------------------------
/** Field description */
private File directory;
}

View File

@@ -1,581 +0,0 @@
/**
* Copyright (c) 2010, Sebastian Sdorra
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* 3. Neither the name of SCM-Manager; nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* http://bitbucket.org/sdorra/scm-manager
*
*/
package sonia.scm.repository;
//~--- non-JDK imports --------------------------------------------------------
import org.eclipse.jgit.errors.MissingObjectException;
import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.ObjectLoader;
import org.eclipse.jgit.revwalk.RevCommit;
import org.eclipse.jgit.revwalk.RevTree;
import org.eclipse.jgit.revwalk.RevWalk;
import org.eclipse.jgit.treewalk.TreeWalk;
import org.eclipse.jgit.treewalk.filter.AndTreeFilter;
import org.eclipse.jgit.treewalk.filter.PathFilter;
import org.eclipse.jgit.treewalk.filter.TreeFilter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import sonia.scm.util.Util;
//~--- JDK imports ------------------------------------------------------------
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
/**
*
* @author Sebastian Sdorra
*/
public class GitRepositoryBrowser implements RepositoryBrowser
{
/** Field description */
public static final String PATH_MODULES = ".gitmodules";
/** the logger for GitRepositoryBrowser */
private static final Logger logger =
LoggerFactory.getLogger(GitRepositoryBrowser.class);
//~--- constructors ---------------------------------------------------------
/**
* Constructs ...
*
*
* @param handler
* @param repository
*/
public GitRepositoryBrowser(GitRepositoryHandler handler,
Repository repository)
{
this.handler = handler;
this.repository = repository;
}
//~--- get methods ----------------------------------------------------------
/**
* Method description
*
*
* @param revision
* @param path
* @param output
*
* @throws IOException
* @throws RepositoryException
*/
@Override
public void getContent(String revision, String path, OutputStream output)
throws IOException, RepositoryException
{
File directory = handler.getDirectory(repository);
org.eclipse.jgit.lib.Repository repo = GitUtil.open(directory);
try
{
ObjectId revId = GitUtil.getRevisionId(repo, revision);
getContent(repo, revId, path, output);
}
finally
{
GitUtil.close(repo);
}
}
/**
* Method description
*
*
*
* @param repo
* @param revId
* @param path
* @param output
*
*
* @throws IOException
* @throws RepositoryException
*/
public void getContent(org.eclipse.jgit.lib.Repository repo, ObjectId revId,
String path, OutputStream output)
throws IOException, RepositoryException
{
TreeWalk treeWalk = null;
RevWalk revWalk = null;
try
{
treeWalk = new TreeWalk(repo);
treeWalk.setRecursive(Util.nonNull(path).contains("/"));
if (logger.isDebugEnabled())
{
logger.debug("load content for {} at {}", path, revId.name());
}
revWalk = new RevWalk(repo);
RevCommit entry = revWalk.parseCommit(revId);
RevTree revTree = entry.getTree();
if (revTree != null)
{
treeWalk.addTree(revTree);
}
else
{
logger.error("could not find tree for {}", revId.name());
}
treeWalk.setFilter(PathFilter.create(path));
if (treeWalk.next())
{
// Path exists
if (treeWalk.getFileMode(0).getObjectType() == Constants.OBJ_BLOB)
{
ObjectId blobId = treeWalk.getObjectId(0);
ObjectLoader loader = repo.open(blobId);
loader.copyTo(output);
}
else
{
// Not a blob, its something else (tree, gitlink)
throw new PathNotFoundException(path);
}
}
else
{
throw new PathNotFoundException(path);
}
}
finally
{
GitUtil.release(revWalk);
GitUtil.release(treeWalk);
}
}
/**
* Method description
*
*
* @param revision
* @param path
*
* @return
*
* @throws IOException
* @throws RepositoryException
*/
@Override
public BrowserResult getResult(String revision, String path)
throws IOException, RepositoryException
{
BrowserResult result = null;
File directory = handler.getDirectory(repository);
org.eclipse.jgit.lib.Repository repo = GitUtil.open(directory);
try
{
ObjectId revId = null;
if (Util.isEmpty(revision))
{
revId = GitUtil.getRepositoryHead(repo);
}
else
{
revId = GitUtil.getRevisionId(repo, revision);
}
if (revId != null)
{
result = getResult(repo, revId, path);
}
else
{
if (Util.isNotEmpty(revision))
{
logger.error("could not find revision {}", revision);
}
else if (logger.isWarnEnabled())
{
logger.warn("coul not find head of repository, empty?");
}
result = new BrowserResult(Constants.HEAD, null, null,
new ArrayList<FileObject>());
}
}
finally
{
GitUtil.close(repo);
}
return result;
}
//~--- methods --------------------------------------------------------------
/**
* Method description
*
*
* @param files
* @param repo
* @param revId
* @param path
*
* @throws IOException
* @throws RepositoryException
*/
private void appendSubModules(List<FileObject> files,
org.eclipse.jgit.lib.Repository repo,
ObjectId revId, String path)
throws IOException, RepositoryException
{
path = Util.nonNull(path);
Map<String, SubRepository> subRepositories = getSubRepositories(repo,
revId);
if (subRepositories != null)
{
for (Entry<String, SubRepository> e : subRepositories.entrySet())
{
String p = e.getKey();
if (p.startsWith(path))
{
p = p.substring(path.length());
if (p.startsWith("/"))
{
p = p.substring(1);
}
if (p.endsWith("/"))
{
p = p.substring(0, p.length() - 1);
}
if (!p.contains("/"))
{
FileObject fo = new FileObject();
fo.setDirectory(true);
fo.setPath(path);
fo.setName(p);
fo.setSubRepository(e.getValue());
files.add(fo);
}
}
}
}
}
/**
* Method description
*
*
*
*
* @param repo
* @param revId
* @param treeWalk
*
* @return
*
* @throws IOException
*/
private FileObject createFileObject(org.eclipse.jgit.lib.Repository repo,
ObjectId revId, TreeWalk treeWalk)
throws IOException
{
FileObject file = null;
try
{
file = new FileObject();
String path = treeWalk.getPathString();
file.setName(treeWalk.getNameString());
file.setPath(path);
ObjectLoader loader = repo.open(treeWalk.getObjectId(0));
file.setDirectory(loader.getType() == Constants.OBJ_TREE);
file.setLength(loader.getSize());
// don't show message and date for directories to improve performance
if (!file.isDirectory())
{
RevCommit commit = getLatestCommit(repo, revId, path);
if (commit != null)
{
file.setLastModified(GitUtil.getCommitTime(commit));
file.setDescription(commit.getShortMessage());
}
else if (logger.isWarnEnabled())
{
logger.warn("could not find latest commit for {} on {}", path, revId);
}
}
}
catch (MissingObjectException ex)
{
file = null;
logger.error("could not fetch object for id {}", revId);
if (logger.isTraceEnabled())
{
logger.trace("could not fetch object", ex);
}
}
return file;
}
//~--- get methods ----------------------------------------------------------
/**
* Method description
*
*
*
* @param repo
* @param revId
* @param path
*
* @return
*/
private RevCommit getLatestCommit(org.eclipse.jgit.lib.Repository repo,
ObjectId revId, String path)
{
RevCommit result = null;
RevWalk walk = null;
try
{
walk = new RevWalk(repo);
walk.setTreeFilter(AndTreeFilter.create(PathFilter.create(path),
TreeFilter.ANY_DIFF));
RevCommit commit = walk.parseCommit(revId);
walk.markStart(commit);
result = Util.getFirst(walk);
}
catch (Exception ex)
{
logger.error("could not parse commit for file", ex);
}
finally
{
GitUtil.release(walk);
}
return result;
}
/**
* Method description
*
*
* @param repo
* @param revId
* @param path
*
* @return
*
* @throws IOException
* @throws RepositoryException
*/
private BrowserResult getResult(org.eclipse.jgit.lib.Repository repo,
ObjectId revId, String path)
throws IOException, RepositoryException
{
BrowserResult result = null;
RevWalk revWalk = null;
TreeWalk treeWalk = null;
try
{
if (logger.isDebugEnabled())
{
logger.debug("load repository browser for revision {}", revId.name());
}
treeWalk = new TreeWalk(repo);
revWalk = new RevWalk(repo);
RevTree tree = revWalk.parseTree(revId);
if (tree != null)
{
treeWalk.addTree(tree);
}
else
{
logger.error("could not find tree for {}", revId.name());
}
result = new BrowserResult();
List<FileObject> files = new ArrayList<FileObject>();
appendSubModules(files, repo, revId, path);
if (Util.isEmpty(path))
{
while (treeWalk.next())
{
FileObject fo = createFileObject(repo, revId, treeWalk);
if (fo != null)
{
files.add(fo);
}
}
}
else
{
String[] parts = path.split("/");
int current = 0;
int limit = parts.length;
while (treeWalk.next())
{
String name = treeWalk.getNameString();
if (current >= limit)
{
String p = treeWalk.getPathString();
if (p.split("/").length > limit)
{
FileObject fo = createFileObject(repo, revId, treeWalk);
if (fo != null)
{
files.add(fo);
}
}
}
else if (name.equalsIgnoreCase(parts[current]))
{
current++;
treeWalk.enterSubtree();
}
}
}
result.setFiles(files);
result.setRevision(revId.getName());
}
finally
{
GitUtil.release(revWalk);
GitUtil.release(treeWalk);
}
return result;
}
/**
* Method description
*
*
* @param repo
* @param revision
*
* @return
*
* @throws IOException
* @throws RepositoryException
*/
private Map<String, SubRepository> getSubRepositories(
org.eclipse.jgit.lib.Repository repo, ObjectId revision)
throws IOException, RepositoryException
{
if (logger.isDebugEnabled())
{
logger.debug("read submodules of {} at {}", repository.getName(),
revision);
}
Map<String, SubRepository> subRepositories = null;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try
{
getContent(repo, revision, PATH_MODULES, baos);
subRepositories = GitSubModuleParser.parse(baos.toString());
}
catch (PathNotFoundException ex)
{
logger.trace("could not find .gitmodules", ex);
}
return subRepositories;
}
//~--- fields ---------------------------------------------------------------
/** Field description */
private GitRepositoryHandler handler;
/** Field description */
private Repository repository;
}

View File

@@ -97,99 +97,6 @@ public class GitRepositoryHandler
//~--- get methods ----------------------------------------------------------
/**
* Method description
*
*
* @param repository
*
* @return
*/
@Override
public BlameViewer getBlameViewer(Repository repository)
{
GitBlameViewer blameViewer = null;
AssertUtil.assertIsNotNull(repository);
String type = repository.getType();
AssertUtil.assertIsNotEmpty(type);
if (TYPE_NAME.equals(type))
{
blameViewer = new GitBlameViewer(this, repository);
}
else
{
throw new IllegalArgumentException("git repository is required");
}
return blameViewer;
}
/**
* Method description
*
*
* @param repository
*
* @return
*/
@Override
public ChangesetViewer getChangesetViewer(Repository repository)
{
GitChangesetViewer changesetViewer = null;
AssertUtil.assertIsNotNull(repository);
String type = repository.getType();
AssertUtil.assertIsNotEmpty(type);
if (TYPE_NAME.equals(type))
{
changesetViewer = new GitChangesetViewer(this, repository);
}
else
{
throw new IllegalArgumentException("git repository is required");
}
return changesetViewer;
}
/**
* Method description
*
*
* @param repository
*
* @return
*/
@Override
public DiffViewer getDiffViewer(Repository repository)
{
GitDiffViewer diffViewer = null;
AssertUtil.assertIsNotNull(repository);
String type = repository.getType();
AssertUtil.assertIsNotEmpty(type);
if (TYPE_NAME.equals(type))
{
diffViewer = new GitDiffViewer(this, repository);
}
else
{
throw new IllegalArgumentException("git repository is required");
}
return diffViewer;
}
/**
* Method description
*
@@ -202,22 +109,6 @@ public class GitRepositoryHandler
return new GitImportHandler(this);
}
/**
* Method description
*
*
* @param repository
*
* @return
*/
@Override
public RepositoryBrowser getRepositoryBrowser(Repository repository)
{
AssertUtil.assertIsNotNull(repository);
return new GitRepositoryBrowser(this, repository);
}
/**
* Method description
*

View File

@@ -1,108 +0,0 @@
/**
* Copyright (c) 2010, Sebastian Sdorra
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* 3. Neither the name of SCM-Manager; nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* http://bitbucket.org/sdorra/scm-manager
*
*/
package sonia.scm.repository;
//~--- non-JDK imports --------------------------------------------------------
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import sonia.scm.util.AssertUtil;
import sonia.scm.web.HgUtil;
//~--- JDK imports ------------------------------------------------------------
import java.io.IOException;
import java.util.Map;
/**
*
* @author Sebastian Sdorra
*/
public class HgBlameViewer extends AbstractHgHandler implements BlameViewer
{
/** the logger for HgBlameViewer */
private static final Logger logger =
LoggerFactory.getLogger(HgBlameViewer.class);
//~--- constructors ---------------------------------------------------------
/**
* Constructs ...
*
*
* @param handler
* @param context
* @param repository
* @param blameResultContext
*/
public HgBlameViewer(HgRepositoryHandler handler, HgContext context,
Repository repository)
{
super(handler, context, repository);
}
//~--- get methods ----------------------------------------------------------
/**
* Method description
*
*
* @param revision
* @param path
*
* @return
*
* @throws IOException
* @throws RepositoryException
*/
@Override
public BlameResult getBlame(String revision, String path)
throws IOException, RepositoryException
{
AssertUtil.assertIsNotEmpty(path);
if (logger.isDebugEnabled())
{
logger.debug("get blame result for {} at revision {}", path,
HgUtil.getRevision(revision));
}
Map<String, String> env = createEnvironment(revision, path);
return getResultFromScript(BlameResult.class, HgPythonScript.BLAME, env);
}
}

View File

@@ -1,244 +0,0 @@
/**
* Copyright (c) 2010, Sebastian Sdorra
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* 3. Neither the name of SCM-Manager; nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* http://bitbucket.org/sdorra/scm-manager
*
*/
package sonia.scm.repository;
//~--- non-JDK imports --------------------------------------------------------
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import sonia.scm.util.Util;
import sonia.scm.web.HgUtil;
//~--- JDK imports ------------------------------------------------------------
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import javax.xml.bind.JAXBContext;
/**
*
* @author Sebastian Sdorra
*/
public class HgChangesetViewer extends AbstractHgHandler
implements ChangesetViewer
{
/** the logger for HgChangesetViewer */
private static final Logger logger =
LoggerFactory.getLogger(HgChangesetViewer.class);
//~--- constructors ---------------------------------------------------------
/**
* Constructs ...
*
*
* @param handler
* @param jaxbContext
* @param context
* @param repositoryDirectory
*/
public HgChangesetViewer(HgRepositoryHandler handler, HgContext context,
File repositoryDirectory)
{
super(handler, context, null, repositoryDirectory);
}
/**
* Constructs ...
*
*
*
* @param handler
* @param jaxbContext
* @param context
* @param repository
*/
public HgChangesetViewer(HgRepositoryHandler handler,
JAXBContext jaxbContext, HgContext context,
Repository repository)
{
super(handler, context, repository);
}
//~--- get methods ----------------------------------------------------------
/**
* Method description
*
*
* @param revision
*
* @return
*
* @throws IOException
* @throws RepositoryException
*/
@Override
public Changeset getChangeset(String revision)
throws IOException, RepositoryException
{
Map<String, String> env = new HashMap<String, String>();
env.put(ENV_REVISION, HgUtil.getRevision(revision));
env.put(ENV_PATH, Util.EMPTY_STRING);
env.put(ENV_PAGE_START, Util.EMPTY_STRING);
env.put(ENV_PAGE_LIMIT, Util.EMPTY_STRING);
env.put(ENV_REVISION_START, Util.EMPTY_STRING);
env.put(ENV_REVISION_END, Util.EMPTY_STRING);
return getResultFromScript(Changeset.class, HgPythonScript.CHANGELOG, env);
}
/**
*
*
* @param start
* @param max
*
* @return
*
* @throws IOException
* @throws RepositoryException
*/
@Override
public ChangesetPagingResult getChangesets(int start, int max)
throws IOException, RepositoryException
{
if (logger.isDebugEnabled())
{
logger.debug("fetch changesets. start: {}, max: {}", start, max);
}
return getChangesets(null, null, String.valueOf(start),
String.valueOf(max), null, null);
}
/**
* Method description
*
*
* @param path
* @param revision
* @param start
* @param max
*
* @return
*
* @throws IOException
* @throws RepositoryException
*/
@Override
public ChangesetPagingResult getChangesets(String path, String revision,
int start, int max)
throws IOException, RepositoryException
{
revision = HgUtil.getRevision(revision);
if (logger.isDebugEnabled())
{
logger.debug(
"fetch changesets for path {} and revision {}. start: {}, max: {}",
new Object[] { path,
revision, start, max });
}
return getChangesets(path, revision, String.valueOf(start),
String.valueOf(max), null, null);
}
/**
* Method description
*
*
*
* @param path
* @param revision
* @param pageStart
* @param pageLimit
* @param revisionStart
* @param revisionEnd
*
* @return
*
* @throws IOException
* @throws RepositoryException
*/
public ChangesetPagingResult getChangesets(String path, String revision,
String pageStart, String pageLimit, String revisionStart,
String revisionEnd)
throws IOException, RepositoryException
{
Map<String, String> env = new HashMap<String, String>();
env.put(ENV_PATH, Util.nonNull(path));
env.put(ENV_REVISION, Util.nonNull(revision));
env.put(ENV_PAGE_START, Util.nonNull(pageStart));
env.put(ENV_PAGE_LIMIT, Util.nonNull(pageLimit));
env.put(ENV_REVISION_START, Util.nonNull(revisionStart));
env.put(ENV_REVISION_END, Util.nonNull(revisionEnd));
return getResultFromScript(ChangesetPagingResult.class,
HgPythonScript.CHANGELOG, env);
}
/**
* Method description
*
*
* @param startNode
* @param endNode
*
* @return
*
* @throws IOException
* @throws RepositoryException
*/
public ChangesetPagingResult getChangesets(String startNode, String endNode)
throws IOException, RepositoryException
{
if (logger.isDebugEnabled())
{
logger.debug("fetch changesets. start-node: {}, end-node: {}", startNode,
endNode);
}
return getChangesets(null, null, null, null, startNode, endNode);
}
}

View File

@@ -1,103 +0,0 @@
/**
* Copyright (c) 2010, Sebastian Sdorra
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* 3. Neither the name of SCM-Manager; nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* http://bitbucket.org/sdorra/scm-manager
*
*/
package sonia.scm.repository;
//~--- non-JDK imports --------------------------------------------------------
import sonia.scm.util.AssertUtil;
import sonia.scm.util.IOUtil;
import sonia.scm.util.Util;
//~--- JDK imports ------------------------------------------------------------
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
/**
*
* @author Sebastian Sdorra
*/
public class HgDiffViewer extends AbstractHgHandler implements DiffViewer
{
/**
* Constructs ...
*
*
* @param handler
* @param context
* @param repository
*/
public HgDiffViewer(HgRepositoryHandler handler, HgContext context,
Repository repository)
{
super(handler, context, repository);
}
//~--- get methods ----------------------------------------------------------
/**
* Method description
*
*
* @param revision
* @param path
* @param output
*
* @throws IOException
* @throws RepositoryException
*/
@Override
public void getDiff(String revision, String path, OutputStream output)
throws IOException, RepositoryException
{
AssertUtil.assertIsNotEmpty(revision);
AssertUtil.assertIsNotNull(output);
Process p = createHgProcess("diff", "-c", revision, Util.nonNull(path));
InputStream input = null;
try
{
handleErrorStream(p.getErrorStream());
input = p.getInputStream();
IOUtil.copy(input, output);
}
finally
{
IOUtil.close(input);
}
}
}

View File

@@ -1,129 +0,0 @@
/**
* Copyright (c) 2010, Sebastian Sdorra
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* 3. Neither the name of SCM-Manager; nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* http://bitbucket.org/sdorra/scm-manager
*
*/
package sonia.scm.repository;
//~--- non-JDK imports --------------------------------------------------------
import sonia.scm.util.IOUtil;
import sonia.scm.util.Util;
import sonia.scm.web.HgUtil;
//~--- JDK imports ------------------------------------------------------------
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Map;
/**
*
* @author Sebastian Sdorra
*/
public class HgRepositoryBrowser extends AbstractHgHandler
implements RepositoryBrowser
{
/**
* Constructs ...
*
*
* @param handler
* @param context
* @param repository
* @param browserResultContext
*/
public HgRepositoryBrowser(HgRepositoryHandler handler, HgContext context,
Repository repository)
{
super(handler, context, repository);
}
//~--- get methods ----------------------------------------------------------
/**
* Method description
*
*
* @param revision
* @param path
* @param output
*
*
* @throws IOException
* @throws RepositoryException
*/
@Override
public void getContent(String revision, String path, OutputStream output)
throws IOException, RepositoryException
{
revision = HgUtil.getRevision(revision);
Process p = createHgProcess("cat", "-r", revision, Util.nonNull(path));
InputStream input = null;
try
{
handleErrorStream(p.getErrorStream());
input = p.getInputStream();
IOUtil.copy(input, output);
}
finally
{
IOUtil.close(input);
}
}
/**
* Method description
*
*
* @param revision
* @param path
*
* @return
*
* @throws IOException
* @throws RepositoryException
*/
@Override
public BrowserResult getResult(String revision, String path)
throws IOException, RepositoryException
{
Map<String, String> env = createEnvironment(revision, path);
return getResultFromScript(BrowserResult.class, HgPythonScript.FILELOG,
env);
}
}

View File

@@ -212,104 +212,6 @@ public class HgRepositoryHandler
//~--- get methods ----------------------------------------------------------
/**
* Method description
*
*
* @param repository
*
* @return
*/
@Override
public BlameViewer getBlameViewer(Repository repository)
{
BlameViewer blameViewer = null;
AssertUtil.assertIsNotNull(repository);
String type = repository.getType();
AssertUtil.assertIsNotEmpty(type);
if (TYPE_NAME.equals(type))
{
blameViewer = new HgBlameViewer(this, hgContextProvider.get(),
repository);
}
else
{
throw new IllegalArgumentException("mercurial repository is required");
}
return blameViewer;
}
/**
* Method description
*
*
* @param repository
*
* @return
*/
@Override
public ChangesetViewer getChangesetViewer(Repository repository)
{
HgChangesetViewer changesetViewer = null;
AssertUtil.assertIsNotNull(repository);
String type = repository.getType();
AssertUtil.assertIsNotEmpty(type);
if (TYPE_NAME.equals(type))
{
changesetViewer = new HgChangesetViewer(this, jaxbContext,
hgContextProvider.get(), repository);
}
else
{
throw new IllegalArgumentException("mercurial repository is required");
}
return changesetViewer;
}
/**
* Method description
*
*
* @param repository
*
* @return
*
* @throws RepositoryException
*/
@Override
public DiffViewer getDiffViewer(Repository repository)
throws RepositoryException
{
DiffViewer diffViewer = null;
AssertUtil.assertIsNotNull(repository);
String type = repository.getType();
AssertUtil.assertIsNotEmpty(type);
if (TYPE_NAME.equals(type))
{
diffViewer = new HgDiffViewer(this, hgContextProvider.get(), repository);
}
else
{
throw new IllegalArgumentException("mercurial repository is required");
}
return diffViewer;
}
/**
* Method description
*
@@ -351,20 +253,6 @@ public class HgRepositoryHandler
return jaxbContext;
}
/**
* Method description
*
*
* @param repository
*
* @return
*/
@Override
public RepositoryBrowser getRepositoryBrowser(Repository repository)
{
return new HgRepositoryBrowser(this, hgContextProvider.get(), repository);
}
/**
* Method description
*
@@ -481,44 +369,6 @@ public class HgRepositoryHandler
return write;
}
//~--- get methods ----------------------------------------------------------
/**
* Method description
*
*
* @param repositoryDirectory
*
* @return
*/
HgChangesetViewer getChangesetViewer(File repositoryDirectory)
{
return getChangesetViewer(repositoryDirectory, hgContextProvider.get());
}
/**
* Method description
*
*
* @param repositoryDirectory
* @param context
*
* @return
*/
HgChangesetViewer getChangesetViewer(File repositoryDirectory,
HgContext context)
{
AssertUtil.assertIsNotNull(repositoryDirectory);
AssertUtil.assertIsNotNull(context);
if (!repositoryDirectory.isDirectory())
{
throw new IllegalStateException("directory not found");
}
return new HgChangesetViewer(this, context, repositoryDirectory);
}
//~--- set methods ----------------------------------------------------------
/**
@@ -810,7 +660,7 @@ public class HgRepositoryHandler
//~--- fields ---------------------------------------------------------------
/** Field description */
private Provider<HgContext> hgContextProvider;
private final Provider<HgContext> hgContextProvider;
/** Field description */
private JAXBContext jaxbContext;

View File

@@ -1,148 +0,0 @@
/**
* Copyright (c) 2010, Sebastian Sdorra
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* 3. Neither the name of SCM-Manager; nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* http://bitbucket.org/sdorra/scm-manager
*
*/
package sonia.scm.repository;
//~--- non-JDK imports --------------------------------------------------------
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.tmatesoft.svn.core.SVNURL;
import org.tmatesoft.svn.core.auth.ISVNAuthenticationManager;
import org.tmatesoft.svn.core.io.SVNRepository;
import org.tmatesoft.svn.core.io.SVNRepositoryFactory;
import org.tmatesoft.svn.core.wc.SVNLogClient;
import org.tmatesoft.svn.core.wc.SVNRevision;
import sonia.scm.util.Util;
//~--- JDK imports ------------------------------------------------------------
import java.io.File;
import java.util.ArrayList;
import java.util.List;
/**
* Class description
*
*
* @version Enter version here..., 11/09/14
* @author Enter your name here...
*/
public class SvnBlameViewer implements BlameViewer
{
/** the logger for SvnChangesetViewer */
private static final Logger logger =
LoggerFactory.getLogger(SvnChangesetViewer.class);
//~--- constructors ---------------------------------------------------------
/**
* Constructs ...
*
*
* @param handler
* @param repository
*/
public SvnBlameViewer(SvnRepositoryHandler handler, Repository repository)
{
this.handler = handler;
this.repository = repository;
}
//~--- get methods ----------------------------------------------------------
/**
* Method description
*
*
* @param revision
* @param path
*
* @return
*/
@Override
public BlameResult getBlame(String revision, String path)
{
List<BlameLine> blameLines = new ArrayList<BlameLine>();
File directory = handler.getDirectory(repository);
SVNRepository svnRepository = null;
SVNURL svnurl = null;
SVNRevision endRevision = null;
if (Util.isNotEmpty(revision))
{
endRevision = SVNRevision.create(Long.parseLong(revision));
}
else
{
endRevision = SVNRevision.HEAD;
}
try
{
svnurl = SVNURL.fromFile(new File(directory, path));
svnRepository = SVNRepositoryFactory.create(SVNURL.fromFile(directory));
ISVNAuthenticationManager svnManager =
svnRepository.getAuthenticationManager();
SVNLogClient svnLogClient = new SVNLogClient(svnManager, null);
svnLogClient.doAnnotate(svnurl, SVNRevision.UNDEFINED,
SVNRevision.create(1l), endRevision,
new SvnBlameHandler(svnRepository, path,
blameLines));
}
catch (Exception ex)
{
logger.error("could not create blame view", ex);
}
finally
{
SvnUtil.closeSession(svnRepository);
}
return new BlameResult(blameLines.size(), blameLines);
}
//~--- fields ---------------------------------------------------------------
/** Field description */
private SvnRepositoryHandler handler;
/** Field description */
private Repository repository;
}

View File

@@ -1,303 +0,0 @@
/**
* Copyright (c) 2010, Sebastian Sdorra
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* 3. Neither the name of SCM-Manager; nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* http://bitbucket.org/sdorra/scm-manager
*
*/
package sonia.scm.repository;
//~--- non-JDK imports --------------------------------------------------------
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.tmatesoft.svn.core.SVNException;
import org.tmatesoft.svn.core.SVNLogEntry;
import org.tmatesoft.svn.core.SVNURL;
import org.tmatesoft.svn.core.io.SVNRepository;
import org.tmatesoft.svn.core.io.SVNRepositoryFactory;
import sonia.scm.util.Util;
//~--- JDK imports ------------------------------------------------------------
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
/**
*
* @author Sebastian Sdorra
*/
public class SvnChangesetViewer implements ChangesetViewer
{
/** the logger for SvnChangesetViewer */
private static final Logger logger =
LoggerFactory.getLogger(SvnChangesetViewer.class);
//~--- constructors ---------------------------------------------------------
/**
* Constructs ...
*
*
* @param handler
* @param repostory
*/
public SvnChangesetViewer(SvnRepositoryHandler handler, Repository repostory)
{
this.handler = handler;
this.repostory = repostory;
}
//~--- get methods ----------------------------------------------------------
/**
* Method description
*
*
* @param revision
*
* @return
*/
@Override
public Changeset getChangeset(String revision)
{
Changeset changeset = null;
if (logger.isDebugEnabled())
{
logger.debug("fetch changeset {}", revision);
}
SVNRepository repository = null;
try
{
long revisioNumber = Long.parseLong(revision);
repository = createRepository();
Collection<SVNLogEntry> entries = repository.log(null, null,
revisioNumber, revisioNumber, true,
true);
if (Util.isNotEmpty(entries))
{
changeset = SvnUtil.createChangeset(entries.iterator().next());
}
}
catch (NumberFormatException ex)
{
if (logger.isWarnEnabled())
{
logger.warn("could not convert revision", ex);
}
}
catch (SVNException ex)
{
logger.error("could not open repository", ex);
}
finally
{
SvnUtil.closeSession(repository);
}
return changeset;
}
/**
* Method description
*
*
* @param start
* @param max
*
* @return
*/
@Override
public ChangesetPagingResult getChangesets(int start, int max)
{
if (logger.isDebugEnabled())
{
logger.debug("fetch changesets. start: {}, max: {}", start, max);
}
ChangesetPagingResult changesets = null;
SVNRepository repository = null;
try
{
repository = createRepository();
long total = repository.getLatestRevision();
long startRev = total - start;
long endRev = total - start - (max - 1);
if (endRev < 0)
{
endRev = 0;
}
List<Changeset> changesetList = new ArrayList<Changeset>();
Collection<SVNLogEntry> entries = repository.log(null, null, startRev,
endRev, true, true);
for (SVNLogEntry entry : entries)
{
changesetList.add(SvnUtil.createChangeset(entry));
}
total++;
changesets = new ChangesetPagingResult((int) total, changesetList);
}
catch (SVNException ex)
{
logger.error("could not open repository", ex);
}
finally
{
SvnUtil.closeSession(repository);
}
return changesets;
}
/**
* Method description
*
*
* @param path
* @param revision
* @param start
* @param max
*
* @return
*/
@Override
public ChangesetPagingResult getChangesets(String path, String revision,
int start, int max)
{
if (logger.isDebugEnabled())
{
logger.debug(
"fetch changesets for path {} and revision {}. start: {}, max: {}",
new Object[] { path,
revision, start, max });
}
ChangesetPagingResult changesets = null;
SVNRepository repository = null;
try
{
repository = createRepository();
long startRev = repository.getLatestRevision();
long endRev = 0;
long maxRev = startRev;
if (Util.isNotEmpty(revision))
{
try
{
maxRev = Long.parseLong(revision);
}
catch (NumberFormatException ex)
{
logger.error("could not parse revision ".concat(revision), ex);
}
}
List<Changeset> changesetList = new ArrayList<Changeset>();
Collection<SVNLogEntry> entries = repository.log(new String[] { path },
null, startRev, endRev, true, true);
for (SVNLogEntry entry : entries)
{
if (entry.getRevision() <= maxRev)
{
changesetList.add(SvnUtil.createChangeset(entry));
}
}
int total = changesetList.size();
int end = total - start;
if (end > max)
{
end = max;
}
if (start < 0)
{
start = 0;
}
changesetList = changesetList.subList(start, end);
changesets = new ChangesetPagingResult(total, changesetList);
}
catch (SVNException ex)
{
logger.error("could not open repository", ex);
}
finally
{
SvnUtil.closeSession(repository);
}
return changesets;
}
//~--- methods --------------------------------------------------------------
/**
* Method description
*
*
* @return
*
* @throws SVNException
*/
private SVNRepository createRepository() throws SVNException
{
return SVNRepositoryFactory.create(
SVNURL.fromFile(handler.getDirectory(repostory)));
}
//~--- fields ---------------------------------------------------------------
/** Field description */
private SvnRepositoryHandler handler;
/** Field description */
private Repository repostory;
}

View File

@@ -1,160 +0,0 @@
/**
* Copyright (c) 2010, Sebastian Sdorra
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* 3. Neither the name of SCM-Manager; nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* http://bitbucket.org/sdorra/scm-manager
*
*/
package sonia.scm.repository;
//~--- non-JDK imports --------------------------------------------------------
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.tmatesoft.svn.core.SVNDepth;
import org.tmatesoft.svn.core.SVNURL;
import org.tmatesoft.svn.core.wc.DefaultSVNDiffGenerator;
import org.tmatesoft.svn.core.wc.ISVNDiffGenerator;
import org.tmatesoft.svn.core.wc.SVNClientManager;
import org.tmatesoft.svn.core.wc.SVNDiffClient;
import org.tmatesoft.svn.core.wc.SVNRevision;
import sonia.scm.util.AssertUtil;
import sonia.scm.util.Util;
//~--- JDK imports ------------------------------------------------------------
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
/**
*
* @author Sebastian Sdorra
*/
public class SvnDiffViewer implements DiffViewer
{
/** the logger for SvnDiffViewer */
private static final Logger logger =
LoggerFactory.getLogger(SvnDiffViewer.class);
//~--- constructors ---------------------------------------------------------
/**
* Constructs ...
*
*
* @param directory
*/
public SvnDiffViewer(File directory)
{
this.directory = directory;
}
/**
* Constructs ...
*
*
* @param handler
* @param repository
*/
public SvnDiffViewer(SvnRepositoryHandler handler, Repository repository)
{
this(handler.getDirectory(repository));
}
//~--- get methods ----------------------------------------------------------
/**
* Method description
*
*
* @param revision
* @param path
* @param output
*
* @throws IOException
* @throws RepositoryException
*/
@Override
public void getDiff(String revision, String path, OutputStream output)
throws IOException, RepositoryException
{
AssertUtil.assertIsNotEmpty(revision);
AssertUtil.assertIsNotNull(output);
SVNClientManager clientManager = null;
try
{
SVNURL svnurl = SVNURL.fromFile(directory);
if (Util.isNotEmpty(path))
{
svnurl = svnurl.appendPath(path, true);
}
clientManager = SVNClientManager.newInstance();
SVNDiffClient diffClient = clientManager.getDiffClient();
ISVNDiffGenerator diffGenerator = diffClient.getDiffGenerator();
if (diffGenerator == null)
{
diffGenerator = new DefaultSVNDiffGenerator();
}
diffGenerator.setDiffAdded(true);
diffGenerator.setDiffDeleted(true);
diffClient.setDiffGenerator(diffGenerator);
long currentRev = Long.parseLong(revision);
diffClient.doDiff(svnurl, SVNRevision.HEAD,
SVNRevision.create(currentRev - 1),
SVNRevision.create(currentRev), SVNDepth.INFINITY,
false, output);
}
catch (Exception ex)
{
logger.error("could not create diff", ex);
}
finally
{
SvnUtil.dispose(clientManager);
}
}
//~--- fields ---------------------------------------------------------------
/** Field description */
private File directory;
}

View File

@@ -1,320 +0,0 @@
/**
* Copyright (c) 2010, Sebastian Sdorra
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* 3. Neither the name of SCM-Manager; nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* http://bitbucket.org/sdorra/scm-manager
*
*/
package sonia.scm.repository;
//~--- non-JDK imports --------------------------------------------------------
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.tmatesoft.svn.core.SVNDirEntry;
import org.tmatesoft.svn.core.SVNException;
import org.tmatesoft.svn.core.SVNNodeKind;
import org.tmatesoft.svn.core.SVNProperties;
import org.tmatesoft.svn.core.SVNProperty;
import org.tmatesoft.svn.core.SVNURL;
import org.tmatesoft.svn.core.io.SVNRepository;
import org.tmatesoft.svn.core.io.SVNRepositoryFactory;
import sonia.scm.util.Util;
//~--- JDK imports ------------------------------------------------------------
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
/**
*
* @author Sebastian Sdorra
*/
public class SvnRepositoryBrowser implements RepositoryBrowser
{
/** the logger for SvnRepositoryBrowser */
private static final Logger logger =
LoggerFactory.getLogger(SvnRepositoryBrowser.class);
//~--- constructors ---------------------------------------------------------
/**
* Constructs ...
*
*
* @param handler
* @param repository
*/
public SvnRepositoryBrowser(SvnRepositoryHandler handler,
Repository repository)
{
this.handler = handler;
this.repository = repository;
}
//~--- get methods ----------------------------------------------------------
/**
* http://wiki.svnkit.com/Printing_Out_File_Contents
*
*
* @param revision
* @param path
* @param output
*
*
* @throws IOException
* @throws RepositoryException
*/
@Override
public void getContent(String revision, String path, OutputStream output)
throws IOException, RepositoryException
{
long revisionNumber = getRevisionNumber(revision);
SVNRepository svnRepository = null;
try
{
svnRepository = getSvnRepository();
svnRepository.getFile(path, revisionNumber, new SVNProperties(), output);
}
catch (SVNException ex)
{
logger.error("could not open repository", ex);
}
finally
{
SvnUtil.closeSession(svnRepository);
}
}
/**
* Method description
*
*
* @param revision
* @param path
*
* @return
*
* @throws IOException
* @throws RepositoryException
*/
@Override
public BrowserResult getResult(String revision, String path)
throws IOException, RepositoryException
{
long revisionNumber = getRevisionNumber(revision);
if (logger.isDebugEnabled())
{
logger.debug("browser repository {} in path {} at revision {}",
new Object[] { repository.getName(),
path, revision });
}
BrowserResult result = null;
SVNRepository svnRepository = null;
try
{
svnRepository = getSvnRepository();
Collection<SVNDirEntry> entries =
svnRepository.getDir(Util.nonNull(path), revisionNumber, null,
(Collection) null);
List<FileObject> children = new ArrayList<FileObject>();
String basePath = Util.EMPTY_STRING;
if (Util.isNotEmpty(path))
{
basePath = path;
if (!basePath.endsWith("/"))
{
basePath = basePath.concat("/");
}
}
for (SVNDirEntry entry : entries)
{
children.add(createFileObject(svnRepository, revisionNumber, entry,
basePath));
}
result = new BrowserResult();
result.setRevision(revision);
result.setFiles(children);
}
catch (SVNException ex)
{
logger.error("could not open repository", ex);
}
finally
{
SvnUtil.closeSession(svnRepository);
}
return result;
}
//~--- methods --------------------------------------------------------------
/**
* Method description
*
*
*
* @param repository
* @param revision
* @param entry
* @param path
*
* @return
*/
private FileObject createFileObject(SVNRepository repository, long revision,
SVNDirEntry entry, String path)
{
FileObject fileObject = new FileObject();
fileObject.setName(entry.getName());
fileObject.setPath(path.concat(entry.getRelativePath()));
fileObject.setDirectory(entry.getKind() == SVNNodeKind.DIR);
if (entry.getDate() != null)
{
fileObject.setLastModified(entry.getDate().getTime());
}
fileObject.setLength(entry.getSize());
fileObject.setDescription(entry.getCommitMessage());
if (fileObject.isDirectory() && entry.hasProperties())
{
fetchExternalsProperty(repository, revision, entry, fileObject);
}
return fileObject;
}
/**
* Method description
*
*
* @param repository
* @param revision
* @param entry
* @param fileObject
*/
private void fetchExternalsProperty(SVNRepository repository, long revision,
SVNDirEntry entry, FileObject fileObject)
{
try
{
SVNProperties properties = new SVNProperties();
repository.getFile(entry.getRelativePath(), revision, properties, null);
String externals = properties.getStringValue(SVNProperty.EXTERNALS);
if (Util.isNotEmpty(externals))
{
SubRepository subRepository = new SubRepository(externals);
fileObject.setSubRepository(subRepository);
}
}
catch (SVNException ex)
{
logger.error("could not fetch file properties");
}
}
//~--- get methods ----------------------------------------------------------
/**
* Method description
*
*
* @param revision
*
* @return
*
* @throws RepositoryException
*/
private long getRevisionNumber(String revision) throws RepositoryException
{
long revisionNumber = -1;
if (Util.isNotEmpty(revision))
{
try
{
revisionNumber = Long.parseLong(revision);
}
catch (NumberFormatException ex)
{
throw new RepositoryException("given revision is not a svnrevision");
}
}
return revisionNumber;
}
/**
* Method description
*
*
* @return
*
* @throws SVNException
*/
private SVNRepository getSvnRepository() throws SVNException
{
File directory = handler.getDirectory(repository);
return SVNRepositoryFactory.create(SVNURL.fromFile(directory));
}
//~--- fields ---------------------------------------------------------------
/** Field description */
private SvnRepositoryHandler handler;
/** Field description */
private Repository repository;
}

View File

@@ -132,99 +132,6 @@ public class SvnRepositoryHandler
//~--- get methods ----------------------------------------------------------
/**
* Method description
*
*
* @param repository
*
* @return
*/
@Override
public BlameViewer getBlameViewer(Repository repository)
{
SvnBlameViewer blameViewer = null;
AssertUtil.assertIsNotNull(repository);
String type = repository.getType();
AssertUtil.assertIsNotEmpty(type);
if (TYPE_NAME.equals(type))
{
blameViewer = new SvnBlameViewer(this, repository);
}
else
{
throw new IllegalArgumentException("svn repository is required");
}
return blameViewer;
}
/**
* Method description
*
*
* @param repository
*
* @return
*/
@Override
public ChangesetViewer getChangesetViewer(Repository repository)
{
SvnChangesetViewer changesetViewer = null;
AssertUtil.assertIsNotNull(repository);
String type = repository.getType();
AssertUtil.assertIsNotEmpty(type);
if (TYPE_NAME.equals(type))
{
changesetViewer = new SvnChangesetViewer(this, repository);
}
else
{
throw new IllegalArgumentException("svn repository is required");
}
return changesetViewer;
}
/**
* Method description
*
*
* @param repository
*
* @return
*/
@Override
public DiffViewer getDiffViewer(Repository repository)
{
SvnDiffViewer diffViewer = null;
AssertUtil.assertIsNotNull(repository);
String type = repository.getType();
AssertUtil.assertIsNotEmpty(type);
if (TYPE_NAME.equals(type))
{
diffViewer = new SvnDiffViewer(this, repository);
}
else
{
throw new IllegalArgumentException("svn repository is required");
}
return diffViewer;
}
/**
* Method description
*
@@ -237,22 +144,6 @@ public class SvnRepositoryHandler
return new SvnImportHandler(this);
}
/**
* Method description
*
*
* @param repository
*
* @return
*/
@Override
public RepositoryBrowser getRepositoryBrowser(Repository repository)
{
AssertUtil.assertIsNotNull(repository);
return new SvnRepositoryBrowser(this, repository);
}
/**
* Method description
*

View File

@@ -109,8 +109,6 @@ public final class RepositoryTestData
happyVerticalPeopleTransporter.setName("happyVerticalPeopleTransporter");
happyVerticalPeopleTransporter.setDescription(
"Happy Vertical People Transporter");
happyVerticalPeopleTransporter.setUrl(
"http://hitchhiker.com/dummy/HeartOfGold");
return happyVerticalPeopleTransporter;
}
@@ -143,7 +141,6 @@ public final class RepositoryTestData
heartOfGold.setName("HeartOfGold");
heartOfGold.setDescription(
"Heart of Gold is the first prototype ship to successfully utilise the revolutionary Infinite Improbability Drive");
heartOfGold.setUrl("http://hitchhiker.com/dummy/HeartOfGold");
return heartOfGold;
}

View File

@@ -49,8 +49,6 @@ import org.mockito.stubbing.Answer;
import sonia.scm.SCMContextProvider;
import sonia.scm.user.User;
import sonia.scm.user.UserTestData;
import sonia.scm.web.security.DummyWebSecurityContext;
import sonia.scm.web.security.WebSecurityContext;
import static org.mockito.Mockito.*;
@@ -176,26 +174,6 @@ public final class MockUtil
//~--- get methods ----------------------------------------------------------
/**
* Method description
*
*
* @return
*/
public static Provider<WebSecurityContext> getAdminSecurityContextProvider()
{
User admin = new User("scmadmin", "SCM Admin", "scmadmin@scm.org");
admin.setAdmin(true);
DummyWebSecurityContext context = new DummyWebSecurityContext(admin);
Provider<WebSecurityContext> scp = mock(Provider.class);
when(scp.get()).thenReturn(context);
return scp;
}
/**
* Method description
*

View File

@@ -1,146 +0,0 @@
/**
* Copyright (c) 2010, Sebastian Sdorra
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* 3. Neither the name of SCM-Manager; nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* http://bitbucket.org/sdorra/scm-manager
*
*/
package sonia.scm.web.security;
//~--- non-JDK imports --------------------------------------------------------
import sonia.scm.user.User;
//~--- JDK imports ------------------------------------------------------------
import java.util.HashSet;
import java.util.Set;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
*
* @author Sebastian Sdorra
*/
public class DummyWebSecurityContext implements WebSecurityContext
{
/**
* Constructs ...
*
*
* @param user
*/
public DummyWebSecurityContext(User user)
{
this.user = user;
}
//~--- methods --------------------------------------------------------------
/**
* Method description
*
*
* @param request
* @param response
* @param username
* @param password
*
* @return
*/
@Override
public User authenticate(HttpServletRequest request,
HttpServletResponse response, String username,
String password)
{
return user;
}
/**
* Method description
*
*
* @param request
* @param response
*/
@Override
public void logout(HttpServletRequest request, HttpServletResponse response)
{
// do nothing
}
//~--- get methods ----------------------------------------------------------
/**
* Method description
*
*
* @return
*/
@Override
public Set<String> getGroups()
{
return groups;
}
/**
* Method description
*
*
* @return
*/
@Override
public User getUser()
{
return user;
}
/**
* Method description
*
*
* @return
*/
@Override
public boolean isAuthenticated()
{
return true;
}
//~--- fields ---------------------------------------------------------------
/** Field description */
private Set<String> groups = new HashSet<String>();
/** Field description */
private User user;
}

View File

@@ -69,11 +69,9 @@ import sonia.scm.plugin.DefaultPluginManager;
import sonia.scm.plugin.Plugin;
import sonia.scm.plugin.PluginLoader;
import sonia.scm.plugin.PluginManager;
import sonia.scm.repository.ChangesetViewerUtil;
import sonia.scm.repository.DefaultRepositoryManager;
import sonia.scm.repository.DefaultRepositoryProvider;
import sonia.scm.repository.Repository;
import sonia.scm.repository.RepositoryBrowserUtil;
import sonia.scm.repository.RepositoryDAO;
import sonia.scm.repository.RepositoryManager;
import sonia.scm.repository.RepositoryManagerProvider;
@@ -96,7 +94,6 @@ import sonia.scm.security.KeyGenerator;
import sonia.scm.security.LoginAttemptHandler;
import sonia.scm.security.MessageDigestEncryptionHandler;
import sonia.scm.security.RepositoryPermissionResolver;
import sonia.scm.security.SecurityContext;
import sonia.scm.security.SecuritySystem;
import sonia.scm.store.BlobStoreFactory;
import sonia.scm.store.ConfigurationEntryStoreFactory;
@@ -109,11 +106,9 @@ import sonia.scm.store.ListenableStoreFactory;
import sonia.scm.store.StoreFactory;
import sonia.scm.template.DefaultEngine;
import sonia.scm.template.FreemarkerTemplateEngine;
import sonia.scm.template.FreemarkerTemplateHandler;
import sonia.scm.template.MustacheTemplateEngine;
import sonia.scm.template.TemplateEngine;
import sonia.scm.template.TemplateEngineFactory;
import sonia.scm.template.TemplateHandler;
import sonia.scm.template.TemplateServlet;
import sonia.scm.url.RestJsonUrlProvider;
import sonia.scm.url.RestXmlUrlProvider;
@@ -134,10 +129,8 @@ import sonia.scm.web.filter.LoggingFilter;
import sonia.scm.web.security.AdministrationContext;
import sonia.scm.web.security.ApiBasicAuthenticationFilter;
import sonia.scm.web.security.AuthenticationManager;
import sonia.scm.web.security.BasicSecurityContext;
import sonia.scm.web.security.ChainAuthenticatonManager;
import sonia.scm.web.security.DefaultAdministrationContext;
import sonia.scm.web.security.WebSecurityContext;
//~--- JDK imports ------------------------------------------------------------
@@ -282,8 +275,6 @@ public class ScmServletModule extends ServletModule
// bind security stuff
bind(PermissionResolver.class, RepositoryPermissionResolver.class);
bind(AuthenticationManager.class, ChainAuthenticatonManager.class);
bind(SecurityContext.class).to(BasicSecurityContext.class);
bind(WebSecurityContext.class).to(BasicSecurityContext.class);
bind(SecuritySystem.class).to(DefaultSecuritySystem.class);
bind(AdministrationContext.class, DefaultAdministrationContext.class);
bind(LoginAttemptHandler.class, ConfigurableLoginAttemptHandler.class);
@@ -303,8 +294,6 @@ public class ScmServletModule extends ServletModule
bindDecorated(GroupManager.class, DefaultGroupManager.class,
GroupManagerProvider.class);
bind(CGIExecutorFactory.class, DefaultCGIExecutorFactory.class);
bind(ChangesetViewerUtil.class);
bind(RepositoryBrowserUtil.class);
// bind httpclient
bind(HttpClient.class, URLHttpClient.class);
@@ -362,7 +351,6 @@ public class ScmServletModule extends ServletModule
serve(PATTERN_PLUGIN_SCRIPT).with(ScriptResourceServlet.class);
// template
bind(TemplateHandler.class).to(FreemarkerTemplateHandler.class);
serve(PATTERN_INDEX, "/").with(TemplateServlet.class);
Multibinder<TemplateEngine> engineBinder =
@@ -593,8 +581,8 @@ public class ScmServletModule extends ServletModule
//~--- fields ---------------------------------------------------------------
/** Field description */
private ClassOverrides overrides;
private final ClassOverrides overrides;
/** Field description */
private DefaultPluginLoader pluginLoader;
private final DefaultPluginLoader pluginLoader;
}

View File

@@ -1016,8 +1016,24 @@ public class RepositoryResource
@Override
protected Repository prepareForReturn(Repository repository)
{
RepositoryUtil.appendUrl(configuration, repositoryManager, repository);
prepareRepository(repository);
if (isOwner(repository))
{
if (repository.getPermissions() == null)
{
repository.setPermissions(new ArrayList<Permission>());
}
}
else
{
if (logger.isTraceEnabled())
{
logger.trace("remove properties and permissions from repository, "
+ "because the user is not privileged");
}
repository.setProperties(null);
repository.setPermissions(null);
}
return repository;
}
@@ -1050,38 +1066,6 @@ public class RepositoryResource
return PATH_PART;
}
//~--- methods --------------------------------------------------------------
/**
* Method description
*
*
* @param repository
*/
private void prepareRepository(Repository repository)
{
if (isOwner(repository))
{
if (repository.getPermissions() == null)
{
repository.setPermissions(new ArrayList<Permission>());
}
}
else
{
if (logger.isTraceEnabled())
{
logger.trace("remove properties and permissions from repository, "
+ "because the user is not privileged");
}
repository.setProperties(null);
repository.setPermissions(null);
}
}
//~--- get methods ----------------------------------------------------------
/**
* Method description
*

View File

@@ -559,52 +559,6 @@ public class DefaultRepositoryManager extends AbstractRepositoryManager
return getAll(null, start, limit);
}
/**
* Method description
*
*
* @param repository
*
* @return
*
* @throws RepositoryException
*/
@Override
public BlameViewer getBlameViewer(Repository repository)
throws RepositoryException
{
AssertUtil.assertIsNotNull(repository);
BlameViewer viewer = null;
if (isReader(repository))
{
viewer = getHandler(repository).getBlameViewer(repository);
}
return viewer;
}
/**
* Method description
*
*
* @param repository
*
* @return
*
* @throws RepositoryException
*/
@Override
public ChangesetViewer getChangesetViewer(Repository repository)
throws RepositoryException
{
AssertUtil.assertIsNotNull(repository);
isReader(repository);
return getHandler(repository).getChangesetViewer(repository);
}
/**
* Method description
*
@@ -627,32 +581,6 @@ public class DefaultRepositoryManager extends AbstractRepositoryManager
return validTypes;
}
/**
* Method description
*
*
* @param repository
*
* @return
*
* @throws RepositoryException
*/
@Override
public DiffViewer getDiffViewer(Repository repository)
throws RepositoryException
{
AssertUtil.assertIsNotNull(repository);
DiffViewer viewer = null;
if (isReader(repository))
{
viewer = getHandler(repository).getDiffViewer(repository);
}
return viewer;
}
/**
* Method description
*
@@ -779,26 +707,6 @@ public class DefaultRepositoryManager extends AbstractRepositoryManager
return repositoryDAO.getLastModified();
}
/**
* Method description
*
*
* @param repository
*
* @return
*
* @throws RepositoryException
*/
@Override
public RepositoryBrowser getRepositoryBrowser(Repository repository)
throws RepositoryException
{
AssertUtil.assertIsNotNull(repository);
isReader(repository);
return getHandler(repository).getRepositoryBrowser(repository);
}
/**
* Method description
*

View File

@@ -98,7 +98,7 @@ public class FreemarkerTemplateEngine implements TemplateEngine
new MultiTemplateLoader(
new TemplateLoader[] {
new WebappTemplateLoader(servletContext, DIRECTORY_ROOT),
new ClassTemplateLoader(FreemarkerTemplateHandler.class,
new ClassTemplateLoader(FreemarkerTemplateEngine.class,
DIRECTORY_ROOT)
}
)

View File

@@ -1,162 +0,0 @@
/**
* Copyright (c) 2010, Sebastian Sdorra
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* 3. Neither the name of SCM-Manager; nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* http://bitbucket.org/sdorra/scm-manager
*
*/
package sonia.scm.template;
//~--- non-JDK imports --------------------------------------------------------
import com.google.inject.Inject;
import com.google.inject.Singleton;
import freemarker.cache.ClassTemplateLoader;
import freemarker.cache.MultiTemplateLoader;
import freemarker.cache.TemplateLoader;
import freemarker.cache.WebappTemplateLoader;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
//~--- JDK imports ------------------------------------------------------------
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.Writer;
import java.util.Locale;
import java.util.Map;
import javax.servlet.ServletContext;
/**
*
* @author Sebastian Sdorra
*/
@Singleton
public class FreemarkerTemplateHandler implements TemplateHandler
{
/** Field description */
public static final String DIRECTORY_CLASS_TEMPLATES = "/templates";
/** Field description */
public static final String DIRECTORY_TEMPLATES = "/";
/** Field description */
public static final String ENCODING = "UTF-8";
/** Field description */
public static final String EXTENSION = ".html";
/** the logger for FreemarkerTemplateHandler */
private static final Logger logger =
LoggerFactory.getLogger(FreemarkerTemplateHandler.class);
//~--- constructors ---------------------------------------------------------
/**
* Constructs ...
*
*
* @param servletContext
*/
@Inject
public FreemarkerTemplateHandler(ServletContext servletContext)
{
configuration = new Configuration();
configuration.setEncoding(Locale.ENGLISH, ENCODING);
//J-
configuration.setTemplateLoader(
new MultiTemplateLoader(
new TemplateLoader[] {
new WebappTemplateLoader(servletContext, DIRECTORY_TEMPLATES),
new ClassTemplateLoader(FreemarkerTemplateHandler.class,
DIRECTORY_CLASS_TEMPLATES)
}
)
);
//J+
}
//~--- methods --------------------------------------------------------------
/**
* Method description
*
*
* @param templateName
* @param writer
* @param params
*
* @throws IOException
*/
@Override
public void render(String templateName, Writer writer,
Map<String, ? extends Object> params)
throws IOException
{
if (!templateName.endsWith(EXTENSION))
{
templateName = templateName.concat(EXTENSION);
}
Template template = configuration.getTemplate(templateName, ENCODING);
if (template == null)
{
throw new FileNotFoundException(
"file ".concat(templateName).concat(" not found"));
}
else
{
try
{
template.process(params, writer);
}
catch (TemplateException ex)
{
logger.error("could not render template ".concat(templateName), ex);
throw new IOException(ex);
}
}
}
//~--- fields ---------------------------------------------------------------
/** Field description */
private Configuration configuration;
}

View File

@@ -1,250 +0,0 @@
/**
* Copyright (c) 2010, Sebastian Sdorra
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* 3. Neither the name of SCM-Manager; nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* http://bitbucket.org/sdorra/scm-manager
*
*/
package sonia.scm.web.security;
//~--- non-JDK imports --------------------------------------------------------
import com.google.inject.Inject;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.subject.PrincipalCollection;
import org.apache.shiro.subject.Subject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import sonia.scm.config.ScmConfiguration;
import sonia.scm.group.GroupNames;
import sonia.scm.security.Tokens;
import sonia.scm.user.User;
import sonia.scm.user.UserManager;
//~--- JDK imports ------------------------------------------------------------
import java.util.Collection;
import java.util.Collections;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
*
* @author Sebastian Sdorra
*/
public class BasicSecurityContext implements WebSecurityContext
{
/** Field description */
public static final String SCM_CREDENTIALS = "SCM_CREDENTIALS";
/** Field description */
public static final String USER_ANONYMOUS = "anonymous";
/** the logger for BasicSecurityContext */
private static final Logger logger =
LoggerFactory.getLogger(BasicSecurityContext.class);
//~--- constructors ---------------------------------------------------------
/**
* Constructs ...
*
*
* @param configuration
* @param userManager
*/
@Inject
public BasicSecurityContext(ScmConfiguration configuration,
UserManager userManager)
{
this.configuration = configuration;
this.userManager = userManager;
}
//~--- methods --------------------------------------------------------------
/**
* Method description
*
*
* @param request
* @param response
* @param username
* @param password
*
* @return
*/
@Override
public User authenticate(HttpServletRequest request,
HttpServletResponse response, String username, String password)
{
User user = null;
try
{
Subject subject = SecurityUtils.getSubject();
subject.login(Tokens.createAuthenticationToken(request, username,
password));
user = subject.getPrincipals().oneByType(User.class);
}
catch (AuthenticationException ex)
{
if (logger.isWarnEnabled())
{
logger.warn("authentication failed", ex);
}
}
return user;
}
/**
* Method description
*
*
* @param request
* @param response
*/
@Override
public void logout(HttpServletRequest request, HttpServletResponse response)
{
SecurityUtils.getSubject().logout();
HttpSession session = request.getSession(false);
if (session != null)
{
session.invalidate();
}
}
//~--- get methods ----------------------------------------------------------
/**
* Method description
*
*
* @return
*/
@Override
public Collection<String> getGroups()
{
GroupNames groups = getPrincipal(GroupNames.class);
Collection<String> groupCollection = null;
if (groups != null)
{
groupCollection = groups.getCollection();
}
else
{
groupCollection = Collections.EMPTY_LIST;
}
return groupCollection;
}
/**
* Method description
*
*
* @return
*/
@Override
public User getUser()
{
User user = getPrincipal(User.class);
if ((user == null) && configuration.isAnonymousAccessEnabled())
{
user = userManager.get(USER_ANONYMOUS);
}
return user;
}
/**
* Method description
*
*
* @return
*/
@Override
public boolean isAuthenticated()
{
return getUser() != null;
}
/**
* Method description
*
*
* @param clazz
* @param <T>
*
* @return
*/
private <T> T getPrincipal(Class<T> clazz)
{
T result = null;
Subject subject = SecurityUtils.getSubject();
if (subject.isAuthenticated() || subject.isRemembered())
{
PrincipalCollection pc = subject.getPrincipals();
if (pc != null)
{
result = pc.oneByType(clazz);
}
}
return result;
}
//~--- fields ---------------------------------------------------------------
/** Field description */
private ScmConfiguration configuration;
/** Field description */
private UserManager userManager;
}

View File

@@ -1,92 +0,0 @@
/**
* Copyright (c) 2010, Sebastian Sdorra
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* 3. Neither the name of SCM-Manager; nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* http://bitbucket.org/sdorra/scm-manager
*
*/
package sonia.scm.web.security;
//~--- non-JDK imports --------------------------------------------------------
import com.google.inject.Provider;
import sonia.scm.SCMContext;
/**
*
* @author Sebastian Sdorra
* @deprecated
*/
@Deprecated
public final class SecurityUtil
{
/**
* Constructs ...
*
*/
private SecurityUtil() {}
//~--- get methods ----------------------------------------------------------
/**
* Method description
*
*
* @param securityContextProvider
*
* @return
*/
public static String getUsername(
Provider<WebSecurityContext> securityContextProvider)
{
return getUsername(securityContextProvider.get());
}
/**
* Method description
*
*
* @param securityContext
*
* @return
*/
public static String getUsername(WebSecurityContext securityContext)
{
String user = SCMContext.USER_ANONYMOUS;
if ((securityContext != null) && (securityContext.getUser() != null))
{
user = securityContext.getUser().getName();
}
return user;
}
}

View File

@@ -77,6 +77,7 @@ import java.util.Collection;
*
* @author Sebastian Sdorra
*/
@Ignore
@RunWith(Parameterized.class)
public class AnonymousAccessITCase
{
@@ -312,15 +313,17 @@ public class AnonymousAccessITCase
File directory = temporaryFolder.newFolder();
RepositoryClient client = null;
// TODO create repository url
if ((username != null) && (password != null))
{
client = RepositoryClientFactory.createClient(repositoryType, directory,
repository.getUrl(), username, password);
null, username, password);
}
else
{
client = RepositoryClientFactory.createClient(repositoryType, directory,
repository.getUrl());
null);
}
client.init();

View File

@@ -77,6 +77,7 @@ import java.util.Random;
*
* @author Sebastian Sdorra
*/
@Ignore
@RunWith(Parameterized.class)
public class ChangesetViewerITCase extends AbstractAdminITCaseBase
{
@@ -264,8 +265,9 @@ public class ChangesetViewerITCase extends AbstractAdminITCaseBase
private RepositoryClient createRepositoryClient()
throws RepositoryClientException
{
// TODO create repository url
return RepositoryClientFactory.createClient(repositoryType, localDirectory,
repository.getUrl(), IntegrationTestUtil.ADMIN_USERNAME,
null, IntegrationTestUtil.ADMIN_USERNAME,
IntegrationTestUtil.ADMIN_PASSWORD);
}

View File

@@ -68,11 +68,13 @@ import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import org.junit.Ignore;
/**
*
* @author Sebastian Sdorra
*/
@Ignore
public class RepositoryITCaseBase
{
@@ -140,9 +142,10 @@ public class RepositoryITCaseBase
try
{
// TODO create repository url
RepositoryClient rc =
RepositoryClientFactory.createClient(repository.getType(), directory,
repository.getUrl(), username, password);
null, username, password);
rc.init();
addTestFiles(rc);
@@ -342,8 +345,9 @@ public class RepositoryITCaseBase
protected RepositoryClient createRepositoryClient(User user, File directory)
throws RepositoryClientException
{
// TODO create repository url
return RepositoryClientFactory.createClient(repository.getType(),
directory, repository.getUrl(), user.getName(), password);
directory, null, user.getName(), password);
}
//~--- fields ---------------------------------------------------------------