1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package p3j.gui.dialogs;
17
18 import java.util.HashMap;
19 import java.util.List;
20 import java.util.Map;
21 import java.util.Map.Entry;
22 import java.util.logging.Level;
23
24 import javax.swing.JLabel;
25 import javax.swing.JTextField;
26 import javax.swing.SwingWorker;
27
28 import org.jamesii.SimSystem;
29
30 import p3j.database.DatabaseFactory;
31 import p3j.database.IP3MDatabase;
32 import p3j.gui.panels.PropertiesShowPanelFactory;
33 import p3j.misc.gui.GUI;
34 import p3j.pppm.PPPModelFactory;
35 import p3j.pppm.ProjectionModel;
36 import p3j.pppm.parameters.ParameterAssignment;
37 import p3j.pppm.parameters.ParameterAssignmentSet;
38 import p3j.pppm.parameters.ParameterInstance;
39 import p3j.pppm.sets.Set;
40 import p3j.pppm.sets.SetType;
41
42
43
44
45
46
47
48 public class DuplicateProjectionDialog extends ProcessProjectionDialog {
49
50
51 private static final long serialVersionUID = 8436821751889161548L;
52
53
54 private final JTextField newProjectionName = new JTextField("");
55
56
57
58
59
60
61
62 public DuplicateProjectionDialog(ProjectionModel projection) {
63 super(projection);
64 initUI();
65 }
66
67
68
69
70 private void initUI() {
71 setTitle("Name of the duplicate projection.");
72 setSize(DIALOG_WIDTH, DIALOG_HEIGHT);
73 setModal(true);
74 GUI.centerOnScreen(this);
75 newProjectionName.setText(getProjectionModel().getName());
76 PropertiesShowPanelFactory pspf = new PropertiesShowPanelFactory(
77 getButtons(), 1);
78 pspf.sep("Duplicate Projection");
79 pspf.app("Name of duplicated projection:", newProjectionName);
80 getContentPane().add(pspf.constructPanel());
81 }
82
83
84
85
86
87
88
89 protected void duplicateProjection(final String newProjName) {
90 final JLabel status = reinitializeUIForAdjustment();
91
92 SwingWorker<Void, Void> worker = new SwingWorker<Void, Void>() {
93 @Override
94 protected Void doInBackground() {
95 try {
96 DuplicateProjectionDialog.duplicate(
97 DatabaseFactory.getDatabaseSingleton(), getProjectionModel(),
98 newProjName, status);
99 } catch (RuntimeException ex) {
100 GUI.printErrorMessage("Error while duplicating projection!", ex);
101 }
102 return null;
103 }
104
105 @Override
106 public void done() {
107 setVisible(false);
108 }
109 };
110
111 worker.execute();
112 }
113
114
115
116
117
118
119
120
121
122
123
124
125
126 public static void duplicate(IP3MDatabase db,
127 ProjectionModel originalProjection, String newProjectionName,
128 JLabel status) {
129
130 ProjectionModel duplicateProjection = PPPModelFactory.createModel(
131 newProjectionName, originalProjection.getDescription(),
132 originalProjection.getGenerations(), originalProjection.getYears(),
133 originalProjection.getMaximumAge(),
134 originalProjection.getJumpOffYear(),
135 originalProjection.getSubPopulationModel());
136
137 db.newProjection(duplicateProjection);
138
139
140 Map<SetType, SetType> setTypeMap = new HashMap<SetType, SetType>();
141 for (SetType originalSetType : originalProjection.getUserDefinedTypes()) {
142 SetType duplicateSetType = duplicateProjection.createSetType(
143 originalSetType.getName(), originalSetType.getDescription());
144 setTypeMap.put(originalSetType, duplicateSetType);
145 for (ParameterInstance parameterInstance : originalSetType
146 .getDefinedParameters()) {
147 duplicateProjection.assignParameterInstance(
148 getInstance(duplicateProjection, parameterInstance),
149 duplicateSetType, false);
150 }
151 }
152
153
154 for (Entry<SetType, SetType> setTypes : setTypeMap.entrySet()) {
155 copySets(db, status, setTypes.getKey(), duplicateProjection,
156 setTypes.getValue(), false);
157 }
158 copySets(db, status, originalProjection.getDefaultSetType(),
159 duplicateProjection, duplicateProjection.getDefaultSetType(), true);
160
161 db.saveProjection(duplicateProjection);
162 }
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180 private static void copySets(IP3MDatabase db, JLabel status,
181 SetType originalSetType, ProjectionModel duplicateProjection,
182 SetType duplicateSetType, boolean isDefaultSetType) {
183 for (Set set : originalSetType.getSets()) {
184 Set duplicateSet = isDefaultSetType ? duplicateProjection.getDefaultSet()
185 : duplicateSetType.createSet(set.getName(), set.getDescription(),
186 set.getProbability());
187 copySet(db, status, set, duplicateProjection, duplicateSet,
188 originalSetType.getDefinedParameters());
189 }
190 }
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208 private static void copySet(IP3MDatabase db, JLabel status, Set originalSet,
209 ProjectionModel duplicateProjection, Set duplicateSet,
210 List<ParameterInstance> definedParameters) {
211 for (ParameterInstance paramInst : definedParameters) {
212 ParameterAssignmentSet paramAssignments = originalSet
213 .getParameterAssignments(paramInst);
214 ParameterInstance duplInst = getInstance(duplicateProjection, paramInst);
215 for (ParameterAssignment origPA : paramAssignments.getAssignments()) {
216 status.setText("Copying parameter assignment '" + origPA.getName()
217 + "' for " + paramInst);
218 SimSystem.report(Level.INFO,
219 "Copying parameter assignment '" + origPA.getName() + "' for "
220 + paramInst);
221 ParameterAssignment duplPA = db.newParameterAssignment(duplInst,
222 origPA.getName(), origPA.getDescription(), origPA.getProbability(),
223 origPA.getDeviation(), origPA.getMatrixValue());
224 duplPA.setParamInstance(duplInst);
225 duplicateSet.addParameterAssignment(duplPA);
226 }
227 }
228 }
229
230
231
232
233
234
235
236
237
238
239
240 private static ParameterInstance getInstance(ProjectionModel newProj,
241 ParameterInstance instance) {
242 for (ParameterInstance inst : newProj.getAllParameterInstances()) {
243
244 boolean valDimentionMatches = (inst.getValueHeight() == instance
245 .getValueHeight() && inst.getValueWidth() == instance.getValueWidth());
246 boolean subPopMatches = (inst.getGeneration() == instance.getGeneration() && inst
247 .getParameter().getPopulation() == instance.getParameter()
248 .getPopulation());
249 if (inst.getParameter().getName()
250 .equals(instance.getParameter().getName())
251 && subPopMatches && valDimentionMatches) {
252 return inst;
253 }
254 }
255 return null;
256 }
257
258 @Override
259 protected void okAction() {
260 duplicateProjection(newProjectionName.getText());
261 }
262
263 }