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

Last change on this file since 193 was 193, checked in by Maciej Komosinski, 10 years ago

Set svn:eol-style native for all textual files

  • Property svn:eol-style set to native
File size: 3.0 KB
Line 
1package com.framsticks.dumping;
2
3import static com.framsticks.params.AccessOperations.*;
4import com.framsticks.params.Access;
5import com.framsticks.params.CompositeParam;
6import com.framsticks.params.FramsClass;
7import com.framsticks.params.ListAccess;
8import com.framsticks.params.Sink;
9import com.framsticks.parsers.Savers;
10import com.framsticks.structure.Node;
11import com.framsticks.structure.Path;
12import com.framsticks.structure.Tree;
13import com.framsticks.util.*;
14import com.framsticks.util.dispatching.Dispatching;
15import com.framsticks.util.dispatching.FutureHandler;
16
17import org.apache.logging.log4j.Logger;
18import org.apache.logging.log4j.LogManager;
19import com.framsticks.util.dispatching.RunAt;
20
21import java.util.HashSet;
22import java.util.Set;
23
24import static com.framsticks.structure.TreeOperations.*;
25import static com.framsticks.util.lang.Containers.filterInstanceof;
26
27/**
28 * @author Piotr Sniegowski
29 */
30public class SaveStream extends Stream {
31
32        private final static Logger log = LogManager.getLogger(SaveStream.class.getName());
33
34        protected final Sink sink;
35        protected final Tree tree;
36        protected final FutureHandler<Void> future;
37        protected final Stopwatch stopwatch = new Stopwatch();
38        protected final Set<FramsClass> storedInfo = new HashSet<FramsClass>();
39
40        private int dispatched = 0;
41
42        public SaveStream(Sink sink, Tree tree, Path root, FutureHandler<Void> future) {
43                assert Dispatching.isThreadSafe();
44                this.sink = sink;
45                this.tree = tree;
46                this.future = future;
47                dispatchWrite(root);
48        }
49
50        protected void dispatchWrite(final Path path) {
51                ++dispatched;
52                tree.dispatch(new RunAt<Tree>(tree) {
53                        @Override
54                        protected void runAt() {
55                                write(path);
56                        }
57                });
58        }
59
60        protected void finished() {
61                assert tree.isActive();
62                log.info("stored in {}", stopwatch);
63                future.pass(null);
64        }
65
66        public void write(final Path path) {
67                assert tree.isActive();
68                if (!path.isResolved()) {
69                        log.debug("path {} is not resolved - skipping", path);
70                } else {
71                        Access access = bindAccess(path);
72                        assert access != null;
73                        FramsClass framsClass = access.getFramsClass();
74                        assert framsClass != null;
75                        if (!storedInfo.contains(framsClass)) {
76                                storedInfo.add(framsClass);
77                                sink.print("info ").print(path.getTextual()).breakLine();
78                                sink.print("file").breakLine();
79                                Savers.saveFramsClass(sink, framsClass);
80                                sink.print("eof").breakLine();
81                                sink.print("ok").breakLine();
82                        }
83                        if (!(access instanceof ListAccess)) {
84                                sink.print("get ").print(path.getTextual()).breakLine();
85                                sink.print("file").breakLine();
86                                //stream.print("#" + access.getSelected().getClass().getCanonicalName() + "\n");
87                                save(access, sink);
88                                sink.print("eof").breakLine();
89                                sink.print("ok").breakLine();
90                        }
91                        for (CompositeParam p : filterInstanceof(access.getParams(), CompositeParam.class)) {
92                                final Path childPath = path.appendNode(new Node(path.getTree(), p, access.get(p, Object.class)));
93                                if (childPath.isResolved() && getInfoFromCache(childPath) != null) {
94                                        dispatchWrite(childPath);
95                                }
96                        }
97                }
98                --dispatched;
99                if (dispatched == 0) {
100                        finished();
101                }
102        }
103}
Note: See TracBrowser for help on using the repository browser.