You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ace.apache.org by ja...@apache.org on 2016/01/26 16:19:17 UTC

svn commit: r1726821 [2/2] - in /ace/trunk: cnf/lib/ cnf/lib/velocity/ cnf/localrepo/ cnf/localrepo/org.apache.commons.collections/ cnf/localrepo/org.apache.commons.lang/ cnf/localrepo/org.apache.velocity-dep/ org.apache.ace.agent.itest/src/org/apache/...

Modified: ace/trunk/org.apache.ace.repository/src/org/apache/ace/repository/servlet/RepositoryServlet.java
URL: http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.repository/src/org/apache/ace/repository/servlet/RepositoryServlet.java?rev=1726821&r1=1726820&r2=1726821&view=diff
==============================================================================
--- ace/trunk/org.apache.ace.repository/src/org/apache/ace/repository/servlet/RepositoryServlet.java (original)
+++ ace/trunk/org.apache.ace.repository/src/org/apache/ace/repository/servlet/RepositoryServlet.java Tue Jan 26 15:19:17 2016
@@ -20,54 +20,30 @@ package org.apache.ace.repository.servle
 
 import java.io.IOException;
 import java.io.InputStream;
-import java.util.Dictionary;
 
 import org.apache.ace.range.SortedRangeSet;
 import org.apache.ace.repository.Repository;
-import org.osgi.framework.InvalidSyntaxException;
-import org.osgi.framework.ServiceReference;
-import org.osgi.service.cm.ConfigurationException;
 
-public class RepositoryServlet extends RepositoryServletBase {
+public class RepositoryServlet extends RepositoryServletBase<Repository> {
     private static final long serialVersionUID = 1L;
-
-    @Override
-    protected ServiceReference[] getRepositories(String filter) throws InvalidSyntaxException {
-        return m_context.getServiceReferences(Repository.class.getName(), filter);
-    }
-
-    @Override
-    protected SortedRangeSet getRange(ServiceReference ref) throws IOException {
-        Repository repository = (Repository) m_context.getService(ref);
-        SortedRangeSet range = repository.getRange();
-        m_context.ungetService(ref);
-        return range;
-    }
-
-    @Override
-    protected boolean doCommit(ServiceReference ref, long version, InputStream data) throws IllegalArgumentException, IOException {
-        Repository r = (Repository) m_context.getService(ref);
-        boolean result = r.commit(data, version);
-        m_context.ungetService(ref);
-        return result;
+    
+    public RepositoryServlet() {
+        super(Repository.class);
     }
 
     @Override
-    protected InputStream doCheckout(ServiceReference ref, long version) throws IllegalArgumentException, IOException {
-        Repository r = (Repository) m_context.getService(ref);
-        InputStream result = r.checkout(version);
-        m_context.ungetService(ref);
-        return result;
+    public String getServletInfo() {
+        return "Apache ACE Repository Servlet";
     }
 
     @Override
-    public String getServletInfo() {
-        return "Apache ACE Repository Servlet";
+    protected InputStream doCheckout(Repository repo, long version) throws IllegalArgumentException, IOException {
+        return repo.checkout(version);
     }
 
     @Override
-    public void updated(Dictionary settings) throws ConfigurationException {
-        super.updated(settings);
+    protected boolean doCommit(Repository repo, long version, InputStream data) throws IllegalArgumentException, IOException {
+        return repo.commit(data, version);
     }
 
     @Override
@@ -79,4 +55,9 @@ public class RepositoryServlet extends R
     protected String getCommitCommand() {
         return "/commit";
     }
+
+    @Override
+    protected SortedRangeSet getRange(Repository repo) throws IOException {
+        return repo.getRange();
+    }
 }
\ No newline at end of file

Modified: ace/trunk/org.apache.ace.repository/src/org/apache/ace/repository/servlet/RepositoryServletBase.java
URL: http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.repository/src/org/apache/ace/repository/servlet/RepositoryServletBase.java?rev=1726821&r1=1726820&r2=1726821&view=diff
==============================================================================
--- ace/trunk/org.apache.ace.repository/src/org/apache/ace/repository/servlet/RepositoryServletBase.java (original)
+++ ace/trunk/org.apache.ace.repository/src/org/apache/ace/repository/servlet/RepositoryServletBase.java Tue Jan 26 15:19:17 2016
@@ -23,7 +23,9 @@ import static javax.servlet.http.HttpSer
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
+import java.util.ArrayList;
 import java.util.Dictionary;
+import java.util.List;
 
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServlet;
@@ -46,7 +48,7 @@ import org.osgi.service.useradmin.User;
  * Base class for the repository servlets. Both the repository and the repository replication servlets work in a similar
  * way, so the specifics were factored out of this base class and put in two subclasses.
  */
-public abstract class RepositoryServletBase extends HttpServlet implements ManagedService {
+public abstract class RepositoryServletBase<REPO_TYPE> extends HttpServlet implements ManagedService {
     /** A boolean denoting whether or not authentication is enabled. */
     private static final String KEY_USE_AUTHENTICATION = "authentication.enabled";
     private static final int COPY_BUFFER_SIZE = 1024;
@@ -54,6 +56,7 @@ public abstract class RepositoryServletB
     protected static final String TEXT_MIMETYPE = "text/plain";
     protected static final String BINARY_MIMETYPE = "application/octet-stream";
 
+    private final Class<REPO_TYPE> m_repoType;
     // injected by Dependency Manager
     private volatile DependencyManager m_dm;
     private volatile AuthenticationService m_authService;
@@ -61,6 +64,53 @@ public abstract class RepositoryServletB
     protected volatile BundleContext m_context;
     protected volatile LogService m_log;
 
+    public RepositoryServletBase(Class<REPO_TYPE> repoType) {
+        m_repoType = repoType;
+    }
+
+    public void updated(Dictionary settings) throws ConfigurationException {
+        if (settings != null) {
+            String useAuthString = (String) settings.get(KEY_USE_AUTHENTICATION);
+            if ((useAuthString == null) ||
+                !("true".equalsIgnoreCase(useAuthString) || "false".equalsIgnoreCase(useAuthString))) {
+                throw new ConfigurationException(KEY_USE_AUTHENTICATION, "Missing or invalid value!");
+            }
+            boolean useAuth = Boolean.parseBoolean(useAuthString);
+            m_useAuth = useAuth;
+        }
+        else {
+            m_useAuth = false;
+        }
+    }
+
+    /**
+     * Checkout or get data from the repository.
+     * 
+     * @param repo
+     *            the repository service
+     * @param version
+     *            the version to check out.
+     * @return the data
+     * @throws IllegalArgumentException
+     * @throws java.io.IOException
+     */
+    protected abstract InputStream doCheckout(REPO_TYPE repo, long version) throws IllegalArgumentException, IOException;
+
+    /**
+     * Commit or put the data into the repository.
+     * 
+     * @param repo
+     *            the repository service
+     * @param version
+     *            The version to commit
+     * @param data
+     *            The data
+     * @return <code>true</code> if successful
+     * @throws IllegalArgumentException
+     * @throws IOException
+     */
+    protected abstract boolean doCommit(REPO_TYPE repo, long version, InputStream data) throws IllegalArgumentException, IOException;
+
     @Override
     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
         String path = request.getPathInfo();
@@ -106,11 +156,6 @@ public abstract class RepositoryServletB
         }
     }
 
-    /**
-     * Returns the name of the "checkout" command.
-     */
-    protected abstract String getCheckoutCommand();
-
     @Override
     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
         String path = request.getPathInfo();
@@ -134,64 +179,31 @@ public abstract class RepositoryServletB
     }
 
     /**
-     * Returns the name of the "commit" command.
+     * Returns the name of the "checkout" command.
      */
-    protected abstract String getCommitCommand();
+    protected abstract String getCheckoutCommand();
 
     /**
-     * Handles a query command and sends back the response.
+     * Returns the name of the "commit" command.
      */
-    private void handleQuery(String filter, HttpServletResponse response) throws IOException {
-        try {
-            ServiceReference[] refs = getRepositories(filter);
-            StringBuffer result = new StringBuffer();
-
-            if (refs != null) {
-                for (ServiceReference ref : refs) {
-                    result.append((String) ref.getProperty("customer"));
-                    result.append(',');
-                    result.append((String) ref.getProperty("name"));
-                    result.append(',');
-                    result.append(getRange(ref).toRepresentation());
-                    result.append('\n');
-                }
-            }
-
-            response.setContentType(TEXT_MIMETYPE);
-            response.getWriter().print(result.toString());
-        }
-        catch (IOException e) {
-            response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR,
-                "Could not retrieve version range for repository: " + e.getMessage());
-        }
-        catch (InvalidSyntaxException e) {
-            response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR,
-                "Invalid filter syntax: " + e.getMessage());
-        }
-    }
+    protected abstract String getCommitCommand();
 
     /**
      * Implement this by asking the right repository for a range of available versions.
      * 
-     * @param ref Reference to the repository service you need to dereference
+     * @param repo
+     *            the repository service
      * @return a sorted range set
-     * @throws IOException If the range cannot be obtained
-     */
-    protected abstract SortedRangeSet getRange(ServiceReference ref) throws IOException;
-
-    /**
-     * Returns a list of repositories that match the specified filter condition.
-     * 
-     * @param filter The filter condition
-     * @return An array of service references
-     * @throws InvalidSyntaxException If the filter condition is invalid
+     * @throws IOException
+     *             If the range cannot be obtained
      */
-    protected abstract ServiceReference[] getRepositories(String filter) throws InvalidSyntaxException;
+    protected abstract SortedRangeSet getRange(REPO_TYPE repo) throws IOException;
 
     /**
      * Called by Dependency Manager upon initialization of this component.
      * 
-     * @param comp the component to initialize, cannot be <code>null</code>.
+     * @param comp
+     *            the component to initialize, cannot be <code>null</code>.
      */
     protected void init(Component comp) {
         comp.add(m_dm.createServiceDependency()
@@ -214,7 +226,8 @@ public abstract class RepositoryServletB
     /**
      * Authenticates, if needed the user with the information from the given request.
      * 
-     * @param request The request to obtain the credentials from, cannot be <code>null</code>.
+     * @param request
+     *            The request to obtain the credentials from, cannot be <code>null</code>.
      * @return <code>true</code> if the authentication was successful, <code>false</code> otherwise.
      */
     private boolean authenticate(HttpServletRequest request) {
@@ -232,127 +245,179 @@ public abstract class RepositoryServletB
     }
 
     /**
-     * Handles a commit command and sends back the response.
+     * Copies data from an input stream to an output stream.
+     * 
+     * @param in
+     *            The input
+     * @param outThe
+     *            output
+     * @param version
+     * @param name
+     * @throws IOException
+     *             If copying fails
      */
-    private void handleCommit(String customer, String name, long version, InputStream data, HttpServletResponse response) throws IOException {
-        try {
-            ServiceReference[] refs = getRepositories("(&(customer=" + customer + ")(name=" + name + "))");
-
-            if ((refs != null) && (refs.length == 1)) {
-                ServiceReference ref = refs[0];
-                try {
-                    if (!doCommit(ref, version, data)) {
-                        response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Could not commit");
-                    }
-                    else {
-                        response.sendError(HttpServletResponse.SC_OK);
-                    }
-                }
-                catch (IllegalArgumentException e) {
-                    response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Invalid version");
-                }
-                catch (IllegalStateException e) {
-                    response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR,
-                        "Cannot commit, not the master repository");
-                }
-            }
-        }
-        catch (IOException e) {
-            response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "I/O exception: " + e.getMessage());
-        }
-        catch (InvalidSyntaxException e) {
-            response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Invalid filter syntax: "
-                + e.getMessage());
+    private void copy(InputStream in, OutputStream out, String name, long version)
+        throws IOException {
+        byte[] buffer = new byte[COPY_BUFFER_SIZE];
+        int bytes = in.read(buffer);
+        while (bytes != -1) {
+            out.write(buffer, 0, bytes);
+            bytes = in.read(buffer);
         }
+
     }
 
     /**
-     * Commit or put the data into the repository.
+     * Returns a list of repositories that match the specified filter condition.
      * 
-     * @param ref Reference to the repository service
-     * @param version The version
-     * @param data The data
-     * @return <code>true</code> if successful
-     * @throws IllegalArgumentException
-     * @throws IOException
+     * @param filter
+     *            The filter condition
+     * @return An array of service references
+     * @throws InvalidSyntaxException
+     *             If the filter condition is invalid
      */
-    protected abstract boolean doCommit(ServiceReference ref, long version, InputStream data) throws IllegalArgumentException, IOException;
+    private List<ServiceReference<REPO_TYPE>> getRepositories(String filter) throws InvalidSyntaxException {
+        List<ServiceReference<REPO_TYPE>> result = new ArrayList<>();
+        result.addAll(m_context.getServiceReferences(m_repoType, filter));
+        return result;
+    }
 
     /**
      * Handles a checkout command and returns the response.
      */
     private void handleCheckout(String customer, String name, long version, HttpServletResponse response) throws IOException {
+        List<ServiceReference<REPO_TYPE>> refs;
+        try {
+            refs = getRepositories("(&(customer=" + customer + ")(name=" + name + "))");
+        }
+        catch (InvalidSyntaxException e) {
+            response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Invalid filter syntax: " + e.getMessage());
+            return;
+        }
+
         try {
-            ServiceReference[] refs = getRepositories("(&(customer=" + customer + ")(name=" + name + "))");
-            if ((refs != null) && (refs.length == 1)) {
-                ServiceReference ref = refs[0];
+            if (refs.size() != 1) {
+                response.sendError(HttpServletResponse.SC_NOT_FOUND,
+                    (refs.isEmpty() ? "Could not find repository " : "Multiple repositories found ") + " for customer " + customer + ", name " + name);
+                return;
+            }
+
+            ServiceReference<REPO_TYPE> ref = refs.get(0);
+            if (ref == null) {
+                response.sendError(HttpServletResponse.SC_NOT_FOUND, "Could not find repository for customer " + customer + ", name " + name);
+                return;
+            }
+
+            REPO_TYPE repo = m_context.getService(ref);
+
+            try {
                 response.setContentType(BINARY_MIMETYPE);
-                InputStream data = doCheckout(ref, version);
+
+                InputStream data = doCheckout(repo, version);
                 if (data == null) {
-                    response.sendError(HttpServletResponse.SC_NOT_FOUND, "Requested version does not exist: "
-                        + version);
+                    response.sendError(HttpServletResponse.SC_NOT_FOUND, "Requested version does not exist: " + version);
                 }
                 else {
                     copy(data, response.getOutputStream(), name, version);
                 }
             }
-            else {
-                response.sendError(HttpServletResponse.SC_NOT_FOUND,
-                    ((refs == null) ? "Could not find repository " : "Multiple repositories found ") + " for customer "
-                        + customer + ", name " + name);
+            finally {
+                m_context.ungetService(ref);
             }
         }
         catch (IOException e) {
             response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "I/O exception: " + e.getMessage());
         }
-        catch (InvalidSyntaxException e) {
-            response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Invalid filter syntax: " + e.getMessage());
-        }
     }
 
     /**
-     * Checkout or get data from the repository.
-     * 
-     * @param ref reference to the repository service
-     * @param version the version
-     * @return the data
-     * @throws IllegalArgumentException
-     * @throws java.io.IOException
+     * Handles a commit command and sends back the response.
      */
-    protected abstract InputStream doCheckout(ServiceReference ref, long version) throws IllegalArgumentException, IOException;
+    private void handleCommit(String customer, String name, long version, InputStream data, HttpServletResponse response) throws IOException {
+        List<ServiceReference<REPO_TYPE>> refs;
+        try {
+            refs = getRepositories("(&(customer=" + customer + ")(name=" + name + "))");
+        }
+        catch (InvalidSyntaxException e) {
+            response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Invalid filter syntax: " + e.getMessage());
+            return;
+        }
+
+        try {
+            if (refs.size() != 1) {
+                response.sendError(HttpServletResponse.SC_NOT_FOUND,
+                    (refs.isEmpty() ? "Could not find repository " : "Multiple repositories found ") + " for customer " + customer + ", name " + name);
+                return;
+            }
+
+            ServiceReference<REPO_TYPE> ref = refs.get(0);
+            if (ref == null) {
+                response.sendError(HttpServletResponse.SC_NOT_FOUND, "Could not find repository for customer " + customer + ", name " + name);
+                return;
+            }
+
+            REPO_TYPE repo = m_context.getService(ref);
+
+            try {
+                if (!doCommit(repo, version, data)) {
+                    response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Could not commit");
+                }
+                else {
+                    response.sendError(HttpServletResponse.SC_OK);
+                }
+            }
+            catch (IllegalArgumentException e) {
+                response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Invalid version");
+            }
+            catch (IllegalStateException e) {
+                response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Cannot commit, not the master repository");
+            }
+            finally {
+                m_context.ungetService(ref);
+            }
+        }
+        catch (IOException e) {
+            response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "I/O exception: " + e.getMessage());
+        }
+    }
 
     /**
-     * Copies data from an input stream to an output stream.
-     * 
-     * @param in The input
-     * @param outThe output
-     * @param version
-     * @param name
-     * @throws IOException If copying fails
+     * Handles a query command and sends back the response.
      */
-    private void copy(InputStream in, OutputStream out, String name, long version)
-        throws IOException {
-        byte[] buffer = new byte[COPY_BUFFER_SIZE];
-        int bytes = in.read(buffer);
-        while (bytes != -1) {
-            out.write(buffer, 0, bytes);
-            bytes = in.read(buffer);
+    private void handleQuery(String filter, HttpServletResponse response) throws IOException {
+        List<ServiceReference<REPO_TYPE>> refs;
+        try {
+            refs = getRepositories(filter);
+        }
+        catch (InvalidSyntaxException e) {
+            response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Invalid filter syntax: " + e.getMessage());
+            return;
         }
 
-    }
+        try {
+            StringBuffer result = new StringBuffer();
 
-    public void updated(Dictionary settings) throws ConfigurationException {
-        if (settings != null) {
-            String useAuthString = (String) settings.get(KEY_USE_AUTHENTICATION);
-            if ((useAuthString == null) ||
-                !("true".equalsIgnoreCase(useAuthString) || "false".equalsIgnoreCase(useAuthString))) {
-                throw new ConfigurationException(KEY_USE_AUTHENTICATION, "Missing or invalid value!");
+            for (ServiceReference<REPO_TYPE> ref : refs) {
+                REPO_TYPE repo = m_context.getService(ref);
+                try {
+                    result.append((String) ref.getProperty("customer"));
+                    result.append(',');
+                    result.append((String) ref.getProperty("name"));
+                    result.append(',');
+                    result.append(getRange(repo).toRepresentation());
+                    result.append('\n');
+                }
+                finally {
+                    m_context.ungetService(ref);
+                }
             }
-            boolean useAuth = Boolean.parseBoolean(useAuthString);
-            m_useAuth = useAuth;
+
+            response.setContentType(TEXT_MIMETYPE);
+            response.getWriter().print(result.toString());
         }
-        else {
-            m_useAuth = false;
+        catch (IOException e) {
+            response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR,
+                "Could not retrieve version range for repository: " + e.getMessage());
         }
     }
 }