From 2df9621154ad057f6cace73efe49c9ef42515fde Mon Sep 17 00:00:00 2001
From: mcentner <mcentner@8a26b1a7-26f0-462f-b9ef-d0e30c41f5a4>
Date: Tue, 9 Dec 2008 08:14:43 +0000
Subject: Refactored STAL interface. Additional infobox functionality.

git-svn-id: https://joinup.ec.europa.eu/svn/mocca/trunk@236 8a26b1a7-26f0-462f-b9ef-d0e30c41f5a4
---
 .../gv/egiz/bku/slcommands/SLCommandFactory.java   |  38 +++-
 .../slcommands/impl/AbstractBinaryFileInfobox.java |   4 +-
 .../impl/AbstractInfoboxCommandImpl.java           |   9 +
 .../bku/slcommands/impl/AbstractInfoboxImpl.java   |  19 ++
 .../slcommands/impl/CardChannelInfoboxImpl.java    | 235 +++++++++++++++++++++
 .../at/gv/egiz/bku/slcommands/impl/Infobox.java    |  21 +-
 .../slcommands/impl/InfoboxReadCommandImpl.java    |   9 -
 .../bku/slcommands/impl/InfoboxReadResultImpl.java |  12 ++
 .../slcommands/impl/InfoboxUpdateCommandImpl.java  | 124 ++---------
 .../gv/egiz/bku/slcommands/impl/SLResultImpl.java  |  56 +++++
 .../at/gv/egiz/bku/slcommands/impl/STALHelper.java |   2 +-
 .../test/java/at/gv/egiz/stal/dummy/DummySTAL.java |   2 +-
 12 files changed, 405 insertions(+), 126 deletions(-)
 create mode 100644 bkucommon/src/main/java/at/gv/egiz/bku/slcommands/impl/CardChannelInfoboxImpl.java

(limited to 'bkucommon/src')

diff --git a/bkucommon/src/main/java/at/gv/egiz/bku/slcommands/SLCommandFactory.java b/bkucommon/src/main/java/at/gv/egiz/bku/slcommands/SLCommandFactory.java
index 9c98ef8a..bec2b253 100644
--- a/bkucommon/src/main/java/at/gv/egiz/bku/slcommands/SLCommandFactory.java
+++ b/bkucommon/src/main/java/at/gv/egiz/bku/slcommands/SLCommandFactory.java
@@ -17,6 +17,7 @@
 package at.gv.egiz.bku.slcommands;
 
 import java.io.IOException;
+import java.io.Reader;
 import java.net.URL;
 import java.util.HashMap;
 import java.util.Map;
@@ -41,10 +42,12 @@ import org.apache.commons.logging.LogFactory;
 import org.xml.sax.SAXException;
 import org.xml.sax.SAXParseException;
 
+import at.buergerkarte.namespaces.cardchannel.ObjectFactory;
 import at.gv.egiz.bku.slexceptions.SLCommandException;
 import at.gv.egiz.bku.slexceptions.SLExceptionMessages;
 import at.gv.egiz.bku.slexceptions.SLRequestException;
 import at.gv.egiz.bku.slexceptions.SLRuntimeException;
+import at.gv.egiz.bku.utils.DebugReader;
 import at.gv.egiz.slbinding.RedirectEventFilter;
 import at.gv.egiz.slbinding.RedirectUnmarshallerListener;
 
@@ -163,8 +166,9 @@ public class SLCommandFactory {
         if (jaxbContext == null) {
             try {
                 String slPkg = at.buergerkarte.namespaces.securitylayer._1.ObjectFactory.class.getPackage().getName();
-                String xmldsigPkg = org.w3._2000._09.xmldsig_.ObjectFactory.class.getPackage().getName();
-                setJaxbContext(JAXBContext.newInstance(slPkg + ":" + xmldsigPkg));
+                String xmldsigPkg = org.w3._2000._09.xmldsig_.ObjectFactory.class.getPackage().getName();
+                String cardChannelPkg = at.buergerkarte.namespaces.cardchannel.ObjectFactory.class.getPackage().getName();
+                setJaxbContext(JAXBContext.newInstance(slPkg + ":" + xmldsigPkg + ":" + cardChannelPkg));
             } catch (JAXBException e) {
                 log.error("Failed to setup JAXBContext security layer request.", e);
                 throw new SLRuntimeException(e);
@@ -325,12 +329,31 @@ public class SLCommandFactory {
      */
     @SuppressWarnings("unchecked")
     public SLCommand createSLCommand(Source source, SLCommandContext context)
-      throws SLCommandException, SLRuntimeException, SLRequestException {
+      throws SLCommandException, SLRuntimeException, SLRequestException {
+      
+        DebugReader dr = null;
+        if (log.isTraceEnabled() && source instanceof StreamSource) {
+          StreamSource streamSource = (StreamSource) source;
+          if (streamSource.getReader() != null) {
+            dr = new DebugReader(streamSource.getReader(), "SLCommand unmarshalled from:\n");
+            streamSource.setReader(dr);
+          }
+        }
 
-        Object object = unmarshal(source);
+        Object object;
+        try {
+          object = unmarshal(source);
+        } catch (SLRequestException e) {
+          throw e;
+        } finally {
+          if (dr != null) {
+            log.trace(dr.getCachedString());
+          }
+        }
+        
         if (!(object instanceof JAXBElement)) {
             // invalid request
-            log.info("Invalid security layer request. " + object.toString());
+            log.info("Invalid security layer request. " + object.toString());
             throw new SLRequestException(3002, SLExceptionMessages.EC3002_INVALID,
               new Object[]{object.toString()});
         }
@@ -343,7 +366,9 @@ public class SLCommandFactory {
             throw new SLCommandException(4011,
               SLExceptionMessages.EC4011_NOTIMPLEMENTED, new Object[]{qName.toString()});
         }
-
+
+        
+        
         // try to instantiate
         SLCommand slCommand;
         try {
@@ -360,6 +385,7 @@ public class SLCommandFactory {
               e);
             throw new SLRuntimeException(e);
         }
+
         slCommand.init(context, (JAXBElement) object);
 
         return slCommand;
diff --git a/bkucommon/src/main/java/at/gv/egiz/bku/slcommands/impl/AbstractBinaryFileInfobox.java b/bkucommon/src/main/java/at/gv/egiz/bku/slcommands/impl/AbstractBinaryFileInfobox.java
index 07ca639c..23394bd5 100644
--- a/bkucommon/src/main/java/at/gv/egiz/bku/slcommands/impl/AbstractBinaryFileInfobox.java
+++ b/bkucommon/src/main/java/at/gv/egiz/bku/slcommands/impl/AbstractBinaryFileInfobox.java
@@ -37,7 +37,7 @@ public abstract class AbstractBinaryFileInfobox extends AbstractInfoboxImpl impl
   /**
    * Is this infobox' content an XML entity?
    */
-  private boolean isXMLEntity = false;
+  protected boolean isXMLEntity = false;
   
   /**
    * @return <code>true</code> if this infobox' content is an XML entity or <code>false</code> otherwise.
@@ -61,8 +61,6 @@ public abstract class AbstractBinaryFileInfobox extends AbstractInfoboxImpl impl
     }
     
   }
-
-  
   
 
 }
diff --git a/bkucommon/src/main/java/at/gv/egiz/bku/slcommands/impl/AbstractInfoboxCommandImpl.java b/bkucommon/src/main/java/at/gv/egiz/bku/slcommands/impl/AbstractInfoboxCommandImpl.java
index 305769a8..8a7edb71 100644
--- a/bkucommon/src/main/java/at/gv/egiz/bku/slcommands/impl/AbstractInfoboxCommandImpl.java
+++ b/bkucommon/src/main/java/at/gv/egiz/bku/slcommands/impl/AbstractInfoboxCommandImpl.java
@@ -52,4 +52,13 @@ public abstract class AbstractInfoboxCommandImpl<T> extends SLCommandImpl<T> {
    */
   protected abstract String getInfoboxIdentifier(T request);
 
+
+  public String getInfoboxIdentifier() {
+    if (infobox != null) {
+      return infobox.getIdentifier();
+    } else {
+      return null;
+    }
+  }
+  
 }
diff --git a/bkucommon/src/main/java/at/gv/egiz/bku/slcommands/impl/AbstractInfoboxImpl.java b/bkucommon/src/main/java/at/gv/egiz/bku/slcommands/impl/AbstractInfoboxImpl.java
index e5c7afcc..564cb8ff 100644
--- a/bkucommon/src/main/java/at/gv/egiz/bku/slcommands/impl/AbstractInfoboxImpl.java
+++ b/bkucommon/src/main/java/at/gv/egiz/bku/slcommands/impl/AbstractInfoboxImpl.java
@@ -16,6 +16,13 @@
  */
 package at.gv.egiz.bku.slcommands.impl;
 
+import at.buergerkarte.namespaces.securitylayer._1.InfoboxReadRequestType;
+import at.buergerkarte.namespaces.securitylayer._1.InfoboxUpdateRequestType;
+import at.gv.egiz.bku.slcommands.InfoboxReadResult;
+import at.gv.egiz.bku.slcommands.InfoboxUpdateResult;
+import at.gv.egiz.bku.slcommands.SLCommandContext;
+import at.gv.egiz.bku.slexceptions.SLCommandException;
+
 /**
  * An abstract base class for {@link Infobox} implementations.
  * 
@@ -23,4 +30,16 @@ package at.gv.egiz.bku.slcommands.impl;
  */
 public abstract class AbstractInfoboxImpl implements Infobox {
 
+  @Override
+  public InfoboxReadResult read(InfoboxReadRequestType request,
+      SLCommandContext cmdCtx) throws SLCommandException {
+    throw new SLCommandException(4011);
+  }
+
+  @Override
+  public InfoboxUpdateResult update(InfoboxUpdateRequestType request,
+      SLCommandContext cmdCtx) throws SLCommandException {
+    throw new SLCommandException(4011);
+  }
+  
 }
diff --git a/bkucommon/src/main/java/at/gv/egiz/bku/slcommands/impl/CardChannelInfoboxImpl.java b/bkucommon/src/main/java/at/gv/egiz/bku/slcommands/impl/CardChannelInfoboxImpl.java
new file mode 100644
index 00000000..4b1cc779
--- /dev/null
+++ b/bkucommon/src/main/java/at/gv/egiz/bku/slcommands/impl/CardChannelInfoboxImpl.java
@@ -0,0 +1,235 @@
+/*
+* 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.bku.slcommands.impl;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.UnsupportedEncodingException;
+import java.math.BigInteger;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.WeakHashMap;
+
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.JAXBElement;
+import javax.xml.bind.JAXBException;
+import javax.xml.bind.Unmarshaller;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import at.buergerkarte.namespaces.cardchannel.ATRType;
+import at.buergerkarte.namespaces.cardchannel.CommandAPDUType;
+import at.buergerkarte.namespaces.cardchannel.ObjectFactory;
+import at.buergerkarte.namespaces.cardchannel.ResetType;
+import at.buergerkarte.namespaces.cardchannel.ResponseAPDUType;
+import at.buergerkarte.namespaces.cardchannel.ResponseType;
+import at.buergerkarte.namespaces.cardchannel.ScriptType;
+import at.buergerkarte.namespaces.cardchannel.VerifyAPDUType;
+import at.buergerkarte.namespaces.securitylayer._1.Base64XMLContentType;
+import at.buergerkarte.namespaces.securitylayer._1.InfoboxReadRequestType;
+import at.buergerkarte.namespaces.securitylayer._1.InfoboxUpdateRequestType;
+import at.buergerkarte.namespaces.securitylayer._1.XMLContentType;
+import at.gv.egiz.bku.slcommands.InfoboxReadResult;
+import at.gv.egiz.bku.slcommands.InfoboxUpdateResult;
+import at.gv.egiz.bku.slcommands.SLCommandContext;
+import at.gv.egiz.bku.slexceptions.SLCommandException;
+import at.gv.egiz.bku.slexceptions.SLRuntimeException;
+import at.gv.egiz.stal.STAL;
+import at.gv.egiz.stal.ext.APDUScriptRequest;
+import at.gv.egiz.stal.ext.APDUScriptResponse;
+import at.gv.egiz.stal.ext.APDUScriptRequest.RequestScriptElement;
+import at.gv.egiz.stal.ext.APDUScriptResponse.ResponseScriptElement;
+
+public class CardChannelInfoboxImpl extends AbstractBinaryFileInfobox {
+  
+  private static Log log = LogFactory.getLog(CardChannelInfoboxImpl.class);
+  
+  private static WeakHashMap<STAL, JAXBElement<ResponseType>> scriptResults = new WeakHashMap<STAL, JAXBElement<ResponseType>>();
+  
+  private static JAXBContext jaxbContext; 
+  
+  static {
+    try {
+      jaxbContext = JAXBContext.newInstance(ObjectFactory.class.getPackage().getName());
+    } catch (JAXBException e) {
+      throw new SLRuntimeException("Failed to initalize CardChannel infobox.", e);
+    }
+  }
+
+  public CardChannelInfoboxImpl() {
+    isXMLEntity = true;
+  }
+  
+  @Override
+  public String getIdentifier() {
+    return "CardChannel";
+  }
+
+  @Override
+  public InfoboxReadResult read(InfoboxReadRequestType request,
+      SLCommandContext cmdCtx) throws SLCommandException {
+    
+    at.buergerkarte.namespaces.securitylayer._1.ObjectFactory objectFactory 
+    = new at.buergerkarte.namespaces.securitylayer._1.ObjectFactory();
+
+    Base64XMLContentType content = objectFactory.createBase64XMLContentType();
+    XMLContentType xmlContent = objectFactory.createXMLContentType();
+    content.setXMLContent(xmlContent);
+
+    JAXBElement<ResponseType> response = scriptResults.get(cmdCtx.getSTAL());
+    if (response != null) {
+      xmlContent.getContent().add(response);
+    }
+
+    return new InfoboxReadResultImpl(content);
+    
+  }
+
+  @SuppressWarnings("unchecked")
+  @Override
+  public InfoboxUpdateResult update(InfoboxUpdateRequestType request,
+      SLCommandContext cmdCtx) throws SLCommandException {
+
+    Base64XMLContentType binaryFileParameters = request.getBinaryFileParameters();
+    
+    if (binaryFileParameters.getBase64Content() != null) {
+      log.info("Got Base64Content but ContentIsXMLEntity is true.");
+      throw new SLCommandException(4010);
+    }
+    
+    XMLContentType content = binaryFileParameters.getXMLContent();
+    if (content instanceof at.gv.egiz.slbinding.impl.XMLContentType) {
+
+      ByteArrayOutputStream redirectedStream = ((at.gv.egiz.slbinding.impl.XMLContentType) content).getRedirectedStream();
+      if (redirectedStream != null) {
+        
+        if (log.isDebugEnabled()) {
+
+          StringBuilder sb = new StringBuilder();
+          sb.append("CardChannel script:\n");
+          try {
+            sb.append(new String(redirectedStream.toByteArray(), "UTF-8"));
+          } catch (UnsupportedEncodingException e) {
+            sb.append(e.getMessage());
+          }
+          log.debug(sb.toString());
+        }
+        
+        Object object;
+        try {
+          Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
+          object = unmarshaller.unmarshal(new ByteArrayInputStream(redirectedStream.toByteArray()));
+        } catch (JAXBException e) {
+          log.info("Failed to parse CardChannel script.", e);
+          throw new SLCommandException(4011);
+        }
+        
+        if (object instanceof JAXBElement) {
+          executeCardChannelScript(((JAXBElement<ScriptType>) object).getValue(), cmdCtx);
+          return new InfoboxUpdateResultImpl();
+        }
+        
+      }
+
+    
+    }
+    log.info("Infobox identifier is '" + getIdentifier() + "' but XMLContent does not contain 'Script'.");
+    throw new SLCommandException(4010);
+    
+  }
+
+  protected void executeCardChannelScript(ScriptType script,
+      SLCommandContext cmdCtx) throws SLCommandException {
+    
+    List<Object> resetOrCommandAPDUOrVerifyAPDU = script.getResetOrCommandAPDUOrVerifyAPDU();
+    List<RequestScriptElement> requestScript = new ArrayList<RequestScriptElement>();
+    
+    for (Object element : resetOrCommandAPDUOrVerifyAPDU) {
+      
+      if (element instanceof ResetType) {
+      
+        requestScript.add(new APDUScriptRequest.Reset());
+      
+      } else if (element instanceof CommandAPDUType) {
+      
+        CommandAPDUType commandAPDU = (CommandAPDUType) element;
+        int sequence = (commandAPDU.getSequence() != null) 
+              ? commandAPDU.getSequence().intValue() 
+              : 0;
+
+        requestScript.add(
+            new APDUScriptRequest.Command(
+                sequence, 
+                commandAPDU.getValue(), 
+                commandAPDU.getExpectedSW()));
+        
+      } else if (element instanceof VerifyAPDUType) {
+        log.warn("CardChannel script command 'VerifyAPDU' not implemented.");
+        throw new SLCommandException(4011);
+      }
+    }
+    
+    APDUScriptRequest scriptRequest = new APDUScriptRequest(requestScript);
+    
+    STAL stal = cmdCtx.getSTAL();
+    STALHelper helper = new STALHelper(stal);
+    
+    helper.transmitSTALRequest(Collections.singletonList(scriptRequest));
+    
+    List<ResponseScriptElement> responseScript = ((APDUScriptResponse) helper
+        .nextResponse(APDUScriptResponse.class)).getScript();
+    
+    ObjectFactory objectFactory = new ObjectFactory();
+    
+    ResponseType responseType = objectFactory.createResponseType();
+    
+    
+    for (ResponseScriptElement element : responseScript) {
+      
+      if (element instanceof APDUScriptResponse.ATR) {
+        
+        byte[] atr = ((APDUScriptResponse.ATR) element).getAtr();
+        
+        ATRType atrType = objectFactory.createATRType();
+        atrType.setValue(atr);
+        atrType.setRc(BigInteger.ZERO);
+        responseType.getATROrResponseAPDU().add(atrType);
+        
+      } else if (element instanceof APDUScriptResponse.Response) {
+        
+        APDUScriptResponse.Response response = (APDUScriptResponse.Response) element;
+        
+        ResponseAPDUType responseAPDUType = objectFactory.createResponseAPDUType();
+        responseAPDUType.setSequence(BigInteger.valueOf(response.getSequence()));
+//        if (response.getRc() != 0) {
+          responseAPDUType.setRc(BigInteger.valueOf(response.getRc()));
+//        }
+        responseAPDUType.setSw(response.getSw());
+        responseAPDUType.setValue(response.getApdu());
+        
+        responseType.getATROrResponseAPDU().add(responseAPDUType);
+      }
+      
+    }
+    
+    scriptResults.put(stal, objectFactory.createResponse(responseType));
+  }
+
+  
+}
diff --git a/bkucommon/src/main/java/at/gv/egiz/bku/slcommands/impl/Infobox.java b/bkucommon/src/main/java/at/gv/egiz/bku/slcommands/impl/Infobox.java
index a6f8cbb2..99d62721 100644
--- a/bkucommon/src/main/java/at/gv/egiz/bku/slcommands/impl/Infobox.java
+++ b/bkucommon/src/main/java/at/gv/egiz/bku/slcommands/impl/Infobox.java
@@ -17,7 +17,9 @@
 package at.gv.egiz.bku.slcommands.impl;
 
 import at.buergerkarte.namespaces.securitylayer._1.InfoboxReadRequestType;
+import at.buergerkarte.namespaces.securitylayer._1.InfoboxUpdateRequestType;
 import at.gv.egiz.bku.slcommands.InfoboxReadResult;
+import at.gv.egiz.bku.slcommands.InfoboxUpdateResult;
 import at.gv.egiz.bku.slcommands.SLCommandContext;
 import at.gv.egiz.bku.slexceptions.SLCommandException;
 
@@ -44,10 +46,25 @@ public interface Infobox {
    * 
    * @return the data read from this infobox as InfoboxReadResult
    * 
-   * @throws SLCommandException
-   *           if reading from this infobox fails
+   * @throws SLCommandException 
+   * 
+   *            if reading from this infobox fails
    */
   public InfoboxReadResult read(InfoboxReadRequestType request,
       SLCommandContext cmdCtx) throws SLCommandException;
 
+  /**
+   * Update data in this infobox.
+   * 
+   * @param request
+   *          the InfoboxUpdateRequest
+   * @param cmdCtx
+   *          the command context
+   * @return a corresponding InfoboxUpdateResult
+   * @throws SLCommandException
+   *           if updating this infobox fails
+   */
+  public InfoboxUpdateResult update(InfoboxUpdateRequestType request,
+      SLCommandContext cmdCtx) throws SLCommandException;
+
 }
diff --git a/bkucommon/src/main/java/at/gv/egiz/bku/slcommands/impl/InfoboxReadCommandImpl.java b/bkucommon/src/main/java/at/gv/egiz/bku/slcommands/impl/InfoboxReadCommandImpl.java
index aaa786a6..693f444f 100644
--- a/bkucommon/src/main/java/at/gv/egiz/bku/slcommands/impl/InfoboxReadCommandImpl.java
+++ b/bkucommon/src/main/java/at/gv/egiz/bku/slcommands/impl/InfoboxReadCommandImpl.java
@@ -83,7 +83,6 @@ public class InfoboxReadCommandImpl extends AbstractInfoboxCommandImpl<InfoboxRe
     }
     
   }
- 
 
   @Override
   public String getIdentityLinkDomainId() {
@@ -94,12 +93,4 @@ public class InfoboxReadCommandImpl extends AbstractInfoboxCommandImpl<InfoboxRe
     }
   }
 
-  @Override
-  public String getInfoboxIdentifier() {
-    if (infobox != null) {
-      return infobox.getIdentifier();
-    } else {
-      return null;
-    }
-  }
 }
diff --git a/bkucommon/src/main/java/at/gv/egiz/bku/slcommands/impl/InfoboxReadResultImpl.java b/bkucommon/src/main/java/at/gv/egiz/bku/slcommands/impl/InfoboxReadResultImpl.java
index a2b8ac9f..e508941d 100644
--- a/bkucommon/src/main/java/at/gv/egiz/bku/slcommands/impl/InfoboxReadResultImpl.java
+++ b/bkucommon/src/main/java/at/gv/egiz/bku/slcommands/impl/InfoboxReadResultImpl.java
@@ -20,6 +20,7 @@ import javax.xml.bind.JAXBElement;
 import javax.xml.transform.Result;
 import javax.xml.transform.Templates;
 
+import at.buergerkarte.namespaces.securitylayer._1.Base64XMLContentType;
 import at.buergerkarte.namespaces.securitylayer._1.InfoboxReadDataAssocArrayType;
 import at.buergerkarte.namespaces.securitylayer._1.InfoboxReadResponseType;
 import at.buergerkarte.namespaces.securitylayer._1.ObjectFactory;
@@ -41,6 +42,17 @@ public class InfoboxReadResultImpl extends SLResultImpl implements InfoboxReadRe
     
     this.infoboxReadResponse = infoboxReadResponseType;
   }
+  
+  public InfoboxReadResultImpl(Base64XMLContentType value) {
+    
+    ObjectFactory objectFactory = new ObjectFactory();
+    InfoboxReadResponseType infoboxReadResponseType = objectFactory.createInfoboxReadResponseType();
+    
+    infoboxReadResponseType.setBinaryFileData(value);
+    
+    this.infoboxReadResponse = infoboxReadResponseType;
+    
+  }
 
   @Override
   public void writeTo(Result result, Templates templates) {
diff --git a/bkucommon/src/main/java/at/gv/egiz/bku/slcommands/impl/InfoboxUpdateCommandImpl.java b/bkucommon/src/main/java/at/gv/egiz/bku/slcommands/impl/InfoboxUpdateCommandImpl.java
index 6d281686..1cdeda94 100644
--- a/bkucommon/src/main/java/at/gv/egiz/bku/slcommands/impl/InfoboxUpdateCommandImpl.java
+++ b/bkucommon/src/main/java/at/gv/egiz/bku/slcommands/impl/InfoboxUpdateCommandImpl.java
@@ -16,143 +16,59 @@
 */
 package at.gv.egiz.bku.slcommands.impl;
 
-import java.util.List;
-
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
-import at.buergerkarte.namespaces.cardchannel.CommandAPDUType;
-import at.buergerkarte.namespaces.cardchannel.ResetType;
-import at.buergerkarte.namespaces.cardchannel.ScriptType;
-import at.buergerkarte.namespaces.cardchannel.VerifyAPDUType;
-import at.buergerkarte.namespaces.securitylayer._1.Base64XMLContentType;
 import at.buergerkarte.namespaces.securitylayer._1.InfoboxUpdateRequestType;
 import at.gv.egiz.bku.slcommands.InfoboxUpdateCommand;
 import at.gv.egiz.bku.slcommands.SLCommandContext;
 import at.gv.egiz.bku.slcommands.SLResult;
 import at.gv.egiz.bku.slexceptions.SLCommandException;
-import at.gv.egiz.bku.slexceptions.SLExceptionMessages;
 
 public class InfoboxUpdateCommandImpl extends
-    SLCommandImpl<InfoboxUpdateRequestType> implements InfoboxUpdateCommand {
+    AbstractInfoboxCommandImpl<InfoboxUpdateRequestType> implements InfoboxUpdateCommand {
   
   private static Log log = LogFactory.getLog(InfoboxUpdateCommandImpl.class);
 
-  public static final String INFOBOX_IDENTIFIER_CARD_CHANNEL = "CardChannel";
+  @Override
+  public String getName() {
+    return "InfoboxUpdateRequest";
+  }
 
-  protected String infoboxIdentifier;
-  
-  protected List<Object> cardChannelScript;
-  
   @Override
-  public String getInfoboxIdentifier() {
-    return infoboxIdentifier;
+  protected String getInfoboxIdentifier(InfoboxUpdateRequestType request) {
+    return request.getInfoboxIdentifier();
   }
-  
+
   @Override
-  public void init(SLCommandContext ctx, Object request)
-      throws SLCommandException {
+  public void init(SLCommandContext ctx, Object request) throws SLCommandException {
     super.init(ctx, request);
     
     InfoboxUpdateRequestType req = getRequestValue();
     
-    infoboxIdentifier = req.getInfoboxIdentifier();
+    if (req.getAssocArrayParameters() != null && 
+        !(infobox instanceof AssocArrayInfobox)) {
+      log.info("Got AssocArrayParameters but Infobox type is not AssocArray.");
+      throw new SLCommandException(4010);
+    }
     
-    if (INFOBOX_IDENTIFIER_CARD_CHANNEL.equals(infoboxIdentifier)) {
-
-      if (req.getAssocArrayParameters() != null) {
-        log.info("Got AssocArrayParameters but Infobox type is BinaryFile.");
-        throw new SLCommandException(4010);
-      }
-      
-      Base64XMLContentType binaryFileParameters = req.getBinaryFileParameters();
-      if (binaryFileParameters == null) {
-        log.info("Got no BinaryFileParameters but Infobox type is BinaryFile.");
-        throw new SLCommandException(4010);
-      }
-
-      if (binaryFileParameters.getBase64Content() == null) {
-        log.info("Got Base64Content but ContentIsXMLEntity is true.");
-        throw new SLCommandException(4010);
-      }
-      
-      List<Object> content = binaryFileParameters.getXMLContent().getContent();
-      if (content.isEmpty()) {
-        log.info("Got no XMLContent but ContentIsXMLEntity is true.");
-        throw new SLCommandException(4010);
-      }
-      
-      for (Object element : content) {
-        if (!(element instanceof ScriptType)) {
-          log.info("Infobox identifier is '" + infoboxIdentifier + "' but XMLContent does not contain 'Script'.");
-          throw new SLCommandException(4010);
-        }
-        
-        setCardChannelScript(((ScriptType) element).getResetOrCommandAPDUOrVerifyAPDU());
-      }
-      
-      if (getCardChannelScript() == null) {
-        log.info("Infobox identifier is '" + infoboxIdentifier + "' but XMLContent does not contain 'Script'.");
-        throw new SLCommandException(4010);
-      }
-      
-    } else {
-      throw new SLCommandException(4002,
-          SLExceptionMessages.EC4002_INFOBOX_UNKNOWN,
-          new Object[] { infoboxIdentifier });
+    if (req.getBinaryFileParameters() != null &&
+        !(infobox instanceof BinaryFileInfobox)) {
+      log.info("Got BinaryFileParameters but Infobox type is not BinaryFile.");
+      throw new SLCommandException(4010);
     }
     
   }
 
-  public List<Object> getCardChannelScript() {
-    return cardChannelScript;
-  }
-
-  public void setCardChannelScript(List<Object> cardChannelScript) {
-    this.cardChannelScript = cardChannelScript;
-  }
-
   @Override
   public SLResult execute() {
     
     try {
-      if (INFOBOX_IDENTIFIER_CARD_CHANNEL.equals(getInfoboxIdentifier())) {
-        
-        executeCardChannelScript();
-        return new InfoboxUpdateResultImpl();
-        
-      } else {
-        throw new SLCommandException(4002,
-            SLExceptionMessages.EC4002_INFOBOX_UNKNOWN,
-            new Object[] { infoboxIdentifier });
-      }
+      return infobox.update(getRequestValue(), getCmdCtx());
     } catch (SLCommandException e) {
-      return new ErrorResultImpl(e, cmdCtx.getLocale());
+      return new ErrorResultImpl(e, getCmdCtx().getLocale());
     }
     
   }
-  
-  protected void executeCardChannelScript() throws SLCommandException {
-    
-    if (cardChannelScript != null) {
-      
-      for (Object element : cardChannelScript) {
-        if (element instanceof ResetType) {
-          
-        } else if (element instanceof CommandAPDUType) {
-          
-        } else if (element instanceof VerifyAPDUType) {
-          
-        }
-      }
-      
-    }
-    
-  }
-
-  @Override
-  public String getName() {
-    return "InfoboxUpdateRequest";
-  }
 
 }
diff --git a/bkucommon/src/main/java/at/gv/egiz/bku/slcommands/impl/SLResultImpl.java b/bkucommon/src/main/java/at/gv/egiz/bku/slcommands/impl/SLResultImpl.java
index 80bbdca8..99a3b119 100644
--- a/bkucommon/src/main/java/at/gv/egiz/bku/slcommands/impl/SLResultImpl.java
+++ b/bkucommon/src/main/java/at/gv/egiz/bku/slcommands/impl/SLResultImpl.java
@@ -16,6 +16,7 @@
 */
 package at.gv.egiz.bku.slcommands.impl;
 
+import java.io.UnsupportedEncodingException;
 import java.util.Locale;
 
 import javax.xml.bind.JAXBContext;
@@ -32,6 +33,7 @@ import javax.xml.transform.TransformerFactoryConfigurationError;
 import javax.xml.transform.dom.DOMSource;
 import javax.xml.transform.sax.SAXTransformerFactory;
 import javax.xml.transform.sax.TransformerHandler;
+import javax.xml.transform.stream.StreamResult;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
@@ -45,6 +47,8 @@ import at.gv.egiz.bku.slexceptions.SLBindingException;
 import at.gv.egiz.bku.slexceptions.SLCommandException;
 import at.gv.egiz.bku.slexceptions.SLException;
 import at.gv.egiz.bku.slexceptions.SLRuntimeException;
+import at.gv.egiz.bku.utils.DebugOutputStream;
+import at.gv.egiz.bku.utils.DebugWriter;
 
 /**
  * This class serves as an abstract base class for the implementation of a
@@ -128,6 +132,20 @@ public abstract class SLResultImpl implements SLResult {
    * @param templates
    */
   protected void writeTo(JAXBElement<?> response, Result result, Templates templates) {
+    
+    DebugWriter dw = null;
+    DebugOutputStream ds = null;
+    if (log.isTraceEnabled() && result instanceof StreamResult) {
+      StreamResult streamResult = (StreamResult) result;
+      if (streamResult.getOutputStream() != null) {
+        ds = new DebugOutputStream(streamResult.getOutputStream());
+        streamResult.setOutputStream(ds);
+      }
+      if (streamResult.getWriter() != null) {
+        dw = new DebugWriter(streamResult.getWriter());
+        streamResult.setWriter(dw);
+      }
+    }
 
     TransformerHandler transformerHandler = null;
     if (templates != null) {
@@ -151,10 +169,36 @@ public abstract class SLResultImpl implements SLResult {
       writeErrorTo(commandException, result, templates);
     }
     
+    if (ds != null) {
+      try {
+        log.trace("Marshalled result:\n" + new String(ds.getBufferedBytes(), "UTF-8"));
+      } catch (UnsupportedEncodingException e) {
+        log.trace(e.getMessage());
+      }
+    }
+    
+    if (dw != null) {
+      log.trace("Marshalled result:\n" + dw.getBufferedString());
+    }
+    
   }
   
   protected void writeTo(Node node, Result result, Templates templates) {
 
+    DebugWriter dw = null;
+    DebugOutputStream ds = null;
+    if (log.isTraceEnabled() && result instanceof StreamResult) {
+      StreamResult streamResult = (StreamResult) result;
+      if (streamResult.getOutputStream() != null) {
+        ds = new DebugOutputStream(streamResult.getOutputStream());
+        streamResult.setOutputStream(ds);
+      }
+      if (streamResult.getWriter() != null) {
+        dw = new DebugWriter(streamResult.getWriter());
+        streamResult.setWriter(dw);
+      }
+    }
+
     if (templates == null) {
       try {
         TransformerFactory transformerFactory = TransformerFactory.newInstance();
@@ -179,7 +223,19 @@ public abstract class SLResultImpl implements SLResult {
         writeErrorTo(new SLException(2008), result, templates);
       }
     }
+
+    if (ds != null) {
+      try {
+        log.trace("Marshalled result:\n" + new String(ds.getBufferedBytes(), "UTF-8"));
+      } catch (UnsupportedEncodingException e) {
+        log.trace(e.getMessage());
+      }
+    }
     
+    if (dw != null) {
+      log.trace("Marshalled result:\n" + dw.getBufferedString());
+    }
+
   }
   
   protected void writeErrorTo(SLException slException, Result result, Templates templates) {
diff --git a/bkucommon/src/main/java/at/gv/egiz/bku/slcommands/impl/STALHelper.java b/bkucommon/src/main/java/at/gv/egiz/bku/slcommands/impl/STALHelper.java
index 969288c1..0c7ce3f5 100644
--- a/bkucommon/src/main/java/at/gv/egiz/bku/slcommands/impl/STALHelper.java
+++ b/bkucommon/src/main/java/at/gv/egiz/bku/slcommands/impl/STALHelper.java
@@ -85,7 +85,7 @@ public class STALHelper {
    * @param stalRequests
    * @throws SLCommandException
    */
-   public void transmitSTALRequest(List<STALRequest> stalRequests) throws SLCommandException {
+   public void transmitSTALRequest(List<? extends STALRequest> stalRequests) throws SLCommandException {
     List<STALResponse> responses = stal.handleRequest(stalRequests);
     if (responses == null) {
       Log log = LogFactory.getLog(this.getClass());
diff --git a/bkucommon/src/test/java/at/gv/egiz/stal/dummy/DummySTAL.java b/bkucommon/src/test/java/at/gv/egiz/stal/dummy/DummySTAL.java
index 2ea0bae0..dd8b8c8f 100644
--- a/bkucommon/src/test/java/at/gv/egiz/stal/dummy/DummySTAL.java
+++ b/bkucommon/src/test/java/at/gv/egiz/stal/dummy/DummySTAL.java
@@ -71,7 +71,7 @@ public class DummySTAL implements STAL {
   }
 
   @Override
-  public List<STALResponse> handleRequest(List<STALRequest> requestList) {
+  public List<STALResponse> handleRequest(List<? extends STALRequest> requestList) {
 
     List<STALResponse> responses = new ArrayList<STALResponse>();
     for (STALRequest request : requestList) {
-- 
cgit v1.2.3