source: java/main/src/main/java/com/framsticks/dumping/SaveStream.java @ 77

Last change on this file since 77 was 77, checked in by psniegowski, 11 years ago

Add new java codebase.

File size: 3.4 KB
Line 
1package com.framsticks.dumping;
2
3import com.framsticks.core.Node;
4import com.framsticks.core.Path;
5import com.framsticks.params.AccessInterface;
6import com.framsticks.params.FramsClass;
7import com.framsticks.params.ListAccess;
8import com.framsticks.params.Param;
9import com.framsticks.params.types.CompositeParam;
10import com.framsticks.params.SinkInterface;
11import com.framsticks.parsers.Savers;
12import com.framsticks.core.Instance;
13import com.framsticks.util.*;
14import org.apache.log4j.Logger;
15
16import java.util.HashSet;
17import java.util.Set;
18
19/**
20 * @author Piotr Sniegowski
21 */
22public class SaveStream {
23
24    private final static Logger LOGGER = Logger.getLogger(SaveStream.class.getName());
25
26    protected final SinkInterface sink;
27    protected final Instance instance;
28    protected final StateFunctor stateFunctor;
29    protected final Stopwatch stopwatch = new Stopwatch();
30    protected final Set<FramsClass> storedInfo = new HashSet<FramsClass>();
31
32    private int dispatched = 0;
33
34    public SaveStream(SinkInterface sink, Instance instance, Path root, StateFunctor stateFunctor) {
35        assert Dispatching.isThreadSafe();
36        this.sink = sink;
37        this.instance = instance;
38        this.stateFunctor = stateFunctor;
39        dispatched = 1;
40        write(root);
41    }
42
43    protected void finished() {
44        assert instance.isActive();
45        LOGGER.info("stored in " + stopwatch);
46        stateFunctor.call(null);
47    }
48
49    public void write(final Path path) {
50        assert instance.isActive();
51        if (!path.isResolved()) {
52            LOGGER.debug("path " + path + " is not resolved - skipping");
53        } else {
54            AccessInterface access = instance.bindAccess(path);
55            FramsClass framsClass = access.getFramsClass();
56            assert framsClass != null;
57            if (!storedInfo.contains(framsClass)) {
58                storedInfo.add(framsClass);
59                sink.print("info ").print(path.getTextual()).breakLine();
60                sink.print("file").breakLine();
61                Savers.saveFramsClass(sink, framsClass);
62                sink.print("eof").breakLine();
63                sink.print("ok").breakLine();
64            }
65            if (!(access instanceof ListAccess)) {
66                sink.print("get ").print(path.getTextual()).breakLine();
67                sink.print("file").breakLine();
68                //stream.print("#" + access.getSelected().getClass().getCanonicalName() + "\n");
69                access.save(sink);
70                sink.print("eof").breakLine();
71                sink.print("ok").breakLine();
72            }
73            for (Param p : access.getParams()) {
74                if (p instanceof CompositeParam) {
75                    CompositeParam childParam = (CompositeParam)p;
76                    final Path childPath = path.appendNode(new Node(childParam, access.get(childParam, Object.class)));
77                    if (childPath.isResolved() && instance.getInfoFromCache(childPath) != null) {
78                        ++dispatched;
79                        instance.invokeLater(new Runnable() {
80                            @Override
81                            public void run() {
82                                write(childPath);
83                            }
84                        });
85                    }
86                }
87            }
88        }
89        --dispatched;
90        if (dispatched == 0) {
91            finished();
92        }
93    }
94
95
96}
Note: See TracBrowser for help on using the repository browser.