Line | Hits | Source |
---|---|---|
1 | /* | |
2 | * Copyright (c) 2003, the JUNG Project and the Regents of the University of | |
3 | * California All rights reserved. | |
4 | * | |
5 | * This software is open-source under the BSD license; see either "license.txt" | |
6 | * or http://jung.sourceforge.net/license.txt for a description. | |
7 | */ | |
8 | package edu.uci.ics.jung.utils; | |
9 | ||
10 | import java.util.Iterator; | |
11 | ||
12 | /** | |
13 | * Represents custom user- and system-level information to extend the definition | |
14 | * of a node. This is the easiest way to extend the class without subclassing. | |
15 | * | |
16 | * This works as a dictionary in order to help ensure that there are | |
17 | * possibilities for extending user information to a variety of different sorts | |
18 | * of data. (Each provider of information can register their own enhanced | |
19 | * information without interfering with other providers.) | |
20 | * | |
21 | * Some suggested uses of UserData include | |
22 | * <ul> | |
23 | * <li/>Underlying data references, such as pointers to data sources</li> | |
24 | * <li/>Raw data which can be analyzed or used by the constraint and filter systems | |
25 | * <li/>Temporary enhanced information which can be used for visualization | |
26 | * </ul> | |
27 | * | |
28 | * Consider a series of nodes that has, among other things, enhanced information | |
29 | * about 3D coordinates. This might be stored in the 3DData data structure, | |
30 | * which generates itself with an input from a node. | |
31 | * | |
32 | * Thus the relevant call might be <code>n.setUserInfo ("3DData", new 3DData ( | |
33 | * ))</code>. | |
34 | * Later, to access this information, the call might be <code>3DData dd = | |
35 | * (3DData) n.getUserInfo("3DData").</code> | |
36 | * | |
37 | * <h3>Shared and Individual Data</h3> | |
38 | * Note that the there are no required semantics for the key or the information. | |
39 | * However, it is necessary to specify information that is used for SHARED and | |
40 | * for INDIVIDUAL data elements. When a new View of a graph is | |
41 | * generated, the Node elements inside it are all shallow-copied. The UserInfo | |
42 | * that they use, however, is <em>not</em> copied, by default. This is the | |
43 | * correct and logical behavior if the UserInfo contains source information. | |
44 | * | |
45 | * But what when the UserInfo contains transient information, specific to the | |
46 | * view, such as graph metrics or coordinates? In that case, the UserInfo would | |
47 | * be quite inappropriate to share that information between copies. | |
48 | * | |
49 | * The solution to this is to add a third flag, "shared", which tells whether | |
50 | * the currect data is shared or not. This flag is assigned when the data is | |
51 | * added. | |
52 | */ | |
53 | 179476 | public abstract class UserData implements UserDataContainer { |
54 | ||
55 | /** | |
56 | * @see java.lang.Object#toString() | |
57 | */ | |
58 | public String toString() { | |
59 | 0 | StringBuffer sb = new StringBuffer(); |
60 | 0 | for (Iterator iter = getUserDatumKeyIterator(); iter.hasNext();) { |
61 | 0 | Object key = (Object) iter.next(); |
62 | 0 | sb.append(key); |
63 | 0 | sb.append("="); |
64 | 0 | sb.append(getUserDatum(key)); |
65 | 0 | if( iter.hasNext()) { |
66 | 0 | sb.append(", "); |
67 | } | |
68 | } | |
69 | 0 | return "USERDATA [" + sb + "]"; |
70 | } | |
71 | ||
72 | public Object clone() throws CloneNotSupportedException | |
73 | { | |
74 | 1761 | return super.clone(); |
75 | } | |
76 | ||
77 | /** | |
78 | * A CopyAction that clones UserData--that is, it uses the Java | |
79 | * {@link java.lang.Object#clone() clone()}call to clone the object. Throws | |
80 | * a <tt>CloneNotSupportedException</tt> if clone isn't allowed. | |
81 | */ | |
82 | 75 | public static final CopyAction CLONE = new CopyAction.Clone(); |
83 | ||
84 | /** | |
85 | * A CopyAction that links UserData--that is, points to the original data. | |
86 | * At that point, both UserDataContainers will contain references to the | |
87 | * same UserData, and, if that data is mutable, will both see changes to it. | |
88 | * (In the case of immutable user data, such as Strings, they will | |
89 | * disconnect if one or the other attempts to change its value: this is the | |
90 | * normal behavior with <code> | |
91 | * String s = "X"; | |
92 | * String t = s; | |
93 | * s = "Y"; | |
94 | * System.out.pritnln( t ); // will still contain X. | |
95 | * </code> | |
96 | */ | |
97 | 75 | public static final CopyAction SHARED = new CopyAction.Shared(); |
98 | ||
99 | /** | |
100 | * Causes the userdata not to be copied over, and instead returns null. | |
101 | * Useful for temporary userdata that isn't meant to be used. | |
102 | */ | |
103 | 75 | public static final CopyAction REMOVE = new CopyAction.Remove(); |
104 | ||
105 | } |
this report was generated by version 1.0.5 of jcoverage. |
copyright © 2003, jcoverage ltd. all rights reserved. |