public Component getListCellRendererComponent( JList list, Object value, int index, boolean isSelected, boolean hasFocus) { Component comp = super.getListCellRendererComponent(list, value, index, isSelected, hasFocus()); if (!(value instanceof GKInstance)) return comp; String text = null; GKInstance instance = (GKInstance) value; text = instance.getDisplayName(); if (text == null || (text != null && text.length() == 0)) { text = instance.getExtendedDisplayName(); } String type = (String) typeMap.get(instance); if (type == DELETE_IN_DB_KEY) setIcon(deleteInDBIcon); else if (type == DELETE_KEY) setIcon(deleteIcon); else if (type == NEW_KEY) setIcon(newInstanceIcon); else if (type == NEW_CHANGE_IN_DB_KEY) setIcon(dbChangeIcon); else if (type == NEW_CHANGE_IN_LOCAL_KEY) setIcon(newChangeIcon); else if (type == CONFLICT_CHANGE_KEY || type == LOCAL_HAS_MORE_IE_KEY) setIcon(conflictIcon); else setIcon(icon); if (text == null) { text = ""; setIcon(null); } setText(text); if (text.length() > 0) setToolTipText(text); else setToolTipText(null); return comp; }
/** * Overlay a single disease reaction onto a normal reaction. * * @param normalReaction * @param diseaseReaction * @param overlaidObjects */ private void overlayDiseaseReaction(HyperEdge normalReaction, GKInstance diseaseReaction) throws Exception { // Make a copy of the HyperEdge for future process that is related to Vertex and JSON generation HyperEdge reactionCopy = normalReaction.shallowCopy(); reactionCopy.setReactomeId(diseaseReaction.getDBID()); reactionCopy.setDisplayName(diseaseReaction.getDisplayName()); reactionCopy.setLineColor(DefaultRenderConstants.DEFAULT_DISEASE_BACKGROUND); displayedObject.addComponent(reactionCopy); overlaidObjects.add(reactionCopy); // Want to handle inputs, outputs and catalysts since regulators can // be ignored List<Node> nodes = new ArrayList<Node>(); nodes.addAll(normalReaction.getInputNodes()); nodes.addAll(normalReaction.getOutputNodes()); nodes.addAll(normalReaction.getHelperNodes()); // List objects not listed in the disease reaction as crossed objects Set<GKInstance> participants = InstanceUtilities.getReactionParticipants(diseaseReaction); Set<Long> diseaseIds = new HashSet<Long>(); for (GKInstance participant : participants) { diseaseIds.add(participant.getDBID()); if (participant.getSchemClass().isValidAttribute(ReactomeJavaConstants.hasMember)) { List<GKInstance> list = participant.getAttributeValuesList(ReactomeJavaConstants.hasMember); if (list != null && list.size() > 0) { for (GKInstance inst : list) diseaseIds.add(inst.getDBID()); } } if (participant.getSchemClass().isValidAttribute(ReactomeJavaConstants.hasCandidate)) { List<GKInstance> list = participant.getAttributeValuesList(ReactomeJavaConstants.hasCandidate); if (list != null && list.size() > 0) { for (GKInstance inst : list) diseaseIds.add(inst.getDBID()); } } } Set<GKInstance> lofInstances = new HashSet<GKInstance>(); Map<Node, GKInstance> normalToDiseaseEntity = mapMutatedToNormalNodes(diseaseReaction, normalReaction, nodes, lofInstances); for (Node node : nodes) { if (!diseaseIds.contains(node.getReactomeId())) { // Check if it should be mapped to a normal entity GKInstance diseaseEntity = normalToDiseaseEntity.get(node); if (diseaseEntity == null) crossedObjects.add(node); // Just crossed out else { Node diseaseNode = replaceNormalNode(node, diseaseEntity, contains(diseaseEntity, lofInstances)); if (diseaseNode == null) continue; // Just in case // Re-link to diseaseNode ConnectInfo connectInfo = reactionCopy.getConnectInfo(); List<?> widgets = connectInfo.getConnectWidgets(); for (Object obj : widgets) { ConnectWidget widget = (ConnectWidget) obj; if (widget.getConnectedNode() == node) widget.replaceConnectedNode(diseaseNode); } } } else overlaidObjects.add(node); } }
private boolean isLOFEntity(GKInstance ef) throws Exception { GKInstance pe = (GKInstance) ef.getAttributeValue(ReactomeJavaConstants.physicalEntity); if (pe == null) return false; GKInstance functionalStatus = (GKInstance) ef.getAttributeValue(ReactomeJavaConstants.functionalStatus); if (functionalStatus != null) { String fsName = functionalStatus.getDisplayName(); if (fsName.contains("loss_of_function") || fsName.contains("decreased_")) return true; } return false; }
private void convertReactomeToGPML(GKInstance pathway, String outputFileName) throws Exception { Long dbID = pathway.getDBID(); System.out.println("converting pathway #" + dbID + " " + pathway.getDisplayName() + "..."); Document doc = r2gConverter.convertPathway(pathway); XMLOutputter outputter = new XMLOutputter(Format.getPrettyFormat()); outputter.output(doc, new FileOutputStream(outputFileName)); /* // Test loading using JDOM and validation SAXBuilder builder = new SAXBuilder(true); builder.setFeature("http://apache.org/xml/features/validation/schema", true); builder.setProperty("http://apache.org/xml/properties/schema/external-schemaLocation", "http://genmapp.org/GPML/2008a http://svn.bigcat.unimaas.nl/pathvisio/trunk/GPML2008a.xsd"); doc = builder.build(new File(outputFileName)); */ }
private Node replaceNormalNode( Node normalNode, GKInstance diseaseEntity, Boolean needDashedBorder) { Node diseaseNode = normalToDiseaseNode.get(normalNode); if (diseaseNode != null) return diseaseNode; try { // If a node exists already, it should use for (Renderable r : diseaseComps) { if (diseaseEntity.getDBID().equals(r.getReactomeId()) && r instanceof Node) { // This is rather arbitrary: if two nodes are very close, // use the existing one. int dx = Math.abs(r.getPosition().x - normalNode.getPosition().x); int dy = Math.abs(r.getPosition().y - normalNode.getPosition().y); if (dx < 10 && dy < 10) { // We don't need to create a new Node if it exists already normalToDiseaseNode.put(normalNode, (Node) r); overlaidObjects.add(r); // Add it to overlaid object to cover edges return (Node) r; } } } diseaseNode = normalNode.getClass().newInstance(); RenderUtility.copyRenderInfo(normalNode, diseaseNode); // The following should NOT be called since NodeAttachment is // related to disease entity only. // TODO: Need to support this. Currently it is not supported!!! See example // in PI3/AKT cancer pathway. // diseaseNode.setNodeAttachmentsLocally(node.getNodeAttachments()); diseaseNode.setDisplayName(diseaseEntity.getDisplayName()); diseaseNode.setReactomeId(diseaseEntity.getDBID()); diseaseNode.invalidateBounds(); diseaseNode.setRenderer(normalNode.getRenderer()); diseaseNode.setLineColor(DefaultRenderConstants.DEFAULT_DISEASE_BACKGROUND); diseaseNode.setNeedDashedBorder(needDashedBorder); RenderUtility.hideCompartmentInNodeName(diseaseNode); overlaidObjects.add(diseaseNode); displayedObject.addComponent(diseaseNode); normalToDiseaseNode.put(normalNode, diseaseNode); return diseaseNode; } catch (Exception e) { e.printStackTrace(); } return null; }
private void showComparison() { // Find the instance that can be used for comparision. This instance // should be chosen from changedList or localHasUnexpInstance GKInstance instance = null; if (changedList != null) { // Check changedList first List selection = changedList.getSelection(); if (selection.size() > 0) instance = (GKInstance) selection.get(0); } if (instance == null && localHasMoreIEList != null) { List selection = localHasMoreIEList.getSelection(); if (selection.size() > 0) instance = (GKInstance) selection.get(0); } if (instance == null) return; final InstanceComparisonPane comparisonPane = new InstanceComparisonPane(); // Fine tune comparison pane for making comparisons with // database comparisonPane.setSaveDialogHideUnusedButtons(true); comparisonPane.setSaveDialogSaveAsNewBtnFirst(false); comparisonPane.setSaveDialogSaveAsNewBtnTitle( "Create new local instance and put merge into that"); comparisonPane.setSaveDialogReplaceFirstBtnTitle( "Overwrite existing instance with merge (recommended)"); comparisonPane.setCloseAfterSaving(true); try { String clsName = instance.getSchemClass().getName(); Long instanceId = instance.getDBID(); final GKInstance localCopy = fileAdaptor.fetchInstance(clsName, instanceId); dbAdaptor.setUseCache(false); // final GKInstance dbCopy = dbAdaptor.fetchInstance(clsName, instanceId); // The class type might be changed locally or remotely. So not clsName should be used // to fetch database instance. Otherwise, null exception will be thrown. The same thing // is done also in creating synchronization result. final GKInstance dbCopy = dbAdaptor.fetchInstance(instanceId); dbAdaptor.setUseCache(true); comparisonPane.setInstances(localCopy, dbCopy); String title = "Comparing Instances \"" + instance.getDisplayName() + "\" in the local and DB repositories"; JDialog parentDialog = (JDialog) SwingUtilities.getAncestorOfClass(JDialog.class, centerPane); final JDialog dialog = new JDialog(parentDialog, title); // Try to update the list automatically dialog.addWindowListener( new WindowAdapter() { public void windowClosed(WindowEvent e) { handleMergeResult(localCopy, dbCopy, comparisonPane); // To prevent double calling. It is called again when parentDialog is closed. dialog.removeWindowListener(this); } }); dialog.getContentPane().add(comparisonPane, BorderLayout.CENTER); dialog.setModal(true); dialog.setSize(800, 600); GKApplicationUtilities.center(dialog); dialog.setVisible(true); // Update synchronization dialog panels depending on user // choice. if (comparisonPane.getSaveMergeOption() == InstanceComparisonPane.SAVE_AS_NEW) { GKInstance merged = comparisonPane.getMerged(); if (newList == null) { List list = new ArrayList(); list.add(merged); newList = initInstanceListPane(list, "Instances created locally: " + list.size()); } else newList.addInstance(merged); } else if (comparisonPane.getSaveMergeOption() == InstanceComparisonPane.OVERWRITE_FIRST) { dbAdaptor.setUseCache(false); GKInstance remoteCopy = dbAdaptor.fetchInstance(instance.getDBID()); dbAdaptor.setUseCache(true); if (remoteCopy != null) { InstanceComparer comparer = new InstanceComparer(); int reply = comparer.compare(instance, remoteCopy); if (reply == InstanceComparer.LOCAL_HAS_MORE_IE) { if (localHasMoreIEList == null) { List list = new ArrayList(); list.add(instance); localHasMoreIEList = initInstanceListPane( list, "Local instances having unexpected InstanceEdits: " + list.size()); } else localHasMoreIEList.addInstance(instance); } else if (reply == InstanceComparer.IS_IDENTICAL) { // Merge has made local and database copies // identical - don't need to check in anymore changedList.deleteInstance(instance); } else if (reply != InstanceComparer.NEW_CHANGE_IN_LOCAL) { // Merge has produced a conflict typeMap.put(mapCompareResultToString(reply), instance); } else // The user should now be allowed to commit this // instance, because it will now have changed. commitToDBAction.setEnabled(true); JOptionPane.showMessageDialog( parentDialog, "Merge successful, you will need to check the merged instance into the database.\n\n", "Merge OK", JOptionPane.INFORMATION_MESSAGE); } } } catch (Exception e1) { System.err.println("Synchronization.createDisplayMapPane(): " + e1); e1.printStackTrace(); JOptionPane.showMessageDialog( this, "Error in comparing: " + instance.toString(), "Error in Comparing", JOptionPane.ERROR_MESSAGE); } }
/** * A simple helper method to get a file name for gpml output. * * @param pathway * @return */ private String getFileName(GKInstance pathway) { return pathway.getDisplayName().replaceAll("[^0-9A-Za-z()_-]+", " ") + ".gpml"; }