001 /*
002 * The contents of this file are subject to the Mozilla Public
003 * License Version 1.1 (the "License"); you may not use this file
004 * except in compliance with the License. You may obtain a copy of
005 * the License at http://www.mozilla.org/MPL/
006 *
007 * Software distributed under the License is distributed on an "AS
008 * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
009 * implied. See the License for the specific language governing
010 * rights and limitations under the License.
011 *
012 * The Original Code is Knowtator.
013 *
014 * The Initial Developer of the Original Code is University of Colorado.
015 * Copyright (C) 2005 - 2008. All Rights Reserved.
016 *
017 * Knowtator was developed by the Center for Computational Pharmacology
018 * (http://compbio.uchcs.edu) at the University of Colorado Health
019 * Sciences Center School of Medicine with support from the National
020 * Library of Medicine.
021 *
022 * Current information about Knowtator can be obtained at
023 * http://knowtator.sourceforge.net/
024 *
025 * Contributor(s):
026 * Philip V. Ogren <philip@ogren.info> (Original Author)
027 */
028 package edu.uchsc.ccp.knowtator.util;
029
030 import java.awt.Component;
031 import java.awt.Cursor;
032 import java.io.File;
033 import java.util.ArrayList;
034 import java.util.Collection;
035 import java.util.HashMap;
036 import java.util.HashSet;
037 import java.util.Map;
038 import java.util.Set;
039
040 import javax.swing.JFileChooser;
041 import javax.swing.JOptionPane;
042 import javax.swing.ProgressMonitor;
043
044 import edu.stanford.smi.protege.model.Cls;
045 import edu.stanford.smi.protege.model.Instance;
046 import edu.stanford.smi.protege.model.KnowledgeBase;
047 import edu.stanford.smi.protege.model.Project;
048 import edu.stanford.smi.protege.model.SimpleInstance;
049 import edu.stanford.smi.protege.model.Slot;
050 import edu.stanford.smi.protege.ui.DisplayUtilities;
051 import edu.stanford.smi.protege.util.CollectionUtilities;
052 import edu.stanford.smi.protege.util.ExtensionFilter;
053 import edu.uchsc.ccp.knowtator.AnnotationUtil;
054 import edu.uchsc.ccp.knowtator.FilterUtil;
055 import edu.uchsc.ccp.knowtator.KnowtatorManager;
056 import edu.uchsc.ccp.knowtator.KnowtatorProjectUtil;
057 import edu.uchsc.ccp.knowtator.MentionUtil;
058 import edu.uchsc.ccp.knowtator.Span;
059 import edu.uchsc.ccp.knowtator.TextSourceUtil;
060 import edu.uchsc.ccp.knowtator.textsource.TextSource;
061 import edu.uchsc.ccp.knowtator.textsource.TextSourceAccessException;
062
063 public class MergeAnnotations {
064
065 Project addedProject;
066
067 Project masterProject;
068
069 TextSourceUtil masterTextSourceUtil;
070
071 Component parentComponent;
072
073 KnowledgeBase masterKB;
074
075 KnowtatorManager masterManager;
076
077 KnowtatorProjectUtil masterKPU;
078
079 AnnotationUtil masterAnnotationUtil;
080
081 MentionUtil masterMentionUtil;
082
083 KnowledgeBase addedKB;
084
085 KnowtatorManager addedManager;
086
087 KnowtatorProjectUtil addedKPU;
088
089 AnnotationUtil addedAnnotationUtil;
090
091 MentionUtil addedMentionUtil;
092
093 FilterUtil addedFilterUtil;
094
095 Map<SimpleInstance, SimpleInstance> annotatorMap;
096
097 Map<SimpleInstance, SimpleInstance> setsMap;
098
099 Set<SimpleInstance> addedAnnotations;
100
101 Set<SimpleInstance> addedMentions;
102
103 Map<SimpleInstance, SimpleInstance> annotationsMap;
104
105 Map<SimpleInstance, SimpleInstance> mentionsMap;
106
107 /**
108 * This class facilitates the merging of an annotation project with a
109 * 'master' annotation project.
110 *
111 * @param addedProject
112 * - the project that will be added to the master project. This
113 * project will not be modified. The .pont for this project
114 * should be identical to that of the master project.
115 * @param masterProject
116 * - the project that the added project will be added to. This
117 * project will be modified - all annotations from the added
118 * project will be added. However, the project will not be saved
119 * - so changes can be discarded if desired.
120 */
121
122 public MergeAnnotations(Project addedProject, Project masterProject, TextSourceUtil masterTextSourceUtil,
123 Component parentComponent) throws TextSourceAccessException {
124 this.addedProject = addedProject;
125 this.masterProject = masterProject;
126 this.masterTextSourceUtil = masterTextSourceUtil;
127 this.parentComponent = parentComponent;
128
129 masterKB = masterProject.getKnowledgeBase();
130 masterKPU = new KnowtatorProjectUtil(masterKB);
131 masterManager = new KnowtatorManager(masterKPU);
132 masterAnnotationUtil = masterManager.getAnnotationUtil();
133 masterAnnotationUtil.setTextSourceUtil(masterTextSourceUtil);
134 masterMentionUtil = masterManager.getMentionUtil();
135
136 addedKB = addedProject.getKnowledgeBase();
137 addedKPU = new KnowtatorProjectUtil(addedKB);
138 addedManager = new KnowtatorManager(addedKPU);
139 addedAnnotationUtil = addedManager.getAnnotationUtil();
140 addedMentionUtil = addedManager.getMentionUtil();
141 addedFilterUtil = addedManager.getFilterUtil();
142
143 annotatorMap = new HashMap<SimpleInstance, SimpleInstance>();
144 setsMap = new HashMap<SimpleInstance, SimpleInstance>();
145 addedAnnotations = new HashSet<SimpleInstance>();
146 addedMentions = new HashSet<SimpleInstance>();
147 annotationsMap = new HashMap<SimpleInstance, SimpleInstance>();
148 mentionsMap = new HashMap<SimpleInstance, SimpleInstance>();
149
150 }
151
152 /*
153 * To do: - I do not worry about subclasses of annotation. If we allow
154 * annotation to be subclassed and have slot values that point to other slot
155 * annotations or any other slot values, then we will need to expand the
156 * code here.
157 */
158
159 public void mergeAnnotations(SimpleInstance addedFilter, Collection<SimpleInstance> addedTextSources)
160 throws Exception {
161
162 annotatorMap.clear();
163 setsMap.clear();
164 addedAnnotations.clear();
165 addedMentions.clear();
166 annotationsMap.clear();
167 mentionsMap.clear();
168
169 // collect the annotations and mentions from the added project that are
170 // going to be added to the master project
171 for (SimpleInstance addedTextSource : addedTextSources) {
172 Collection<SimpleInstance> tsAnnotations = addedAnnotationUtil.getAnnotations(addedTextSource);
173 tsAnnotations = addedFilterUtil.filterAnnotations(tsAnnotations, addedFilter);
174 for (SimpleInstance tsAnnotation : tsAnnotations) {
175 addedAnnotations.add(tsAnnotation);
176
177 SimpleInstance mention = addedAnnotationUtil.getMention(tsAnnotation);
178 addedMentions.add(mention);
179 Set<SimpleInstance> connectedMentions = addedMentionUtil.getAllConnectedMentions(mention);
180 addedMentions.addAll(connectedMentions);
181 for (SimpleInstance connectedMention : connectedMentions) {
182 SimpleInstance connectedAnnotation = addedMentionUtil.getMentionAnnotation(connectedMention);
183 if (connectedAnnotation != null)
184 addedAnnotations.add(connectedAnnotation);
185 }
186 }
187 }
188
189 System.out.println("adding " + addedAnnotations.size() + " annotations:");
190
191 int npes = 0;
192
193 ProgressMonitor progressMonitor = new ProgressMonitor(parentComponent, "Merging annotations", null, 0,
194 addedAnnotations.size() + addedMentions.size());
195
196 try {
197
198 int progress = 0;
199
200 for (SimpleInstance addedAnnotation : addedAnnotations) {
201 progressMonitor.setProgress(progress++);
202
203 if (progressMonitor.isCanceled())
204 throw new Exception("Merge cancelled by user.");
205
206 // get the spans of the new annotation
207 java.util.List<Span> spans = addedAnnotationUtil.getSpans(addedAnnotation);
208 // get the spanned text of the new annotation
209 String spannedText = addedAnnotationUtil.getText(addedAnnotation);
210 // we want the text source instance in the master kb for the new
211 // annotation - not the one from the added kb
212 Slot addedTSSlot = addedKPU.getAnnotationTextSourceSlot();
213 Instance addedTS = (Instance) addedAnnotation.getOwnSlotValue(addedTSSlot);
214 String addedTextSourceName = addedTS.getName();
215
216 SimpleInstance masterTextSourceInstance = masterKB.getSimpleInstance(addedTextSourceName);
217 if (masterTextSourceInstance == null) {
218 TextSource masterTextSource = masterTextSourceUtil.getCurrentTextSourceCollection().get(
219 addedTextSourceName);
220 masterTextSourceInstance = masterTextSourceUtil.getTextSourceInstance(masterTextSource, true);
221 }
222
223 SimpleInstance addedAnnotator = (SimpleInstance) (addedAnnotation.getOwnSlotValue(addedKPU
224 .getAnnotationAnnotatorSlot()));
225 SimpleInstance masterAnnotator = getMasterAnnotator(addedAnnotator);
226
227 Collection<SimpleInstance> masterSets = getMasterSets(addedAnnotation);
228
229 SimpleInstance masterAnnotation = masterAnnotationUtil.createAnnotation(null, masterAnnotator, spans,
230 spannedText, masterTextSourceInstance, masterSets);
231
232 String comment = addedAnnotationUtil.getComment(addedAnnotation);
233 if (comment != null) {
234 masterAnnotationUtil.setComment(masterAnnotation, comment);
235 }
236 annotationsMap.put(addedAnnotation, masterAnnotation);
237 }
238 System.out.println("Number of NullPointerExceptions for new annotations = " + npes);
239
240 System.out.println("adding " + addedMentions.size() + " mentions:");
241
242 for (SimpleInstance addedMention : addedMentions) {
243 System.out.print(".");
244 System.out.flush();
245 if (progress % 30 == 0)
246 System.out.println("");
247 progressMonitor.setProgress(progress++);
248 addMention(addedMention, addedKPU, masterKPU, addedMentionUtil, annotationsMap, mentionsMap,
249 masterMentionUtil, masterKB);
250 }
251
252 progressMonitor.close();
253
254 } catch (Exception exception) {
255 progressMonitor.close();
256 throw exception;
257 }
258 }
259
260 /**
261 * This method adds a mention from added project to the master project.
262 *
263 * @param addedMention
264 * an instance of a mention from the added project
265 * @param addedKPU
266 * a kpu initialized with the knowledge base from the added
267 * project
268 * @param masterKPU
269 * a kpu initialized with the knowledge base from the master
270 * project
271 * @param addedMentionUtil
272 * a MentionUtil initialized with addedKPU
273 * @param annotationsMap
274 * keys are added annotations and values are master annotations.
275 * Each annotation in the added project is copied and added to
276 * the master project. An added annotation is an instance in the
277 * added project. A master annotation is an instance in the
278 * master project.
279 * @param mentionsMap
280 * keys are added mentions and values are master mentions. Each
281 * mention in the added project is copied and added to the master
282 * project. An added mention is an instance in the added project.
283 * A master mention is an instance in the master project.
284 * @param masterMentionUtil
285 * a MentionUtil initialized with masterKPU
286 * @param masterKB
287 * the knowledge base of the master project
288 */
289
290 private static SimpleInstance addMention(SimpleInstance addedMention, KnowtatorProjectUtil addedKPU,
291 KnowtatorProjectUtil masterKPU, MentionUtil addedMentionUtil,
292 Map<SimpleInstance, SimpleInstance> annotationsMap, Map<SimpleInstance, SimpleInstance> mentionsMap,
293 MentionUtil masterMentionUtil, KnowledgeBase masterKB) {
294 if (!mentionsMap.containsKey(addedMention)) {
295 SimpleInstance masterMention = null;
296
297 if (addedMentionUtil.isClassMention(addedMention)) {
298 Cls addedCls = addedMentionUtil.getMentionCls(addedMention);
299 String addedClsName = addedCls.getName();
300 Cls masterCls = masterKB.getCls(addedClsName);
301 masterMention = masterMentionUtil.createClassMention(masterCls);
302 mentionsMap.put(addedMention, masterMention);
303 Collection<SimpleInstance> addedSlotMentions = ProtegeUtil.castSimpleInstances(addedMention
304 .getOwnSlotValues(addedKPU.getSlotMentionSlot()));
305 for (SimpleInstance addedSlotMention : addedSlotMentions) {
306 SimpleInstance masterSlotMention = addMention(addedSlotMention, addedKPU, masterKPU,
307 addedMentionUtil, annotationsMap, mentionsMap, masterMentionUtil, masterKB);
308 if (masterSlotMention != null)
309 masterMention.addOwnSlotValue(masterKPU.getSlotMentionSlot(), masterSlotMention);
310 }
311 } else if (addedMentionUtil.isInstanceMention(addedMention)) {
312 String addedInstanceName = addedMentionUtil.getMentionInstance(addedMention).getName();
313 SimpleInstance masterInstance = (SimpleInstance) masterKB.getInstance(addedInstanceName);
314 masterMention = masterMentionUtil.createInstanceMention(masterInstance);
315 mentionsMap.put(addedMention, masterMention);
316 Collection<SimpleInstance> addedSlotMentions = ProtegeUtil.castSimpleInstances(addedMention
317 .getOwnSlotValues(addedKPU.getSlotMentionSlot()));
318 for (SimpleInstance addedSlotMention : addedSlotMentions) {
319 SimpleInstance masterSlotMention = addMention(addedSlotMention, addedKPU, masterKPU,
320 addedMentionUtil, annotationsMap, mentionsMap, masterMentionUtil, masterKB);
321 masterMention.addOwnSlotValue(masterKPU.getSlotMentionSlot(), masterSlotMention);
322 }
323 } else if (addedMentionUtil.isSlotMention(addedMention)) {
324 Slot addedSlot = addedMentionUtil.getSlotMentionSlot(addedMention);
325 if (addedSlot == null) {
326 System.out.println("WARNING: slot mention has no slot specified. It will not be added.");
327 return null;
328 }
329 String addedSlotName = addedMentionUtil.getSlotMentionSlot(addedMention).getName();
330 Slot masterSlot = masterKB.getSlot(addedSlotName);
331 masterMention = masterMentionUtil.createSlotMention(masterSlot);
332 mentionsMap.put(addedMention, masterMention);
333 Collection addedValues = addedMention.getOwnSlotValues(addedKPU.getMentionSlotValueSlot());
334
335 if (addedValues != null && addedValues.size() > 0) {
336 Object value = CollectionUtilities.getFirstItem(addedValues);
337 if (value instanceof SimpleInstance) {
338 for (Object addedValue : addedValues) {
339 SimpleInstance addedInstance = (SimpleInstance) addedValue;
340 SimpleInstance masterInstance = mentionsMap.get(addedInstance);
341 if (masterInstance == null) {
342 masterInstance = addMention(addedInstance, addedKPU, masterKPU, addedMentionUtil,
343 annotationsMap, mentionsMap, masterMentionUtil, masterKB);
344 }
345 masterMention.addOwnSlotValue(masterKPU.getMentionSlotValueSlot(), masterInstance);
346 }
347 } else {
348 masterMention.setOwnSlotValues(masterKPU.getMentionSlotValueSlot(), addedValues);
349 }
350 }
351 }
352 if (masterMention != null) {
353 Collection<SimpleInstance> mentionAnnotations = ProtegeUtil.castSimpleInstances(addedMention
354 .getOwnSlotValues(addedKPU.getMentionAnnotationSlot()));
355 if (mentionAnnotations != null) {
356 for (SimpleInstance mentionAnnotation : mentionAnnotations) {
357 SimpleInstance masterAnnotation = annotationsMap.get(mentionAnnotation);
358 masterMention.addOwnSlotValue(masterKPU.getMentionAnnotationSlot(), masterAnnotation);
359 }
360 }
361 return masterMention;
362 }
363 } else {
364 return mentionsMap.get(addedMention);
365 }
366 return null;
367 }
368
369 /**
370 * Does not handle 'knowtator consensus set' slot values
371 *
372 * @param addedAnnotation
373 * @return
374 */
375 private Collection<SimpleInstance> getMasterSets(SimpleInstance addedAnnotation) {
376 Set<SimpleInstance> addedSets = addedAnnotationUtil.getSets(addedAnnotation);
377 Collection<SimpleInstance> masterSets = new ArrayList<SimpleInstance>();
378 SETS_LOOP: for (SimpleInstance addedSet : addedSets) {
379 // if there is already a mapping from the added set to the master
380 // set then use it
381 if (setsMap.containsKey(addedSet)) {
382 masterSets.add(setsMap.get(addedSet));
383 continue;
384 }
385
386 // //if the same instance exists in both projects (i.e. they have
387 // the same system id) then use it
388 // String setName = addedSet.getName();
389 // SimpleInstance masterSet = masterKB.getSimpleInstance(setName);
390 // if(masterSet != null)
391 // {
392 // masterSets.add(masterSet);
393 // setsMap.put(addedSet, masterSet);
394 // continue;
395 // }
396
397 // try to find a set in the master project that has the same slot
398 // value for knowtator_set_name
399 String name = (String) addedSet.getOwnSlotValue(addedKPU.getSetNameSlot());
400 if (name != null) {
401 Collection<SimpleInstance> allMasterSets = ProtegeUtil.castSimpleInstances(masterKB
402 .getInstances(masterKPU.getSetCls()));
403 for (SimpleInstance mstrSet : allMasterSets) {
404 String masterName = (String) mstrSet.getOwnSlotValue(masterKPU.getSetNameSlot());
405 if (masterName != null && masterName.equals(name)) {
406 masterSets.add(mstrSet);
407 setsMap.put(addedSet, mstrSet);
408 continue SETS_LOOP;
409 }
410 }
411 }
412
413 // create the set in the master project if it does not exist
414 String description = (String) addedSet.getOwnSlotValue(addedKPU.getSetDescriptionSlot());
415 SimpleInstance masterSet = (SimpleInstance) masterKB.createInstance(null, masterKPU.getSetCls());
416 if (name != null)
417 masterSet.setOwnSlotValue(masterKPU.getSetNameSlot(), name);
418 if (description != null)
419 masterSet.setOwnSlotValue(masterKPU.getSetDescriptionSlot(), description);
420 masterSets.add(masterSet);
421 setsMap.put(addedSet, masterSet);
422 }
423 return masterSets;
424 }
425
426 private SimpleInstance getMasterAnnotator(SimpleInstance addedAnnotator) {
427 if (annotatorMap.containsKey(addedAnnotator))
428 return annotatorMap.get(addedAnnotator);
429
430 if (addedAnnotator != null) {
431 String addedAnnotatorName = addedAnnotator.getName();
432 System.out.println("addedAnnotatorName=" + addedAnnotatorName);
433 System.out.println("frame id = " + addedAnnotator.getFrameID().toString());
434
435 SimpleInstance masterAnnotator = (SimpleInstance) masterKB.getInstance(addedAnnotatorName);
436
437 if (masterAnnotator != null && masterAnnotator.hasType(masterKPU.getAnnotatorCls())) {
438 annotatorMap.put(addedAnnotator, masterAnnotator);
439 return masterAnnotator;
440 } else {
441 if (addedAnnotator.hasType(addedKB.getCls("knowtator human annotator"))) {
442 String affiliation = (String) addedAnnotator.getOwnSlotValue(addedKB
443 .getSlot("knowtator_annotation_annotator_affiliation"));
444 String firstName = (String) addedAnnotator.getOwnSlotValue(addedKB
445 .getSlot("knowtator_annotation_annotator_firstname"));
446 String lastName = (String) addedAnnotator.getOwnSlotValue(addedKB
447 .getSlot("knowtator_annotation_annotator_lastname"));
448
449 Cls masterAnnotatorCls = masterKB.getCls("knowtator human annotator");
450 masterAnnotator = (SimpleInstance) masterKB.createInstance(null, masterAnnotatorCls);
451 masterAnnotator.setOwnSlotValue(masterKB.getSlot("knowtator_annotation_annotator_affiliation"),
452 affiliation);
453 masterAnnotator.setOwnSlotValue(masterKB.getSlot("knowtator_annotation_annotator_firstname"),
454 firstName);
455 masterAnnotator.setOwnSlotValue(masterKB.getSlot("knowtator_annotation_annotator_lastname"),
456 lastName);
457
458 annotatorMap.put(addedAnnotator, masterAnnotator);
459 return masterAnnotator;
460 } else if (addedAnnotator.hasType(addedKB.getCls("knowtator annotator team"))) {
461 String teamName = (String) addedAnnotator.getOwnSlotValue(addedKB
462 .getSlot("knowtator_annotator_team_name"));
463 Collection addedTeamMembers = addedAnnotator.getOwnSlotValues(addedKB
464 .getSlot("knowtator_annotator_team_members"));
465 Collection<SimpleInstance> masterTeamMembers = new ArrayList<SimpleInstance>();
466 for (Object teamMember : addedTeamMembers) {
467 masterTeamMembers.add(getMasterAnnotator((SimpleInstance) teamMember));
468 }
469
470 Cls masterAnnotatorCls = masterKB.getCls("knowtator annotator team");
471 masterAnnotator = (SimpleInstance) masterKB.createInstance(null, masterAnnotatorCls);
472 masterAnnotator.setOwnSlotValue(masterKB.getSlot("knowtator_annotator_team_name"), teamName);
473 masterAnnotator.setOwnSlotValues(masterKB.getSlot("knowtator_annotator_team_members"),
474 masterTeamMembers);
475 annotatorMap.put(addedAnnotator, masterAnnotator);
476 return masterAnnotator;
477 }
478 }
479 }
480 return null;
481 }
482
483 public static void mergeAnnotations(Component parent, Project masterProject, TextSourceUtil masterTextSourceUtil) {
484 int option = JOptionPane
485 .showConfirmDialog(
486 parent,
487 "Select 'OK' to proceed with merging annotation projects.\n"
488 + "Please make an archive of your Protege project and consult available documentation before using this feature.\n"
489 + "Loading and merging the annotations from the Protege project may take some time.\n"
490 + "Please be patient!", "Merge annotation projects", JOptionPane.OK_CANCEL_OPTION);
491 if (option == JOptionPane.OK_OPTION) {
492 JFileChooser chooser = new JFileChooser();
493 chooser.setFileFilter(new ExtensionFilter(".pprj", "Protege projects"));
494 chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
495 int returnVal = chooser.showOpenDialog(parent);
496 if (returnVal == JFileChooser.APPROVE_OPTION) {
497 File file = chooser.getSelectedFile();
498 ArrayList errors = new ArrayList();
499 System.out.println("file.getPath()= " + file.getPath());
500 parent.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
501 Project addedProject = new Project(file.getPath(), errors);
502 parent.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
503 option = JOptionPane.showConfirmDialog(parent, "Project loaded into memory. Proceed with merging?",
504 "Proceed?", JOptionPane.OK_CANCEL_OPTION);
505
506 if (option == JOptionPane.OK_OPTION) {
507 try {
508 MergeAnnotations merge = new MergeAnnotations(addedProject, masterProject,
509 masterTextSourceUtil, parent);
510
511 SimpleInstance addedFilter = (SimpleInstance) DisplayUtilities.pickInstance(parent,
512 CollectionUtilities.createCollection(addedProject.getKnowledgeBase().getCls(
513 KnowtatorProjectUtil.FILTER_CLS_NAME)),
514 "Select filter for annotations to add from selected project.");
515 if (addedFilter == null)
516 return;
517
518 Collection<SimpleInstance> textSources = ProtegeUtil.castSimpleInstances(DisplayUtilities
519 .pickInstances(parent, addedProject.getKnowledgeBase(), CollectionUtilities
520 .createCollection(addedProject.getKnowledgeBase().getCls(
521 KnowtatorProjectUtil.TEXT_SOURCE_CLS_NAME)),
522 "Select text sources that contain annotations you want to add."));
523 if (textSources == null || textSources.size() == 0)
524 return;
525
526 merge.mergeAnnotations(addedFilter, textSources);
527
528 JOptionPane
529 .showMessageDialog(
530 parent,
531 "Merge completed without error. To save merged annotations, save the Protege project.",
532 "Merge Completion", JOptionPane.INFORMATION_MESSAGE);
533 } catch (Exception tsae) {
534 tsae.printStackTrace();
535 JOptionPane.showMessageDialog(parent,
536 "Merge caused an exception to be thrown. Please discard changes caused by aborted merge\n"
537 + "by closing the project without saving changes.\n" + tsae.getMessage());
538 }
539 }
540 }
541 }
542 }
543 }
544
545 // public static void main(String[] args)
546 // {
547 // public static void mergeAnnotations(Project addedProject,
548 // Project masterProject,
549 // TextSourceUtil textSourceUtil)
550 // throws Exception
551 //
552 // String addedProjectFileName = args[0];
553 // String masterProjectFileName = args[0];
554 // String grifLinesTSCFileName = args[1];
555 // String filterInstanceName = args[2];
556 // String log4jConfigurationFileName = args[3];
557 //
558 // PropertyConfigurator.configure(log4jConfigurationFileName);
559 //
560 //
561 // // GRIFFileLinesTextSourceCollection tsc = new
562 // GRIFFileLinesTextSourceCollection(grifLinesTSCFileName);
563 // GRIFTextSourceCollection tsc = new
564 // GRIFTextSourceCollection(grifLinesTSCFileName);
565 //
566 // ArrayList errors = new ArrayList();
567 // Project project = new Project(protegeProjectFileName, errors);
568 // if(errors.isEmpty())
569 // {
570 // System.out.println("Protege project loaded without error.");
571 // }
572 // else
573 // {
574 // System.out.println("Protege project loaded with errors.");
575 // for(int i=0; i<errors.size();i++)
576 // {
577 // System.out.println("errors.get(i)="+errors.get(i));
578 // }
579 // }
580 //
581 // }
582
583 // Instance masterAnnotationSet = null;
584 // Instance addedAnnotationSet =
585 // (Instance)(addedAnnotation.getOwnSlotValue(addedKPU.getSetSlot()));
586 // if(addedAnnotationSet != null)
587 // {
588 // String addedAnnotationSetName = addedAnnotationSet.getName();
589 // masterAnnotationSet = masterKB.getInstance(addedAnnotationSetName);
590 // }
591 //
592 // SimpleInstance masterAnnotation = masterAnnotationUtil.createAnnotation(
593 // null,
594 // masterAnnotator,
595 // spans,
596 // masterTextSourceInstance,
597 // masterAnnotationSet);
598