Reintroduce Jetty web socket
authorMathieu Baudier <mbaudier@argeo.org>
Wed, 25 May 2022 07:28:38 +0000 (09:28 +0200)
committerMathieu Baudier <mbaudier@argeo.org>
Wed, 25 May 2022 07:28:38 +0000 (09:28 +0200)
46 files changed:
Makefile-tp.mk
cms/org.argeo.cms.integration/src/org/argeo/cms/integration/CmsExceptionsChain.java [deleted file]
cms/org.argeo.cms.integration/src/org/argeo/cms/integration/CmsLoginServlet.java [deleted file]
cms/org.argeo.cms.integration/src/org/argeo/cms/integration/CmsLogoutServlet.java [deleted file]
cms/org.argeo.cms.integration/src/org/argeo/cms/integration/CmsPrivateServletContext.java [deleted file]
cms/org.argeo.cms.integration/src/org/argeo/cms/integration/CmsSessionDescriptor.java [deleted file]
cms/org.argeo.cms.integration/src/org/argeo/cms/integration/CmsTokenServlet.java [deleted file]
cms/org.argeo.cms.integration/src/org/argeo/cms/integration/JcrReadServlet.java [deleted file]
cms/org.argeo.cms.integration/src/org/argeo/cms/integration/JcrWriteServlet.java [deleted file]
cms/org.argeo.cms.integration/src/org/argeo/cms/integration/TokenDescriptor.java [deleted file]
cms/org.argeo.cms.integration/src/org/argeo/cms/integration/XslTemplate.java [deleted file]
cms/org.argeo.cms.integration/src/org/argeo/cms/integration/package-info.java [deleted file]
cms/org.argeo.cms.integration/src/org/argeo/cms/websocket/CmsWebSocketConfigurator.java [deleted file]
cms/org.argeo.cms.integration/src/org/argeo/cms/websocket/package-info.java [deleted file]
ext/org.argeo.ext.equinox.jetty/.classpath [deleted file]
ext/org.argeo.ext.equinox.jetty/.gitignore [deleted file]
ext/org.argeo.ext.equinox.jetty/.project [deleted file]
ext/org.argeo.ext.equinox.jetty/META-INF/.gitignore [deleted file]
ext/org.argeo.ext.equinox.jetty/bnd.bnd [deleted file]
ext/org.argeo.ext.equinox.jetty/build.properties [deleted file]
ext/org.argeo.ext.equinox.jetty/src/org/argeo/equinox/jetty/CmsJettyCustomizer.java [deleted file]
ext/org.argeo.ext.equinox.jetty/src/org/argeo/equinox/jetty/package-info.java [deleted file]
org.argeo.slc.factory/src/org/argeo/slc/factory/A2Factory.java
tp/org.argeo.tp.jetty.websocket/javax.websocket.bnd [deleted file]
tp/org.argeo.tp.jetty.websocket/jetty-websocket/common.bnd [deleted file]
tp/org.argeo.tp.jetty.websocket/jetty-websocket/org.eclipse.jetty.websocket.api.bnd [deleted file]
tp/org.argeo.tp.jetty.websocket/jetty-websocket/org.eclipse.jetty.websocket.client.bnd [deleted file]
tp/org.argeo.tp.jetty.websocket/jetty-websocket/org.eclipse.jetty.websocket.common.bnd [deleted file]
tp/org.argeo.tp.jetty.websocket/jetty-websocket/org.eclipse.jetty.websocket.core.client.bnd [deleted file]
tp/org.argeo.tp.jetty.websocket/jetty-websocket/org.eclipse.jetty.websocket.core.common.bnd [deleted file]
tp/org.argeo.tp.jetty.websocket/jetty-websocket/org.eclipse.jetty.websocket.core.server.bnd [deleted file]
tp/org.argeo.tp.jetty.websocket/jetty-websocket/org.eclipse.jetty.websocket.jakarta.websocket.client.bnd.disabled [deleted file]
tp/org.argeo.tp.jetty.websocket/jetty-websocket/org.eclipse.jetty.websocket.jakarta.websocket.common.bnd.disabled [deleted file]
tp/org.argeo.tp.jetty.websocket/jetty-websocket/org.eclipse.jetty.websocket.jakarta.websocket.server.bnd.disabled [deleted file]
tp/org.argeo.tp.jetty.websocket/jetty-websocket/org.eclipse.jetty.websocket.server.bnd [deleted file]
tp/org.argeo.tp.jetty.websocket/jetty-websocket/org.eclipse.jetty.websocket.servlet.bnd [deleted file]
tp/org.argeo.tp.jetty/javax.websocket.bnd [new file with mode: 0644]
tp/org.argeo.tp.jetty/jetty-websocket/merge.bnd [new file with mode: 0644]
tp/org.argeo.tp.jetty/jetty/org.eclipse.jetty.alpn.client.bnd [new file with mode: 0644]
tp/org.argeo.tp.jetty/jetty/org.eclipse.jetty.alpn.server.bnd [new file with mode: 0644]
tp/org.argeo.tp.jetty/jetty/org.eclipse.jetty.client.bnd [new file with mode: 0644]
tp/org.argeo.tp.jetty/jetty/org.eclipse.jetty.client.bnd.retired [deleted file]
tp/org.argeo.tp.jetty/jetty/org.eclipse.jetty.http2.client.bnd [new file with mode: 0644]
tp/org.argeo.tp.jetty/jetty/org.eclipse.jetty.http2.common.bnd [new file with mode: 0644]
tp/org.argeo.tp.jetty/jetty/org.eclipse.jetty.http2.hpack.bnd [new file with mode: 0644]
tp/org.argeo.tp.jetty/jetty/org.eclipse.jetty.http2.server.bnd [new file with mode: 0644]

index 5fcaba3b15ad1baf7cd0b08c4b86d822cb2cc665..ba01d243ed0ebc2da76ad01dea2aa0cfa2e59fd8 100644 (file)
@@ -26,6 +26,8 @@ bootstrap :
 
 clean:
        rm -rf $(BOOTSTRAP_BASE)
+       rm -rf $(A2_OUTPUT)/org.argeo.tp
+       rm -rf $(A2_OUTPUT)/org.argeo.tp.*
        $(MAKE) -f Makefile-ext.mk clean
 
 include  $(SDK_SRC_BASE)/sdk/argeo-build/osgi.mk
\ No newline at end of file
diff --git a/cms/org.argeo.cms.integration/src/org/argeo/cms/integration/CmsExceptionsChain.java b/cms/org.argeo.cms.integration/src/org/argeo/cms/integration/CmsExceptionsChain.java
deleted file mode 100644 (file)
index fb289c1..0000000
+++ /dev/null
@@ -1,154 +0,0 @@
-package org.argeo.cms.integration;
-
-import java.io.IOException;
-import java.io.Writer;
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.servlet.http.HttpServletResponse;
-
-import org.argeo.api.cms.CmsLog;
-
-import com.fasterxml.jackson.core.JsonGenerator;
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.databind.ObjectMapper;
-
-/** Serialisable wrapper of a {@link Throwable}. */
-public class CmsExceptionsChain {
-       public final static CmsLog log = CmsLog.getLog(CmsExceptionsChain.class);
-
-       private List<SystemException> exceptions = new ArrayList<>();
-
-       public CmsExceptionsChain() {
-               super();
-       }
-
-       public CmsExceptionsChain(Throwable exception) {
-               writeException(exception);
-               if (log.isDebugEnabled())
-                       log.error("Exception chain", exception);
-       }
-
-       public String toJsonString(ObjectMapper objectMapper) {
-               try {
-                       return objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(this);
-               } catch (JsonProcessingException e) {
-                       throw new IllegalStateException("Cannot write system exceptions " + toString(), e);
-               }
-       }
-
-       public void writeAsJson(ObjectMapper objectMapper, Writer writer) {
-               try {
-                       JsonGenerator jg = objectMapper.writerWithDefaultPrettyPrinter().getFactory().createGenerator(writer);
-                       jg.writeObject(this);
-               } catch (IOException e) {
-                       throw new IllegalStateException("Cannot write system exceptions " + toString(), e);
-               }
-       }
-
-       public void writeAsJson(ObjectMapper objectMapper, HttpServletResponse resp) {
-               try {
-                       resp.setContentType("application/json");
-                       resp.setStatus(500);
-                       writeAsJson(objectMapper, resp.getWriter());
-               } catch (IOException e) {
-                       throw new IllegalStateException("Cannot write system exceptions " + toString(), e);
-               }
-       }
-
-       /** recursive */
-       protected void writeException(Throwable exception) {
-               SystemException systemException = new SystemException(exception);
-               exceptions.add(systemException);
-               Throwable cause = exception.getCause();
-               if (cause != null)
-                       writeException(cause);
-       }
-
-       public List<SystemException> getExceptions() {
-               return exceptions;
-       }
-
-       public void setExceptions(List<SystemException> exceptions) {
-               this.exceptions = exceptions;
-       }
-
-       /** An exception in the chain. */
-       public static class SystemException {
-               private String type;
-               private String message;
-               private List<String> stackTrace;
-
-               public SystemException() {
-               }
-
-               public SystemException(Throwable exception) {
-                       this.type = exception.getClass().getName();
-                       this.message = exception.getMessage();
-                       this.stackTrace = new ArrayList<>();
-                       StackTraceElement[] elems = exception.getStackTrace();
-                       for (int i = 0; i < elems.length; i++)
-                               stackTrace.add("at " + elems[i].toString());
-               }
-
-               public String getType() {
-                       return type;
-               }
-
-               public void setType(String type) {
-                       this.type = type;
-               }
-
-               public String getMessage() {
-                       return message;
-               }
-
-               public void setMessage(String message) {
-                       this.message = message;
-               }
-
-               public List<String> getStackTrace() {
-                       return stackTrace;
-               }
-
-               public void setStackTrace(List<String> stackTrace) {
-                       this.stackTrace = stackTrace;
-               }
-
-               @Override
-               public String toString() {
-                       return "System exception: " + type + ", " + message + ", " + stackTrace;
-               }
-
-       }
-
-       @Override
-       public String toString() {
-               return exceptions.toString();
-       }
-
-//     public static void main(String[] args) throws Exception {
-//             try {
-//                     try {
-//                             try {
-//                                     testDeeper();
-//                             } catch (Exception e) {
-//                                     throw new Exception("Less deep exception", e);
-//                             }
-//                     } catch (Exception e) {
-//                             throw new RuntimeException("Top exception", e);
-//                     }
-//             } catch (Exception e) {
-//                     CmsExceptionsChain vjeSystemErrors = new CmsExceptionsChain(e);
-//                     ObjectMapper objectMapper = new ObjectMapper();
-//                     System.out.println(objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(vjeSystemErrors));
-//                     System.out.println(objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(e));
-//                     e.printStackTrace();
-//             }
-//     }
-//
-//     static void testDeeper() throws Exception {
-//             throw new IllegalStateException("Deep exception");
-//     }
-
-}
diff --git a/cms/org.argeo.cms.integration/src/org/argeo/cms/integration/CmsLoginServlet.java b/cms/org.argeo.cms.integration/src/org/argeo/cms/integration/CmsLoginServlet.java
deleted file mode 100644 (file)
index 29a3137..0000000
+++ /dev/null
@@ -1,112 +0,0 @@
-package org.argeo.cms.integration;
-
-import java.io.IOException;
-import java.util.Locale;
-import java.util.Set;
-
-import javax.security.auth.Subject;
-import javax.security.auth.callback.Callback;
-import javax.security.auth.callback.NameCallback;
-import javax.security.auth.callback.PasswordCallback;
-import javax.security.auth.callback.UnsupportedCallbackException;
-import javax.security.auth.login.LoginContext;
-import javax.security.auth.login.LoginException;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.argeo.api.cms.CmsAuth;
-import org.argeo.api.cms.CmsSessionId;
-import org.argeo.cms.auth.RemoteAuthCallback;
-import org.argeo.cms.auth.RemoteAuthCallbackHandler;
-import org.argeo.cms.servlet.ServletHttpRequest;
-import org.argeo.cms.servlet.ServletHttpResponse;
-import org.osgi.service.useradmin.Authorization;
-
-import com.fasterxml.jackson.core.JsonGenerator;
-import com.fasterxml.jackson.databind.ObjectMapper;
-
-/** Externally authenticate an http session. */
-public class CmsLoginServlet extends HttpServlet {
-       public final static String PARAM_USERNAME = "username";
-       public final static String PARAM_PASSWORD = "password";
-
-       private static final long serialVersionUID = 2478080654328751539L;
-       private ObjectMapper objectMapper = new ObjectMapper();
-
-       @Override
-       protected void doGet(HttpServletRequest request, HttpServletResponse response)
-                       throws ServletException, IOException {
-               doPost(request, response);
-       }
-
-       @Override
-       protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
-               LoginContext lc = null;
-               String username = req.getParameter(PARAM_USERNAME);
-               String password = req.getParameter(PARAM_PASSWORD);
-               ServletHttpRequest request = new ServletHttpRequest(req);
-               ServletHttpResponse response = new ServletHttpResponse(resp);
-               try {
-                       lc = new LoginContext(CmsAuth.LOGIN_CONTEXT_USER, new RemoteAuthCallbackHandler(request, response) {
-                               public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException {
-                                       for (Callback callback : callbacks) {
-                                               if (callback instanceof NameCallback && username != null)
-                                                       ((NameCallback) callback).setName(username);
-                                               else if (callback instanceof PasswordCallback && password != null)
-                                                       ((PasswordCallback) callback).setPassword(password.toCharArray());
-                                               else if (callback instanceof RemoteAuthCallback) {
-                                                       ((RemoteAuthCallback) callback).setRequest(request);
-                                                       ((RemoteAuthCallback) callback).setResponse(response);
-                                               }
-                                       }
-                               }
-                       });
-                       lc.login();
-
-                       Subject subject = lc.getSubject();
-                       CmsSessionId cmsSessionId = extractFrom(subject.getPrivateCredentials(CmsSessionId.class));
-                       if (cmsSessionId == null) {
-                               resp.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
-                               return;
-                       }
-                       Authorization authorization = extractFrom(subject.getPrivateCredentials(Authorization.class));
-                       Locale locale = extractFrom(subject.getPublicCredentials(Locale.class));
-
-                       CmsSessionDescriptor cmsSessionDescriptor = new CmsSessionDescriptor(authorization.getName(),
-                                       cmsSessionId.getUuid().toString(), authorization.getRoles(), authorization.toString(),
-                                       locale != null ? locale.toString() : null);
-
-                       resp.setContentType("application/json");
-                       JsonGenerator jg = objectMapper.getFactory().createGenerator(resp.getWriter());
-                       jg.writeObject(cmsSessionDescriptor);
-
-                       String redirectTo = redirectTo(req);
-                       if (redirectTo != null)
-                               resp.sendRedirect(redirectTo);
-               } catch (LoginException e) {
-                       resp.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
-                       return;
-               }
-       }
-
-       protected <T> T extractFrom(Set<T> creds) {
-               if (creds.size() > 0)
-                       return creds.iterator().next();
-               else
-                       return null;
-       }
-
-       /**
-        * To be overridden in order to return a richer {@link CmsSessionDescriptor} to
-        * be serialized.
-        */
-       protected CmsSessionDescriptor enrichJson(CmsSessionDescriptor cmsSessionDescriptor) {
-               return cmsSessionDescriptor;
-       }
-
-       protected String redirectTo(HttpServletRequest request) {
-               return null;
-       }
-}
diff --git a/cms/org.argeo.cms.integration/src/org/argeo/cms/integration/CmsLogoutServlet.java b/cms/org.argeo.cms.integration/src/org/argeo/cms/integration/CmsLogoutServlet.java
deleted file mode 100644 (file)
index 0628eae..0000000
+++ /dev/null
@@ -1,79 +0,0 @@
-package org.argeo.cms.integration;
-
-import java.io.IOException;
-import java.util.Set;
-
-import javax.security.auth.Subject;
-import javax.security.auth.callback.Callback;
-import javax.security.auth.callback.UnsupportedCallbackException;
-import javax.security.auth.login.LoginContext;
-import javax.security.auth.login.LoginException;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.argeo.api.cms.CmsAuth;
-import org.argeo.api.cms.CmsSessionId;
-import org.argeo.cms.auth.CurrentUser;
-import org.argeo.cms.auth.RemoteAuthCallback;
-import org.argeo.cms.auth.RemoteAuthCallbackHandler;
-import org.argeo.cms.servlet.ServletHttpRequest;
-import org.argeo.cms.servlet.ServletHttpResponse;
-
-/** Externally authenticate an http session. */
-public class CmsLogoutServlet extends HttpServlet {
-       private static final long serialVersionUID = 2478080654328751539L;
-
-       @Override
-       protected void doGet(HttpServletRequest request, HttpServletResponse response)
-                       throws ServletException, IOException {
-               doPost(request, response);
-       }
-
-       @Override
-       protected void doPost(HttpServletRequest request, HttpServletResponse response)
-                       throws ServletException, IOException {
-               ServletHttpRequest httpRequest = new ServletHttpRequest(request);
-               ServletHttpResponse httpResponse = new ServletHttpResponse(response);
-               LoginContext lc = null;
-               try {
-                       lc = new LoginContext(CmsAuth.LOGIN_CONTEXT_USER,
-                                       new RemoteAuthCallbackHandler(httpRequest, httpResponse) {
-                                               public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException {
-                                                       for (Callback callback : callbacks) {
-                                                               if (callback instanceof RemoteAuthCallback) {
-                                                                       ((RemoteAuthCallback) callback).setRequest(httpRequest);
-                                                                       ((RemoteAuthCallback) callback).setResponse(httpResponse);
-                                                               }
-                                                       }
-                                               }
-                                       });
-                       lc.login();
-
-                       Subject subject = lc.getSubject();
-                       CmsSessionId cmsSessionId = extractFrom(subject.getPrivateCredentials(CmsSessionId.class));
-                       if (cmsSessionId != null) {// logged in
-                               CurrentUser.logoutCmsSession(subject);
-                       }
-
-               } catch (LoginException e) {
-                       // ignore
-               }
-
-               String redirectTo = redirectTo(request);
-               if (redirectTo != null)
-                       response.sendRedirect(redirectTo);
-       }
-
-       protected <T> T extractFrom(Set<T> creds) {
-               if (creds.size() > 0)
-                       return creds.iterator().next();
-               else
-                       return null;
-       }
-
-       protected String redirectTo(HttpServletRequest request) {
-               return null;
-       }
-}
diff --git a/cms/org.argeo.cms.integration/src/org/argeo/cms/integration/CmsPrivateServletContext.java b/cms/org.argeo.cms.integration/src/org/argeo/cms/integration/CmsPrivateServletContext.java
deleted file mode 100644 (file)
index cec04d2..0000000
+++ /dev/null
@@ -1,82 +0,0 @@
-package org.argeo.cms.integration;
-
-import java.io.IOException;
-import java.security.AccessControlContext;
-import java.security.PrivilegedAction;
-import java.util.Map;
-
-import javax.security.auth.Subject;
-import javax.security.auth.login.LoginContext;
-import javax.security.auth.login.LoginException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.argeo.api.cms.CmsAuth;
-import org.argeo.cms.auth.RemoteAuthCallbackHandler;
-import org.argeo.cms.auth.RemoteAuthUtils;
-import org.argeo.cms.servlet.ServletHttpRequest;
-import org.argeo.cms.servlet.ServletHttpResponse;
-import org.osgi.service.http.context.ServletContextHelper;
-
-/** Manages security access to servlets. */
-public class CmsPrivateServletContext extends ServletContextHelper {
-       public final static String LOGIN_PAGE = "argeo.cms.integration.loginPage";
-       public final static String LOGIN_SERVLET = "argeo.cms.integration.loginServlet";
-       private String loginPage;
-       private String loginServlet;
-
-       public void init(Map<String, String> properties) {
-               loginPage = properties.get(LOGIN_PAGE);
-               loginServlet = properties.get(LOGIN_SERVLET);
-       }
-
-       /**
-        * Add the {@link AccessControlContext} as a request attribute, or redirect to
-        * the login page.
-        */
-       @Override
-       public boolean handleSecurity(final HttpServletRequest req, HttpServletResponse resp) throws IOException {
-               LoginContext lc = null;
-               ServletHttpRequest request = new ServletHttpRequest(req);
-               ServletHttpResponse response = new ServletHttpResponse(resp);
-
-               String pathInfo = req.getPathInfo();
-               String servletPath = req.getServletPath();
-               if ((pathInfo != null && (servletPath + pathInfo).equals(loginPage)) || servletPath.contentEquals(loginServlet))
-                       return true;
-               try {
-                       lc = new LoginContext(CmsAuth.LOGIN_CONTEXT_USER, new RemoteAuthCallbackHandler(request, response));
-                       lc.login();
-               } catch (LoginException e) {
-                       lc = processUnauthorized(req, resp);
-                       if (lc == null)
-                               return false;
-               }
-               Subject.doAs(lc.getSubject(), new PrivilegedAction<Void>() {
-
-                       @Override
-                       public Void run() {
-                               // TODO also set login context in order to log out ?
-                               RemoteAuthUtils.configureRequestSecurity(request);
-                               return null;
-                       }
-
-               });
-
-               return true;
-       }
-
-       @Override
-       public void finishSecurity(HttpServletRequest req, HttpServletResponse resp) {
-               RemoteAuthUtils.clearRequestSecurity(new ServletHttpRequest(req));
-       }
-
-       protected LoginContext processUnauthorized(HttpServletRequest request, HttpServletResponse response) {
-               try {
-                       response.sendRedirect(loginPage);
-               } catch (IOException e) {
-                       throw new RuntimeException("Cannot redirect to login page", e);
-               }
-               return null;
-       }
-}
diff --git a/cms/org.argeo.cms.integration/src/org/argeo/cms/integration/CmsSessionDescriptor.java b/cms/org.argeo.cms.integration/src/org/argeo/cms/integration/CmsSessionDescriptor.java
deleted file mode 100644 (file)
index 30de616..0000000
+++ /dev/null
@@ -1,96 +0,0 @@
-package org.argeo.cms.integration;
-
-import java.io.Serializable;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Set;
-import java.util.TreeSet;
-
-import org.argeo.api.cms.CmsSession;
-import org.osgi.service.useradmin.Authorization;
-
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-
-/** A serializable descriptor of an internal {@link CmsSession}. */
-@JsonIgnoreProperties(ignoreUnknown = true)
-public class CmsSessionDescriptor implements Serializable, Authorization {
-       private static final long serialVersionUID = 8592162323372641462L;
-
-       private String name;
-       private String cmsSessionId;
-       private String displayName;
-       private String locale;
-       private Set<String> roles;
-
-       public CmsSessionDescriptor() {
-       }
-
-       public CmsSessionDescriptor(String name, String cmsSessionId, String[] roles, String displayName, String locale) {
-               this.name = name;
-               this.displayName = displayName;
-               this.cmsSessionId = cmsSessionId;
-               this.locale = locale;
-               this.roles = Collections.unmodifiableSortedSet(new TreeSet<>(Arrays.asList(roles)));
-       }
-
-       public String getName() {
-               return name;
-       }
-
-       public void setName(String name) {
-               this.name = name;
-       }
-
-       public String getDisplayName() {
-               return displayName;
-       }
-
-       public void setDisplayName(String displayName) {
-               this.displayName = displayName;
-       }
-
-       public String getCmsSessionId() {
-               return cmsSessionId;
-       }
-
-       public void setCmsSessionId(String cmsSessionId) {
-               this.cmsSessionId = cmsSessionId;
-       }
-
-       public Boolean isAnonymous() {
-               return name == null;
-       }
-
-       public String getLocale() {
-               return locale;
-       }
-
-       public void setLocale(String locale) {
-               this.locale = locale;
-       }
-
-       @Override
-       public boolean hasRole(String name) {
-               return roles.contains(name);
-       }
-
-       @Override
-       public String[] getRoles() {
-               return roles.toArray(new String[roles.size()]);
-       }
-
-       public void setRoles(String[] roles) {
-               this.roles = Collections.unmodifiableSortedSet(new TreeSet<>(Arrays.asList(roles)));
-       }
-
-       @Override
-       public int hashCode() {
-               return cmsSessionId != null ? cmsSessionId.hashCode() : super.hashCode();
-       }
-
-       @Override
-       public String toString() {
-               return displayName != null ? displayName : name != null ? name : super.toString();
-       }
-
-}
diff --git a/cms/org.argeo.cms.integration/src/org/argeo/cms/integration/CmsTokenServlet.java b/cms/org.argeo.cms.integration/src/org/argeo/cms/integration/CmsTokenServlet.java
deleted file mode 100644 (file)
index 983202a..0000000
+++ /dev/null
@@ -1,117 +0,0 @@
-package org.argeo.cms.integration;
-
-import java.io.IOException;
-import java.time.ZonedDateTime;
-import java.util.Set;
-import java.util.UUID;
-
-import javax.security.auth.Subject;
-import javax.security.auth.callback.Callback;
-import javax.security.auth.callback.UnsupportedCallbackException;
-import javax.security.auth.login.LoginContext;
-import javax.security.auth.login.LoginException;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.argeo.api.cms.CmsAuth;
-import org.argeo.cms.CmsUserManager;
-import org.argeo.cms.auth.RemoteAuthCallback;
-import org.argeo.cms.auth.RemoteAuthCallbackHandler;
-import org.argeo.cms.servlet.ServletHttpRequest;
-import org.argeo.cms.servlet.ServletHttpResponse;
-import org.argeo.util.naming.NamingUtils;
-import org.osgi.service.useradmin.Authorization;
-
-import com.fasterxml.jackson.core.JsonGenerator;
-import com.fasterxml.jackson.databind.ObjectMapper;
-
-/** Provides access to tokens. */
-public class CmsTokenServlet extends HttpServlet {
-       private static final long serialVersionUID = 302918711430864140L;
-
-       public final static String PARAM_EXPIRY_DATE = "expiryDate";
-       public final static String PARAM_TOKEN = "token";
-
-       private final static int DEFAULT_HOURS = 24;
-
-       private CmsUserManager userManager;
-       private ObjectMapper objectMapper = new ObjectMapper();
-
-       @Override
-       protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
-               ServletHttpRequest request = new ServletHttpRequest(req);
-               ServletHttpResponse response = new ServletHttpResponse(resp);
-               LoginContext lc = null;
-               try {
-                       lc = new LoginContext(CmsAuth.LOGIN_CONTEXT_USER, new RemoteAuthCallbackHandler(request, response) {
-                               public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException {
-                                       for (Callback callback : callbacks) {
-                                               if (callback instanceof RemoteAuthCallback) {
-                                                       ((RemoteAuthCallback) callback).setRequest(request);
-                                                       ((RemoteAuthCallback) callback).setResponse(response);
-                                               }
-                                       }
-                               }
-                       });
-                       lc.login();
-               } catch (LoginException e) {
-                       // ignore
-               }
-
-               try {
-                       Subject subject = lc.getSubject();
-                       Authorization authorization = extractFrom(subject.getPrivateCredentials(Authorization.class));
-                       String token = UUID.randomUUID().toString();
-                       String expiryDateStr = req.getParameter(PARAM_EXPIRY_DATE);
-                       ZonedDateTime expiryDate;
-                       if (expiryDateStr != null) {
-                               expiryDate = NamingUtils.ldapDateToZonedDateTime(expiryDateStr);
-                       } else {
-                               expiryDate = ZonedDateTime.now().plusHours(DEFAULT_HOURS);
-                               expiryDateStr = NamingUtils.instantToLdapDate(expiryDate);
-                       }
-                       userManager.addAuthToken(authorization.getName(), token, expiryDate);
-
-                       TokenDescriptor tokenDescriptor = new TokenDescriptor();
-                       tokenDescriptor.setUsername(authorization.getName());
-                       tokenDescriptor.setToken(token);
-                       tokenDescriptor.setExpiryDate(expiryDateStr);
-//                     tokenDescriptor.setRoles(Collections.unmodifiableSortedSet(new TreeSet<>(Arrays.asList(roles))));
-
-                       resp.setContentType("application/json");
-                       JsonGenerator jg = objectMapper.getFactory().createGenerator(resp.getWriter());
-                       jg.writeObject(tokenDescriptor);
-               } catch (Exception e) {
-                       new CmsExceptionsChain(e).writeAsJson(objectMapper, resp);
-               }
-       }
-
-       @Override
-       protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
-               // temporarily wrap POST for ease of testing
-               doPost(req, resp);
-       }
-
-       @Override
-       protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
-               try {
-                       String token = req.getParameter(PARAM_TOKEN);
-                       userManager.expireAuthToken(token);
-               } catch (Exception e) {
-                       new CmsExceptionsChain(e).writeAsJson(objectMapper, resp);
-               }
-       }
-
-       protected <T> T extractFrom(Set<T> creds) {
-               if (creds.size() > 0)
-                       return creds.iterator().next();
-               else
-                       return null;
-       }
-
-       public void setUserManager(CmsUserManager userManager) {
-               this.userManager = userManager;
-       }
-}
diff --git a/cms/org.argeo.cms.integration/src/org/argeo/cms/integration/JcrReadServlet.java b/cms/org.argeo.cms.integration/src/org/argeo/cms/integration/JcrReadServlet.java
deleted file mode 100644 (file)
index 0553d7f..0000000
+++ /dev/null
@@ -1,318 +0,0 @@
-package org.argeo.cms.integration;
-
-import java.io.IOException;
-import java.io.UnsupportedEncodingException;
-import java.net.URLDecoder;
-import java.nio.charset.StandardCharsets;
-import java.security.AccessControlContext;
-import java.security.PrivilegedActionException;
-import java.security.PrivilegedExceptionAction;
-import java.util.ArrayList;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.TreeMap;
-
-import javax.jcr.Node;
-import javax.jcr.NodeIterator;
-import javax.jcr.Property;
-import javax.jcr.PropertyIterator;
-import javax.jcr.PropertyType;
-import javax.jcr.Repository;
-import javax.jcr.RepositoryException;
-import javax.jcr.Session;
-import javax.jcr.Value;
-import javax.jcr.nodetype.NodeType;
-import javax.security.auth.Subject;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.apache.commons.io.IOUtils;
-import org.apache.jackrabbit.api.JackrabbitNode;
-import org.apache.jackrabbit.api.JackrabbitValue;
-import org.argeo.api.cms.CmsLog;
-import org.argeo.jcr.JcrUtils;
-import org.osgi.service.http.context.ServletContextHelper;
-
-import com.fasterxml.jackson.core.JsonGenerator;
-import com.fasterxml.jackson.databind.ObjectMapper;
-
-/** Access a JCR repository via web services. */
-public class JcrReadServlet extends HttpServlet {
-       private static final long serialVersionUID = 6536175260540484539L;
-       private final static CmsLog log = CmsLog.getLog(JcrReadServlet.class);
-
-       protected final static String ACCEPT_HTTP_HEADER = "Accept";
-       protected final static String CONTENT_DISPOSITION_HTTP_HEADER = "Content-Disposition";
-
-       protected final static String OCTET_STREAM_CONTENT_TYPE = "application/octet-stream";
-       protected final static String XML_CONTENT_TYPE = "application/xml";
-       protected final static String JSON_CONTENT_TYPE = "application/json";
-
-       private final static String PARAM_VERBOSE = "verbose";
-       private final static String PARAM_DEPTH = "depth";
-
-       protected final static String JCR_NODES = "jcr:nodes";
-       // cf. javax.jcr.Property
-       protected final static String JCR_PATH = "path";
-       protected final static String JCR_NAME = "name";
-
-       protected final static String _JCR = "_jcr";
-       protected final static String JCR_PREFIX = "jcr:";
-       protected final static String REP_PREFIX = "rep:";
-
-       private Repository repository;
-       private Integer maxDepth = 8;
-
-       private ObjectMapper objectMapper = new ObjectMapper();
-
-       @Override
-       protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
-               if (log.isTraceEnabled())
-                       log.trace("Data service: " + req.getPathInfo());
-
-               String dataWorkspace = getWorkspace(req);
-               String jcrPath = getJcrPath(req);
-
-               boolean verbose = req.getParameter(PARAM_VERBOSE) != null && !req.getParameter(PARAM_VERBOSE).equals("false");
-               int depth = 1;
-               if (req.getParameter(PARAM_DEPTH) != null) {
-                       depth = Integer.parseInt(req.getParameter(PARAM_DEPTH));
-                       if (depth > maxDepth)
-                               throw new RuntimeException("Depth " + depth + " is higher than maximum " + maxDepth);
-               }
-
-               Session session = null;
-               try {
-                       // authentication
-                       session = openJcrSession(req, resp, getRepository(), dataWorkspace);
-                       if (!session.itemExists(jcrPath))
-                               throw new RuntimeException("JCR node " + jcrPath + " does not exist");
-                       Node node = session.getNode(jcrPath);
-
-                       List<String> acceptHeader = readAcceptHeader(req);
-                       if (!acceptHeader.isEmpty() && node.isNodeType(NodeType.NT_FILE)) {
-                               resp.setContentType(OCTET_STREAM_CONTENT_TYPE);
-                               resp.addHeader(CONTENT_DISPOSITION_HTTP_HEADER, "attachment; filename='" + node.getName() + "'");
-                               IOUtils.copy(JcrUtils.getFileAsStream(node), resp.getOutputStream());
-                               resp.flushBuffer();
-                       } else {
-                               if (!acceptHeader.isEmpty() && acceptHeader.get(0).equals(XML_CONTENT_TYPE)) {
-                                       // TODO Use req.startAsync(); ?
-                                       resp.setContentType(XML_CONTENT_TYPE);
-                                       session.exportSystemView(node.getPath(), resp.getOutputStream(), false, depth <= 1);
-                                       return;
-                               }
-                               if (!acceptHeader.isEmpty() && !acceptHeader.contains(JSON_CONTENT_TYPE)) {
-                                       if (log.isTraceEnabled())
-                                               log.warn("Content type " + acceptHeader + " in Accept header is not supported. Supported: "
-                                                               + JSON_CONTENT_TYPE + " (default), " + XML_CONTENT_TYPE);
-                               }
-                               resp.setContentType(JSON_CONTENT_TYPE);
-                               JsonGenerator jsonGenerator = getObjectMapper().getFactory().createGenerator(resp.getWriter());
-                               jsonGenerator.writeStartObject();
-                               writeNodeChildren(node, jsonGenerator, depth, verbose);
-                               writeNodeProperties(node, jsonGenerator, verbose);
-                               jsonGenerator.writeEndObject();
-                               jsonGenerator.flush();
-                       }
-               } catch (Exception e) {
-                       new CmsExceptionsChain(e).writeAsJson(getObjectMapper(), resp);
-               } finally {
-                       JcrUtils.logoutQuietly(session);
-               }
-       }
-
-       protected Session openJcrSession(HttpServletRequest req, HttpServletResponse resp, Repository repository,
-                       String workspace) throws RepositoryException {
-               AccessControlContext acc = (AccessControlContext) req.getAttribute(ServletContextHelper.REMOTE_USER);
-               Subject subject = Subject.getSubject(acc);
-               try {
-                       return Subject.doAs(subject, new PrivilegedExceptionAction<Session>() {
-
-                               @Override
-                               public Session run() throws RepositoryException {
-                                       return repository.login(workspace);
-                               }
-
-                       });
-               } catch (PrivilegedActionException e) {
-                       if (e.getException() instanceof RepositoryException)
-                               throw (RepositoryException) e.getException();
-                       else
-                               throw new RuntimeException(e.getException());
-               }
-//             return workspace != null ? repository.login(workspace) : repository.login();
-       }
-
-       protected String getWorkspace(HttpServletRequest req) {
-               String path = req.getPathInfo();
-               try {
-                       path = URLDecoder.decode(path, StandardCharsets.UTF_8.name());
-               } catch (UnsupportedEncodingException e) {
-                       throw new IllegalArgumentException(e);
-               }
-               String[] pathTokens = path.split("/");
-               return pathTokens[1];
-       }
-
-       protected String getJcrPath(HttpServletRequest req) {
-               String path = req.getPathInfo();
-               try {
-                       path = URLDecoder.decode(path, StandardCharsets.UTF_8.name());
-               } catch (UnsupportedEncodingException e) {
-                       throw new IllegalArgumentException(e);
-               }
-               String[] pathTokens = path.split("/");
-               String domain = pathTokens[1];
-               String jcrPath = path.substring(domain.length() + 1);
-               return jcrPath;
-       }
-
-       protected List<String> readAcceptHeader(HttpServletRequest req) {
-               List<String> lst = new ArrayList<>();
-               String acceptHeader = req.getHeader(ACCEPT_HTTP_HEADER);
-               if (acceptHeader == null)
-                       return lst;
-//             Enumeration<String> acceptHeader = req.getHeaders(ACCEPT_HTTP_HEADER);
-//             while (acceptHeader.hasMoreElements()) {
-               String[] arr = acceptHeader.split("\\.");
-               for (int i = 0; i < arr.length; i++) {
-                       String str = arr[i].trim();
-                       if (!"".equals(str))
-                               lst.add(str);
-               }
-//             }
-               return lst;
-       }
-
-       protected void writeNodeProperties(Node node, JsonGenerator jsonGenerator, boolean verbose)
-                       throws RepositoryException, IOException {
-               String jcrPath = node.getPath();
-               Map<String, Map<String, Property>> namespaces = new TreeMap<>();
-
-               PropertyIterator pit = node.getProperties();
-               properties: while (pit.hasNext()) {
-                       Property property = pit.nextProperty();
-
-                       final String propertyName = property.getName();
-                       int columnIndex = propertyName.indexOf(':');
-                       if (columnIndex > 0) {
-                               // mark prefix with a '_' before the name of the object, according to JSON
-                               // conventions to indicate a special value
-                               String prefix = "_" + propertyName.substring(0, columnIndex);
-                               String unqualifiedName = propertyName.substring(columnIndex + 1);
-                               if (!namespaces.containsKey(prefix))
-                                       namespaces.put(prefix, new LinkedHashMap<String, Property>());
-                               Map<String, Property> map = namespaces.get(prefix);
-                               assert !map.containsKey(unqualifiedName);
-                               map.put(unqualifiedName, property);
-                               continue properties;
-                       }
-
-                       if (property.getType() == PropertyType.BINARY) {
-                               if (!(node instanceof JackrabbitNode)) {
-                                       continue properties;// skip
-                               }
-                       }
-
-                       writeProperty(propertyName, property, jsonGenerator);
-               }
-
-               for (String prefix : namespaces.keySet()) {
-                       Map<String, Property> map = namespaces.get(prefix);
-                       jsonGenerator.writeFieldName(prefix);
-                       jsonGenerator.writeStartObject();
-                       if (_JCR.equals(prefix)) {
-                               jsonGenerator.writeStringField(JCR_NAME, node.getName());
-                               jsonGenerator.writeStringField(JCR_PATH, jcrPath);
-                       }
-                       properties: for (String unqualifiedName : map.keySet()) {
-                               Property property = map.get(unqualifiedName);
-                               if (property.getType() == PropertyType.BINARY) {
-                                       if (!(node instanceof JackrabbitNode)) {
-                                               continue properties;// skip
-                                       }
-                               }
-                               writeProperty(unqualifiedName, property, jsonGenerator);
-                       }
-                       jsonGenerator.writeEndObject();
-               }
-       }
-
-       protected void writeProperty(String fieldName, Property property, JsonGenerator jsonGenerator)
-                       throws RepositoryException, IOException {
-               if (!property.isMultiple()) {
-                       jsonGenerator.writeFieldName(fieldName);
-                       writePropertyValue(property.getType(), property.getValue(), jsonGenerator);
-               } else {
-                       jsonGenerator.writeFieldName(fieldName);
-                       jsonGenerator.writeStartArray();
-                       Value[] values = property.getValues();
-                       for (Value value : values) {
-                               writePropertyValue(property.getType(), value, jsonGenerator);
-                       }
-                       jsonGenerator.writeEndArray();
-               }
-       }
-
-       protected void writePropertyValue(int type, Value value, JsonGenerator jsonGenerator)
-                       throws RepositoryException, IOException {
-               if (type == PropertyType.DOUBLE)
-                       jsonGenerator.writeNumber(value.getDouble());
-               else if (type == PropertyType.LONG)
-                       jsonGenerator.writeNumber(value.getLong());
-               else if (type == PropertyType.BINARY) {
-                       if (value instanceof JackrabbitValue) {
-                               String contentIdentity = ((JackrabbitValue) value).getContentIdentity();
-                               jsonGenerator.writeString("SHA256:" + contentIdentity);
-                       } else {
-                               // TODO write Base64 ?
-                               jsonGenerator.writeNull();
-                       }
-               } else
-                       jsonGenerator.writeString(value.getString());
-       }
-
-       protected void writeNodeChildren(Node node, JsonGenerator jsonGenerator, int depth, boolean verbose)
-                       throws RepositoryException, IOException {
-               if (!node.hasNodes())
-                       return;
-               if (depth <= 0)
-                       return;
-               NodeIterator nit;
-
-               nit = node.getNodes();
-               children: while (nit.hasNext()) {
-                       Node child = nit.nextNode();
-                       if (!verbose && child.getName().startsWith(REP_PREFIX)) {
-                               continue children;// skip Jackrabbit auth metadata
-                       }
-
-                       jsonGenerator.writeFieldName(child.getName());
-                       jsonGenerator.writeStartObject();
-                       writeNodeChildren(child, jsonGenerator, depth - 1, verbose);
-                       writeNodeProperties(child, jsonGenerator, verbose);
-                       jsonGenerator.writeEndObject();
-               }
-       }
-
-       public void setRepository(Repository repository) {
-               this.repository = repository;
-       }
-
-       public void setMaxDepth(Integer maxDepth) {
-               this.maxDepth = maxDepth;
-       }
-
-       protected Repository getRepository() {
-               return repository;
-       }
-
-       protected ObjectMapper getObjectMapper() {
-               return objectMapper;
-       }
-
-}
diff --git a/cms/org.argeo.cms.integration/src/org/argeo/cms/integration/JcrWriteServlet.java b/cms/org.argeo.cms.integration/src/org/argeo/cms/integration/JcrWriteServlet.java
deleted file mode 100644 (file)
index 8a3864b..0000000
+++ /dev/null
@@ -1,91 +0,0 @@
-package org.argeo.cms.integration;
-
-import java.io.IOException;
-
-import javax.jcr.ImportUUIDBehavior;
-import javax.jcr.Node;
-import javax.jcr.Session;
-import javax.jcr.nodetype.NodeType;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.apache.commons.io.FilenameUtils;
-import org.apache.commons.io.IOUtils;
-import org.argeo.api.cms.CmsLog;
-import org.argeo.jcr.JcrUtils;
-
-/** Access a JCR repository via web services. */
-public class JcrWriteServlet extends JcrReadServlet {
-       private static final long serialVersionUID = 17272653843085492L;
-       private final static CmsLog log = CmsLog.getLog(JcrWriteServlet.class);
-
-       @Override
-       protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
-               if (log.isDebugEnabled())
-                       log.debug("Data service POST: " + req.getPathInfo());
-
-               String dataWorkspace = getWorkspace(req);
-               String jcrPath = getJcrPath(req);
-
-               Session session = null;
-               try {
-                       // authentication
-                       session = openJcrSession(req, resp, getRepository(), dataWorkspace);
-
-                       if (req.getContentType() != null && req.getContentType().equals(XML_CONTENT_TYPE)) {
-//                             resp.setContentType(XML_CONTENT_TYPE);
-                               session.getWorkspace().importXML(jcrPath, req.getInputStream(),
-                                               ImportUUIDBehavior.IMPORT_UUID_COLLISION_REMOVE_EXISTING);
-                               return;
-                       }
-
-                       if (!session.itemExists(jcrPath)) {
-                               String parentPath = FilenameUtils.getFullPathNoEndSeparator(jcrPath);
-                               String fileName = FilenameUtils.getName(jcrPath);
-                               Node folderNode = JcrUtils.mkfolders(session, parentPath);
-                               byte[] bytes = IOUtils.toByteArray(req.getInputStream());
-                               JcrUtils.copyBytesAsFile(folderNode, fileName, bytes);
-                       } else {
-                               Node node = session.getNode(jcrPath);
-                               if (!node.isNodeType(NodeType.NT_FILE))
-                                       throw new IllegalArgumentException("Node " + jcrPath + " exists but is not a file");
-                               byte[] bytes = IOUtils.toByteArray(req.getInputStream());
-                               JcrUtils.copyBytesAsFile(node.getParent(), node.getName(), bytes);
-                       }
-                       session.save();
-               } catch (Exception e) {
-                       new CmsExceptionsChain(e).writeAsJson(getObjectMapper(), resp);
-               } finally {
-                       JcrUtils.logoutQuietly(session);
-               }
-       }
-
-       @Override
-       protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
-               if (log.isDebugEnabled())
-                       log.debug("Data service DELETE: " + req.getPathInfo());
-
-               String dataWorkspace = getWorkspace(req);
-               String jcrPath = getJcrPath(req);
-
-               Session session = null;
-               try {
-                       // authentication
-                       session = openJcrSession(req, resp, getRepository(), dataWorkspace);
-                       if (!session.itemExists(jcrPath)) {
-                               // ignore
-                               return;
-                       } else {
-                               Node node = session.getNode(jcrPath);
-                               node.remove();
-                       }
-                       session.save();
-               } catch (Exception e) {
-                       new CmsExceptionsChain(e).writeAsJson(getObjectMapper(), resp);
-               } finally {
-                       JcrUtils.logoutQuietly(session);
-               }
-       }
-
-}
diff --git a/cms/org.argeo.cms.integration/src/org/argeo/cms/integration/TokenDescriptor.java b/cms/org.argeo.cms.integration/src/org/argeo/cms/integration/TokenDescriptor.java
deleted file mode 100644 (file)
index 1541b4f..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-package org.argeo.cms.integration;
-
-import java.io.Serializable;
-
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-
-/** A serializable descriptor of a token. */
-@JsonIgnoreProperties(ignoreUnknown = true)
-public class TokenDescriptor implements Serializable {
-       private static final long serialVersionUID = -6607393871416803324L;
-
-       private String token;
-       private String username;
-       private String expiryDate;
-//     private Set<String> roles;
-
-       public String getToken() {
-               return token;
-       }
-
-       public void setToken(String token) {
-               this.token = token;
-       }
-
-       public String getUsername() {
-               return username;
-       }
-
-       public void setUsername(String username) {
-               this.username = username;
-       }
-
-//     public Set<String> getRoles() {
-//             return roles;
-//     }
-//
-//     public void setRoles(Set<String> roles) {
-//             this.roles = roles;
-//     }
-
-       public String getExpiryDate() {
-               return expiryDate;
-       }
-
-       public void setExpiryDate(String expiryDate) {
-               this.expiryDate = expiryDate;
-       }
-
-}
diff --git a/cms/org.argeo.cms.integration/src/org/argeo/cms/integration/XslTemplate.java b/cms/org.argeo.cms.integration/src/org/argeo/cms/integration/XslTemplate.java
deleted file mode 100644 (file)
index c9802a2..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-package org.argeo.cms.integration;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-
-import javax.jcr.Node;
-import javax.jcr.RepositoryException;
-import javax.xml.transform.Result;
-import javax.xml.transform.Source;
-import javax.xml.transform.Transformer;
-import javax.xml.transform.TransformerConfigurationException;
-import javax.xml.transform.TransformerException;
-import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.TransformerFactoryConfigurationError;
-import javax.xml.transform.stream.StreamResult;
-import javax.xml.transform.stream.StreamSource;
-
-public class XslTemplate {
-       private Transformer transformer;
-
-       public XslTemplate(InputStream in, String systemId) {
-               this(loadTransformer(in, systemId));
-       }
-
-       public XslTemplate(Transformer transformer) {
-               this.transformer = transformer;
-       }
-
-       private static Transformer loadTransformer(InputStream in, String systemId) {
-               try {
-                       TransformerFactory tFactory = TransformerFactory.newInstance();
-                       StreamSource stylesource = new StreamSource(in, systemId);
-                       return tFactory.newTransformer(stylesource);
-               } catch (TransformerConfigurationException | TransformerFactoryConfigurationError e) {
-                       throw new IllegalArgumentException("Cannot initialise stylesheet with systemId " + systemId, e);
-               }
-       }
-
-       public synchronized void apply(Node node, OutputStream out) {
-               // TODO use a pool of Transformer instead of synchronized
-               try (ByteArrayOutputStream xml = new ByteArrayOutputStream()) {
-                       node.getSession().exportDocumentView(node.getPath(), xml, true, false);
-                       try (ByteArrayInputStream xmlIn = new ByteArrayInputStream(xml.toByteArray())) {
-                               Source source = new StreamSource(xmlIn);
-                               Result results = new StreamResult(out);
-                               transformer.transform(source, results);
-                       }
-               } catch (IOException | RepositoryException | TransformerException e) {
-                       throw new RuntimeException("Cannot process XSL template on " + node, e);
-               }
-       }
-}
diff --git a/cms/org.argeo.cms.integration/src/org/argeo/cms/integration/package-info.java b/cms/org.argeo.cms.integration/src/org/argeo/cms/integration/package-info.java
deleted file mode 100644 (file)
index 1405737..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-/** Argeo CMS integration (JSON, web services). */
-package org.argeo.cms.integration;
\ No newline at end of file
diff --git a/cms/org.argeo.cms.integration/src/org/argeo/cms/websocket/CmsWebSocketConfigurator.java b/cms/org.argeo.cms.integration/src/org/argeo/cms/websocket/CmsWebSocketConfigurator.java
deleted file mode 100644 (file)
index 747afa4..0000000
+++ /dev/null
@@ -1,86 +0,0 @@
-package org.argeo.cms.websocket;
-
-/** <strong>Disabled until third party issues are solved.</strong>. Customises the initialisation of a new web socket. */
-public class CmsWebSocketConfigurator {
-//extends Configurator {
-//     public final static String WEBSOCKET_SUBJECT = "org.argeo.cms.websocket.subject";
-//
-//     private final static CmsLog log = CmsLog.getLog(CmsWebSocketConfigurator.class);
-//     final static String HEADER_WWW_AUTHENTICATE = "WWW-Authenticate";
-//
-//     @Override
-//     public boolean checkOrigin(String originHeaderValue) {
-//             return true;
-//     }
-//
-//     @Override
-//     public <T> T getEndpointInstance(Class<T> endpointClass) throws InstantiationException {
-//             try {
-//                     return endpointClass.getDeclaredConstructor().newInstance();
-//             } catch (Exception e) {
-//                     throw new IllegalArgumentException("Cannot get endpoint instance", e);
-//             }
-//     }
-//
-//     @Override
-//     public List<Extension> getNegotiatedExtensions(List<Extension> installed, List<Extension> requested) {
-//             return requested;
-//     }
-//
-//     @Override
-//     public String getNegotiatedSubprotocol(List<String> supported, List<String> requested) {
-//             if ((requested == null) || (requested.size() == 0))
-//                     return "";
-//             if ((supported == null) || (supported.isEmpty()))
-//                     return "";
-//             for (String possible : requested) {
-//                     if (possible == null)
-//                             continue;
-//                     if (supported.contains(possible))
-//                             return possible;
-//             }
-//             return "";
-//     }
-//
-//     @Override
-//     public void modifyHandshake(ServerEndpointConfig sec, HandshakeRequest request, HandshakeResponse response) {
-//
-//             RemoteAuthSession httpSession = new ServletHttpSession((javax.servlet.http.HttpSession) request.getHttpSession());
-//             if (log.isDebugEnabled() && httpSession != null)
-//                     log.debug("Web socket HTTP session id: " + httpSession.getId());
-//
-//             if (httpSession == null) {
-//                     rejectResponse(response, null);
-//             }
-//             try {
-//                     LoginContext lc = new LoginContext(CmsAuth.LOGIN_CONTEXT_USER,
-//                                     new RemoteAuthCallbackHandler(httpSession));
-//                     lc.login();
-//                     if (log.isDebugEnabled())
-//                             log.debug("Web socket logged-in as " + lc.getSubject());
-//                     Subject.doAs(lc.getSubject(), new PrivilegedAction<Void>() {
-//
-//                             @Override
-//                             public Void run() {
-//                                     sec.getUserProperties().put(ServletContextHelper.REMOTE_USER, AccessController.getContext());
-//                                     return null;
-//                             }
-//
-//                     });
-//             } catch (Exception e) {
-//                     rejectResponse(response, e);
-//             }
-//     }
-//
-//     /**
-//      * Behaviour when the web socket could not be authenticated. Throws an
-//      * {@link IllegalStateException} by default.
-//      * 
-//      * @param e can be null
-//      */
-//     protected void rejectResponse(HandshakeResponse response, Exception e) {
-//             // violent implementation, as suggested in
-//             // https://stackoverflow.com/questions/21763829/jsr-356-how-to-abort-a-websocket-connection-during-the-handshake
-////           throw new IllegalStateException("Web socket cannot be authenticated");
-//     }
-}
diff --git a/cms/org.argeo.cms.integration/src/org/argeo/cms/websocket/package-info.java b/cms/org.argeo.cms.integration/src/org/argeo/cms/websocket/package-info.java
deleted file mode 100644 (file)
index 2ab9a67..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-/** Argeo CMS websocket integration. */
-package org.argeo.cms.websocket;
\ No newline at end of file
diff --git a/ext/org.argeo.ext.equinox.jetty/.classpath b/ext/org.argeo.ext.equinox.jetty/.classpath
deleted file mode 100644 (file)
index eca7bdb..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-       <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
-       <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-       <classpathentry kind="src" path="src"/>
-       <classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/ext/org.argeo.ext.equinox.jetty/.gitignore b/ext/org.argeo.ext.equinox.jetty/.gitignore
deleted file mode 100644 (file)
index 09e3bc9..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-/bin/
-/target/
diff --git a/ext/org.argeo.ext.equinox.jetty/.project b/ext/org.argeo.ext.equinox.jetty/.project
deleted file mode 100644 (file)
index 0b9700d..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-       <name>org.argeo.ext.equinox.jetty</name>
-       <comment></comment>
-       <projects>
-       </projects>
-       <buildSpec>
-               <buildCommand>
-                       <name>org.eclipse.jdt.core.javabuilder</name>
-                       <arguments>
-                       </arguments>
-               </buildCommand>
-               <buildCommand>
-                       <name>org.eclipse.pde.ManifestBuilder</name>
-                       <arguments>
-                       </arguments>
-               </buildCommand>
-               <buildCommand>
-                       <name>org.eclipse.pde.SchemaBuilder</name>
-                       <arguments>
-                       </arguments>
-               </buildCommand>
-       </buildSpec>
-       <natures>
-               <nature>org.eclipse.pde.PluginNature</nature>
-               <nature>org.eclipse.jdt.core.javanature</nature>
-       </natures>
-</projectDescription>
diff --git a/ext/org.argeo.ext.equinox.jetty/META-INF/.gitignore b/ext/org.argeo.ext.equinox.jetty/META-INF/.gitignore
deleted file mode 100644 (file)
index 4854a41..0000000
+++ /dev/null
@@ -1 +0,0 @@
-/MANIFEST.MF
diff --git a/ext/org.argeo.ext.equinox.jetty/bnd.bnd b/ext/org.argeo.ext.equinox.jetty/bnd.bnd
deleted file mode 100644 (file)
index 0f21e73..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-Fragment-Host: org.eclipse.equinox.http.jetty
-
-Import-Package: org.eclipse.jetty.websocket.jsr356,\
-org.eclipse.jetty.websocket.api,\
-org.eclipse.jetty.websocket.common,\
-org.osgi.service.http,\
-*
\ No newline at end of file
diff --git a/ext/org.argeo.ext.equinox.jetty/build.properties b/ext/org.argeo.ext.equinox.jetty/build.properties
deleted file mode 100644 (file)
index 34d2e4d..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .
diff --git a/ext/org.argeo.ext.equinox.jetty/src/org/argeo/equinox/jetty/CmsJettyCustomizer.java b/ext/org.argeo.ext.equinox.jetty/src/org/argeo/equinox/jetty/CmsJettyCustomizer.java
deleted file mode 100644 (file)
index 46f0280..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-package org.argeo.equinox.jetty;
-
-import java.util.Dictionary;
-
-import javax.servlet.ServletContext;
-import javax.websocket.DeploymentException;
-
-import org.eclipse.equinox.http.jetty.JettyCustomizer;
-import org.eclipse.jetty.servlet.ServletContextHandler;
-import org.eclipse.jetty.websocket.jsr356.server.ServerContainer;
-import org.eclipse.jetty.websocket.jsr356.server.deploy.WebSocketServerContainerInitializer;
-import org.eclipse.jetty.websocket.jsr356.server.deploy.WebSocketServerContainerInitializer.Configurator;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.FrameworkUtil;
-
-/** Customises the Jetty HTTP server. */
-public class CmsJettyCustomizer extends JettyCustomizer {
-       private BundleContext bc = FrameworkUtil.getBundle(CmsJettyCustomizer.class).getBundleContext();
-
-       public final static String WEBSOCKET_ENABLED = "websocket.enabled";
-
-       @Override
-       public Object customizeContext(Object context, Dictionary<String, ?> settings) {
-               // WebSocket
-               Object webSocketEnabled = settings.get(WEBSOCKET_ENABLED);
-               if (webSocketEnabled != null && webSocketEnabled.toString().equals("true")) {
-                       ServletContextHandler servletContextHandler = (ServletContextHandler) context;
-                       WebSocketServerContainerInitializer.configure(servletContextHandler, new Configurator() {
-
-                               @Override
-                               public void accept(ServletContext servletContext, ServerContainer serverContainer)
-                                               throws DeploymentException {
-                                       bc.registerService(javax.websocket.server.ServerContainer.class, serverContainer, null);
-                               }
-                       });
-               }
-               return super.customizeContext(context, settings);
-
-       }
-}
diff --git a/ext/org.argeo.ext.equinox.jetty/src/org/argeo/equinox/jetty/package-info.java b/ext/org.argeo.ext.equinox.jetty/src/org/argeo/equinox/jetty/package-info.java
deleted file mode 100644 (file)
index 41c8ce9..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-/** Equinox Jetty extensions. */
-package org.argeo.equinox.jetty;
\ No newline at end of file
index 5641687f7bbf79afefce003e876f56c6be5bf07e..3bebfe637846e4b17ef3dce85c1ca67870e32ddd 100644 (file)
@@ -300,6 +300,8 @@ public class A2Factory {
                                                continue entries;
                                        if (entry.getName().equals("META-INF/NOTICE"))
                                                continue entries;
+                                       if (entry.getName().equals("META-INF/NOTICE.txt"))
+                                               continue entries;
                                        if (entry.getName().equals("META-INF/LICENSE"))
                                                continue entries;
                                        Path target = targetBundleDir.resolve(entry.getName());
@@ -920,11 +922,12 @@ public class A2Factory {
 //             factory.processSingleM2ArtifactDistributionUnit(descriptorsBase.resolve("org.argeo.tp.apache").resolve("org.apache.xml.resolver.bnd"));
 //             factory.processM2BasedDistributionUnit(descriptorsBase.resolve("org.argeo.tp.apache/apache-sshd"));
 //             factory.processM2BasedDistributionUnit(descriptorsBase.resolve("org.argeo.tp.jetty/jetty"));
-//             factory.processM2BasedDistributionUnit(descriptorsBase.resolve("org.argeo.tp.jetty/jetty-websocket"));
+               factory.processCategory(descriptorsBase.resolve("org.argeo.tp.jetty"));
+//             factory.processCategory(descriptorsBase.resolve("org.argeo.tp.jetty.websocket"));
 //             factory.processCategory(descriptorsBase.resolve("org.argeo.tp.eclipse.rcp"));
 //             factory.processCategory(descriptorsBase.resolve("org.argeo.tp"));
-               factory.processCategory(descriptorsBase.resolve("org.argeo.tp.apache"));
-               factory.processCategory(descriptorsBase.resolve("org.argeo.tp.formats"));
+//             factory.processCategory(descriptorsBase.resolve("org.argeo.tp.apache"));
+//             factory.processCategory(descriptorsBase.resolve("org.argeo.tp.formats"));
 //             factory.processCategory(descriptorsBase.resolve("org.argeo.tp.gis"));
                System.exit(0);
 
diff --git a/tp/org.argeo.tp.jetty.websocket/javax.websocket.bnd b/tp/org.argeo.tp.jetty.websocket/javax.websocket.bnd
deleted file mode 100644 (file)
index cefcff8..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-Bundle-SymbolicName: javax.websocket
-Bundle-License: GPL-2.0-only OR CDDL-1.1
-SLC-Origin-M2: javax.websocket:javax.websocket-api:1.1
-SLC-Origin-ManifestNotModified: true
diff --git a/tp/org.argeo.tp.jetty.websocket/jetty-websocket/common.bnd b/tp/org.argeo.tp.jetty.websocket/jetty-websocket/common.bnd
deleted file mode 100644 (file)
index c26721c..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-Bundle-License: Apache-2.0
-SLC-Origin-M2: :10.0.8
diff --git a/tp/org.argeo.tp.jetty.websocket/jetty-websocket/org.eclipse.jetty.websocket.api.bnd b/tp/org.argeo.tp.jetty.websocket/jetty-websocket/org.eclipse.jetty.websocket.api.bnd
deleted file mode 100644 (file)
index 3723f35..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-SLC-Origin-M2: org.eclipse.jetty.websocket:websocket-jetty-api
-SLC-Origin-ManifestNotModified: true
-Bundle-SymbolicName: org.eclipse.jetty.websocket.api
diff --git a/tp/org.argeo.tp.jetty.websocket/jetty-websocket/org.eclipse.jetty.websocket.client.bnd b/tp/org.argeo.tp.jetty.websocket/jetty-websocket/org.eclipse.jetty.websocket.client.bnd
deleted file mode 100644 (file)
index 12795c3..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-SLC-Origin-M2: org.eclipse.jetty.websocket:websocket-jetty-client
-SLC-Origin-ManifestNotModified: true
-Bundle-SymbolicName: org.eclipse.jetty.websocket.client
diff --git a/tp/org.argeo.tp.jetty.websocket/jetty-websocket/org.eclipse.jetty.websocket.common.bnd b/tp/org.argeo.tp.jetty.websocket/jetty-websocket/org.eclipse.jetty.websocket.common.bnd
deleted file mode 100644 (file)
index d97b5e7..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-SLC-Origin-M2: org.eclipse.jetty.websocket:websocket-jetty-common
-SLC-Origin-ManifestNotModified: true
-Bundle-SymbolicName: org.eclipse.jetty.websocket.common
diff --git a/tp/org.argeo.tp.jetty.websocket/jetty-websocket/org.eclipse.jetty.websocket.core.client.bnd b/tp/org.argeo.tp.jetty.websocket/jetty-websocket/org.eclipse.jetty.websocket.core.client.bnd
deleted file mode 100644 (file)
index e6f4338..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-SLC-Origin-M2: org.eclipse.jetty.websocket:websocket-core-client
-SLC-Origin-ManifestNotModified: true
-Bundle-SymbolicName: org.eclipse.jetty.websocket.core.client
diff --git a/tp/org.argeo.tp.jetty.websocket/jetty-websocket/org.eclipse.jetty.websocket.core.common.bnd b/tp/org.argeo.tp.jetty.websocket/jetty-websocket/org.eclipse.jetty.websocket.core.common.bnd
deleted file mode 100644 (file)
index 9d8bbe9..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-SLC-Origin-M2: org.eclipse.jetty.websocket:websocket-core-common
-SLC-Origin-ManifestNotModified: true
-Bundle-SymbolicName: org.eclipse.jetty.websocket.core.common
diff --git a/tp/org.argeo.tp.jetty.websocket/jetty-websocket/org.eclipse.jetty.websocket.core.server.bnd b/tp/org.argeo.tp.jetty.websocket/jetty-websocket/org.eclipse.jetty.websocket.core.server.bnd
deleted file mode 100644 (file)
index e6f4338..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-SLC-Origin-M2: org.eclipse.jetty.websocket:websocket-core-client
-SLC-Origin-ManifestNotModified: true
-Bundle-SymbolicName: org.eclipse.jetty.websocket.core.client
diff --git a/tp/org.argeo.tp.jetty.websocket/jetty-websocket/org.eclipse.jetty.websocket.jakarta.websocket.client.bnd.disabled b/tp/org.argeo.tp.jetty.websocket/jetty-websocket/org.eclipse.jetty.websocket.jakarta.websocket.client.bnd.disabled
deleted file mode 100644 (file)
index 29ee719..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-SLC-Origin-M2: org.eclipse.jetty.websocket:websocket-jakarta-client
-SLC-Origin-ManifestNotModified: true
-Bundle-SymbolicName: org.eclipse.jetty.websocket.jakarta.client
diff --git a/tp/org.argeo.tp.jetty.websocket/jetty-websocket/org.eclipse.jetty.websocket.jakarta.websocket.common.bnd.disabled b/tp/org.argeo.tp.jetty.websocket/jetty-websocket/org.eclipse.jetty.websocket.jakarta.websocket.common.bnd.disabled
deleted file mode 100644 (file)
index b2d60af..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-SLC-Origin-M2: org.eclipse.jetty.websocket:websocket-jakarta-common
-SLC-Origin-ManifestNotModified: true
-Bundle-SymbolicName: org.eclipse.jetty.websocket.jakarta.common
diff --git a/tp/org.argeo.tp.jetty.websocket/jetty-websocket/org.eclipse.jetty.websocket.jakarta.websocket.server.bnd.disabled b/tp/org.argeo.tp.jetty.websocket/jetty-websocket/org.eclipse.jetty.websocket.jakarta.websocket.server.bnd.disabled
deleted file mode 100644 (file)
index 999440a..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-SLC-Origin-M2: org.eclipse.jetty.websocket:websocket-jakarta-server
-SLC-Origin-ManifestNotModified: true
-Bundle-SymbolicName: org.eclipse.jetty.websocket.jakarta.server
diff --git a/tp/org.argeo.tp.jetty.websocket/jetty-websocket/org.eclipse.jetty.websocket.server.bnd b/tp/org.argeo.tp.jetty.websocket/jetty-websocket/org.eclipse.jetty.websocket.server.bnd
deleted file mode 100644 (file)
index c515899..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-SLC-Origin-M2: org.eclipse.jetty.websocket:websocket-jetty-server
-SLC-Origin-ManifestNotModified: true
-Bundle-SymbolicName: org.eclipse.jetty.websocket.server
diff --git a/tp/org.argeo.tp.jetty.websocket/jetty-websocket/org.eclipse.jetty.websocket.servlet.bnd b/tp/org.argeo.tp.jetty.websocket/jetty-websocket/org.eclipse.jetty.websocket.servlet.bnd
deleted file mode 100644 (file)
index 3db77e2..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-SLC-Origin-M2: org.eclipse.jetty.websocket:websocket-servlet
-SLC-Origin-ManifestNotModified: true
-Bundle-SymbolicName: org.eclipse.jetty.websocket.servlet
diff --git a/tp/org.argeo.tp.jetty/javax.websocket.bnd b/tp/org.argeo.tp.jetty/javax.websocket.bnd
new file mode 100644 (file)
index 0000000..cefcff8
--- /dev/null
@@ -0,0 +1,4 @@
+Bundle-SymbolicName: javax.websocket
+Bundle-License: GPL-2.0-only OR CDDL-1.1
+SLC-Origin-M2: javax.websocket:javax.websocket-api:1.1
+SLC-Origin-ManifestNotModified: true
diff --git a/tp/org.argeo.tp.jetty/jetty-websocket/merge.bnd b/tp/org.argeo.tp.jetty/jetty-websocket/merge.bnd
new file mode 100644 (file)
index 0000000..309a9e7
--- /dev/null
@@ -0,0 +1,22 @@
+Bundle-SymbolicName: org.eclipse.jetty.websocket
+Bundle-License: Apache-2.0
+SLC-Origin-M2: :10.0.9
+SLC-Origin-M2-Merge: \
+org.eclipse.jetty.websocket:websocket-core-client, \
+org.eclipse.jetty.websocket:websocket-core-common, \
+org.eclipse.jetty.websocket:websocket-core-server, \
+org.eclipse.jetty.websocket:websocket-jetty-api, \
+org.eclipse.jetty.websocket:websocket-jetty-client, \
+org.eclipse.jetty.websocket:websocket-jetty-common, \
+org.eclipse.jetty.websocket:websocket-jetty-server,\
+org.eclipse.jetty.websocket:websocket-javax-client, \
+org.eclipse.jetty.websocket:websocket-javax-common, \
+org.eclipse.jetty.websocket:websocket-javax-server,\
+org.eclipse.jetty.websocket:websocket-servlet, \
+
+Export-Package: org.eclipse.jetty.*
+
+Import-Package: \
+!java.*, \
+org.eclipse.jetty.webapp;resolution:="optional", \
+*
\ No newline at end of file
diff --git a/tp/org.argeo.tp.jetty/jetty/org.eclipse.jetty.alpn.client.bnd b/tp/org.argeo.tp.jetty/jetty/org.eclipse.jetty.alpn.client.bnd
new file mode 100644 (file)
index 0000000..202f50a
--- /dev/null
@@ -0,0 +1,2 @@
+SLC-Origin-M2: org.eclipse.jetty:jetty-alpn-client
+SLC-Origin-ManifestNotModified: true
diff --git a/tp/org.argeo.tp.jetty/jetty/org.eclipse.jetty.alpn.server.bnd b/tp/org.argeo.tp.jetty/jetty/org.eclipse.jetty.alpn.server.bnd
new file mode 100644 (file)
index 0000000..47e4560
--- /dev/null
@@ -0,0 +1,2 @@
+SLC-Origin-M2: org.eclipse.jetty:jetty-alpn-server
+SLC-Origin-ManifestNotModified: true
diff --git a/tp/org.argeo.tp.jetty/jetty/org.eclipse.jetty.client.bnd b/tp/org.argeo.tp.jetty/jetty/org.eclipse.jetty.client.bnd
new file mode 100644 (file)
index 0000000..8bce1ab
--- /dev/null
@@ -0,0 +1,3 @@
+SLC-Origin-M2: org.eclipse.jetty:jetty-client
+SLC-Origin-ManifestNotModified: true
+Bundle-SymbolicName: org.eclipse.jetty.client
diff --git a/tp/org.argeo.tp.jetty/jetty/org.eclipse.jetty.client.bnd.retired b/tp/org.argeo.tp.jetty/jetty/org.eclipse.jetty.client.bnd.retired
deleted file mode 100644 (file)
index 8bce1ab..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-SLC-Origin-M2: org.eclipse.jetty:jetty-client
-SLC-Origin-ManifestNotModified: true
-Bundle-SymbolicName: org.eclipse.jetty.client
diff --git a/tp/org.argeo.tp.jetty/jetty/org.eclipse.jetty.http2.client.bnd b/tp/org.argeo.tp.jetty/jetty/org.eclipse.jetty.http2.client.bnd
new file mode 100644 (file)
index 0000000..b57b83f
--- /dev/null
@@ -0,0 +1,2 @@
+SLC-Origin-M2: org.eclipse.jetty.http2:http2-client
+SLC-Origin-ManifestNotModified: true
diff --git a/tp/org.argeo.tp.jetty/jetty/org.eclipse.jetty.http2.common.bnd b/tp/org.argeo.tp.jetty/jetty/org.eclipse.jetty.http2.common.bnd
new file mode 100644 (file)
index 0000000..c1d7174
--- /dev/null
@@ -0,0 +1,2 @@
+SLC-Origin-M2: org.eclipse.jetty.http2:http2-common
+SLC-Origin-ManifestNotModified: true
diff --git a/tp/org.argeo.tp.jetty/jetty/org.eclipse.jetty.http2.hpack.bnd b/tp/org.argeo.tp.jetty/jetty/org.eclipse.jetty.http2.hpack.bnd
new file mode 100644 (file)
index 0000000..766cdd0
--- /dev/null
@@ -0,0 +1,2 @@
+SLC-Origin-M2: org.eclipse.jetty.http2:http2-hpack
+SLC-Origin-ManifestNotModified: true
diff --git a/tp/org.argeo.tp.jetty/jetty/org.eclipse.jetty.http2.server.bnd b/tp/org.argeo.tp.jetty/jetty/org.eclipse.jetty.http2.server.bnd
new file mode 100644 (file)
index 0000000..2f1a080
--- /dev/null
@@ -0,0 +1,2 @@
+SLC-Origin-M2: org.eclipse.jetty.http2:http2-server
+SLC-Origin-ManifestNotModified: true