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 :

http://dive4elements.wald.intevation.org