diff options
| -rw-r--r-- | bkucommon/src/main/java/at/gv/egiz/bku/slcommands/impl/InfoboxReadCommandImpl.java | 20 | ||||
| -rw-r--r-- | utils/src/main/java/at/gv/egiz/idlink/IdentityLinkTransformer.java | 223 | 
2 files changed, 71 insertions, 172 deletions
| 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 b6c89e5b..d23c0598 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 @@ -23,6 +23,7 @@ import java.io.ByteArrayInputStream;  import java.io.ByteArrayOutputStream;  import java.io.IOException;  import java.io.OutputStream; +import java.net.MalformedURLException;  import java.security.cert.CertificateEncodingException;  import java.security.cert.CertificateException;  import java.security.cert.CertificateFactory; @@ -415,11 +416,22 @@ public class InfoboxReadCommandImpl extends SLCommandImpl<InfoboxReadRequestType            : new StreamResult((resultBytes = new ByteArrayOutputStream()));
      try {        log.trace("Trying to transform identitylink");
 -      identityLinkTransformer.transformIdLink(issuerTemplate, new DOMSource(document), xmlResult);
 +      identityLinkTransformer.transformIdLink(issuerTemplate, new DOMSource(document), xmlResult); +    } catch (MalformedURLException e) { +      log.warn("Malformed issuer template URL '" + issuerTemplate + "'."); +      throw new SLCommandException(4000, +          SLExceptionMessages.EC4000_UNCLASSIFIED_IDLINK_TRANSFORMATION_FAILED, +          new Object[] { issuerTemplate });      } catch (IOException e) {
 -      // we should not get an IOException as we are writing into a DOMResult -      log.warn("Failed to transform idlink",e);
 -      throw new SLRuntimeException(e);
 +      log.warn("Failed to dereferene issuer template URL '" + issuerTemplate + "'." ,e);
 +      throw new SLCommandException(4000, +          SLExceptionMessages.EC4000_UNCLASSIFIED_IDLINK_TRANSFORMATION_FAILED, +          new Object[] { issuerTemplate }); +    } catch (TransformerConfigurationException e) { +      log.warn("Failed to create transformation template from issuer template URL '" + issuerTemplate + "'", e); +      throw new SLCommandException(4000, +          SLExceptionMessages.EC4000_UNCLASSIFIED_IDLINK_TRANSFORMATION_FAILED, +          new Object[] { issuerTemplate });      } catch (TransformerException e) {
        log.info("Faild to transform CompressedIdentityLink.", e);
        throw new SLCommandException(4000,
 diff --git a/utils/src/main/java/at/gv/egiz/idlink/IdentityLinkTransformer.java b/utils/src/main/java/at/gv/egiz/idlink/IdentityLinkTransformer.java index 98f8d1c1..8bee5fa4 100644 --- a/utils/src/main/java/at/gv/egiz/idlink/IdentityLinkTransformer.java +++ b/utils/src/main/java/at/gv/egiz/idlink/IdentityLinkTransformer.java @@ -19,11 +19,7 @@ package at.gv.egiz.idlink;  import java.io.IOException;  import java.net.MalformedURLException;  import java.net.URL; -import java.util.ArrayList; -import java.util.Date;  import java.util.HashMap; -import java.util.Iterator; -import java.util.List;  import java.util.Map;  import javax.xml.transform.Result; @@ -50,114 +46,8 @@ public class IdentityLinkTransformer {    protected static Log log = LogFactory.getLog(IdentityLinkTransformer.class);
 -  private class IdLTransformer {
 -    
 -    /**
 -     * Is transformer in use?
 -     */
 -    private boolean inUse = false;
 -    
 -    /**
 -     * How often has this transformer been used?
 -     */
 -    private int timesUsed = 0;
 -    
 -    /**
 -     * The time this transformer has been created.
 -     */
 -    private long created;
 -    
 -    /**
 -     * When has this transformer been used the last time?
 -     */
 -    private long lastTimeUsed;
 -    
 -    /**
 -     * Average performance in milliseconds. 
 -     */
 -    private long time;
 -    
 -    /**
 -     * Time used for initialization.
 -     */
 -    private long initTime;
 -    
 -    /**
 -     * The stylesheet transformer.
 -     */
 -    private Templates templates;
 -    
 -    /**
 -     * Stylesheet URL.
 -     */
 -    private String stylesheetURL;
 -
 -    /**
 -     * 
 -     * @param stylesheetURL
 -     * @throws IOException
 -     * @throws TransformerConfigurationException
 -     */
 -    public IdLTransformer(String stylesheetURL) throws IOException, TransformerConfigurationException {
 -      
 -      created = System.currentTimeMillis();
 -      
 -      // TODO: implement stylesheet cache
 -      this.stylesheetURL = stylesheetURL;
 -      URL url = new URL(stylesheetURL);
 -
 -      if (!"http".equalsIgnoreCase(url.getProtocol()) && !"https".equalsIgnoreCase(url.getProtocol())) {
 -        throw new MalformedURLException("Protocol " + url.getProtocol() + " not supported for IssuerTemplate URL.");
 -      } -       -      URLDereferencer dereferencer = URLDereferencer.getInstance(); -      StreamData data = dereferencer.dereference(url.toExternalForm(), null); -      
 -      StreamSource source = new StreamSource(data.getStream());
 -      log.trace("Trying to creating template from stylesheet");
 -      templates = factory.newTemplates(source);
 -      log.trace("Successfully created stylesheet template");
 -      initTime = System.currentTimeMillis() - created;
 -      
 -    }
 -    
 -    public void transform(Source xmlSource, Result outputTarget) throws TransformerException {
 -      long t0 = System.currentTimeMillis();
 -      try { -        Transformer transformer = templates.newTransformer();
 -        transformer.transform(xmlSource, outputTarget);
 -      } catch (TransformerException e) {
 -        throw e;
 -      } finally {
 -        inUse = false;
 -        long t1 = System.currentTimeMillis();
 -        time += (t1 - t0);
 -        timesUsed++;
 -        lastTimeUsed = System.currentTimeMillis();
 -      }
 -    }
 -    
 -    /**
 -     * @return <code>true</code> if this transformer is in use, or <code>false</code> otherwise
 -     */
 -    public boolean isInUse() {
 -      return inUse;
 -    }
 -
 -    @Override
 -    public String toString() {
 -      StringBuffer str = new StringBuffer();
 -      str.append("Transformer ").append(stylesheetURL)
 -        .append("\n    created ").append(new Date(created)).append(" used ").append(
 -          timesUsed).append(" times, (init ").append(initTime).append("ms / ")
 -        .append(((float) time) / timesUsed).append("ms avg) last time ").append(new Date(lastTimeUsed));
 -      return str.toString();
 -    }
 -    
 -  }
 -  
    /**
 -   * The transfomer factory.
 +   * The transformer factory.
     */
    private static SAXTransformerFactory factory;
 @@ -232,70 +122,67 @@ public class IdentityLinkTransformer {    }
 -  /**
 -   * The pool of <code>Transformer</code>.
 -   */
 -  private Map<String, List<IdLTransformer>> pool;
 +  /** +   * Mapping of issuer template URIs to transformation templates. +   */ +  private Map<String, Templates> templates = new HashMap<String, Templates>();
    /**
     * Private constructor.
     */
    private IdentityLinkTransformer() {
 -    pool = new HashMap<String, List<IdLTransformer>>();
 -  }
 -  
 -  private IdLTransformer getFreeTransfomer(String stylesheetURL) throws TransformerConfigurationException, IOException {
 -    
 -    IdLTransformer transformer = null;
 -    
 -    List<IdLTransformer> transfomerList = pool.get(stylesheetURL);
 -    if (transfomerList == null) {
 -      transfomerList = new ArrayList<IdLTransformer>();
 -      pool.put(stylesheetURL, transfomerList);
 -    }
 -    
 -    for (IdLTransformer candTransformer : transfomerList) {
 -      if (!candTransformer.inUse) {
 -        transformer = candTransformer;
 -        break;
 -      }
 -    }
 -    
 -    if (transformer == null) {
 -      transformer = new IdLTransformer(stylesheetURL);
 -      transfomerList.add(transformer);
 -    }
 -    
 -    transformer.inUse = true;
 -    return transformer;
 -    
 -  }
 -  
 +  } + +  /** +   * Transforms an identity link <code>source</code> to <code>result</code> with +   * the given issuer template from the <code>stylesheetURL</code>. +   *  +   * @param stylesheetURL +   *          the URL of the issuer template to be used for transformation +   * @param source +   *          the compressed identity link source +   * @param result +   *          the transformed identity link result +   *  +   * @throws MalformedURLException +   *           if the given <code>stylesheetURL</code> is not a valid +   *           <code>http</code> or <code>https</code> URL. +   * @throws IOException +   *           if dereferencing the <code>stylesheetURL</code> fails. +   * @throws TransformerConfigurationException +   *           if creating a transformation template from the dereferenced +   *           stylesheet fails. +   * @throws TransformerException +   *           if transforming the identity link fails. +   */
    public void transformIdLink(String stylesheetURL, Source source, Result result) throws IOException, TransformerException { -    log.trace("Trying to get free IdentityLinkTransformer for issuer template '" + stylesheetURL + "'.");
 -    IdLTransformer transformer = getFreeTransfomer(stylesheetURL); -    log.trace("Trying to transform IdentityLink.");
 + +    Templates templ = templates.get(stylesheetURL); +     +    if (templ == null) { + +      // TODO: implement stylesheet cache +      URL url = new URL(stylesheetURL); + +      if (!"http".equalsIgnoreCase(url.getProtocol()) && !"https".equalsIgnoreCase(url.getProtocol())) { +        throw new MalformedURLException("Protocol " + url.getProtocol() + " not supported for IssuerTemplate URL."); +      } +       +      URLDereferencer dereferencer = URLDereferencer.getInstance(); +      StreamData data = dereferencer.dereference(url.toExternalForm(), null); +       +      log.trace("Trying to create issuer template."); +      templ = factory.newTemplates(new StreamSource(data.getStream())); +      log.trace("Successfully created issuer template"); + +      templates.put(stylesheetURL, templ); + +    } +     +    Transformer transformer = templ.newTransformer(); +          transformer.transform(source, result); -    log.trace("IdentityLink transformed successfully. " + getStatistics());
 -  }
 -  
 -  public String getStatistics() {
 -    
 -    StringBuffer str = new StringBuffer();
 -    Iterator<String> keys = pool.keySet().iterator();
 -    int count = 0;
 -    while (keys.hasNext()) {
 -      String stylesheetURL = (String) keys.next();
 -      str.append("Stylesheet URL: ").append(stylesheetURL);
 -      Iterator<IdLTransformer> transformer = pool.get(stylesheetURL).iterator();
 -      while (transformer.hasNext()) {
 -        IdLTransformer idLTransformer = (IdLTransformer) transformer.next();
 -        str.append("\n  ").append(idLTransformer);
 -        count++;
 -      }
 -    }
 -    str.append("\n(").append(count).append(" transformer)");
 -    return str.toString();
 +        }
  }
 | 
