From 23f82c4d63290cb41dc0fc6ebb86d6cae9a560fe Mon Sep 17 00:00:00 2001
From: clemenso <clemenso@8a26b1a7-26f0-462f-b9ef-d0e30c41f5a4>
Date: Tue, 20 Jan 2009 14:09:21 +0000
Subject: prepare for stal service extension

git-svn-id: https://joinup.ec.europa.eu/svn/mocca/trunk@262 8a26b1a7-26f0-462f-b9ef-d0e30c41f5a4
---
 .../egiz/bku/online/webapp/BKURequestHandler.java  |  13 +-
 .../egiz/stal/service/impl/STALRequestBroker.java  |   5 +-
 .../stal/service/impl/STALRequestBrokerImpl.java   | 195 +++++----------------
 .../gv/egiz/stal/service/impl/STALServiceImpl.java | 127 ++++++++------
 .../stal/service/impl/STALXJAXBContextFactory.java |  61 +++++++
 5 files changed, 193 insertions(+), 208 deletions(-)
 create mode 100644 BKUOnline/src/main/java/at/gv/egiz/stal/service/impl/STALXJAXBContextFactory.java

(limited to 'BKUOnline/src/main/java/at')

diff --git a/BKUOnline/src/main/java/at/gv/egiz/bku/online/webapp/BKURequestHandler.java b/BKUOnline/src/main/java/at/gv/egiz/bku/online/webapp/BKURequestHandler.java
index 781e0832..7930c53a 100644
--- a/BKUOnline/src/main/java/at/gv/egiz/bku/online/webapp/BKURequestHandler.java
+++ b/BKUOnline/src/main/java/at/gv/egiz/bku/online/webapp/BKURequestHandler.java
@@ -67,13 +67,11 @@ public class BKURequestHandler extends SpringBKUServlet {
     return new String(os.toByteArray(), encoding);
   }
 
+  @Override
   protected void doPost(HttpServletRequest req, HttpServletResponse resp)
       throws ServletException, java.io.IOException {
-    log.debug("Got new request");
-    String acceptLanguage = req.getHeader("Accept-Language");
-    Locale locale = AcceptLanguage.getLocale(acceptLanguage);
-    log.debug("Accept-Language locale: " + locale);
-
+    log.debug("Received new request");
+    
     HttpSession session = req.getSession(false);
     if (session != null) {
       log.warn("Already a session with id: " + session.getId()
@@ -95,6 +93,10 @@ public class BKURequestHandler extends SpringBKUServlet {
       log.debug("Using session id: " + session.getId());
     }
 
+    String acceptLanguage = req.getHeader("Accept-Language");
+    Locale locale = AcceptLanguage.getLocale(acceptLanguage);
+    log.debug("Accept-Language locale: " + locale);
+
     HTTPBindingProcessor bindingProcessor;
     bindingProcessor = (HTTPBindingProcessor) getBindingProcessorManager()
         .createBindingProcessor(req.getRequestURL().toString(),
@@ -185,6 +187,7 @@ public class BKURequestHandler extends SpringBKUServlet {
     dispatcher.forward(req, resp);
   }
 
+  @Override
   protected void doGet(HttpServletRequest req, HttpServletResponse resp)
       throws ServletException, java.io.IOException {
     doPost(req, resp);
diff --git a/BKUOnline/src/main/java/at/gv/egiz/stal/service/impl/STALRequestBroker.java b/BKUOnline/src/main/java/at/gv/egiz/stal/service/impl/STALRequestBroker.java
index d1fe045a..b77f7660 100644
--- a/BKUOnline/src/main/java/at/gv/egiz/stal/service/impl/STALRequestBroker.java
+++ b/BKUOnline/src/main/java/at/gv/egiz/stal/service/impl/STALRequestBroker.java
@@ -22,6 +22,7 @@ import at.gv.egiz.stal.STAL;
 import at.gv.egiz.stal.service.types.RequestType;
 import at.gv.egiz.stal.service.types.ResponseType;
 import java.util.List;
+import javax.xml.bind.JAXBElement;
 
 /**
  *
@@ -32,9 +33,9 @@ public interface STALRequestBroker extends STAL {
     public static final int ERR_4500 = 4500;
     public static final long DEFAULT_TIMEOUT_MS = 1000*60*5; //5mn
 
-    public List<RequestType> connect();
+    public List<JAXBElement<? extends RequestType>> connect();
     
-    public List<RequestType> nextRequest(List<ResponseType> response);
+    public List<JAXBElement<? extends RequestType>> nextRequest(List<JAXBElement<? extends ResponseType>> responses);
 
     public List<HashDataInput> getHashDataInput();
 }
diff --git a/BKUOnline/src/main/java/at/gv/egiz/stal/service/impl/STALRequestBrokerImpl.java b/BKUOnline/src/main/java/at/gv/egiz/stal/service/impl/STALRequestBrokerImpl.java
index 5e3a1a99..252327d3 100644
--- a/BKUOnline/src/main/java/at/gv/egiz/stal/service/impl/STALRequestBrokerImpl.java
+++ b/BKUOnline/src/main/java/at/gv/egiz/stal/service/impl/STALRequestBrokerImpl.java
@@ -25,6 +25,7 @@ import at.gv.egiz.stal.STALRequest;
 import at.gv.egiz.stal.STALResponse;
 import at.gv.egiz.stal.SignRequest;
 import at.gv.egiz.stal.service.types.InfoboxReadRequestType;
+import at.gv.egiz.stal.service.types.ObjectFactory;
 import at.gv.egiz.stal.service.types.QuitRequestType;
 import at.gv.egiz.stal.service.types.RequestType;
 import at.gv.egiz.stal.service.types.ResponseType;
@@ -34,6 +35,7 @@ import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 import java.util.Locale;
+import javax.xml.bind.JAXBElement;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
@@ -52,14 +54,12 @@ public class STALRequestBrokerImpl implements STALRequestBroker {
 
     private static final Log log = LogFactory.getLog(STALRequestBrokerImpl.class);
 
-//    private boolean expectingResponse = false;
+    private ObjectFactory stalObjFactory = new ObjectFactory();
+    
     private boolean interrupted = false;
     
-//    private final RequestsMonitor reqMon = new RequestsMonitor();
-//    private final ResponsesMonitor respMon = new ResponsesMonitor();
-
-    protected ArrayList<RequestType> requests;
-    protected ArrayList<ResponseType> responses;
+    protected final ArrayList<JAXBElement<? extends RequestType>> requests;
+    protected final ArrayList<JAXBElement<? extends ResponseType>> responses;
 
     protected ArrayList<HashDataInput> hashDataInputs;
     
@@ -69,8 +69,8 @@ public class STALRequestBrokerImpl implements STALRequestBroker {
       if (timeoutMillisec <= 0) 
         timeoutMillisec = DEFAULT_TIMEOUT_MS;
       timeout = timeoutMillisec;
-      requests = new ArrayList<RequestType>();
-      responses = new ArrayList<ResponseType>();
+      requests = new ArrayList<JAXBElement<? extends RequestType>>();
+      responses = new ArrayList<JAXBElement<? extends ResponseType>>();
       hashDataInputs = new ArrayList<HashDataInput>();
     }
     
@@ -95,36 +95,39 @@ public class STALRequestBrokerImpl implements STALRequestBroker {
 
             requests.clear();
             hashDataInputs.clear();
-//            reqMon.produce(requests);
-//            reqMon.setHashDataInput(null);
             
             for (STALRequest stalRequest : stalRequests) {
                 if (stalRequest instanceof SignRequest) {
                   log.trace("Received SignRequest, keep HashDataInput.");
-                  SignRequestType req = new SignRequestType();
-                  req.setKeyIdentifier(((SignRequest) stalRequest).getKeyIdentifier());
-                  req.setSignedInfo(((SignRequest) stalRequest).getSignedInfo());
+                  SignRequestType reqT = stalObjFactory.createSignRequestType();
+                  reqT.setKeyIdentifier(((SignRequest) stalRequest).getKeyIdentifier());
+                  reqT.setSignedInfo(((SignRequest) stalRequest).getSignedInfo());
+                  JAXBElement<SignRequestType> req = stalObjFactory.createGetNextRequestResponseTypeSignRequest(reqT);
                   requests.add(req);
                   //DataObjectHashDataInput with reference caching enabled DataObject 
                   hashDataInputs.addAll(((SignRequest) stalRequest).getHashDataInput());
                   break;
                 } else if (stalRequest instanceof InfoboxReadRequest) {
                   log.trace("Received InfoboxReadRequest");
-                  InfoboxReadRequestType req = new InfoboxReadRequestType();
-                  req.setInfoboxIdentifier(((InfoboxReadRequest) stalRequest).getInfoboxIdentifier());
-                  req.setDomainIdentifier(((InfoboxReadRequest) stalRequest).getDomainIdentifier());
+                  InfoboxReadRequestType reqT = new InfoboxReadRequestType();
+                  reqT.setInfoboxIdentifier(((InfoboxReadRequest) stalRequest).getInfoboxIdentifier());
+                  reqT.setDomainIdentifier(((InfoboxReadRequest) stalRequest).getDomainIdentifier());
+                  JAXBElement<InfoboxReadRequestType> req = stalObjFactory.createGetNextRequestResponseTypeInfoboxReadRequest(reqT);
                   requests.add(req);
                 } else if (stalRequest instanceof QuitRequest) {
                   log.trace("Received QuitRequest, do not wait for responses.");
-                  requests.add(new QuitRequestType());
+                  QuitRequestType reqT = stalObjFactory.createQuitRequestType();
+                  JAXBElement<QuitRequestType> req = stalObjFactory.createGetNextRequestResponseTypeQuitRequest(reqT);
+                  requests.add(req);
                   log.trace("notifying request consumers");
                   requests.notify();
-//                    reqMon.notify();
                   return new ArrayList<STALResponse>();
                 } else {
                   log.error("Received unsupported STAL request: " + stalRequest.getClass().getName() + ", send QUIT");
                   requests.clear();
-                  requests.add(new QuitRequestType());
+                  QuitRequestType reqT = stalObjFactory.createQuitRequestType();
+                  JAXBElement<QuitRequestType> req = stalObjFactory.createGetNextRequestResponseTypeQuitRequest(reqT);
+                  requests.add(req);
                   log.trace("notifying request consumers");
                   requests.notify();
                   return new ArrayList<STALResponse>();
@@ -132,32 +135,25 @@ public class STALRequestBrokerImpl implements STALRequestBroker {
             }
             log.trace("notifying request consumers");
             requests.notify();
-//            reqMon.notify();
           }
           
-          synchronized (responses) { //respMon) {
+          synchronized (responses) { 
             long beforeWait = System.currentTimeMillis();
-//            while (respMon.responses == null) {
             while (responses.isEmpty()) {
                 log.trace("waiting to consume response");
-//                respMon.wait(timeout);
                 responses.wait(timeout);
                 if (System.currentTimeMillis() - beforeWait >= timeout) {
                     log.warn("timeout while waiting to consume response, cleanup requests");
-//                    reqMon.consume(); //TODO check deadlock?
-//                    reqMon.setHashDataInput(null);
-                    requests.clear(); //TODO sync on requests?
+                    requests.clear(); 
                     hashDataInputs.clear();
                     return Collections.singletonList((STALResponse) new ErrorResponse(ERR_4500));
                 }
             }
             log.trace("consuming responses");
-//            List<STALResponse> responses = respMon.consume();
             List<STALResponse> resps = STALTranslator.toSTAL(responses);
             responses.clear();
             log.trace("notifying response producers");
             responses.notify();
-//            respMon.notify();
 
             return resps;
           }
@@ -169,7 +165,7 @@ public class STALRequestBrokerImpl implements STALRequestBroker {
     }
 
     @Override
-    public List<RequestType> connect() {
+    public List<JAXBElement<? extends RequestType>> connect() {
       if (interrupted) {
         return null;
       }
@@ -181,15 +177,9 @@ public class STALRequestBrokerImpl implements STALRequestBroker {
                 requests.wait(timeout);
                 if (System.currentTimeMillis() - beforeWait >= timeout) {
                     log.warn("timeout while waiting to consume request");
-                    return Collections.singletonList((RequestType) new QuitRequestType());
+                    return createSingleQuitRequest();
                 }
             }
-            
-//            log.trace("consume request");
-//            List<RequestType> reqs = new ArrayList<RequestType>(); 
-//            reqs.addAll(requests);
-//            requests.clear();
-//            return reqs;
             log.trace("don't consume request now, leave for further connect calls");
             return requests;
           }
@@ -212,7 +202,7 @@ public class STALRequestBrokerImpl implements STALRequestBroker {
      * @return QUIT if expected responses are not provided
      */
     @Override
-    public List<RequestType> nextRequest(List<ResponseType> resps) {
+    public List<JAXBElement<? extends RequestType>> nextRequest(List<JAXBElement<? extends ResponseType>> resps) {
       if (interrupted) {
         return null;
       }
@@ -227,69 +217,43 @@ public class STALRequestBrokerImpl implements STALRequestBroker {
             }
           }
           
-          synchronized (responses) { //respMon) {
+          synchronized (responses) { 
             if (resps != null && resps.size() > 0) {
-//                if (!expectingResponse) {
-//                    log.warn("Received unexpected response in nextRequest(), return QUIT");
-//                    return Collections.singletonList((RequestType) new QuitRequestType());
-//                }
                 long beforeWait = System.currentTimeMillis();
-//                while (respMon.responses != null) {
                 while (!responses.isEmpty()) {
                     log.trace("waiting to produce response");
-//                    respMon.wait(timeout);
                     responses.wait(timeout);
                     if (System.currentTimeMillis() - beforeWait >= timeout) {
                         log.warn("timeout while waiting to produce response");
-                        return Collections.singletonList((RequestType) new QuitRequestType());
+                        return createSingleQuitRequest();
                     }
                 }
                 log.trace("produce response");
-//                respMon.produce(resps);
                 responses.addAll(resps);
                 //reset HashDataInputCallback iff SignResponse
                 if (log.isTraceEnabled()) {
-                    for (ResponseType response : resps) {
-                        log.trace("Received STAL response: " + response.getClass().getName());
+                    for (JAXBElement<? extends ResponseType> response : resps) {
+                        log.trace("Received STAL response: " + response.getValue().getClass().getName());
                     }
                 }
                 log.trace("notifying response consumers");
-//                respMon.notify();
                 responses.notify();
             } else {
-//                if (expectingResponse) {
-//                    log.warn("Did not receive expected response(s) in nextRequest(), return QUIT");
-//                    return Collections.singletonList((RequestType) new QuitRequestType());
-//                }
-//                log.trace("expecting non-null response in next nextRequest(response)");
-//                expectingResponse = true;
               log.error("Received NextRequest without responses, return QUIT");
-              return Collections.singletonList((RequestType) new QuitRequestType());
+              return createSingleQuitRequest();
             }
           }
           
-          synchronized (requests) { //reqMon) {
+          synchronized (requests) { 
             long beforeWait = System.currentTimeMillis();
-//            while (reqMon.requests == null) {
             while (requests.isEmpty()) {
                 log.trace("waiting to consume request");
-//                reqMon.wait(timeout);
                 requests.wait(timeout);
                 if (System.currentTimeMillis() - beforeWait >= timeout) {
                     log.warn("timeout while waiting to consume request");
-                    return Collections.singletonList((RequestType) new QuitRequestType());
+                    return createSingleQuitRequest();
                 }
             }
-//            log.trace("consume request");
-//            List<RequestType> reqs = new ArrayList<RequestType>(); // reqMon.consume();
-//            reqs.addAll(requests);
-//            
-////            if (requests.size() > 0 && requests.get(0) instanceof QuitRequestType) {
-////                log.trace("expecting no response in next nextRequest()");
-////                expectingResponse = false;
-////            }
-//            requests.clear();
-//            return reqs;
             log.trace("don't consume request now, but on next response delivery");
             return requests;
           }
@@ -304,92 +268,19 @@ public class STALRequestBrokerImpl implements STALRequestBroker {
     public List<HashDataInput> getHashDataInput() {
       synchronized (requests) {
         log.trace("return " + hashDataInputs.size() + " current HashDataInput(s) ");
-        return hashDataInputs; //reqMon.getHashDataInput();
+        return hashDataInputs;
       }
     }
     
     @Override
     public void setLocale(Locale locale) {
     }
-    
-//    class RequestsMonitor {
-//      List<STALRequest> requests;
-//      List<HashDataInput> hashDataInput;
-//      
-//      void produce(List<STALRequest> req) {
-//        requests = req;
-//      }
-//      
-//      synchronized List<at.gv.egiz.stal.service.types.STALRequest> consume() {
-//        List<at.gv.egiz.stal.service.types.STALRequest> reqs = new ArrayList<at.gv.egiz.stal.service.types.STALRequest>();
-//        for (STALRequest request : requests) {
-//          if (request instanceof SignRequest) {
-//            at.gv.egiz.stal.service.types.SignRequest r = new at.gv.egiz.stal.service.types.SignRequest();
-//            r.setKeyIdentifier(((SignRequest) request).getKeyIdentifier());
-//            r.setSignedInfo(((SignRequest) request).getSignedInfo());
-//            reqs.add(r);
-//          } else if (request instanceof InfoboxReadRequest) {
-//            at.gv.egiz.stal.service.types.InfoboxReadRequest r = new at.gv.egiz.stal.service.types.InfoboxReadRequest();
-//            r.setDomainIdentifier(((InfoboxReadRequest) request).getDomainIdentifier());
-//            r.setInfoboxIdentifier(((InfoboxReadRequest) request).getInfoboxIdentifier());
-//            reqs.add(r);
-//          } else if (request instanceof QuitRequest) {
-//            at.gv.egiz.stal.service.types.QuitRequest r = new at.gv.egiz.stal.service.types.QuitRequest();
-//            reqs.add(r);
-//          } else {
-//            log.error("unknown STAL request type: " + request.getClass());
-//            requests = null;
-//            return Collections.singletonList((at.gv.egiz.stal.service.types.STALRequest) new at.gv.egiz.stal.service.types.QuitRequest());
-//          }
-//        }
-//        requests = null;
-//        return reqs;
-//      }
-//      
-//      void setHashDataInput(List<HashDataInput> hdi) {
-//        hashDataInput = hdi;
-//      }
-//      
-//      List<HashDataInput> getHashDataInput() {
-//        return hashDataInput;
-//      }
-//    }
-//    
-//    /** TODO: now, that responses are not nulled, synchronize directly on responses? */
-//    class ResponsesMonitor {
-//      List<at.gv.egiz.stal.service.types.STALResponse> responses;
-//      
-//      void produce(List<at.gv.egiz.stal.service.types.STALResponse> resp) {
-//        responses = resp;
-//      }
-//      
-//      synchronized List<STALResponse> consume() {
-//        List<STALResponse> resps = new ArrayList<STALResponse>();
-//        
-//        for (at.gv.egiz.stal.service.types.STALResponse response : responses) {
-//          if (response instanceof at.gv.egiz.stal.service.types.InfoboxReadResponse) {
-//            InfoboxReadResponse r = new InfoboxReadResponse();
-//            r.setInfoboxValue(((at.gv.egiz.stal.service.types.InfoboxReadResponse) response).getInfoboxValue());
-//            resps.add(r);
-//          } else if (response instanceof at.gv.egiz.stal.service.types.SignResponse) {
-//            SignResponse r = new SignResponse();
-//            r.setSignatureValue(((at.gv.egiz.stal.service.types.SignResponse) response).getSignatureValue());
-//            resps.add(r);
-//          } else if (response instanceof at.gv.egiz.stal.service.types.ErrorResponse) {
-//            ErrorResponse r = new ErrorResponse();
-//            r.setErrorCode(((at.gv.egiz.stal.service.types.ErrorResponse) response).getErrorCode());
-//            r.setErrorMessage(((at.gv.egiz.stal.service.types.ErrorResponse) response).getErrorMessage());
-//            resps.add(r);
-//          } else {
-//            log.error("unknown STAL response type: " + response.getClass());
-//            ErrorResponse r = new ErrorResponse(4000);
-//            r.setErrorMessage("unknown STAL response type: " + response.getClass());
-//            responses = null;
-//            return Collections.singletonList((STALResponse) r);
-//          }
-//        }
-//        responses = null;
-//        return resps;
-//      }
-//    }
+
+    private List<JAXBElement<? extends RequestType>> createSingleQuitRequest() {
+      QuitRequestType quitT = stalObjFactory.createQuitRequestType();
+      JAXBElement<QuitRequestType> quit = stalObjFactory.createGetNextRequestResponseTypeQuitRequest(quitT);
+      ArrayList<JAXBElement<? extends RequestType>> l = new ArrayList<JAXBElement<? extends RequestType>>();
+      l.add(quit);
+      return l;
+    }
 }
diff --git a/BKUOnline/src/main/java/at/gv/egiz/stal/service/impl/STALServiceImpl.java b/BKUOnline/src/main/java/at/gv/egiz/stal/service/impl/STALServiceImpl.java
index 05a3f5e5..45629869 100644
--- a/BKUOnline/src/main/java/at/gv/egiz/stal/service/impl/STALServiceImpl.java
+++ b/BKUOnline/src/main/java/at/gv/egiz/stal/service/impl/STALServiceImpl.java
@@ -14,9 +14,10 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
 package at.gv.egiz.stal.service.impl;
 
+//import at.buergerkarte.namespaces.cardchannel.service.CommandAPDUType;
+//import at.buergerkarte.namespaces.cardchannel.service.ScriptType;
 import at.gv.egiz.bku.binding.BindingProcessor;
 import at.gv.egiz.bku.binding.BindingProcessorManager;
 import at.gv.egiz.bku.binding.Id;
@@ -36,6 +37,7 @@ import at.gv.egiz.stal.service.types.QuitRequestType;
 import at.gv.egiz.stal.service.types.RequestType;
 import at.gv.egiz.stal.service.types.ResponseType;
 import at.gv.egiz.stal.service.types.SignRequestType;
+import com.sun.xml.ws.developer.UsesJAXBContext;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
@@ -46,6 +48,7 @@ import java.util.Map;
 import javax.annotation.Resource;
 import javax.jws.WebService;
 import javax.servlet.ServletContext;
+import javax.xml.bind.JAXBElement;
 import javax.xml.ws.WebServiceContext;
 import javax.xml.ws.handler.MessageContext;
 import org.apache.commons.logging.Log;
@@ -56,46 +59,45 @@ import org.apache.commons.logging.LogFactory;
  * @author clemens
  */
 @WebService(endpointInterface = "at.gv.egiz.stal.service.STALPortType")
+@UsesJAXBContext(STALXJAXBContextFactory.class)
 public class STALServiceImpl implements STALPortType {
 
   public static final String BINDING_PROCESSOR_MANAGER = "bindingProcessorManager";
   public static final Id TEST_SESSION_ID = IdFactory.getInstance().createId("TestSession");
-  
   protected static final Log log = LogFactory.getLog(STALServiceImpl.class);
-  
+
+
   static {
-    
     if (log.isTraceEnabled()) {
       log.trace("enabling webservice communication dump");
       System.setProperty("com.sun.xml.ws.transport.http.HttpAdapter.dump", "true");
     } else {
       System.setProperty("com.sun.xml.ws.fault.SOAPFaultBuilder.disableCaptureStackTrace", "false");
     }
-    
   }
-  
   @Resource
-  WebServiceContext wsContext;
+  protected WebServiceContext wsContext;
   protected IdFactory idF = IdFactory.getInstance();
+  private at.gv.egiz.stal.service.types.ObjectFactory stalObjFactory = new at.gv.egiz.stal.service.types.ObjectFactory();
+//  private at.buergerkarte.namespaces.cardchannel.service.ObjectFactory ccObjFactory = new at.buergerkarte.namespaces.cardchannel.service.ObjectFactory();
 
-   
   @Override
   public GetNextRequestResponseType connect(String sessId) {
-    
+
     if (sessId == null) {
       throw new NullPointerException("No session id provided");
     }
-    
+
     Id sessionId = idF.createId(sessId);
 
     if (log.isDebugEnabled()) {
       log.debug("Received Connect [" + sessionId + "]");
     }
-    
+
     if (TEST_SESSION_ID.equals(sessionId)) {
       return getTestSessionNextRequestResponse(null);
     }
-    
+
     GetNextRequestResponseType response = new GetNextRequestResponseType();
     response.setSessionId(sessionId.toString());
 
@@ -103,7 +105,7 @@ public class STALServiceImpl implements STALPortType {
 
     if (stal != null) {
 
-      List<RequestType> requestsOut = ((STALRequestBroker) stal).connect();
+      List<JAXBElement<? extends RequestType>> requestsOut = ((STALRequestBroker) stal).connect();
       response.getInfoboxReadRequestOrSignRequestOrQuitRequest().addAll(requestsOut);
 
       if (log.isDebugEnabled()) {
@@ -112,29 +114,32 @@ public class STALServiceImpl implements STALPortType {
         sb.append("] containing ");
         sb.append(requestsOut.size());
         sb.append(" requests: ");
-        for (RequestType reqOut : requestsOut) {
-          sb.append(reqOut.getClass());
+        for (JAXBElement<? extends RequestType> reqOut : requestsOut) {
+          sb.append(reqOut.getValue().getClass());
           sb.append(' ');
         }
         log.debug(sb.toString());
       }
     } else {
       log.error("Failed to get STAL for session " + sessionId + ", returning QuitRequest");
-      response.getInfoboxReadRequestOrSignRequestOrQuitRequest().add(new QuitRequestType());
+      QuitRequestType quitT = stalObjFactory.createQuitRequestType();
+      JAXBElement<QuitRequestType> quit = stalObjFactory.createGetNextRequestResponseTypeQuitRequest(quitT);
+      response.getInfoboxReadRequestOrSignRequestOrQuitRequest().add(quit);
     }
     return response;
   }
-  
+
   @Override
   public GetNextRequestResponseType getNextRequest(GetNextRequestType request) {
 
     if (request.getSessionId() == null) {
       throw new NullPointerException("No session id provided");
     }
-    
+
     Id sessionId = idF.createId(request.getSessionId());
 
-    List<ResponseType> responsesIn = request.getInfoboxReadResponseOrSignResponseOrErrorResponse();//getResponse();
+    List<JAXBElement<? extends ResponseType>> responsesIn = request.getInfoboxReadResponseOrSignResponseOrErrorResponse();
+//    List<ResponseType> responsesIn = request.getInfoboxReadResponseOrSignResponseOrErrorResponse();//getResponse();
 
     if (log.isDebugEnabled()) {
       StringBuilder sb = new StringBuilder("Received GetNextRequest [");
@@ -142,25 +147,25 @@ public class STALServiceImpl implements STALPortType {
       sb.append("] containing ");
       sb.append(responsesIn.size());
       sb.append(" responses: ");
-      for (ResponseType respIn : responsesIn) {
+      for (Object respIn : responsesIn) {
         sb.append(respIn.getClass());
         sb.append(' ');
       }
       log.debug(sb.toString());
     }
-    
+
     if (TEST_SESSION_ID.equals(sessionId)) {
       return getTestSessionNextRequestResponse(responsesIn);
     }
 
     GetNextRequestResponseType response = new GetNextRequestResponseType();
     response.setSessionId(sessionId.toString());
-    
+
     STALRequestBroker stal = getStal(sessionId);
 
     if (stal != null) {
 
-      List<RequestType> requestsOut = ((STALRequestBroker) stal).nextRequest(responsesIn);
+      List<JAXBElement<? extends RequestType>> requestsOut = ((STALRequestBroker) stal).nextRequest(responsesIn);
       response.getInfoboxReadRequestOrSignRequestOrQuitRequest().addAll(requestsOut);
 
       if (log.isDebugEnabled()) {
@@ -169,15 +174,17 @@ public class STALServiceImpl implements STALPortType {
         sb.append("] containing ");
         sb.append(requestsOut.size());
         sb.append(" requests: ");
-        for (RequestType reqOut : requestsOut) {
-          sb.append(reqOut.getClass());
+        for (JAXBElement<? extends RequestType> reqOut : requestsOut) {
+          sb.append(reqOut.getValue().getClass());
           sb.append(' ');
         }
         log.debug(sb.toString());
       }
     } else {
       log.error("Failed to get STAL for session " + sessionId + ", returning QuitRequest");
-      response.getInfoboxReadRequestOrSignRequestOrQuitRequest().add(new QuitRequestType());
+      QuitRequestType quitT = stalObjFactory.createQuitRequestType();
+      JAXBElement<QuitRequestType> quit = stalObjFactory.createGetNextRequestResponseTypeQuitRequest(quitT);
+      response.getInfoboxReadRequestOrSignRequestOrQuitRequest().add(quit);
     }
     return response;
   }
@@ -188,7 +195,7 @@ public class STALServiceImpl implements STALPortType {
     if (request.getSessionId() == null) {
       throw new NullPointerException("No session id provided");
     }
-    
+
     Id sessionId = idF.createId(request.getSessionId());
 
     if (log.isDebugEnabled()) {
@@ -197,13 +204,13 @@ public class STALServiceImpl implements STALPortType {
 
     GetHashDataInputResponseType response = new GetHashDataInputResponseType();
     response.setSessionId(sessionId.toString());
-      
+
     if (TEST_SESSION_ID.equals(sessionId)) {
       log.debug("Received GetHashDataInput for session " + TEST_SESSION_ID + ", return DummyHashDataInput");
       GetHashDataInputResponseType.Reference ref = new GetHashDataInputResponseType.Reference();
       ref.setID("signed-data-reference-0-1214921968-27971781-24309"); //Reference-" + TEST_SESSION_ID + "-001");
       ref.setMimeType("text/plain");
-      
+
       Charset charset;
       try {
         charset = Charset.forName("iso-8859-15");
@@ -316,30 +323,52 @@ public class STALServiceImpl implements STALPortType {
     return (bp == null) ? null : (bp.isFinished() ? null : (STALRequestBroker) bp.getSTAL());
   }
 
-  private GetNextRequestResponseType getTestSessionNextRequestResponse(List<ResponseType> responsesIn) {
+  private GetNextRequestResponseType getTestSessionNextRequestResponse(List<JAXBElement<? extends ResponseType>> responsesIn) {
     GetNextRequestResponseType response = new GetNextRequestResponseType();
     response.setSessionId(TEST_SESSION_ID.toString());
-    
-    if (responsesIn != null && responsesIn.size() > 0 && responsesIn.get(0) instanceof ErrorResponseType) {
-      log.info("Received TestSession GetNextRequest(ErrorResponse), returning QuitRequest");
-      response.getInfoboxReadRequestOrSignRequestOrQuitRequest().add(new QuitRequestType());
+
+    List<JAXBElement<? extends RequestType>> reqs = response.getInfoboxReadRequestOrSignRequestOrQuitRequest();
+
+    if (responsesIn == null) {
+      log.info("[TestSession] received CONNECT, return dummy requests ");
+//      ScriptType scriptT = ccObjFactory.createScriptType();
+//      CommandAPDUType cmd = ccObjFactory.createCommandAPDUType();
+//      cmd.setValue("TestSession CardChannelCMD 1234".getBytes());
+//      scriptT.getResetOrCommandAPDUOrVerifyAPDU().add(cmd);
+//      reqs.add(ccObjFactory.createScript(scriptT));
+      addDummyRequests(reqs);
+    } else if (responsesIn != null && responsesIn.size() > 0 && responsesIn.get(0).getValue() instanceof ErrorResponseType) {
+      log.info("[TestSession] received ErrorResponse, return QUIT request");
+      QuitRequestType quitT = stalObjFactory.createQuitRequestType();
+      reqs.add(stalObjFactory.createGetNextRequestResponseTypeQuitRequest(quitT));
     } else {
-      log.info("Received TestSession GetNextRequest, returning SignRequest and 3 InfoboxReadRequests ");
-      InfoboxReadRequestType req = new InfoboxReadRequestType();
-      req.setInfoboxIdentifier("IdentityLink");
-      req.setDomainIdentifier("hansiwurzel");
-      response.getInfoboxReadRequestOrSignRequestOrQuitRequest().add(req);
-      SignRequestType sig = new SignRequestType();
-      sig.setKeyIdentifier("SecureSignatureKeypair");
-      sig.setSignedInfo("<dsig:SignedInfo  xmlns:dsig=\"http://www.w3.org/2000/09/xmldsig#\" xmlns:xpf=\"http://www.w3.org/2002/06/xmldsig-filter2\"><dsig:CanonicalizationMethod Algorithm=\"http://www.w3.org/TR/2001/REC-xml-c14n-20010315\" /> <dsig:SignatureMethod Algorithm=\"http://www.w3.org/2001/04/xmldsig-more#ecdsa-sha1\" /> <dsig:Reference Id=\"signed-data-reference-0-1214921968-27971781-24309\" URI=\"#signed-data-object-0-1214921968-27971781-13578\"><dsig:Transforms> <dsig:Transform Algorithm=\"http://www.w3.org/2002/06/xmldsig-filter2\"> <xpf:XPath xmlns:xpf=\"http://www.w3.org/2002/06/xmldsig-filter2\" Filter=\"intersect\">id('signed-data-object-0-1214921968-27971781-13578')/node()</xpf:XPath></dsig:Transform></dsig:Transforms><dsig:DigestMethod Algorithm=\"http://www.w3.org/2000/09/xmldsig#sha1\" /> <dsig:DigestValue>H1IePEEfGQ2SG03H6LTzw1TpCuM=</dsig:DigestValue></dsig:Reference><dsig:Reference Id=\"etsi-data-reference-0-1214921968-27971781-25439\" Type=\"http://uri.etsi.org/01903/v1.1.1#SignedProperties\" URI=\"#xmlns(etsi=http://uri.etsi.org/01903/v1.1.1%23)%20xpointer(id('etsi-data-object-0-1214921968-27971781-3095')/child::etsi:QualifyingProperties/child::etsi:SignedProperties)\"><dsig:DigestMethod Algorithm=\"http://www.w3.org/2000/09/xmldsig#sha1\" /><dsig:DigestValue>yV6Q+I60buqR4mMaxA7fi+CV35A=</dsig:DigestValue></dsig:Reference></dsig:SignedInfo>".getBytes());
-      response.getInfoboxReadRequestOrSignRequestOrQuitRequest().add(sig);
-      req = new InfoboxReadRequestType();
-      req.setInfoboxIdentifier("CertifiedKeypair");
-      response.getInfoboxReadRequestOrSignRequestOrQuitRequest().add(req);
-      req = new InfoboxReadRequestType();
-      req.setInfoboxIdentifier("SecureSignatureKeypair");
-      response.getInfoboxReadRequestOrSignRequestOrQuitRequest().add(req);
+      log.info("[TestSession] received " + responsesIn.size() + " response(s), return dummy requests" );
+      addDummyRequests(reqs);
     }
     return response;
   }
+
+  private void addDummyRequests(List<JAXBElement<? extends RequestType>> reqs) {
+//    log.info("[TestSession] add READ request for Infobox IdentityLink");
+//    InfoboxReadRequestType ibrT1 = stalObjFactory.createInfoboxReadRequestType();
+//    ibrT1.setInfoboxIdentifier("IdentityLink");
+//    reqs.add(stalObjFactory.createGetNextRequestResponseTypeInfoboxReadRequest(ibrT1));
+
+    log.info("[TestSession] add READ request for Infobox CertifiedKeypair");
+    InfoboxReadRequestType ibrT2 = stalObjFactory.createInfoboxReadRequestType();
+    ibrT2.setInfoboxIdentifier("CertifiedKeypair");
+    reqs.add(stalObjFactory.createGetNextRequestResponseTypeInfoboxReadRequest(ibrT2));
+
+    log.info("[TestSession] add READ request for Infobox SecureSignatureKeypair");
+    InfoboxReadRequestType ibrT3 = stalObjFactory.createInfoboxReadRequestType();
+    ibrT3.setInfoboxIdentifier("SecureSignatureKeypair");
+    reqs.add(stalObjFactory.createGetNextRequestResponseTypeInfoboxReadRequest(ibrT3));
+
+    log.info("[TestSession] add SIGN request");
+    SignRequestType sigT1 = stalObjFactory.createSignRequestType();
+    sigT1.setKeyIdentifier("SecureSignatureKeypair");
+    sigT1.setSignedInfo("<dsig:SignedInfo  xmlns:dsig=\"http://www.w3.org/2000/09/xmldsig#\" xmlns:xpf=\"http://www.w3.org/2002/06/xmldsig-filter2\"><dsig:CanonicalizationMethod Algorithm=\"http://www.w3.org/TR/2001/REC-xml-c14n-20010315\" /> <dsig:SignatureMethod Algorithm=\"http://www.w3.org/2001/04/xmldsig-more#ecdsa-sha1\" /> <dsig:Reference Id=\"signed-data-reference-0-1214921968-27971781-24309\" URI=\"#signed-data-object-0-1214921968-27971781-13578\"><dsig:Transforms> <dsig:Transform Algorithm=\"http://www.w3.org/2002/06/xmldsig-filter2\"> <xpf:XPath xmlns:xpf=\"http://www.w3.org/2002/06/xmldsig-filter2\" Filter=\"intersect\">id('signed-data-object-0-1214921968-27971781-13578')/node()</xpf:XPath></dsig:Transform></dsig:Transforms><dsig:DigestMethod Algorithm=\"http://www.w3.org/2000/09/xmldsig#sha1\" /> <dsig:DigestValue>H1IePEEfGQ2SG03H6LTzw1TpCuM=</dsig:DigestValue></dsig:Reference><dsig:Reference Id=\"etsi-data-reference-0-1214921968-27971781-25439\" Type=\"http://uri.etsi.org/01903/v1.1.1#SignedProperties\" URI=\"#xmlns(etsi=http://uri.etsi.org/01903/v1.1.1%23)%20xpointer(id('etsi-data-object-0-1214921968-27971781-3095')/child::etsi:QualifyingProperties/child::etsi:SignedProperties)\"><dsig:DigestMethod Algorithm=\"http://www.w3.org/2000/09/xmldsig#sha1\" /><dsig:DigestValue>yV6Q+I60buqR4mMaxA7fi+CV35A=</dsig:DigestValue></dsig:Reference></dsig:SignedInfo>".getBytes());
+    reqs.add(stalObjFactory.createGetNextRequestResponseTypeSignRequest(sigT1));
+  }
+
 }
diff --git a/BKUOnline/src/main/java/at/gv/egiz/stal/service/impl/STALXJAXBContextFactory.java b/BKUOnline/src/main/java/at/gv/egiz/stal/service/impl/STALXJAXBContextFactory.java
new file mode 100644
index 00000000..92559254
--- /dev/null
+++ b/BKUOnline/src/main/java/at/gv/egiz/stal/service/impl/STALXJAXBContextFactory.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2008 Federal Chancellery Austria and
+ * Graz University of Technology
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package at.gv.egiz.stal.service.impl;
+
+import com.sun.xml.bind.api.JAXBRIContext;
+import com.sun.xml.bind.api.TypeReference;
+import com.sun.xml.ws.api.model.SEIModel;
+import com.sun.xml.ws.developer.JAXBContextFactory;
+import java.util.ArrayList;
+import java.util.List;
+import javax.xml.bind.JAXBException;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+/**
+ *
+ * @author Clemens Orthacker <clemens.orthacker@iaik.tugraz.at>
+ */
+public class STALXJAXBContextFactory implements JAXBContextFactory {
+
+  private static final Log log = LogFactory.getLog(STALXJAXBContextFactory.class);
+
+  @Override
+  public JAXBRIContext createJAXBContext(SEIModel sei, List<Class> classesToBind, List<TypeReference> typeReferences) throws JAXBException {
+    if (log.isTraceEnabled()) {
+      log.trace("JAXBContext seed for SEI " + sei.getTargetNamespace() + ":");
+      for (Class class1 : classesToBind) {
+        log.trace(" " + class1);
+      }
+      for (TypeReference typeReference : typeReferences) {
+        log.trace(" typeRef " + typeReference.tagName + " -> " + typeReference.type);
+      }
+    }
+    List<Class> classes = new ArrayList<Class>();
+    classes.addAll(classesToBind);
+//    Class ccOF = at.buergerkarte.namespaces.cardchannel.service.ObjectFactory.class;
+//    if (!classes.contains(ccOF)) {
+//      log.debug("adding " + ccOF + " to JAXBContext seed");
+//      classes.add(ccOF);
+//    }
+
+    //TODO add typeReference?
+
+    return JAXBRIContext.newInstance(classes.toArray(new Class[classes.size()]),
+            typeReferences, null, sei.getTargetNamespace(), false, null);
+  }
+}
-- 
cgit v1.2.3