Finished
This commit is contained in:
4
pom.xml
4
pom.xml
@@ -6,7 +6,7 @@
|
||||
|
||||
<groupId>org.openautonomousconnection</groupId>
|
||||
<artifactId>InfoNameLib</artifactId>
|
||||
<version>1.0.0-BETA.1.3</version>
|
||||
<version>1.0.0-BETA.1.0</version>
|
||||
<organization>
|
||||
<name>Open Autonomous Connection</name>
|
||||
<url>https://open-autonomous-connection.org/</url>
|
||||
@@ -97,7 +97,7 @@
|
||||
<dependency>
|
||||
<groupId>org.openautonomousconnection</groupId>
|
||||
<artifactId>Protocol</artifactId>
|
||||
<version>1.0.0-BETA.7.7</version>
|
||||
<version>1.0.0-BETA.1.0</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
|
||||
@@ -0,0 +1,29 @@
|
||||
package org.openautonomousconnection.infonamelib;
|
||||
|
||||
/**
|
||||
* Stores the current session token across multiple HttpURLConnection instances.
|
||||
*
|
||||
* <p>JavaFX WebView creates a new connection per navigation, so headers must be re-injected
|
||||
* for every request.</p>
|
||||
*/
|
||||
public final class OacSessionJar {
|
||||
|
||||
private volatile String session;
|
||||
|
||||
/**
|
||||
* Stores a session token (e.g. from response header "session").
|
||||
*
|
||||
* @param session session token
|
||||
*/
|
||||
public void store(String session) {
|
||||
String s = (session == null) ? null : session.trim();
|
||||
this.session = (s == null || s.isEmpty()) ? null : s;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return stored session token or null
|
||||
*/
|
||||
public String get() {
|
||||
return session;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,290 @@
|
||||
package org.openautonomousconnection.infonamelib;
|
||||
|
||||
import org.openautonomousconnection.protocol.versions.v1_0_0.beta.WebRequestMethod;
|
||||
|
||||
import java.io.*;
|
||||
import java.net.HttpURLConnection;
|
||||
import java.net.ProtocolException;
|
||||
import java.net.URL;
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
* HttpURLConnection implementation that maps "web://" URLs to OAC WebRequestPacket/WebResponsePacket.
|
||||
*
|
||||
* <p>Important semantics for JavaFX WebView:</p>
|
||||
* <ul>
|
||||
* <li>WebView may call {@link #connect()} before {@link #getOutputStream()}.</li>
|
||||
* <li>WebView creates a NEW connection instance per navigation; therefore persistent headers
|
||||
* (like session) must be injected from an external store per request.</li>
|
||||
* </ul>
|
||||
*/
|
||||
public final class OacWebHttpURLConnection extends HttpURLConnection {
|
||||
|
||||
private static final int MAX_REDIRECTS = 8;
|
||||
|
||||
private final OacWebRequestBroker broker;
|
||||
private final OacSessionJar sessionJar;
|
||||
|
||||
private final Map<String, String> requestHeaders = new LinkedHashMap<>();
|
||||
private final ByteArrayOutputStream requestBody = new ByteArrayOutputStream(1024);
|
||||
|
||||
private boolean connected;
|
||||
private boolean requestSent;
|
||||
|
||||
private OacWebResponse response;
|
||||
|
||||
/**
|
||||
* Creates a new OAC HttpURLConnection.
|
||||
*
|
||||
* @param url the web:// URL
|
||||
* @param broker request broker
|
||||
* @param sessionJar shared session store (must be shared across connections)
|
||||
*/
|
||||
public OacWebHttpURLConnection(URL url, OacWebRequestBroker broker, OacSessionJar sessionJar) {
|
||||
super(url);
|
||||
this.broker = Objects.requireNonNull(broker, "broker");
|
||||
this.sessionJar = Objects.requireNonNull(sessionJar, "sessionJar");
|
||||
this.method = "GET";
|
||||
setInstanceFollowRedirects(true);
|
||||
}
|
||||
|
||||
private static String headerValue(Map<String, String> headers, String nameLower) {
|
||||
if (headers == null || headers.isEmpty() || nameLower == null) return null;
|
||||
String needle = nameLower.trim().toLowerCase(Locale.ROOT);
|
||||
for (Map.Entry<String, String> e : headers.entrySet()) {
|
||||
if (e.getKey() == null) continue;
|
||||
if (e.getKey().trim().toLowerCase(Locale.ROOT).equals(needle)) {
|
||||
return e.getValue();
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setRequestProperty(String key, String value) {
|
||||
if (key == null) return;
|
||||
// DO NOT block after connect(): WebView may call connect() early.
|
||||
// Only block once the request was actually sent.
|
||||
if (requestSent) throw new IllegalStateException("Request already sent");
|
||||
if (value == null) requestHeaders.remove(key);
|
||||
else requestHeaders.put(key, value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getRequestProperty(String key) {
|
||||
if (key == null) return null;
|
||||
for (Map.Entry<String, String> e : requestHeaders.entrySet()) {
|
||||
if (e.getKey() != null && e.getKey().equalsIgnoreCase(key)) return e.getValue();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Map<String, List<String>> getRequestProperties() {
|
||||
Map<String, List<String>> out = new LinkedHashMap<>();
|
||||
for (Map.Entry<String, String> e : requestHeaders.entrySet()) {
|
||||
out.put(e.getKey(), e.getValue() == null ? List.of() : List.of(e.getValue()));
|
||||
}
|
||||
return Collections.unmodifiableMap(out);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setRequestMethod(String method) throws ProtocolException {
|
||||
if (method == null) throw new ProtocolException("method is null");
|
||||
if (requestSent) throw new ProtocolException("Request already sent");
|
||||
|
||||
String m = method.trim().toUpperCase(Locale.ROOT);
|
||||
if (!m.equals("GET") && !m.equals("POST")) {
|
||||
throw new ProtocolException("Unsupported method: " + method);
|
||||
}
|
||||
this.method = m;
|
||||
}
|
||||
|
||||
@Override
|
||||
public OutputStream getOutputStream() throws IOException {
|
||||
// WebView may call connect() first, so do NOT throw "Already connected".
|
||||
if (requestSent) throw new IllegalStateException("Request already sent");
|
||||
|
||||
setDoOutput(true);
|
||||
return requestBody;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void connect() {
|
||||
// MUST NOT send here. WebView may call connect() before writing the POST body.
|
||||
connected = true;
|
||||
}
|
||||
|
||||
private void ensureResponse() throws IOException {
|
||||
if (requestSent) return;
|
||||
|
||||
URL cur = this.url;
|
||||
|
||||
String methodStr = (this.method == null) ? "GET" : this.method.trim().toUpperCase(Locale.ROOT);
|
||||
WebRequestMethod reqMethod = "POST".equals(methodStr) ? WebRequestMethod.POST : WebRequestMethod.GET;
|
||||
|
||||
// Snapshot headers/body at send time.
|
||||
Map<String, String> carryHeaders = new LinkedHashMap<>(requestHeaders);
|
||||
|
||||
// ---- SESSION HEADER INJECTION (the core fix for your "header resets") ----
|
||||
// Each navigation creates a new connection, so we re-add the session for every request.
|
||||
String session = sessionJar.get();
|
||||
if (session != null && !session.isBlank() && headerValue(carryHeaders, "session") == null) {
|
||||
carryHeaders.put("session", session);
|
||||
}
|
||||
|
||||
byte[] carryBody = null;
|
||||
if (getDoOutput()) {
|
||||
carryBody = requestBody.toByteArray();
|
||||
if (reqMethod == WebRequestMethod.POST && carryBody == null) carryBody = new byte[0];
|
||||
}
|
||||
|
||||
if (reqMethod == WebRequestMethod.POST && headerValue(carryHeaders, "content-type") == null) {
|
||||
carryHeaders.put("content-type", "application/x-www-form-urlencoded; charset=utf-8");
|
||||
}
|
||||
|
||||
OacWebResponse resp = null;
|
||||
WebRequestMethod carryMethod = reqMethod;
|
||||
|
||||
for (int i = 0; i <= MAX_REDIRECTS; i++) {
|
||||
resp = broker.fetch(cur, carryMethod, carryHeaders, carryBody);
|
||||
|
||||
// ---- capture session from response (login/register) ----
|
||||
String newSession = headerValue(resp.headers(), "session");
|
||||
if (newSession != null && !newSession.isBlank()) {
|
||||
sessionJar.store(newSession);
|
||||
// keep it for the next request in this redirect chain too
|
||||
carryHeaders.put("session", newSession);
|
||||
}
|
||||
|
||||
int code = resp.statusCode();
|
||||
if (!getInstanceFollowRedirects()) break;
|
||||
|
||||
if (code == 301 || code == 302 || code == 303 || code == 307 || code == 308) {
|
||||
String loc = headerValue(resp.headers(), "location");
|
||||
if (loc == null || loc.isBlank()) break;
|
||||
|
||||
try {
|
||||
cur = new URL(cur, loc);
|
||||
} catch (Exception ex) {
|
||||
break;
|
||||
}
|
||||
|
||||
if (code == 303) {
|
||||
carryMethod = WebRequestMethod.GET;
|
||||
carryBody = null;
|
||||
} else if ((code == 301 || code == 302) && carryMethod == WebRequestMethod.POST) {
|
||||
carryMethod = WebRequestMethod.GET;
|
||||
carryBody = null;
|
||||
}
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
this.response = resp;
|
||||
this.requestSent = true;
|
||||
this.connected = true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public InputStream getInputStream() throws IOException {
|
||||
ensureResponse();
|
||||
if (response == null) return new ByteArrayInputStream(new byte[0]);
|
||||
return response.bodyStream();
|
||||
}
|
||||
|
||||
@Override
|
||||
public InputStream getErrorStream() {
|
||||
try {
|
||||
ensureResponse();
|
||||
if (response == null) return null;
|
||||
int code = response.statusCode();
|
||||
return (code >= 400) ? response.bodyStream() : null;
|
||||
} catch (IOException e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getResponseCode() throws IOException {
|
||||
ensureResponse();
|
||||
return response == null ? -1 : response.statusCode();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getContentType() {
|
||||
try {
|
||||
ensureResponse();
|
||||
} catch (IOException e) {
|
||||
return "application/octet-stream";
|
||||
}
|
||||
String ct = (response == null) ? null : response.contentType();
|
||||
return (ct == null || ct.isBlank()) ? "application/octet-stream" : ct;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getContentLength() {
|
||||
try {
|
||||
ensureResponse();
|
||||
} catch (IOException e) {
|
||||
return -1;
|
||||
}
|
||||
long len = (response == null) ? -1L : response.contentLength();
|
||||
return (len <= 0 || len > Integer.MAX_VALUE) ? -1 : (int) len;
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getContentLengthLong() {
|
||||
try {
|
||||
ensureResponse();
|
||||
} catch (IOException e) {
|
||||
return -1L;
|
||||
}
|
||||
return (response == null) ? -1L : response.contentLength();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Map<String, List<String>> getHeaderFields() {
|
||||
try {
|
||||
ensureResponse();
|
||||
} catch (IOException e) {
|
||||
return Map.of();
|
||||
}
|
||||
if (response == null) return Map.of();
|
||||
|
||||
Map<String, List<String>> out = new LinkedHashMap<>();
|
||||
for (Map.Entry<String, String> e : response.headers().entrySet()) {
|
||||
String k = e.getKey();
|
||||
String v = e.getValue();
|
||||
if (k == null) continue;
|
||||
out.put(k, v == null ? List.of() : List.of(v));
|
||||
}
|
||||
return out;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getHeaderField(String name) {
|
||||
if (name == null) return null;
|
||||
try {
|
||||
ensureResponse();
|
||||
} catch (IOException e) {
|
||||
return null;
|
||||
}
|
||||
if (response == null) return null;
|
||||
return headerValue(response.headers(), name.trim().toLowerCase(Locale.ROOT));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void disconnect() {
|
||||
// No persistent socket owned by this object.
|
||||
connected = false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean usingProxy() {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -75,7 +75,9 @@ public final class OacWebPacketListener extends EventListener {
|
||||
|
||||
if (!host.contains(":")) {
|
||||
hostname = host;
|
||||
port = 1028;
|
||||
|
||||
if (records.getFirst().port == 0) port = 1028;
|
||||
else port = records.getFirst().port;
|
||||
} else {
|
||||
String[] split = host.split(":", 2);
|
||||
hostname = split[0].trim();
|
||||
|
||||
@@ -48,6 +48,30 @@ public final class OacWebRequestBroker {
|
||||
return INSTANCE;
|
||||
}
|
||||
|
||||
private static String safeContentType(String ct) {
|
||||
return (ct == null || ct.isBlank()) ? "application/octet-stream" : ct;
|
||||
}
|
||||
|
||||
private static Map<String, String> safeHeaders(Map<String, String> headers) {
|
||||
return (headers == null || headers.isEmpty()) ? Map.of() : Map.copyOf(headers);
|
||||
}
|
||||
|
||||
private static String normalizePathWithQuery(String path, String query) {
|
||||
String p;
|
||||
if (path == null || path.isBlank() || "/".equals(path)) {
|
||||
p = "index.html";
|
||||
} else {
|
||||
p = path.startsWith("/") ? path.substring(1) : path;
|
||||
if (p.isBlank()) p = "index.html";
|
||||
}
|
||||
|
||||
if (query != null && !query.isBlank()) {
|
||||
// Keep query for server-side fallback parsing
|
||||
return p + "?" + query;
|
||||
}
|
||||
return p;
|
||||
}
|
||||
|
||||
/**
|
||||
* Attaches the client used to send INS/Web packets.
|
||||
*
|
||||
@@ -102,13 +126,6 @@ public final class OacWebRequestBroker {
|
||||
|
||||
/**
|
||||
* Opens a resource and blocks until the current single-flight response completes.
|
||||
*
|
||||
* @param client protocol client
|
||||
* @param url web:// URL
|
||||
* @param method request method
|
||||
* @param headers request headers
|
||||
* @param body request body
|
||||
* @return response snapshot
|
||||
*/
|
||||
public Response openAndAwait(ProtocolClient client, URL url, WebRequestMethod method, Map<String, String> headers, byte[] body) {
|
||||
Objects.requireNonNull(client, "client");
|
||||
@@ -121,12 +138,6 @@ public final class OacWebRequestBroker {
|
||||
|
||||
/**
|
||||
* Sends required packets for a {@code web://} URL.
|
||||
*
|
||||
* @param client protocol client
|
||||
* @param url web:// URL
|
||||
* @param method request method
|
||||
* @param headers request headers
|
||||
* @param body request body
|
||||
*/
|
||||
public synchronized void open(ProtocolClient client, URL url, WebRequestMethod method, Map<String, String> headers, byte[] body) {
|
||||
Objects.requireNonNull(client, "client");
|
||||
@@ -142,7 +153,8 @@ public final class OacWebRequestBroker {
|
||||
throw new IllegalArgumentException("Missing InfoName in URL: " + url);
|
||||
}
|
||||
|
||||
String path = normalizePath(url.getPath());
|
||||
// IMPORTANT FIX: include query in the path, so the server can read it as fallback.
|
||||
String path = normalizePathWithQuery(url.getPath(), url.getQuery());
|
||||
|
||||
beginNewResponse();
|
||||
|
||||
@@ -156,9 +168,6 @@ public final class OacWebRequestBroker {
|
||||
sendWebRequest(client, path, method, headers, body);
|
||||
}
|
||||
|
||||
/**
|
||||
* Called once the ServerConnection is established (from listener).
|
||||
*/
|
||||
public void notifyServerConnected() {
|
||||
CountDownLatch latch = connectionLatch;
|
||||
if (latch != null) {
|
||||
@@ -166,21 +175,10 @@ public final class OacWebRequestBroker {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Forces re-resolution on next request.
|
||||
*/
|
||||
public synchronized void invalidateCurrentInfoName() {
|
||||
currentInfoName = null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Receives non-streamed WebResponsePacket.
|
||||
*
|
||||
* @param statusCode status code
|
||||
* @param contentType content type
|
||||
* @param headers headers
|
||||
* @param body body bytes
|
||||
*/
|
||||
public void onWebResponse(int statusCode, String contentType, Map<String, String> headers, byte[] body) {
|
||||
ResponseState st = responseState;
|
||||
if (st == null) return;
|
||||
@@ -201,14 +199,6 @@ public final class OacWebRequestBroker {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Receives a stream start.
|
||||
*
|
||||
* @param statusCode status code
|
||||
* @param contentType content type
|
||||
* @param headers headers
|
||||
* @param totalLength total length (may be 0/unknown)
|
||||
*/
|
||||
public void onStreamStart(int statusCode, String contentType, Map<String, String> headers, long totalLength) {
|
||||
ResponseState st = responseState;
|
||||
if (st == null) return;
|
||||
@@ -225,12 +215,6 @@ public final class OacWebRequestBroker {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Receives a stream chunk (may arrive out-of-order).
|
||||
*
|
||||
* @param seq chunk sequence number
|
||||
* @param data chunk bytes
|
||||
*/
|
||||
public void onStreamChunk(int seq, byte[] data) {
|
||||
ResponseState st = responseState;
|
||||
if (st == null) return;
|
||||
@@ -249,11 +233,6 @@ public final class OacWebRequestBroker {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Receives stream end.
|
||||
*
|
||||
* @param ok whether stream completed successfully
|
||||
*/
|
||||
public void onStreamEnd(boolean ok) {
|
||||
ResponseState st = responseState;
|
||||
if (st == null) return;
|
||||
@@ -276,13 +255,6 @@ public final class OacWebRequestBroker {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Waits for the current response.
|
||||
*
|
||||
* @param timeout timeout
|
||||
* @param unit unit
|
||||
* @return response snapshot
|
||||
*/
|
||||
public Response awaitResponse(long timeout, TimeUnit unit) {
|
||||
Objects.requireNonNull(unit, "unit");
|
||||
|
||||
@@ -314,26 +286,6 @@ public final class OacWebRequestBroker {
|
||||
}
|
||||
}
|
||||
|
||||
// ============================
|
||||
// Internal helpers
|
||||
// ============================
|
||||
|
||||
private static String safeContentType(String ct) {
|
||||
return (ct == null || ct.isBlank()) ? "application/octet-stream" : ct;
|
||||
}
|
||||
|
||||
private static Map<String, String> safeHeaders(Map<String, String> headers) {
|
||||
return (headers == null || headers.isEmpty()) ? Map.of() : Map.copyOf(headers);
|
||||
}
|
||||
|
||||
private static String normalizePath(String path) {
|
||||
if (path == null || path.isBlank() || "/".equals(path)) {
|
||||
return "index.html";
|
||||
}
|
||||
String p = path.startsWith("/") ? path.substring(1) : path;
|
||||
return p.isBlank() ? "index.html" : p;
|
||||
}
|
||||
|
||||
private void resolveAndConnect(ProtocolClient client, String infoName) {
|
||||
if (client.getClientINSConnection() == null || !client.getClientINSConnection().isConnected()) return;
|
||||
|
||||
@@ -433,14 +385,6 @@ public final class OacWebRequestBroker {
|
||||
st.done.countDown();
|
||||
}
|
||||
|
||||
/**
|
||||
* Immutable response snapshot.
|
||||
*
|
||||
* @param statusCode status code
|
||||
* @param contentType content type
|
||||
* @param headers headers
|
||||
* @param body body bytes
|
||||
*/
|
||||
public record Response(int statusCode, String contentType, Map<String, String> headers, byte[] body) {
|
||||
}
|
||||
|
||||
|
||||
@@ -28,12 +28,12 @@ public final class OacWebURLConnection extends URLConnection {
|
||||
private static final int MAX_REDIRECTS = 8;
|
||||
|
||||
private final OacWebRequestBroker broker;
|
||||
|
||||
private boolean connected;
|
||||
private OacWebResponse response;
|
||||
|
||||
private final Map<String, String> requestHeaders = new LinkedHashMap<>();
|
||||
private final ByteArrayOutputStream requestBody = new ByteArrayOutputStream(1024);
|
||||
private boolean connected;
|
||||
private OacWebResponse response;
|
||||
private boolean outputOpened;
|
||||
private boolean outputClosed;
|
||||
|
||||
/**
|
||||
* Creates a new OAC URLConnection.
|
||||
@@ -85,7 +85,24 @@ public final class OacWebURLConnection extends URLConnection {
|
||||
@Override
|
||||
public OutputStream getOutputStream() {
|
||||
setDoOutput(true);
|
||||
return requestBody;
|
||||
outputOpened = true;
|
||||
|
||||
return new OutputStream() {
|
||||
@Override
|
||||
public void write(int b) {
|
||||
requestBody.write(b);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void write(byte[] b, int off, int len) {
|
||||
requestBody.write(b, off, len);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void close() {
|
||||
outputClosed = true;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -94,12 +111,24 @@ public final class OacWebURLConnection extends URLConnection {
|
||||
|
||||
URL cur = this.url;
|
||||
|
||||
// Determine initial method/body.
|
||||
byte[] body = (getDoOutput() && requestBody.size() > 0) ? requestBody.toByteArray() : null;
|
||||
WebRequestMethod method = (body != null) ? WebRequestMethod.POST : WebRequestMethod.GET;
|
||||
// Decide method:
|
||||
// - If doOutput is true OR content-type is present: treat as POST (even if body is empty).
|
||||
// This fixes engines that perform POST with empty/unknown body.
|
||||
boolean hasContentType = headerValue(requestHeaders, "content-type") != null;
|
||||
boolean wantsPost = getDoOutput() || hasContentType;
|
||||
|
||||
WebRequestMethod method = wantsPost ? WebRequestMethod.POST : WebRequestMethod.GET;
|
||||
|
||||
byte[] body;
|
||||
if (wantsPost) {
|
||||
// Always send a body for POST; may be empty.
|
||||
body = requestBody.toByteArray();
|
||||
} else {
|
||||
body = null;
|
||||
}
|
||||
|
||||
// Ensure content-type exists for form posts if caller didn't set it.
|
||||
if (method == WebRequestMethod.POST && headerValue(requestHeaders, "content-type") == null) {
|
||||
if (method == WebRequestMethod.POST && !hasContentType) {
|
||||
requestHeaders.put("content-type", "application/x-www-form-urlencoded; charset=utf-8");
|
||||
}
|
||||
|
||||
|
||||
@@ -7,10 +7,7 @@ import java.util.Objects;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
|
||||
/**
|
||||
* Installs the "web://" protocol handler using the standard Java mechanism:
|
||||
* {@code java.protocol.handler.pkgs}.
|
||||
*
|
||||
* <p>This avoids {@link java.net.URL#setURLStreamHandlerFactory} which can only be set once per JVM.</p>
|
||||
* Installs the "web://" protocol handler using java.protocol.handler.pkgs.
|
||||
*/
|
||||
public final class OacWebUrlInstaller {
|
||||
|
||||
@@ -19,34 +16,16 @@ public final class OacWebUrlInstaller {
|
||||
private OacWebUrlInstaller() {
|
||||
}
|
||||
|
||||
/**
|
||||
* Installs:
|
||||
* <ul>
|
||||
* <li>protocol handler package prefix</li>
|
||||
* <li>packet listener forwarding WebResponse/WebStream + INSResponse into the broker</li>
|
||||
* </ul>
|
||||
*
|
||||
* <p>Must be called before any {@code web://} URL is resolved/loaded.</p>
|
||||
*
|
||||
* @param eventManager global event manager
|
||||
* @param client protocol client (required for connecting ServerConnection after INS resolution)
|
||||
*/
|
||||
public static void installOnce(EventManager eventManager, ProtocolClient client) {
|
||||
Objects.requireNonNull(eventManager, "eventManager");
|
||||
Objects.requireNonNull(client, "client");
|
||||
|
||||
if (!INSTALLED.compareAndSet(false, true)) {
|
||||
return;
|
||||
}
|
||||
if (!INSTALLED.compareAndSet(false, true)) return;
|
||||
|
||||
// Make client available for broker.fetch(...)
|
||||
OacWebRequestBroker.get().attachClient(client);
|
||||
|
||||
// Register packet listener (INSResponse + WebResponse + WebStream*)
|
||||
eventManager.registerListener(new OacWebPacketListener(OacWebRequestBroker.get(), client));
|
||||
|
||||
// Register protocol handler package prefix:
|
||||
// JVM will load: "org.openautonomousconnection.webclient.recode.url.web.Handler"
|
||||
ProtocolHandlerPackages.installPackage("org.openautonomousconnection.webclient.recode.url");
|
||||
// IMPORTANT: must match "org.openautonomousconnection.infonamelib.web.Handler"
|
||||
ProtocolHandlerPackages.installPackage("org.openautonomousconnection.infonamelib");
|
||||
}
|
||||
}
|
||||
@@ -1,7 +1,8 @@
|
||||
package org.openautonomousconnection.infonamelib.web;
|
||||
|
||||
import org.openautonomousconnection.infonamelib.OacSessionJar;
|
||||
import org.openautonomousconnection.infonamelib.OacWebHttpURLConnection;
|
||||
import org.openautonomousconnection.infonamelib.OacWebRequestBroker;
|
||||
import org.openautonomousconnection.infonamelib.OacWebURLConnection;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.URL;
|
||||
@@ -9,14 +10,13 @@ import java.net.URLConnection;
|
||||
import java.net.URLStreamHandler;
|
||||
|
||||
/**
|
||||
* URLStreamHandler for the "web" protocol.
|
||||
*
|
||||
* <p>Loaded via the "java.protocol.handler.pkgs" mechanism.</p>
|
||||
* URLStreamHandler for the "web" protocol (loaded via java.protocol.handler.pkgs).
|
||||
*/
|
||||
public final class Handler extends URLStreamHandler {
|
||||
private static final OacSessionJar SESSION_JAR = new OacSessionJar();
|
||||
|
||||
@Override
|
||||
protected URLConnection openConnection(URL u) throws IOException {
|
||||
return new OacWebURLConnection(u, OacWebRequestBroker.get());
|
||||
return new OacWebHttpURLConnection(u, OacWebRequestBroker.get(), SESSION_JAR);
|
||||
}
|
||||
}
|
||||
@@ -1,277 +0,0 @@
|
||||
Eclipse Public License - v 2.0
|
||||
|
||||
THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
|
||||
PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION
|
||||
OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.
|
||||
|
||||
1. DEFINITIONS
|
||||
|
||||
"Contribution" means:
|
||||
|
||||
a) in the case of the initial Contributor, the initial content
|
||||
Distributed under this Agreement, and
|
||||
|
||||
b) in the case of each subsequent Contributor:
|
||||
i) changes to the Program, and
|
||||
ii) additions to the Program;
|
||||
where such changes and/or additions to the Program originate from
|
||||
and are Distributed by that particular Contributor. A Contribution
|
||||
"originates" from a Contributor if it was added to the Program by
|
||||
such Contributor itself or anyone acting on such Contributor's behalf.
|
||||
Contributions do not include changes or additions to the Program that
|
||||
are not Modified Works.
|
||||
|
||||
"Contributor" means any person or entity that Distributes the Program.
|
||||
|
||||
"Licensed Patents" mean patent claims licensable by a Contributor which
|
||||
are necessarily infringed by the use or sale of its Contribution alone
|
||||
or when combined with the Program.
|
||||
|
||||
"Program" means the Contributions Distributed in accordance with this
|
||||
Agreement.
|
||||
|
||||
"Recipient" means anyone who receives the Program under this Agreement
|
||||
or any Secondary License (as applicable), including Contributors.
|
||||
|
||||
"Derivative Works" shall mean any work, whether in Source Code or other
|
||||
form, that is based on (or derived from) the Program and for which the
|
||||
editorial revisions, annotations, elaborations, or other modifications
|
||||
represent, as a whole, an original work of authorship.
|
||||
|
||||
"Modified Works" shall mean any work in Source Code or other form that
|
||||
results from an addition to, deletion from, or modification of the
|
||||
contents of the Program, including, for purposes of clarity any new file
|
||||
in Source Code form that contains any contents of the Program. Modified
|
||||
Works shall not include works that contain only declarations,
|
||||
interfaces, types, classes, structures, or files of the Program solely
|
||||
in each case in order to link to, bind by name, or subclass the Program
|
||||
or Modified Works thereof.
|
||||
|
||||
"Distribute" means the acts of a) distributing or b) making available
|
||||
in any manner that enables the transfer of a copy.
|
||||
|
||||
"Source Code" means the form of a Program preferred for making
|
||||
modifications, including but not limited to software source code,
|
||||
documentation source, and configuration files.
|
||||
|
||||
"Secondary License" means either the GNU General Public License,
|
||||
Version 2.0, or any later versions of that license, including any
|
||||
exceptions or additional permissions as identified by the initial
|
||||
Contributor.
|
||||
|
||||
2. GRANT OF RIGHTS
|
||||
|
||||
a) Subject to the terms of this Agreement, each Contributor hereby
|
||||
grants Recipient a non-exclusive, worldwide, royalty-free copyright
|
||||
license to reproduce, prepare Derivative Works of, publicly display,
|
||||
publicly perform, Distribute and sublicense the Contribution of such
|
||||
Contributor, if any, and such Derivative Works.
|
||||
|
||||
b) Subject to the terms of this Agreement, each Contributor hereby
|
||||
grants Recipient a non-exclusive, worldwide, royalty-free patent
|
||||
license under Licensed Patents to make, use, sell, offer to sell,
|
||||
import and otherwise transfer the Contribution of such Contributor,
|
||||
if any, in Source Code or other form. This patent license shall
|
||||
apply to the combination of the Contribution and the Program if, at
|
||||
the time the Contribution is added by the Contributor, such addition
|
||||
of the Contribution causes such combination to be covered by the
|
||||
Licensed Patents. The patent license shall not apply to any other
|
||||
combinations which include the Contribution. No hardware per se is
|
||||
licensed hereunder.
|
||||
|
||||
c) Recipient understands that although each Contributor grants the
|
||||
licenses to its Contributions set forth herein, no assurances are
|
||||
provided by any Contributor that the Program does not infringe the
|
||||
patent or other intellectual property rights of any other entity.
|
||||
Each Contributor disclaims any liability to Recipient for claims
|
||||
brought by any other entity based on infringement of intellectual
|
||||
property rights or otherwise. As a condition to exercising the
|
||||
rights and licenses granted hereunder, each Recipient hereby
|
||||
assumes sole responsibility to secure any other intellectual
|
||||
property rights needed, if any. For example, if a third party
|
||||
patent license is required to allow Recipient to Distribute the
|
||||
Program, it is Recipient's responsibility to acquire that license
|
||||
before distributing the Program.
|
||||
|
||||
d) Each Contributor represents that to its knowledge it has
|
||||
sufficient copyright rights in its Contribution, if any, to grant
|
||||
the copyright license set forth in this Agreement.
|
||||
|
||||
e) Notwithstanding the terms of any Secondary License, no
|
||||
Contributor makes additional grants to any Recipient (other than
|
||||
those set forth in this Agreement) as a result of such Recipient's
|
||||
receipt of the Program under the terms of a Secondary License
|
||||
(if permitted under the terms of Section 3).
|
||||
|
||||
3. REQUIREMENTS
|
||||
|
||||
3.1 If a Contributor Distributes the Program in any form, then:
|
||||
|
||||
a) the Program must also be made available as Source Code, in
|
||||
accordance with section 3.2, and the Contributor must accompany
|
||||
the Program with a statement that the Source Code for the Program
|
||||
is available under this Agreement, and informs Recipients how to
|
||||
obtain it in a reasonable manner on or through a medium customarily
|
||||
used for software exchange; and
|
||||
|
||||
b) the Contributor may Distribute the Program under a license
|
||||
different than this Agreement, provided that such license:
|
||||
i) effectively disclaims on behalf of all other Contributors all
|
||||
warranties and conditions, express and implied, including
|
||||
warranties or conditions of title and non-infringement, and
|
||||
implied warranties or conditions of merchantability and fitness
|
||||
for a particular purpose;
|
||||
|
||||
ii) effectively excludes on behalf of all other Contributors all
|
||||
liability for damages, including direct, indirect, special,
|
||||
incidental and consequential damages, such as lost profits;
|
||||
|
||||
iii) does not attempt to limit or alter the recipients' rights
|
||||
in the Source Code under section 3.2; and
|
||||
|
||||
iv) requires any subsequent distribution of the Program by any
|
||||
party to be under a license that satisfies the requirements
|
||||
of this section 3.
|
||||
|
||||
3.2 When the Program is Distributed as Source Code:
|
||||
|
||||
a) it must be made available under this Agreement, or if the
|
||||
Program (i) is combined with other material in a separate file or
|
||||
files made available under a Secondary License, and (ii) the initial
|
||||
Contributor attached to the Source Code the notice described in
|
||||
Exhibit A of this Agreement, then the Program may be made available
|
||||
under the terms of such Secondary Licenses, and
|
||||
|
||||
b) a copy of this Agreement must be included with each copy of
|
||||
the Program.
|
||||
|
||||
3.3 Contributors may not remove or alter any copyright, patent,
|
||||
trademark, attribution notices, disclaimers of warranty, or limitations
|
||||
of liability ("notices") contained within the Program from any copy of
|
||||
the Program which they Distribute, provided that Contributors may add
|
||||
their own appropriate notices.
|
||||
|
||||
4. COMMERCIAL DISTRIBUTION
|
||||
|
||||
Commercial distributors of software may accept certain responsibilities
|
||||
with respect to end users, business partners and the like. While this
|
||||
license is intended to facilitate the commercial use of the Program,
|
||||
the Contributor who includes the Program in a commercial product
|
||||
offering should do so in a manner which does not create potential
|
||||
liability for other Contributors. Therefore, if a Contributor includes
|
||||
the Program in a commercial product offering, such Contributor
|
||||
("Commercial Contributor") hereby agrees to defend and indemnify every
|
||||
other Contributor ("Indemnified Contributor") against any losses,
|
||||
damages and costs (collectively "Losses") arising from claims, lawsuits
|
||||
and other legal actions brought by a third party against the Indemnified
|
||||
Contributor to the extent caused by the acts or omissions of such
|
||||
Commercial Contributor in connection with its distribution of the Program
|
||||
in a commercial product offering. The obligations in this section do not
|
||||
apply to any claims or Losses relating to any actual or alleged
|
||||
intellectual property infringement. In order to qualify, an Indemnified
|
||||
Contributor must: a) promptly notify the Commercial Contributor in
|
||||
writing of such claim, and b) allow the Commercial Contributor to control,
|
||||
and cooperate with the Commercial Contributor in, the defense and any
|
||||
related settlement negotiations. The Indemnified Contributor may
|
||||
participate in any such claim at its own expense.
|
||||
|
||||
For example, a Contributor might include the Program in a commercial
|
||||
product offering, Product X. That Contributor is then a Commercial
|
||||
Contributor. If that Commercial Contributor then makes performance
|
||||
claims, or offers warranties related to Product X, those performance
|
||||
claims and warranties are such Commercial Contributor's responsibility
|
||||
alone. Under this section, the Commercial Contributor would have to
|
||||
defend claims against the other Contributors related to those performance
|
||||
claims and warranties, and if a court requires any other Contributor to
|
||||
pay any damages as a result, the Commercial Contributor must pay
|
||||
those damages.
|
||||
|
||||
5. NO WARRANTY
|
||||
|
||||
EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT
|
||||
PERMITTED BY APPLICABLE LAW, THE PROGRAM IS PROVIDED ON AN "AS IS"
|
||||
BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR
|
||||
IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF
|
||||
TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR
|
||||
PURPOSE. Each Recipient is solely responsible for determining the
|
||||
appropriateness of using and distributing the Program and assumes all
|
||||
risks associated with its exercise of rights under this Agreement,
|
||||
including but not limited to the risks and costs of program errors,
|
||||
compliance with applicable laws, damage to or loss of data, programs
|
||||
or equipment, and unavailability or interruption of operations.
|
||||
|
||||
6. DISCLAIMER OF LIABILITY
|
||||
|
||||
EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT
|
||||
PERMITTED BY APPLICABLE LAW, NEITHER RECIPIENT NOR ANY CONTRIBUTORS
|
||||
SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST
|
||||
PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE
|
||||
EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGES.
|
||||
|
||||
7. GENERAL
|
||||
|
||||
If any provision of this Agreement is invalid or unenforceable under
|
||||
applicable law, it shall not affect the validity or enforceability of
|
||||
the remainder of the terms of this Agreement, and without further
|
||||
action by the parties hereto, such provision shall be reformed to the
|
||||
minimum extent necessary to make such provision valid and enforceable.
|
||||
|
||||
If Recipient institutes patent litigation against any entity
|
||||
(including a cross-claim or counterclaim in a lawsuit) alleging that the
|
||||
Program itself (excluding combinations of the Program with other software
|
||||
or hardware) infringes such Recipient's patent(s), then such Recipient's
|
||||
rights granted under Section 2(b) shall terminate as of the date such
|
||||
litigation is filed.
|
||||
|
||||
All Recipient's rights under this Agreement shall terminate if it
|
||||
fails to comply with any of the material terms or conditions of this
|
||||
Agreement and does not cure such failure in a reasonable period of
|
||||
time after becoming aware of such noncompliance. If all Recipient's
|
||||
rights under this Agreement terminate, Recipient agrees to cease use
|
||||
and distribution of the Program as soon as reasonably practicable.
|
||||
However, Recipient's obligations under this Agreement and any licenses
|
||||
granted by Recipient relating to the Program shall continue and survive.
|
||||
|
||||
Everyone is permitted to copy and distribute copies of this Agreement,
|
||||
but in order to avoid inconsistency the Agreement is copyrighted and
|
||||
may only be modified in the following manner. The Agreement Steward
|
||||
reserves the right to publish new versions (including revisions) of
|
||||
this Agreement from time to time. No one other than the Agreement
|
||||
Steward has the right to modify this Agreement. The Eclipse Foundation
|
||||
is the initial Agreement Steward. The Eclipse Foundation may assign the
|
||||
responsibility to serve as the Agreement Steward to a suitable separate
|
||||
entity. Each new version of the Agreement will be given a distinguishing
|
||||
version number. The Program (including Contributions) may always be
|
||||
Distributed subject to the version of the Agreement under which it was
|
||||
received. In addition, after a new version of the Agreement is published,
|
||||
Contributor may elect to Distribute the Program (including its
|
||||
Contributions) under the new version.
|
||||
|
||||
Except as expressly stated in Sections 2(a) and 2(b) above, Recipient
|
||||
receives no rights or licenses to the intellectual property of any
|
||||
Contributor under this Agreement, whether expressly, by implication,
|
||||
estoppel or otherwise. All rights in the Program not expressly granted
|
||||
under this Agreement are reserved. Nothing in this Agreement is intended
|
||||
to be enforceable by any entity that is not a Contributor or Recipient.
|
||||
No third-party beneficiary rights are created under this Agreement.
|
||||
|
||||
Exhibit A - Form of Secondary Licenses Notice
|
||||
|
||||
"This Source Code may also be made available under the following
|
||||
Secondary Licenses when the conditions for such availability set forth
|
||||
in the Eclipse Public License, v. 2.0 are satisfied: {name license(s),
|
||||
version(s), and exceptions or additional permissions here}."
|
||||
|
||||
Simply including a copy of this Agreement, including this Exhibit A
|
||||
is not sufficient to license the Source Code under Secondary Licenses.
|
||||
|
||||
If it is not possible or desirable to put the notice in a particular
|
||||
file, then You may include the notice in a location (such as a LICENSE
|
||||
file in a relevant directory) where a recipient would be likely to
|
||||
look for such a notice.
|
||||
|
||||
You may add additional accurate notices of copyright ownership.
|
||||
@@ -1,277 +0,0 @@
|
||||
Eclipse Public License - v 2.0
|
||||
|
||||
THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
|
||||
PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION
|
||||
OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.
|
||||
|
||||
1. DEFINITIONS
|
||||
|
||||
"Contribution" means:
|
||||
|
||||
a) in the case of the initial Contributor, the initial content
|
||||
Distributed under this Agreement, and
|
||||
|
||||
b) in the case of each subsequent Contributor:
|
||||
i) changes to the Program, and
|
||||
ii) additions to the Program;
|
||||
where such changes and/or additions to the Program originate from
|
||||
and are Distributed by that particular Contributor. A Contribution
|
||||
"originates" from a Contributor if it was added to the Program by
|
||||
such Contributor itself or anyone acting on such Contributor's behalf.
|
||||
Contributions do not include changes or additions to the Program that
|
||||
are not Modified Works.
|
||||
|
||||
"Contributor" means any person or entity that Distributes the Program.
|
||||
|
||||
"Licensed Patents" mean patent claims licensable by a Contributor which
|
||||
are necessarily infringed by the use or sale of its Contribution alone
|
||||
or when combined with the Program.
|
||||
|
||||
"Program" means the Contributions Distributed in accordance with this
|
||||
Agreement.
|
||||
|
||||
"Recipient" means anyone who receives the Program under this Agreement
|
||||
or any Secondary License (as applicable), including Contributors.
|
||||
|
||||
"Derivative Works" shall mean any work, whether in Source Code or other
|
||||
form, that is based on (or derived from) the Program and for which the
|
||||
editorial revisions, annotations, elaborations, or other modifications
|
||||
represent, as a whole, an original work of authorship.
|
||||
|
||||
"Modified Works" shall mean any work in Source Code or other form that
|
||||
results from an addition to, deletion from, or modification of the
|
||||
contents of the Program, including, for purposes of clarity any new file
|
||||
in Source Code form that contains any contents of the Program. Modified
|
||||
Works shall not include works that contain only declarations,
|
||||
interfaces, types, classes, structures, or files of the Program solely
|
||||
in each case in order to link to, bind by name, or subclass the Program
|
||||
or Modified Works thereof.
|
||||
|
||||
"Distribute" means the acts of a) distributing or b) making available
|
||||
in any manner that enables the transfer of a copy.
|
||||
|
||||
"Source Code" means the form of a Program preferred for making
|
||||
modifications, including but not limited to software source code,
|
||||
documentation source, and configuration files.
|
||||
|
||||
"Secondary License" means either the GNU General Public License,
|
||||
Version 2.0, or any later versions of that license, including any
|
||||
exceptions or additional permissions as identified by the initial
|
||||
Contributor.
|
||||
|
||||
2. GRANT OF RIGHTS
|
||||
|
||||
a) Subject to the terms of this Agreement, each Contributor hereby
|
||||
grants Recipient a non-exclusive, worldwide, royalty-free copyright
|
||||
license to reproduce, prepare Derivative Works of, publicly display,
|
||||
publicly perform, Distribute and sublicense the Contribution of such
|
||||
Contributor, if any, and such Derivative Works.
|
||||
|
||||
b) Subject to the terms of this Agreement, each Contributor hereby
|
||||
grants Recipient a non-exclusive, worldwide, royalty-free patent
|
||||
license under Licensed Patents to make, use, sell, offer to sell,
|
||||
import and otherwise transfer the Contribution of such Contributor,
|
||||
if any, in Source Code or other form. This patent license shall
|
||||
apply to the combination of the Contribution and the Program if, at
|
||||
the time the Contribution is added by the Contributor, such addition
|
||||
of the Contribution causes such combination to be covered by the
|
||||
Licensed Patents. The patent license shall not apply to any other
|
||||
combinations which include the Contribution. No hardware per se is
|
||||
licensed hereunder.
|
||||
|
||||
c) Recipient understands that although each Contributor grants the
|
||||
licenses to its Contributions set forth herein, no assurances are
|
||||
provided by any Contributor that the Program does not infringe the
|
||||
patent or other intellectual property rights of any other entity.
|
||||
Each Contributor disclaims any liability to Recipient for claims
|
||||
brought by any other entity based on infringement of intellectual
|
||||
property rights or otherwise. As a condition to exercising the
|
||||
rights and licenses granted hereunder, each Recipient hereby
|
||||
assumes sole responsibility to secure any other intellectual
|
||||
property rights needed, if any. For example, if a third party
|
||||
patent license is required to allow Recipient to Distribute the
|
||||
Program, it is Recipient's responsibility to acquire that license
|
||||
before distributing the Program.
|
||||
|
||||
d) Each Contributor represents that to its knowledge it has
|
||||
sufficient copyright rights in its Contribution, if any, to grant
|
||||
the copyright license set forth in this Agreement.
|
||||
|
||||
e) Notwithstanding the terms of any Secondary License, no
|
||||
Contributor makes additional grants to any Recipient (other than
|
||||
those set forth in this Agreement) as a result of such Recipient's
|
||||
receipt of the Program under the terms of a Secondary License
|
||||
(if permitted under the terms of Section 3).
|
||||
|
||||
3. REQUIREMENTS
|
||||
|
||||
3.1 If a Contributor Distributes the Program in any form, then:
|
||||
|
||||
a) the Program must also be made available as Source Code, in
|
||||
accordance with section 3.2, and the Contributor must accompany
|
||||
the Program with a statement that the Source Code for the Program
|
||||
is available under this Agreement, and informs Recipients how to
|
||||
obtain it in a reasonable manner on or through a medium customarily
|
||||
used for software exchange; and
|
||||
|
||||
b) the Contributor may Distribute the Program under a license
|
||||
different than this Agreement, provided that such license:
|
||||
i) effectively disclaims on behalf of all other Contributors all
|
||||
warranties and conditions, express and implied, including
|
||||
warranties or conditions of title and non-infringement, and
|
||||
implied warranties or conditions of merchantability and fitness
|
||||
for a particular purpose;
|
||||
|
||||
ii) effectively excludes on behalf of all other Contributors all
|
||||
liability for damages, including direct, indirect, special,
|
||||
incidental and consequential damages, such as lost profits;
|
||||
|
||||
iii) does not attempt to limit or alter the recipients' rights
|
||||
in the Source Code under section 3.2; and
|
||||
|
||||
iv) requires any subsequent distribution of the Program by any
|
||||
party to be under a license that satisfies the requirements
|
||||
of this section 3.
|
||||
|
||||
3.2 When the Program is Distributed as Source Code:
|
||||
|
||||
a) it must be made available under this Agreement, or if the
|
||||
Program (i) is combined with other material in a separate file or
|
||||
files made available under a Secondary License, and (ii) the initial
|
||||
Contributor attached to the Source Code the notice described in
|
||||
Exhibit A of this Agreement, then the Program may be made available
|
||||
under the terms of such Secondary Licenses, and
|
||||
|
||||
b) a copy of this Agreement must be included with each copy of
|
||||
the Program.
|
||||
|
||||
3.3 Contributors may not remove or alter any copyright, patent,
|
||||
trademark, attribution notices, disclaimers of warranty, or limitations
|
||||
of liability ("notices") contained within the Program from any copy of
|
||||
the Program which they Distribute, provided that Contributors may add
|
||||
their own appropriate notices.
|
||||
|
||||
4. COMMERCIAL DISTRIBUTION
|
||||
|
||||
Commercial distributors of software may accept certain responsibilities
|
||||
with respect to end users, business partners and the like. While this
|
||||
license is intended to facilitate the commercial use of the Program,
|
||||
the Contributor who includes the Program in a commercial product
|
||||
offering should do so in a manner which does not create potential
|
||||
liability for other Contributors. Therefore, if a Contributor includes
|
||||
the Program in a commercial product offering, such Contributor
|
||||
("Commercial Contributor") hereby agrees to defend and indemnify every
|
||||
other Contributor ("Indemnified Contributor") against any losses,
|
||||
damages and costs (collectively "Losses") arising from claims, lawsuits
|
||||
and other legal actions brought by a third party against the Indemnified
|
||||
Contributor to the extent caused by the acts or omissions of such
|
||||
Commercial Contributor in connection with its distribution of the Program
|
||||
in a commercial product offering. The obligations in this section do not
|
||||
apply to any claims or Losses relating to any actual or alleged
|
||||
intellectual property infringement. In order to qualify, an Indemnified
|
||||
Contributor must: a) promptly notify the Commercial Contributor in
|
||||
writing of such claim, and b) allow the Commercial Contributor to control,
|
||||
and cooperate with the Commercial Contributor in, the defense and any
|
||||
related settlement negotiations. The Indemnified Contributor may
|
||||
participate in any such claim at its own expense.
|
||||
|
||||
For example, a Contributor might include the Program in a commercial
|
||||
product offering, Product X. That Contributor is then a Commercial
|
||||
Contributor. If that Commercial Contributor then makes performance
|
||||
claims, or offers warranties related to Product X, those performance
|
||||
claims and warranties are such Commercial Contributor's responsibility
|
||||
alone. Under this section, the Commercial Contributor would have to
|
||||
defend claims against the other Contributors related to those performance
|
||||
claims and warranties, and if a court requires any other Contributor to
|
||||
pay any damages as a result, the Commercial Contributor must pay
|
||||
those damages.
|
||||
|
||||
5. NO WARRANTY
|
||||
|
||||
EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT
|
||||
PERMITTED BY APPLICABLE LAW, THE PROGRAM IS PROVIDED ON AN "AS IS"
|
||||
BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR
|
||||
IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF
|
||||
TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR
|
||||
PURPOSE. Each Recipient is solely responsible for determining the
|
||||
appropriateness of using and distributing the Program and assumes all
|
||||
risks associated with its exercise of rights under this Agreement,
|
||||
including but not limited to the risks and costs of program errors,
|
||||
compliance with applicable laws, damage to or loss of data, programs
|
||||
or equipment, and unavailability or interruption of operations.
|
||||
|
||||
6. DISCLAIMER OF LIABILITY
|
||||
|
||||
EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT
|
||||
PERMITTED BY APPLICABLE LAW, NEITHER RECIPIENT NOR ANY CONTRIBUTORS
|
||||
SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST
|
||||
PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE
|
||||
EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGES.
|
||||
|
||||
7. GENERAL
|
||||
|
||||
If any provision of this Agreement is invalid or unenforceable under
|
||||
applicable law, it shall not affect the validity or enforceability of
|
||||
the remainder of the terms of this Agreement, and without further
|
||||
action by the parties hereto, such provision shall be reformed to the
|
||||
minimum extent necessary to make such provision valid and enforceable.
|
||||
|
||||
If Recipient institutes patent litigation against any entity
|
||||
(including a cross-claim or counterclaim in a lawsuit) alleging that the
|
||||
Program itself (excluding combinations of the Program with other software
|
||||
or hardware) infringes such Recipient's patent(s), then such Recipient's
|
||||
rights granted under Section 2(b) shall terminate as of the date such
|
||||
litigation is filed.
|
||||
|
||||
All Recipient's rights under this Agreement shall terminate if it
|
||||
fails to comply with any of the material terms or conditions of this
|
||||
Agreement and does not cure such failure in a reasonable period of
|
||||
time after becoming aware of such noncompliance. If all Recipient's
|
||||
rights under this Agreement terminate, Recipient agrees to cease use
|
||||
and distribution of the Program as soon as reasonably practicable.
|
||||
However, Recipient's obligations under this Agreement and any licenses
|
||||
granted by Recipient relating to the Program shall continue and survive.
|
||||
|
||||
Everyone is permitted to copy and distribute copies of this Agreement,
|
||||
but in order to avoid inconsistency the Agreement is copyrighted and
|
||||
may only be modified in the following manner. The Agreement Steward
|
||||
reserves the right to publish new versions (including revisions) of
|
||||
this Agreement from time to time. No one other than the Agreement
|
||||
Steward has the right to modify this Agreement. The Eclipse Foundation
|
||||
is the initial Agreement Steward. The Eclipse Foundation may assign the
|
||||
responsibility to serve as the Agreement Steward to a suitable separate
|
||||
entity. Each new version of the Agreement will be given a distinguishing
|
||||
version number. The Program (including Contributions) may always be
|
||||
Distributed subject to the version of the Agreement under which it was
|
||||
received. In addition, after a new version of the Agreement is published,
|
||||
Contributor may elect to Distribute the Program (including its
|
||||
Contributions) under the new version.
|
||||
|
||||
Except as expressly stated in Sections 2(a) and 2(b) above, Recipient
|
||||
receives no rights or licenses to the intellectual property of any
|
||||
Contributor under this Agreement, whether expressly, by implication,
|
||||
estoppel or otherwise. All rights in the Program not expressly granted
|
||||
under this Agreement are reserved. Nothing in this Agreement is intended
|
||||
to be enforceable by any entity that is not a Contributor or Recipient.
|
||||
No third-party beneficiary rights are created under this Agreement.
|
||||
|
||||
Exhibit A - Form of Secondary Licenses Notice
|
||||
|
||||
"This Source Code may also be made available under the following
|
||||
Secondary Licenses when the conditions for such availability set forth
|
||||
in the Eclipse Public License, v. 2.0 are satisfied: {name license(s),
|
||||
version(s), and exceptions or additional permissions here}."
|
||||
|
||||
Simply including a copy of this Agreement, including this Exhibit A
|
||||
is not sufficient to license the Source Code under Secondary Licenses.
|
||||
|
||||
If it is not possible or desirable to put the notice in a particular
|
||||
file, then You may include the notice in a location (such as a LICENSE
|
||||
file in a relevant directory) where a recipient would be likely to
|
||||
look for such a notice.
|
||||
|
||||
You may add additional accurate notices of copyright ownership.
|
||||
@@ -1,104 +0,0 @@
|
||||
Copyright (C) 2009-2021 The Project Lombok Authors.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
|
||||
==============================================================================
|
||||
Licenses for included components:
|
||||
|
||||
org.ow2.asm:asm
|
||||
org.ow2.asm:asm-analysis
|
||||
org.ow2.asm:asm-commons
|
||||
org.ow2.asm:asm-tree
|
||||
org.ow2.asm:asm-util
|
||||
ASM: a very small and fast Java bytecode manipulation framework
|
||||
Copyright (c) 2000-2011 INRIA, France Telecom
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
are met:
|
||||
1. Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
2. Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
3. Neither the name of the copyright holders nor the names of its
|
||||
contributors may be used to endorse or promote products derived from
|
||||
this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
|
||||
THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
rzwitserloot/com.zwitserloot.cmdreader
|
||||
|
||||
Copyright © 2010 Reinier Zwitserloot.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
projectlombok/lombok.patcher
|
||||
|
||||
Copyright (C) 2009-2021 The Project Lombok Authors.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
@@ -1 +0,0 @@
|
||||
Please read the license here: https://open-autonomous-connection.org/license.html
|
||||
@@ -1,104 +0,0 @@
|
||||
Copyright (C) 2009-2021 The Project Lombok Authors.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
|
||||
==============================================================================
|
||||
Licenses for included components:
|
||||
|
||||
org.ow2.asm:asm
|
||||
org.ow2.asm:asm-analysis
|
||||
org.ow2.asm:asm-commons
|
||||
org.ow2.asm:asm-tree
|
||||
org.ow2.asm:asm-util
|
||||
ASM: a very small and fast Java bytecode manipulation framework
|
||||
Copyright (c) 2000-2011 INRIA, France Telecom
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
are met:
|
||||
1. Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
2. Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
3. Neither the name of the copyright holders nor the names of its
|
||||
contributors may be used to endorse or promote products derived from
|
||||
this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
|
||||
THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
rzwitserloot/com.zwitserloot.cmdreader
|
||||
|
||||
Copyright © 2010 Reinier Zwitserloot.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
projectlombok/lombok.patcher
|
||||
|
||||
Copyright (C) 2009-2021 The Project Lombok Authors.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
@@ -1 +0,0 @@
|
||||
Please read the license here: https://open-autonomous-connection.org/license.html
|
||||
Reference in New Issue
Block a user