Skip to content

Commit bc5ed96

Browse files
committed
improve session handling by delegating to server
Signed-off-by: Stefan Bischof <[email protected]>
1 parent 96f07af commit bc5ed96

File tree

8 files changed

+158
-99
lines changed

8 files changed

+158
-99
lines changed

api/src/main/java/org/eclipse/daanse/xmla/api/XmlaService.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,13 @@
1515

1616
import org.eclipse.daanse.xmla.api.discover.DiscoverService;
1717
import org.eclipse.daanse.xmla.api.execute.ExecuteService;
18+
import org.eclipse.daanse.xmla.api.session.SessionService;
1819

1920
public interface XmlaService {
2021

2122
DiscoverService discover();
2223

2324
ExecuteService execute();
25+
26+
SessionService session();
2427
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
/*
2+
* Copyright (c) 2025 Contributors to the Eclipse Foundation.
3+
*
4+
* This program and the accompanying materials are made
5+
* available under the terms of the Eclipse Public License 2.0
6+
* which is available at https://www.eclipse.org/legal/epl-2.0/
7+
*
8+
* SPDX-License-Identifier: EPL-2.0
9+
*
10+
* Contributors:
11+
* SmartCity Jena - initial
12+
* Stefan Bischof (bipolis.org) - initial
13+
*/
14+
package org.eclipse.daanse.xmla.api.session;
15+
16+
import java.util.Optional;
17+
18+
import org.eclipse.daanse.xmla.api.UserPrincipal;
19+
import org.eclipse.daanse.xmla.api.xmla.BeginSession;
20+
import org.eclipse.daanse.xmla.api.xmla.EndSession;
21+
import org.eclipse.daanse.xmla.api.xmla.Session;
22+
23+
public interface SessionService {
24+
25+
Optional<Session> beginSession(BeginSession beginSession, UserPrincipal userPrincipal);
26+
27+
boolean checkSession(Session session, UserPrincipal userPrincipal);
28+
29+
void endSession(EndSession endSession, UserPrincipal userPrincipal);
30+
31+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
/*
2+
* Copyright (c) 2025 Contributors to the Eclipse Foundation.
3+
*
4+
* This program and the accompanying materials are made
5+
* available under the terms of the Eclipse Public License 2.0
6+
* which is available at https://www.eclipse.org/legal/epl-2.0/
7+
*
8+
* SPDX-License-Identifier: EPL-2.0
9+
*
10+
* Contributors:
11+
* SmartCity Jena - initial
12+
* Stefan Bischof (bipolis.org) - initial
13+
*/
14+
15+
@org.osgi.annotation.bundle.Export
16+
@org.osgi.annotation.versioning.Version("0.0.1")
17+
package org.eclipse.daanse.xmla.api.session;
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
/*
2+
* Copyright (c) 2025 Contributors to the Eclipse Foundation.
3+
*
4+
* This program and the accompanying materials are made
5+
* available under the terms of the Eclipse Public License 2.0
6+
* which is available at https://www.eclipse.org/legal/epl-2.0/
7+
*
8+
* SPDX-License-Identifier: EPL-2.0
9+
*
10+
* Contributors:
11+
* SmartCity Jena - initial
12+
* Stefan Bischof (bipolis.org) - initial
13+
*/
14+
package org.eclipse.daanse.xmla.client.soapmessage;
15+
16+
import java.util.Optional;
17+
18+
import org.eclipse.daanse.xmla.api.UserPrincipal;
19+
import org.eclipse.daanse.xmla.api.session.SessionService;
20+
import org.eclipse.daanse.xmla.api.xmla.BeginSession;
21+
import org.eclipse.daanse.xmla.api.xmla.EndSession;
22+
import org.eclipse.daanse.xmla.api.xmla.Session;
23+
24+
public class SessionServiceImpl implements SessionService {
25+
26+
@Override
27+
public Optional<Session> beginSession(BeginSession beginSession, UserPrincipal userPrincipal) {
28+
return Optional.empty();
29+
}
30+
31+
@Override
32+
public boolean checkSession(Session session, UserPrincipal userPrincipal) {
33+
return true;
34+
}
35+
36+
@Override
37+
public void endSession(EndSession endSession, UserPrincipal userPrincipal) {
38+
39+
}
40+
41+
}

client/soapmessage/src/main/java/org/eclipse/daanse/xmla/client/soapmessage/XmlaServiceClientImpl.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import org.eclipse.daanse.xmla.api.XmlaService;
1717
import org.eclipse.daanse.xmla.api.discover.DiscoverService;
1818
import org.eclipse.daanse.xmla.api.execute.ExecuteService;
19+
import org.eclipse.daanse.xmla.api.session.SessionService;
1920

2021
public class XmlaServiceClientImpl implements XmlaService {
2122

@@ -38,4 +39,9 @@ public ExecuteService execute() {
3839
return es;
3940
}
4041

42+
@Override
43+
public SessionService session() {
44+
return null;
45+
}
46+
4147
}

server/adapter.soapmessage/src/main/java/org/eclipse/daanse/xmla/server/adapter/soapmessage/RequestMetaDataUtils.java

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,13 @@ public class RequestMetaDataUtils {
2525

2626
public static final String USER_AGENT = "User-agent";
2727

28-
public static RequestMetaData getRequestMetaData(
29-
Map<String, Object> headers,
30-
Optional<Session> ses) {
31-
Optional<String> oUserAgent = get(headers.get(USER_AGENT));
32-
return new RequestMetaDataR(oUserAgent, ses.isPresent() ? Optional.of(ses.get().sessionId()) : Optional.empty());
28+
public static RequestMetaData getRequestMetaData(Map<String, Object> headers, Optional<Session> oSession) {
29+
Optional<String> oUserAgent = getUserAgent(headers.get(USER_AGENT));
30+
return new RequestMetaDataR(oUserAgent,
31+
oSession.isPresent() ? Optional.of(oSession.get().sessionId()) : Optional.empty());
3332
}
3433

35-
private static Optional<String> get(Object o) {
34+
private static Optional<String> getUserAgent(Object o) {
3635
if (o instanceof List list) {
3736
if (list.isEmpty()) {
3837
return Optional.of((String) list.get(0));

server/adapter.soapmessage/src/main/java/org/eclipse/daanse/xmla/server/adapter/soapmessage/SessionUtil.java

Lines changed: 0 additions & 65 deletions
This file was deleted.

server/adapter.soapmessage/src/main/java/org/eclipse/daanse/xmla/server/adapter/soapmessage/XmlaApiAdapter.java

Lines changed: 55 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,14 @@
1313
*/
1414
package org.eclipse.daanse.xmla.server.adapter.soapmessage;
1515

16-
import jakarta.xml.soap.MessageFactory;
17-
import jakarta.xml.soap.Node;
18-
import jakarta.xml.soap.SOAPBody;
19-
import jakarta.xml.soap.SOAPElement;
20-
import jakarta.xml.soap.SOAPEnvelope;
21-
import jakarta.xml.soap.SOAPException;
22-
import jakarta.xml.soap.SOAPHeader;
23-
import jakarta.xml.soap.SOAPHeaderElement;
24-
import jakarta.xml.soap.SOAPMessage;
25-
import jakarta.xml.soap.SOAPPart;
16+
import java.util.Arrays;
17+
import java.util.Iterator;
18+
import java.util.List;
19+
import java.util.Map;
20+
import java.util.Optional;
21+
22+
import javax.xml.namespace.QName;
23+
2624
import org.eclipse.daanse.xmla.api.RequestMetaData;
2725
import org.eclipse.daanse.xmla.api.UserPrincipal;
2826
import org.eclipse.daanse.xmla.api.XmlaService;
@@ -89,7 +87,9 @@
8987
import org.eclipse.daanse.xmla.api.execute.clearcache.ClearCacheResponse;
9088
import org.eclipse.daanse.xmla.api.execute.statement.StatementRequest;
9189
import org.eclipse.daanse.xmla.api.execute.statement.StatementResponse;
90+
import org.eclipse.daanse.xmla.api.xmla.BeginSession;
9291
import org.eclipse.daanse.xmla.api.xmla.Command;
92+
import org.eclipse.daanse.xmla.api.xmla.EndSession;
9393
import org.eclipse.daanse.xmla.api.xmla.Session;
9494
import org.eclipse.daanse.xmla.model.record.UserPrincipalR;
9595
import org.eclipse.daanse.xmla.model.record.discover.PropertiesR;
@@ -158,14 +158,16 @@
158158
import org.slf4j.Logger;
159159
import org.slf4j.LoggerFactory;
160160

161-
import javax.xml.namespace.QName;
162-
import java.util.Arrays;
163-
import java.util.HashSet;
164-
import java.util.Iterator;
165-
import java.util.List;
166-
import java.util.Map;
167-
import java.util.Optional;
168-
import java.util.Set;
161+
import jakarta.xml.soap.MessageFactory;
162+
import jakarta.xml.soap.Node;
163+
import jakarta.xml.soap.SOAPBody;
164+
import jakarta.xml.soap.SOAPElement;
165+
import jakarta.xml.soap.SOAPEnvelope;
166+
import jakarta.xml.soap.SOAPException;
167+
import jakarta.xml.soap.SOAPHeader;
168+
import jakarta.xml.soap.SOAPHeaderElement;
169+
import jakarta.xml.soap.SOAPMessage;
170+
import jakarta.xml.soap.SOAPPart;
169171

170172
public class XmlaApiAdapter {
171173
private static final Logger LOGGER = LoggerFactory.getLogger(XmlaApiAdapter.class);
@@ -203,7 +205,7 @@ public XmlaApiAdapter(XmlaService xmlaService) {
203205
private static final String MDSCHEMA_SETS = "MDSCHEMA_SETS";
204206
private static final String MDSCHEMA_KPIS = "MDSCHEMA_KPIS";
205207
private static final String MDSCHEMA_MEASUREGROUPS = "MDSCHEMA_MEASUREGROUPS";
206-
private Set<String> sessions = new HashSet<>();
208+
private static final QName QN_SESSION = new QName("urn:schemas-microsoft-com:xml-analysis", "Session");
207209

208210
public SOAPMessage handleRequest(SOAPMessage messageRequest, Map<String, Object> headers) {
209211
try {
@@ -219,18 +221,17 @@ public SOAPMessage handleRequest(SOAPMessage messageRequest, Map<String, Object>
219221
envelopeResponse.addNamespaceDeclaration(Constants.EMPTY.PREFIX, Constants.EMPTY.NS_URN);
220222
envelopeResponse.addNamespaceDeclaration(Constants.XSI.PREFIX, Constants.XSI.NS_URN);
221223

222-
SOAPBody bodyResponse = envelopeResponse.getBody();
223224
Object role = headers.get("ROLE");
224225
Object user = headers.get("USER");
225-
UserPrincipal userPrincipal = new UserPrincipalR(getStringOrNull(user), getRiles(role));
226-
Optional<Session> ses = SessionUtil.getSession(messageRequest.getSOAPHeader(), sessions);
227-
if (ses.isPresent()) {
226+
UserPrincipal userPrincipal = new UserPrincipalR(getStringOrNull(user), getRoles(role));
227+
Optional<Session> oSession =session(messageRequest.getSOAPHeader(),userPrincipal);
228+
if (oSession.isPresent()) {
228229
SOAPHeader header = envelopeResponse.getHeader();
229-
QName session = new QName("urn:schemas-microsoft-com:xml-analysis", "Session");
230-
SOAPHeaderElement sessionElement = header.addHeaderElement(session);
231-
sessionElement.addAttribute(new QName("SessionId"), ses.get().sessionId());
230+
SOAPHeaderElement sessionElement = header.addHeaderElement(QN_SESSION);
231+
sessionElement.addAttribute(new QName("SessionId"), oSession.get().sessionId());
232232
}
233-
RequestMetaData metaData = RequestMetaDataUtils.getRequestMetaData(headers, ses);
233+
RequestMetaData metaData = RequestMetaDataUtils.getRequestMetaData(headers, oSession);
234+
SOAPBody bodyResponse = envelopeResponse.getBody();
234235
handleBody(messageRequest.getSOAPBody(), bodyResponse, metaData, userPrincipal);
235236
return messageResponse;
236237
} catch (SOAPException e) {
@@ -239,7 +240,7 @@ public SOAPMessage handleRequest(SOAPMessage messageRequest, Map<String, Object>
239240
return null;
240241
}
241242

242-
private List<String> getRiles(Object ob) {
243+
private List<String> getRoles(Object ob) {
243244
if (ob != null && ob instanceof String str) {
244245
return Arrays.asList(str.split(","));
245246
}
@@ -253,6 +254,31 @@ private String getStringOrNull(Object ob) {
253254
return null;
254255
}
255256

257+
private Optional<Session> session(SOAPHeader soapRequestHeader, UserPrincipal userPrincipal) throws SOAPException {
258+
Optional<Session> oSession = Convert.getSession(soapRequestHeader);
259+
if (oSession.isPresent()) {
260+
boolean checked = xmlaService.session().checkSession(oSession.get(), userPrincipal);
261+
if (checked) {
262+
return oSession;
263+
} else {
264+
Optional.empty();
265+
}
266+
}
267+
268+
Optional<BeginSession> beginSession = Convert.getBeginSession(soapRequestHeader);
269+
if (beginSession.isPresent()) {
270+
return xmlaService.session().beginSession(beginSession.get(), userPrincipal);
271+
}
272+
273+
Optional<EndSession> oEndSession = Convert.getEndSession(soapRequestHeader);
274+
if (oEndSession.isPresent()) {
275+
xmlaService.session().endSession(oEndSession.get(), userPrincipal);
276+
return Optional.empty();
277+
}
278+
279+
return Optional.empty();
280+
}
281+
256282
private void handleBody(SOAPBody body, SOAPBody responseBody, RequestMetaData metaData, UserPrincipal userPrincipal)
257283
throws SOAPException {
258284
SOAPElement node = null;
@@ -280,6 +306,7 @@ private void handleBody(SOAPBody body, SOAPBody responseBody, RequestMetaData me
280306

281307
}
282308

309+
283310
private void discover(SOAPElement discover, SOAPBody responseBody, RequestMetaData metaData,
284311
UserPrincipal userPrincipal) throws SOAPException {
285312

0 commit comments

Comments
 (0)