Mercurial > dive4elements > framework
comparison artifact-database/src/main/java/de/intevation/artifactdatabase/ArtifactDatabaseImpl.java @ 79:f69e5b87f05f
Implementation to export artifacts as xml (applied patch from issue208 by SLT).
artifacts/trunk@792 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author | Ingo Weinzierl <ingo.weinzierl@intevation.de> |
---|---|
date | Tue, 16 Mar 2010 16:03:06 +0000 |
parents | d4c4c23847f5 |
children | 8447467cef86 |
comparison
equal
deleted
inserted
replaced
78:55eefe63a777 | 79:f69e5b87f05f |
---|---|
1 package de.intevation.artifactdatabase; | 1 package de.intevation.artifactdatabase; |
2 | |
3 import de.intevation.artifactdatabase.Backend.PersistentArtifact; | |
4 | |
5 import de.intevation.artifacts.Artifact; | |
6 import de.intevation.artifacts.ArtifactDatabase; | |
7 import de.intevation.artifacts.ArtifactDatabaseException; | |
8 import de.intevation.artifacts.ArtifactFactory; | |
9 import de.intevation.artifacts.ArtifactNamespaceContext; | |
10 import de.intevation.artifacts.CallContext; | |
11 import de.intevation.artifacts.CallMeta; | |
12 import de.intevation.artifacts.Service; | |
13 import de.intevation.artifacts.ServiceFactory; | |
2 | 14 |
3 import java.io.IOException; | 15 import java.io.IOException; |
4 import java.io.OutputStream; | 16 import java.io.OutputStream; |
17 | |
18 import java.security.MessageDigest; | |
19 import java.security.NoSuchAlgorithmException; | |
20 | |
5 import java.util.ArrayList; | 21 import java.util.ArrayList; |
6 import java.util.HashMap; | 22 import java.util.HashMap; |
7 import java.util.HashSet; | 23 import java.util.HashSet; |
8 import java.util.List; | 24 import java.util.List; |
9 | 25 |
26 import org.apache.commons.codec.binary.Base64; | |
27 | |
10 import org.apache.log4j.Logger; | 28 import org.apache.log4j.Logger; |
29 | |
11 import org.w3c.dom.Document; | 30 import org.w3c.dom.Document; |
12 | 31 import org.w3c.dom.Element; |
13 import de.intevation.artifactdatabase.Backend.PersistentArtifact; | |
14 import de.intevation.artifacts.Artifact; | |
15 import de.intevation.artifacts.ArtifactDatabase; | |
16 import de.intevation.artifacts.ArtifactDatabaseException; | |
17 import de.intevation.artifacts.ArtifactFactory; | |
18 import de.intevation.artifacts.CallContext; | |
19 import de.intevation.artifacts.CallMeta; | |
20 import de.intevation.artifacts.Service; | |
21 import de.intevation.artifacts.ServiceFactory; | |
22 | 32 |
23 /** | 33 /** |
24 * @author Sascha L. Teichmann | 34 * @author Sascha L. Teichmann |
25 */ | 35 */ |
26 public class ArtifactDatabaseImpl | 36 public class ArtifactDatabaseImpl |
47 public static final String INTERNAL_ERROR = | 57 public static final String INTERNAL_ERROR = |
48 "Creation of artifact failed"; | 58 "Creation of artifact failed"; |
49 | 59 |
50 public static final String NO_SUCH_SERVICE = | 60 public static final String NO_SUCH_SERVICE = |
51 "No such service"; | 61 "No such service"; |
62 | |
63 public static final String DIGEST_ALGORITHM = | |
64 "SHA-1"; | |
52 | 65 |
53 public class CallContextImpl | 66 public class CallContextImpl |
54 implements CallContext | 67 implements CallContext |
55 { | 68 { |
56 protected PersistentArtifact artifact; | 69 protected PersistentArtifact artifact; |
169 protected HashMap name2service; | 182 protected HashMap name2service; |
170 | 183 |
171 protected Backend backend; | 184 protected Backend backend; |
172 protected Object context; | 185 protected Object context; |
173 | 186 |
187 protected byte [] exportSecret; | |
188 | |
174 protected HashSet backgroundIds; | 189 protected HashSet backgroundIds; |
175 | 190 |
176 public ArtifactDatabaseImpl() { | 191 public ArtifactDatabaseImpl() { |
177 } | 192 } |
178 | 193 |
185 backgroundIds = new HashSet(); | 200 backgroundIds = new HashSet(); |
186 | 201 |
187 setupArtifactFactories(bootstrap); | 202 setupArtifactFactories(bootstrap); |
188 setupServices(bootstrap); | 203 setupServices(bootstrap); |
189 | 204 |
190 context = bootstrap.getContext(); | 205 context = bootstrap.getContext(); |
206 exportSecret = bootstrap.getExportSecret(); | |
191 | 207 |
192 wireWithBackend(backend); | 208 wireWithBackend(backend); |
193 } | 209 } |
194 | 210 |
195 protected void setupArtifactFactories(FactoryBootstrap bootstrap) { | 211 protected void setupArtifactFactories(FactoryBootstrap bootstrap) { |
420 } | 436 } |
421 | 437 |
422 return new DeferredOutputImpl(artifact, format, callMeta); | 438 return new DeferredOutputImpl(artifact, format, callMeta); |
423 } | 439 } |
424 | 440 |
441 public Document exportArtifact(String artifact, CallMeta callMeta) | |
442 throws ArtifactDatabaseException | |
443 { | |
444 final String [] factoryName = new String[1]; | |
445 | |
446 byte [] bytes = (byte [])backend.loadArtifact( | |
447 artifact, | |
448 new Backend.ArtifactLoader() { | |
449 public Object load( | |
450 ArtifactFactory factory, | |
451 byte [] bytes, | |
452 int id | |
453 ) { | |
454 factoryName[0] = factory.getName(); | |
455 return bytes; | |
456 } | |
457 }); | |
458 | |
459 if (bytes == null) { | |
460 throw new ArtifactDatabaseException(NO_SUCH_ARTIFACT); | |
461 } | |
462 | |
463 return createExportDocument( | |
464 factoryName[0], | |
465 bytes, | |
466 exportSecret); | |
467 } | |
468 | |
469 protected static Document createExportDocument( | |
470 String factoryName, | |
471 byte [] artifact, | |
472 byte [] secret | |
473 ) { | |
474 Document document = XMLUtils.newDocument(); | |
475 | |
476 MessageDigest md; | |
477 try { | |
478 md = MessageDigest.getInstance(DIGEST_ALGORITHM); | |
479 } | |
480 catch (NoSuchAlgorithmException nsae) { | |
481 logger.error(nsae.getLocalizedMessage(), nsae); | |
482 return document; | |
483 } | |
484 | |
485 md.update(artifact); | |
486 md.update(secret); | |
487 | |
488 String checksum = StringUtils.toHex(md.digest()); | |
489 | |
490 XMLUtils.ElementCreator ec = new XMLUtils.ElementCreator( | |
491 document, | |
492 ArtifactNamespaceContext.NAMESPACE_URI, | |
493 ArtifactNamespaceContext.NAMESPACE_PREFIX); | |
494 | |
495 Element root = ec.create("result"); | |
496 document.appendChild(root); | |
497 | |
498 Element type = ec.create("type"); | |
499 ec.addAttr(type, "name", "export"); | |
500 root.appendChild(type); | |
501 | |
502 Element data = ec.create("data"); | |
503 ec.addAttr(data, "checksum", checksum); | |
504 data.setTextContent(Base64.encodeBase64String(artifact)); | |
505 | |
506 root.appendChild(data); | |
507 | |
508 return document; | |
509 } | |
510 | |
511 public Document importArtifact(Document data, CallMeta callMeta) | |
512 throws ArtifactDatabaseException | |
513 { | |
514 return null; | |
515 } | |
516 | |
425 public String [][] serviceNamesAndDescriptions() { | 517 public String [][] serviceNamesAndDescriptions() { |
426 return serviceNamesAndDescription; | 518 return serviceNamesAndDescription; |
427 } | 519 } |
428 | 520 |
429 public Document process( | 521 public Document process( |
440 } | 532 } |
441 | 533 |
442 return service.process(input, context, callMeta); | 534 return service.process(input, context, callMeta); |
443 } | 535 } |
444 } | 536 } |
445 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8: | 537 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : |