1 | /* | |
2 | * Copyright 2006 - 2013 | |
3 | * Stefan Balev <stefan.balev@graphstream-project.org> | |
4 | * Julien Baudry <julien.baudry@graphstream-project.org> | |
5 | * Antoine Dutot <antoine.dutot@graphstream-project.org> | |
6 | * Yoann Pign�� <yoann.pigne@graphstream-project.org> | |
7 | * Guilhelm Savin <guilhelm.savin@graphstream-project.org> | |
8 | * | |
9 | * This file is part of GraphStream <http://graphstream-project.org>. | |
10 | * | |
11 | * GraphStream is a library whose purpose is to handle static or dynamic | |
12 | * graph, create them from scratch, file or any source and display them. | |
13 | * | |
14 | * This program is free software distributed under the terms of two licenses, the | |
15 | * CeCILL-C license that fits European law, and the GNU Lesser General Public | |
16 | * License. You can use, modify and/ or redistribute the software under the terms | |
17 | * of the CeCILL-C license as circulated by CEA, CNRS and INRIA at the following | |
18 | * URL <http://www.cecill.info> or under the terms of the GNU LGPL as published by | |
19 | * the Free Software Foundation, either version 3 of the License, or (at your | |
20 | * option) any later version. | |
21 | * | |
22 | * This program is distributed in the hope that it will be useful, but WITHOUT ANY | |
23 | * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A | |
24 | * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. | |
25 | * | |
26 | * You should have received a copy of the GNU Lesser General Public License | |
27 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | |
28 | * | |
29 | * The fact that you are presently reading this means that you have had | |
30 | * knowledge of the CeCILL-C and LGPL licenses and that you accept their terms. | |
31 | */ | |
32 | package org.graphstream.stream.file; | |
33 | ||
34 | /** | |
35 | * Transform the input events into a GML graph. | |
36 | * | |
37 | * <p> | |
38 | * THIS CLASS IS REALLY NOT APPROPRIATE FOR GENERAL USE. Indeed the GML format | |
39 | * is not dynamic and it is very difficult to export the correct attributes of | |
40 | * nodes if the declaration of the attribute is far from the declaration of the | |
41 | * node. The only way would be to store the graph in a buffer and output it at | |
42 | * once when the file is closed. | |
43 | * </p> | |
44 | * | |
45 | * <p> | |
46 | * Therefore this class outputs attributes of nodes and edges only if their | |
47 | * addition directly follows the corresponding node or edge. | |
48 | * </p> | |
49 | */ | |
50 | public class FileSinkDynamicGML extends FileSinkGML { | |
51 | // Construction | |
52 | ||
53 | public FileSinkDynamicGML() { | |
54 | // NOP | |
55 | } | |
56 | ||
57 | // Attribute events | |
58 | ||
59 | @Override | |
60 | public void graphAttributeAdded(String sourceId, long timeId, | |
61 | String attribute, Object value) { | |
62 |
1
1. graphAttributeAdded : removed call to org/graphstream/stream/file/FileSinkDynamicGML::ensureToFinish → NO_COVERAGE |
ensureToFinish(); |
63 | ||
64 | String val = valueToString(value); | |
65 | ||
66 |
1
1. graphAttributeAdded : negated conditional → NO_COVERAGE |
if (val != null) { |
67 | out.printf("\t%s %s%n", attribute, val); | |
68 | } | |
69 | } | |
70 | ||
71 | @Override | |
72 | public void graphAttributeChanged(String sourceId, long timeId, | |
73 | String attribute, Object oldValue, Object newValue) { | |
74 |
1
1. graphAttributeChanged : removed call to org/graphstream/stream/file/FileSinkDynamicGML::ensureToFinish → NO_COVERAGE |
ensureToFinish(); |
75 |
1
1. graphAttributeChanged : removed call to org/graphstream/stream/file/FileSinkDynamicGML::graphAttributeAdded → NO_COVERAGE |
graphAttributeAdded(sourceId, timeId, attribute, newValue); |
76 | } | |
77 | ||
78 | @Override | |
79 | public void graphAttributeRemoved(String sourceId, long timeId, | |
80 | String attribute) { | |
81 |
1
1. graphAttributeRemoved : removed call to org/graphstream/stream/file/FileSinkDynamicGML::ensureToFinish → NO_COVERAGE |
ensureToFinish(); |
82 | out.printf("\t-%s%n", attribute); | |
83 | } | |
84 | ||
85 | @Override | |
86 | public void nodeAttributeAdded(String sourceId, long timeId, String nodeId, | |
87 | String attribute, Object value) { | |
88 |
1
1. nodeAttributeAdded : removed call to org/graphstream/stream/file/FileSinkDynamicGML::nodeAttributeChanged → NO_COVERAGE |
nodeAttributeChanged(sourceId, timeId, nodeId, attribute, null, value); |
89 | } | |
90 | ||
91 | @Override | |
92 | public void nodeAttributeChanged(String sourceId, long timeId, | |
93 | String nodeId, String attribute, Object oldValue, Object newValue) { | |
94 | ||
95 |
2
1. nodeAttributeChanged : negated conditional → NO_COVERAGE 2. nodeAttributeChanged : negated conditional → NO_COVERAGE |
if(nodeToFinish == null || (!nodeToFinish.equals(nodeId))) { |
96 |
1
1. nodeAttributeChanged : removed call to org/graphstream/stream/file/FileSinkDynamicGML::ensureToFinish → NO_COVERAGE |
ensureToFinish(); |
97 | out.printf("\t+node [%n"); | |
98 | out.printf("\t\tid \"%s\"%n", nodeId); | |
99 | nodeToFinish = nodeId; | |
100 | } | |
101 | ||
102 |
1
1. nodeAttributeChanged : negated conditional → NO_COVERAGE |
if(newValue != null) { |
103 | String val = valueToString(newValue); | |
104 | | |
105 |
1
1. nodeAttributeChanged : negated conditional → NO_COVERAGE |
if (val != null) { |
106 | out.printf("\t\t%s %s%n", attribute, val); | |
107 | } | |
108 | } else { | |
109 | out.printf("\t\t-%s%n", attribute); | |
110 | } | |
111 | } | |
112 | ||
113 | @Override | |
114 | public void nodeAttributeRemoved(String sourceId, long timeId, | |
115 | String nodeId, String attribute) { | |
116 |
1
1. nodeAttributeRemoved : removed call to org/graphstream/stream/file/FileSinkDynamicGML::nodeAttributeChanged → NO_COVERAGE |
nodeAttributeChanged(sourceId, timeId, nodeId, attribute, null, null); |
117 | } | |
118 | ||
119 | @Override | |
120 | public void edgeAttributeAdded(String sourceId, long timeId, String edgeId, | |
121 | String attribute, Object value) { | |
122 |
1
1. edgeAttributeAdded : removed call to org/graphstream/stream/file/FileSinkDynamicGML::edgeAttributeChanged → NO_COVERAGE |
edgeAttributeChanged(sourceId, timeId, edgeId, attribute, null, value); |
123 | } | |
124 | ||
125 | @Override | |
126 | public void edgeAttributeChanged(String sourceId, long timeId, | |
127 | String edgeId, String attribute, Object oldValue, Object newValue) { | |
128 | ||
129 |
2
1. edgeAttributeChanged : negated conditional → NO_COVERAGE 2. edgeAttributeChanged : negated conditional → NO_COVERAGE |
if(edgeToFinish == null || (!edgeToFinish.equals(edgeId))) { |
130 |
1
1. edgeAttributeChanged : removed call to org/graphstream/stream/file/FileSinkDynamicGML::ensureToFinish → NO_COVERAGE |
ensureToFinish(); |
131 | out.printf("\t+edge [%n"); | |
132 | out.printf("\t\tid \"%s\"%n", edgeId); | |
133 | edgeToFinish = edgeId; | |
134 | } | |
135 | ||
136 |
1
1. edgeAttributeChanged : negated conditional → NO_COVERAGE |
if(newValue != null) { |
137 | String val = valueToString(newValue); | |
138 | | |
139 |
1
1. edgeAttributeChanged : negated conditional → NO_COVERAGE |
if (val != null) { |
140 | out.printf("\t\t%s %s%n", attribute, val); | |
141 | } | |
142 | } else { | |
143 | out.printf("\t\t-%s%n", attribute); | |
144 | } | |
145 | } | |
146 | ||
147 | @Override | |
148 | public void edgeAttributeRemoved(String sourceId, long timeId, | |
149 | String edgeId, String attribute) { | |
150 |
1
1. edgeAttributeRemoved : removed call to org/graphstream/stream/file/FileSinkDynamicGML::edgeAttributeChanged → NO_COVERAGE |
edgeAttributeChanged(sourceId, timeId, edgeId, attribute, null, null); |
151 | } | |
152 | ||
153 | // Element events | |
154 | ||
155 | @Override | |
156 | public void nodeAdded(String sourceId, long timeId, String nodeId) { | |
157 |
1
1. nodeAdded : removed call to org/graphstream/stream/file/FileSinkDynamicGML::ensureToFinish → NO_COVERAGE |
ensureToFinish(); |
158 | out.printf("\tnode [%n"); | |
159 | out.printf("\t\tid \"%s\"%n", nodeId); | |
160 | nodeToFinish = nodeId; | |
161 | } | |
162 | ||
163 | @Override | |
164 | public void nodeRemoved(String sourceId, long timeId, String nodeId) { | |
165 |
1
1. nodeRemoved : removed call to org/graphstream/stream/file/FileSinkDynamicGML::ensureToFinish → NO_COVERAGE |
ensureToFinish(); |
166 | out.printf("\t-node \"%s\"%n", nodeId); | |
167 | } | |
168 | ||
169 | @Override | |
170 | public void edgeAdded(String sourceId, long timeId, String edgeId, | |
171 | String fromNodeId, String toNodeId, boolean directed) { | |
172 |
1
1. edgeAdded : removed call to org/graphstream/stream/file/FileSinkDynamicGML::ensureToFinish → NO_COVERAGE |
ensureToFinish(); |
173 | out.printf("\tedge [%n"); | |
174 | out.printf("\t\tid \"%s\"%n", edgeId); | |
175 | out.printf("\t\tsource \"%s\"%n", fromNodeId); | |
176 | out.printf("\t\ttarget \"%s\"%n", toNodeId); | |
177 |
1
1. edgeAdded : negated conditional → NO_COVERAGE |
out.printf("\t\tdirected %s%n", directed ? "1" : "0"); |
178 | edgeToFinish = edgeId; | |
179 | } | |
180 | ||
181 | @Override | |
182 | public void edgeRemoved(String sourceId, long timeId, String edgeId) { | |
183 |
1
1. edgeRemoved : removed call to org/graphstream/stream/file/FileSinkDynamicGML::ensureToFinish → NO_COVERAGE |
ensureToFinish(); |
184 | out.printf("\t-edge \"%s\"%n", edgeId); | |
185 | } | |
186 | ||
187 | @Override | |
188 | public void graphCleared(String sourceId, long timeId) { | |
189 | // Ah ah ah !! | |
190 | } | |
191 | ||
192 | @Override | |
193 | public void stepBegins(String sourceId, long timeId, double step) { | |
194 |
1
1. stepBegins : removed call to org/graphstream/stream/file/FileSinkDynamicGML::ensureToFinish → NO_COVERAGE |
ensureToFinish(); |
195 |
2
1. stepBegins : Replaced double subtraction with addition → NO_COVERAGE 2. stepBegins : negated conditional → NO_COVERAGE |
if((step-((int)step))==0) |
196 | out.printf("\tstep %d%n", (int)step); | |
197 | else out.printf("\tstep %f%n", step); | |
198 | } | |
199 | } | |
Mutations | ||
62 |
1.1 |
|
66 |
1.1 |
|
74 |
1.1 |
|
75 |
1.1 |
|
81 |
1.1 |
|
88 |
1.1 |
|
95 |
1.1 2.2 |
|
96 |
1.1 |
|
102 |
1.1 |
|
105 |
1.1 |
|
116 |
1.1 |
|
122 |
1.1 |
|
129 |
1.1 2.2 |
|
130 |
1.1 |
|
136 |
1.1 |
|
139 |
1.1 |
|
150 |
1.1 |
|
157 |
1.1 |
|
165 |
1.1 |
|
172 |
1.1 |
|
177 |
1.1 |
|
183 |
1.1 |
|
194 |
1.1 |
|
195 |
1.1 2.2 |