diff options
Diffstat (limited to 'bkucommon/src/main/java/at/gv')
11 files changed, 404 insertions, 125 deletions
| 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()); | 
