diff options
Diffstat (limited to 'utils/src')
-rw-r--r-- | utils/src/main/java/at/gv/egiz/idlink/IdentityLinkTransformer.java | 223 |
1 files changed, 55 insertions, 168 deletions
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();
+ }
}
|