/*************************************************** * * cismet GmbH, Saarbruecken, Germany * * ... and it just works. * ****************************************************/ package Sirius.navigator.method; import Sirius.navigator.connection.SessionManager; import Sirius.navigator.exception.ConnectionException; import Sirius.navigator.exception.ExceptionManager; import Sirius.navigator.exception.SqlConnectionException; import Sirius.navigator.tools.CloneHelper; import Sirius.navigator.types.iterator.TreeNodeIterator; import Sirius.navigator.types.iterator.TreeNodeRestriction; import Sirius.navigator.types.treenode.ClassTreeNode; import Sirius.navigator.types.treenode.DefaultMetaTreeNode; import Sirius.navigator.types.treenode.ObjectTreeNode; import Sirius.navigator.ui.ComponentRegistry; import Sirius.navigator.ui.attributes.editor.AttributeEditor; import Sirius.navigator.ui.tree.MetaCatalogueTree; import Sirius.navigator.ui.tree.SearchResultsTree; import Sirius.server.localserver.method.Method; import Sirius.server.middleware.types.Link; import Sirius.server.middleware.types.MetaClass; import Sirius.server.middleware.types.MetaObject; import Sirius.server.middleware.types.MetaObjectNode; import Sirius.server.middleware.types.Node; import Sirius.server.newuser.User; import Sirius.server.newuser.UserGroup; import Sirius.server.newuser.permission.Permission; import org.apache.log4j.Logger; import java.beans.PropertyChangeListener; import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import java.util.Iterator; import java.util.Vector; import javax.swing.JOptionPane; import javax.swing.tree.DefaultTreeModel; import javax.swing.tree.TreeNode; import javax.swing.tree.TreePath; import de.cismet.cids.dynamics.CidsBean; import de.cismet.cids.editors.NavigatorAttributeEditorGui; import de.cismet.cids.server.search.MetaObjectNodeServerSearch; import de.cismet.lookupoptions.gui.OptionsDialog; import de.cismet.tools.gui.StaticSwingTools; /** * DOCUMENT ME! * * @version $Revision$, $Date$ */ public class MethodManager { //~ Static fields/initializers --------------------------------------------- // availability public static final long NONE = 0; public static final long PURE_NODE = 1; public static final long CLASS_NODE = 2; public static final long OBJECT_NODE = 4; public static final long MULTIPLE = 8; public static final long CLASS_MULTIPLE = 16; public static final long WRITE = 32; public static final long SINGLE = 64; private static final Logger logger = Logger.getLogger(MethodManager.class); private static MethodManager manager = null; private static final Object blocker = new Object(); //~ Instance fields -------------------------------------------------------- protected MetaClass[] classArray = null; protected MetaObject[] objectArray = null; protected Vector methodVector = new Vector(5, 1); protected boolean wrongParameters = false; //~ Constructors ----------------------------------------------------------- /** * Creates a new MethodManager object. */ private MethodManager() { } //~ Methods ---------------------------------------------------------------- /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public static final MethodManager getManager() { synchronized (blocker) { if (manager == null) { manager = new MethodManager(); } return manager; } } /** * DOCUMENT ME! */ public static final void destroy() { synchronized (blocker) { logger.warn("destroying singelton MethodManager instance"); // NOI18N manager = null; } } /** * DOCUMENT ME! * * @param methodID DOCUMENT ME! * * @return DOCUMENT ME! */ protected Method getMethod(final String methodID) { Method tmpMethod = null; for (int i = 0; i < methodVector.size(); i++) { tmpMethod = (Method)methodVector.elementAt(i); if (String.valueOf(tmpMethod.getID()).equals(methodID)) { return tmpMethod; } } return null; } /** * DOCUMENT ME! */ public void callSpecialTreeCommand() { if (ComponentRegistry.getRegistry().getActiveCatalogue() instanceof SearchResultsTree) { ((SearchResultsTree)ComponentRegistry.getRegistry().getActiveCatalogue()).removeSelectedResultNodes(); } else if (ComponentRegistry.getRegistry().getActiveCatalogue() instanceof MetaCatalogueTree) { final DefaultMetaTreeNode[] selectedTreeNodes = ComponentRegistry.getRegistry() .getActiveCatalogue() .getSelectedNodesArray(); if ((selectedTreeNodes != null) && (selectedTreeNodes.length > 0)) { final Node[] selectedNodes = new Node[selectedTreeNodes.length]; for (int i = 0; i < selectedTreeNodes.length; i++) { selectedNodes[i] = selectedTreeNodes[i].getNode(); } ComponentRegistry.getRegistry().getSearchResultsTree().setResultNodes(selectedNodes, true, null); } else { JOptionPane.showMessageDialog(ComponentRegistry.getRegistry().getMainWindow(), org.openide.util.NbBundle.getMessage( MethodManager.class, "MethodManager.callSpecialTreeCommand().JOptionPane_anon2.message"), // NOI18N org.openide.util.NbBundle.getMessage( MethodManager.class, "MethodManager.callSpecialTreeCommand().JOptionPane_anon2.title"), // NOI18N JOptionPane.INFORMATION_MESSAGE); } } } /** * DOCUMENT ME! */ public void showSearchResults() { ComponentRegistry.getRegistry().getGUIContainer().select(ComponentRegistry.SEARCHRESULTS_TREE); } /** * Shows the options dialog. */ public void showOptionsDialog() { final OptionsDialog optionsDialog = ComponentRegistry.getRegistry().getOptionsDialog(); optionsDialog.pack(); StaticSwingTools.showDialog(optionsDialog); } /** * DOCUMENT ME! */ public void showQueryResultProfileManager() { } /** * DOCUMENT ME! */ public void showPluginManager() { StaticSwingTools.showDialog(ComponentRegistry.getRegistry().getPluginManager()); } /** * DOCUMENT ME! */ public void showSearchDialog() // throws Exception { } /** * DOCUMENT ME! */ public void showQueryProfilesManager() // throws Exception { } /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public MethodAvailability getMethodAvailability() { long availability = NONE; final Collection nodes = ComponentRegistry.getRegistry().getActiveCatalogue().getSelectedNodes(); final HashSet classKeys = new HashSet(); int i = 0; try { if ((nodes != null) && (nodes.size() > 0)) { final TreeNodeIterator iterator = new TreeNodeIterator(nodes, new TreeNodeRestriction()); while (iterator.hasNext()) { final DefaultMetaTreeNode node = iterator.next(); if (node.isPureNode() && ((PURE_NODE & availability) == 0)) { availability += PURE_NODE; } else if (node.isClassNode() && ((CLASS_NODE & availability) == 0)) { availability += CLASS_NODE; classKeys.add(((ClassTreeNode)node).getKey()); } else if (node.isObjectNode() && ((OBJECT_NODE & availability) == 0)) { availability += OBJECT_NODE; classKeys.add(((ObjectTreeNode)node).getMetaClass().getKey()); } } i++; } } catch (Throwable t) { logger.error("getAvailability() could not comute availabilty", t); // NOI18N availability = 0; } if (i > 0) { availability += MULTIPLE; } if (classKeys.size() > 1) { availability += CLASS_MULTIPLE; } return new MethodAvailability(classKeys, availability); } /** * DOCUMENT ME! * * @param serverSearch DOCUMENT ME! * @param resultNodes The results to display in the SearchResultsTree. * @param append Whether to append the search results or not. */ public void showSearchResults(final MetaObjectNodeServerSearch serverSearch, final Node[] resultNodes, final boolean append) { showSearchResults(serverSearch, resultNodes, append, null); } /** * DOCUMENT ME! * * @param serverSearch DOCUMENT ME! * @param resultNodes DOCUMENT ME! * @param append DOCUMENT ME! * @param searchResultsTreeListener DOCUMENT ME! */ public void showSearchResults(final MetaObjectNodeServerSearch serverSearch, final Node[] resultNodes, final boolean append, final PropertyChangeListener searchResultsTreeListener) { showSearchResults(serverSearch, resultNodes, append, searchResultsTreeListener, false); } /** * DOCUMENT ME! * * @param serverSearch DOCUMENT ME! * @param resultNodes The results to display in the SearchResultsTree. * @param append Whether to append the search results or not. * @param searchResultsTreeListener A listener which will be informed about status changes of search thread. * Usually a SearchControlPanel. * @param simpleSort if true, sorts the search results alphabetically. Usually set to false, as a * more specific sorting order is wished. */ public void showSearchResults(final MetaObjectNodeServerSearch serverSearch, final Node[] resultNodes, final boolean append, final PropertyChangeListener searchResultsTreeListener, final boolean simpleSort) { showSearchResults(serverSearch, resultNodes, append, searchResultsTreeListener, simpleSort, true); } /** * DOCUMENT ME! * * @param serverSearch DOCUMENT ME! * @param resultNodes The results to display in the SearchResultsTree. * @param append Whether to append the search results or not. * @param searchResultsTreeListener A listener which will be informed about status changes of search thread. * Usually a SearchControlPanel. * @param simpleSort if true, sorts the search results alphabetically. Usually set to false, as a * more specific sorting order is wished. * @param sortActive if false, no sort will be done (the value of simpleSort will be ignored, if * sortActive is false) */ public void showSearchResults(final MetaObjectNodeServerSearch serverSearch, final Node[] resultNodes, final boolean append, final PropertyChangeListener searchResultsTreeListener, final boolean simpleSort, final boolean sortActive) { if ((resultNodes == null) || (resultNodes.length < 1)) { JOptionPane.showMessageDialog(ComponentRegistry.getRegistry().getMainWindow(), org.openide.util.NbBundle.getMessage( MethodManager.class, "MethodManager.showSearchResults(Node[],boolean).JOptionPane_anon.message"), // NOI18N org.openide.util.NbBundle.getMessage( MethodManager.class, "MethodManager.showSearchResults(Node[],boolean).JOptionPane_anon.title"), // NOI18N JOptionPane.WARNING_MESSAGE); } else { ComponentRegistry.getRegistry() .getSearchResultsTree() .setResultNodes(resultNodes, append, searchResultsTreeListener, simpleSort, sortActive); ComponentRegistry.getRegistry().getSearchResultsTree().setUnderlyingSearch(serverSearch); this.showSearchResults(); } } // Tree Operationen ........................................................ /** * destinationNode = parentNode. * * @param metaTree DOCUMENT ME! * @param destinationNode DOCUMENT ME! * @param sourceNode DOCUMENT ME! * * @return DOCUMENT ME! */ public boolean updateNode(final MetaCatalogueTree metaTree, final DefaultMetaTreeNode destinationNode, final DefaultMetaTreeNode sourceNode) { try { if (logger.isInfoEnabled()) { logger.info("updateNode() updating node " + sourceNode); // NOI18N } // zuerst l\u00F6schen SessionManager.getProxy().deleteNode(sourceNode.getNode()); // dann neu einf\u00FCgen this.addNode(metaTree, destinationNode, sourceNode); return true; } catch (Exception exp) { logger.error("deleteNode() could not update node " + sourceNode, exp); // NOI18N // XXX i18n ExceptionManager.getManager() .showExceptionDialog( ExceptionManager.WARNING, org.openide.util.NbBundle.getMessage( MethodManager.class, "MethodManager.updateNode(MetaCatalogueTree,DefaultMetaTreeNode,DefaultMetaTreeNode).ExceptionManager_anon.title"), // NOI18N org.openide.util.NbBundle.getMessage( MethodManager.class, "MethodManager.updateNode(MetaCatalogueTree,DefaultMetaTreeNode,DefaultMetaTreeNode).ExceptionManager_anon.message", sourceNode), // NOI18N exp); } return false; } /** * DOCUMENT ME! * * @param metaTree DOCUMENT ME! * @param sourceNode DOCUMENT ME! * * @return DOCUMENT ME! */ public boolean deleteNode(final MetaCatalogueTree metaTree, final DefaultMetaTreeNode sourceNode) { return deleteNode(metaTree, sourceNode, true); } /** * DOCUMENT ME! * * @param metaTree DOCUMENT ME! * @param sourceNode DOCUMENT ME! * @param withQuestion DOCUMENT ME! * * @return DOCUMENT ME! */ public boolean deleteNode(final MetaCatalogueTree metaTree, final DefaultMetaTreeNode sourceNode, final boolean withQuestion) { boolean ans = false; if (withQuestion) { final int option; final boolean nodeCurrentlyEdited = isTreeNodeAlsoOpenInEditor(sourceNode); option = showOptionDialogDeleteNode(sourceNode, nodeCurrentlyEdited); // discard the editor if (nodeCurrentlyEdited && (option == JOptionPane.YES_OPTION)) { final AttributeEditor editor = ComponentRegistry.getRegistry().getAttributeEditor(); if (editor instanceof NavigatorAttributeEditorGui) { ((NavigatorAttributeEditorGui)editor).cancelEditing(); } else { ComponentRegistry.getRegistry().getAttributeEditor().cancel(); } } ans = (option == JOptionPane.YES_OPTION); } if (!withQuestion || ans) // NOI18N { try { if (logger.isInfoEnabled()) { logger.info("deleteNode() deleting node " + sourceNode); // NOI18N } ComponentRegistry.getRegistry() .getMainWindow() .setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.WAIT_CURSOR)); SessionManager.getProxy().deleteNode(sourceNode.getNode()); if (sourceNode.isObjectNode()) { if (logger.isDebugEnabled()) { logger.debug("deleting object node's meta object"); // NOI18N } final MetaObject MetaObject = ((ObjectTreeNode)sourceNode).getMetaObject(); SessionManager.getProxy().deleteMetaObject(MetaObject, MetaObject.getDomain()); } ComponentRegistry.getRegistry() .getMainWindow() .setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.DEFAULT_CURSOR)); this.deleteTreeNode(metaTree, sourceNode); return true; } catch (Exception exp) { logger.error("deleteNode() could not delete node " + sourceNode, exp); // NOI18N ComponentRegistry.getRegistry() .getMainWindow() .setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.DEFAULT_CURSOR)); if (exp instanceof SqlConnectionException) { final ArrayList<String> messages = new ArrayList<String>(); messages.add(exp.getMessage()); for (final StackTraceElement elem : exp.getStackTrace()) { messages.add(elem.toString()); } ExceptionManager.getManager() .showExceptionDialog( ExceptionManager.WARNING, org.openide.util.NbBundle.getMessage( MethodManager.class, "MethodManager.deleteNode(MetaCatalogueTree,DefaultMetaTreeNode).ExceptionManager_anon.title"), org.openide.util.NbBundle.getMessage( MethodManager.class, "MethodManager.deleteNode(MetaCatalogueTree,DefaultMetaTreeNode).ExceptionManager_anon.sql.message", sourceNode, exp.getMessage()), messages); } else { ExceptionManager.getManager() .showExceptionDialog( ExceptionManager.WARNING, org.openide.util.NbBundle.getMessage( MethodManager.class, "MethodManager.deleteNode(MetaCatalogueTree,DefaultMetaTreeNode).ExceptionManager_anon.title"), // NOI18N org.openide.util.NbBundle.getMessage( MethodManager.class, "MethodManager.deleteNode(MetaCatalogueTree,DefaultMetaTreeNode).ExceptionManager_anon.message", sourceNode), // NOI18N exp); } } } return false; } /** * DOCUMENT ME! * * @param sourceNode DOCUMENT ME! * * @return DOCUMENT ME! */ private boolean isTreeNodeAlsoOpenInEditor(final DefaultMetaTreeNode sourceNode) { final Node selectedNode = sourceNode.getNode(); if (!(selectedNode instanceof MetaObjectNode)) { return false; } final MetaObject selectedObject = ((MetaObjectNode)selectedNode).getObject(); final CidsBean selectedBeanInTree = selectedObject.getBean(); final AttributeEditor editor = ComponentRegistry.getRegistry().getAttributeEditor(); if (!(editor instanceof NavigatorAttributeEditorGui)) { return false; } final MetaObject objectInEditor = ((NavigatorAttributeEditorGui)editor).getEditorObject(); if (objectInEditor == null) { return false; } final CidsBean beanInEditor = objectInEditor.getBean(); return selectedBeanInTree.equals(beanInEditor); } /** * DOCUMENT ME! * * @param sourceNode DOCUMENT ME! * @param nodeCurrentlyEdited DOCUMENT ME! * * @return DOCUMENT ME! */ private int showOptionDialogDeleteNode(final DefaultMetaTreeNode sourceNode, final boolean nodeCurrentlyEdited) { final String suffix = nodeCurrentlyEdited ? ".currentlyEdited" : ""; return JOptionPane.showOptionDialog( ComponentRegistry.getRegistry().getMainWindow(), org.openide.util.NbBundle.getMessage( MethodManager.class, "MethodManager.showOptionDialogDeleteNode(DefaultMetaTreeNode,boolean).JOptionPane_anon.message" + suffix, new Object[] { String.valueOf(sourceNode) }), // NOI18N org.openide.util.NbBundle.getMessage( MethodManager.class, "MethodManager.showOptionDialogDeleteNode(DefaultMetaTreeNode,boolean).JOptionPane_anon.title" + suffix), // NOI18N JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, new String[] { org.openide.util.NbBundle.getMessage( MethodManager.class, "MethodManager.showOptionDialogDeleteNode(DefaultMetaTreeNode,boolean).JOptionPane_anon.option.commit" + suffix), // NOI18N org.openide.util.NbBundle.getMessage( MethodManager.class, "MethodManager.showOptionDialogDeleteNode(DefaultMetaTreeNode,boolean).JOptionPane_anon.option.cancel" + suffix) }, // NOI18N org.openide.util.NbBundle.getMessage( MethodManager.class, "MethodManager.showOptionDialogDeleteNode(DefaultMetaTreeNode,boolean).JOptionPane_anon.option.commit" + suffix)); } /** * DOCUMENT ME! * * @param metaTree DOCUMENT ME! * @param destinationNode DOCUMENT ME! * @param sourceNode DOCUMENT ME! * * @return DOCUMENT ME! */ public boolean addNode(final MetaCatalogueTree metaTree, final DefaultMetaTreeNode destinationNode, final DefaultMetaTreeNode sourceNode) { return this.addOrLinkNode(metaTree, destinationNode, sourceNode, false); } /** * DOCUMENT ME! * * @param metaTree DOCUMENT ME! * @param destinationNode DOCUMENT ME! * @param sourceNode DOCUMENT ME! * * @return DOCUMENT ME! */ public boolean copyNode(final MetaCatalogueTree metaTree, final DefaultMetaTreeNode destinationNode, final DefaultMetaTreeNode sourceNode) { if (logger.isInfoEnabled()) { logger.info("copy node " + sourceNode + " -> " + destinationNode); // NOI18N } if (JOptionPane.YES_NO_OPTION == JOptionPane.showOptionDialog( ComponentRegistry.getRegistry().getMainWindow(), org.openide.util.NbBundle.getMessage( MethodManager.class, "MethodManager.copyNode(MetaCatalogueTree,DefaultMetaTreeNode,DefaultMetaTreeNode).JOptionPane_anon.message", sourceNode, destinationNode), // NOI18N org.openide.util.NbBundle.getMessage( MethodManager.class, "MethodManager.copyNode(MetaCatalogueTree,DefaultMetaTreeNode,DefaultMetaTreeNode).JOptionPane_anon.title"), // NOI18N JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, new String[] { org.openide.util.NbBundle.getMessage( MethodManager.class, "MethodManager.copyNode(MetaCatalogueTree,DefaultMetaTreeNode,DefaultMetaTreeNode).JOptionPane_anon.option.commit"), // NOI18N org.openide.util.NbBundle.getMessage( MethodManager.class, "MethodManager.copyNode(MetaCatalogueTree,DefaultMetaTreeNode,DefaultMetaTreeNode).JOptionPane_anon.option.cancel") }, // NOI18N org.openide.util.NbBundle.getMessage( MethodManager.class, "MethodManager.copyNode(MetaCatalogueTree,DefaultMetaTreeNode,DefaultMetaTreeNode).JOptionPane_anon.option.commit"))) // NOI18N { try { // copy node final DefaultMetaTreeNode sourceNodeCopy = (DefaultMetaTreeNode)CloneHelper.clone(sourceNode); if (sourceNode instanceof ObjectTreeNode) { final MetaObject oldMetaObject = ((ObjectTreeNode)sourceNodeCopy).getMetaObject(); // oldMetaObject.setPrimaryKey(new Integer(-1)); oldMetaObject.setPrimaryKeysNull(); if (logger.isInfoEnabled()) { logger.info("copy node(): copy meta object: " + oldMetaObject.getName()); // NOI18N } final MetaObject newMetaObject = SessionManager.getProxy() .insertMetaObject(oldMetaObject, sourceNodeCopy.getDomain()); // neues objekt zuweisen ((ObjectTreeNode)sourceNodeCopy).setMetaObject(newMetaObject); } if (this.addNode(metaTree, destinationNode, sourceNodeCopy)) { this.addTreeNode(metaTree, destinationNode, sourceNodeCopy); return true; } } catch (Exception exp) { logger.error("could not create copy of node " + sourceNode, exp); // NOI18N ExceptionManager.getManager() .showExceptionDialog( ExceptionManager.WARNING, org.openide.util.NbBundle.getMessage( MethodManager.class, "MethodManager.copyNode(MetaCatalogueTree,DefaultMetaTreeNode,DefaultMetaTreeNode).ExceptionManager_anon.title"), // NOI18N org.openide.util.NbBundle.getMessage( MethodManager.class, "MethodManager.copyNode(MetaCatalogueTree,DefaultMetaTreeNode,DefaultMetaTreeNode).ExceptionManager_anon.message", sourceNode), // NOI18N exp); } } return false; } /** * DOCUMENT ME! * * @param metaTree DOCUMENT ME! * @param destinationNode DOCUMENT ME! * @param sourceNode DOCUMENT ME! * * @return DOCUMENT ME! */ public boolean moveNode(final MetaCatalogueTree metaTree, final DefaultMetaTreeNode destinationNode, final DefaultMetaTreeNode sourceNode) { if (logger.isInfoEnabled()) { logger.info("move node " + sourceNode + " -> " + destinationNode); // NOI18N } if (JOptionPane.YES_NO_OPTION == JOptionPane.showOptionDialog( ComponentRegistry.getRegistry().getMainWindow(), org.openide.util.NbBundle.getMessage( MethodManager.class, "MethodManager.moveNode(MetaCatalogueTree,DefaultMetaTreeNode,DefaultMetaTreeNode).JOptionPane_anon.message", sourceNode, destinationNode), // NOI18N org.openide.util.NbBundle.getMessage( MethodManager.class, "MethodManager.moveNode(MetaCatalogueTree,DefaultMetaTreeNode,DefaultMetaTreeNode).JOptionPane_anon.title"), // NOI18N JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, new String[] { org.openide.util.NbBundle.getMessage( MethodManager.class, "MethodManager.moveNode(MetaCatalogueTree,DefaultMetaTreeNode,DefaultMetaTreeNode).JOptionPane_anon.option.commit"), // NOI18N org.openide.util.NbBundle.getMessage( MethodManager.class, "MethodManager.moveNode(MetaCatalogueTree,DefaultMetaTreeNode,DefaultMetaTreeNode).JOptionPane_anon.option.cancel") }, // NOI18N org.openide.util.NbBundle.getMessage( MethodManager.class, "MethodManager.moveNode(MetaCatalogueTree,DefaultMetaTreeNode,DefaultMetaTreeNode).JOptionPane_anon.option.commit"))) // NOI18N { try { final DefaultMetaTreeNode sourceParentNode = (DefaultMetaTreeNode)sourceNode.getParent(); ComponentRegistry.getRegistry() .getMainWindow() .setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.WAIT_CURSOR)); SessionManager.getProxy().deleteLink(sourceParentNode.getNode(), sourceNode.getNode()); this.deleteTreeNode(metaTree, sourceNode); SessionManager.getProxy().addLink(destinationNode.getNode(), sourceNode.getNode()); this.addTreeNode(metaTree, destinationNode, sourceNode); // destinationNode.explore(); ComponentRegistry.getRegistry() .getMainWindow() .setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.DEFAULT_CURSOR)); } catch (Exception exp) { logger.error("addNode() could not add node"); // NOI18N ComponentRegistry.getRegistry() .getMainWindow() .setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.DEFAULT_CURSOR)); ExceptionManager.getManager() .showExceptionDialog( ExceptionManager.WARNING, org.openide.util.NbBundle.getMessage( MethodManager.class, "MethodManager.moveNode(MetaCatalogueTree,DefaultMetaTreeNode,DefaultMetaTreeNode).ExceptionManager_anon.title"), // NOI18N org.openide.util.NbBundle.getMessage( MethodManager.class, "MethodManager.moveNode(MetaCatalogueTree,DefaultMetaTreeNode,DefaultMetaTreeNode).ExceptionManager_anon.message", sourceNode), // NOI18N exp); } } return false; } /** * TreeNode Merhoden. * * @param metaTree DOCUMENT ME! * @param destinationNode DOCUMENT ME! * @param sourceNode DOCUMENT ME! */ public void addTreeNode(final MetaCatalogueTree metaTree, final DefaultMetaTreeNode destinationNode, final DefaultMetaTreeNode sourceNode) { if (destinationNode.isLeaf()) { if (logger.isDebugEnabled()) { logger.debug("addTreeNode() destinationNode " + destinationNode + " is leaf"); // NOI18N } destinationNode.setLeaf(false); } // int childCount = destinationNode.getChildCount(); destinationNode.add(sourceNode); final int pos = destinationNode.getIndex(sourceNode); ((DefaultTreeModel)metaTree.getModel()).nodesWereInserted(destinationNode, new int[] { pos }); // aufklappen ... destinationNode.setExplored(true); metaTree.setSelectionPath(new TreePath(sourceNode.getPath())); } /** * DOCUMENT ME! * * @param metaTree DOCUMENT ME! * @param sourceNode DOCUMENT ME! */ public void deleteTreeNode(final MetaCatalogueTree metaTree, final DefaultMetaTreeNode sourceNode) { final DefaultMetaTreeNode sourceParentNode = (DefaultMetaTreeNode)sourceNode.getParent(); final Object[] removedChildren = new Object[] { sourceNode }; if (logger.isDebugEnabled()) { logger.debug("removing child node '" + sourceNode + "' from parent node '" + sourceParentNode + "'"); // NOI18N } final int[] childIndices = this.getChildIndices(sourceParentNode, sourceNode); sourceNode.removeFromParent(); ((DefaultTreeModel)metaTree.getModel()).nodesWereRemoved(sourceParentNode, childIndices, removedChildren); } /** * Hilfsmethoden ........................................................... * * @param metaTree DOCUMENT ME! * @param destinationNode DOCUMENT ME! * @param sourceNode DOCUMENT ME! * @param linkOnly DOCUMENT ME! * * @return DOCUMENT ME! */ private boolean addOrLinkNode(final MetaCatalogueTree metaTree, final DefaultMetaTreeNode destinationNode, final DefaultMetaTreeNode sourceNode, final boolean linkOnly) { try { if (linkOnly) { if (logger.isDebugEnabled()) { logger.debug("addOrLinkNode(): linking node: " + sourceNode); // NOI18N } ComponentRegistry.getRegistry() .getMainWindow() .setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.WAIT_CURSOR)); SessionManager.getProxy().addLink(destinationNode.getNode(), sourceNode.getNode()); ComponentRegistry.getRegistry() .getMainWindow() .setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.DEFAULT_CURSOR)); } else { Link link; if (destinationNode != null) { link = new Link(destinationNode.getID(), destinationNode.getDomain()); } else { logger.warn("addNode(): node '" + sourceNode + "' has no parent node'"); // NOI18N link = new Link(-1, sourceNode.getDomain()); } if (logger.isDebugEnabled()) { logger.debug("addOrLinkNode(): adding node: " + sourceNode); // NOI18N } ComponentRegistry.getRegistry() .getMainWindow() .setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.WAIT_CURSOR)); final Node node = SessionManager.getProxy().addNode(sourceNode.getNode(), link); node.setPermissions(destinationNode.getNode().getPermissions()); ComponentRegistry.getRegistry() .getMainWindow() .setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.DEFAULT_CURSOR)); sourceNode.setNode(node); } // this.addTreeNode(metaTree, destinationNode, sourceNode); return true; } catch (ConnectionException cexp) { logger.error("addOrLinkNode() could not add node " + sourceNode, cexp); // NOI18N ComponentRegistry.getRegistry() .getMainWindow() .setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.DEFAULT_CURSOR)); ExceptionManager.getManager() .showExceptionDialog( ExceptionManager.WARNING, org.openide.util.NbBundle.getMessage( MethodManager.class, "MethodManager.addOrLinkNode(MetaCatalogueTree,DefaultMetaTreeNode,DefaultMetaTreeNode,boolean).ExceptionManager_anon.title"), // NOI18N org.openide.util.NbBundle.getMessage( MethodManager.class, "MethodManager.addOrLinkNode(MetaCatalogueTree,DefaultMetaTreeNode,DefaultMetaTreeNode,boolean).ExceptionManager_anon.message", sourceNode), // NOI18N cexp); } return false; } /** * DOCUMENT ME! * * @param metaTree DOCUMENT ME! * @param destinationNode DOCUMENT ME! * @param sourceNode DOCUMENT ME! * * @return DOCUMENT ME! */ public boolean linkNode(final MetaCatalogueTree metaTree, final DefaultMetaTreeNode destinationNode, final DefaultMetaTreeNode sourceNode) { if (logger.isInfoEnabled()) { logger.info("link node " + sourceNode + " -> " + destinationNode); // NOI18N } if (JOptionPane.YES_NO_OPTION == JOptionPane.showOptionDialog( ComponentRegistry.getRegistry().getMainWindow(), org.openide.util.NbBundle.getMessage( MethodManager.class, "MethodManager.linkNode(MetaCatalogueTree,DefaultMetaTreeNode,DefaultMetaTreeNode).JOptionPane_anon.message", sourceNode, destinationNode), // NOI18N org.openide.util.NbBundle.getMessage( MethodManager.class, "MethodManager.linkNode(MetaCatalogueTree,DefaultMetaTreeNode,DefaultMetaTreeNode).JOptionPane_anon.title"), // NOI18N JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, new String[] { org.openide.util.NbBundle.getMessage( MethodManager.class, "MethodManager.linkNode(MetaCatalogueTree,DefaultMetaTreeNode,DefaultMetaTreeNode).JOptionPane_anon.option.commit"), // NOI18N org.openide.util.NbBundle.getMessage( MethodManager.class, "MethodManager.linkNode(MetaCatalogueTree,DefaultMetaTreeNode,DefaultMetaTreeNode).JOptionPane_anon.option.cancel") }, // NOI18N org.openide.util.NbBundle.getMessage( MethodManager.class, "MethodManager.linkNode(MetaCatalogueTree,DefaultMetaTreeNode,DefaultMetaTreeNode).JOptionPane_anon.option.commit"))) // NOI18N { try { // copy node final DefaultMetaTreeNode sourceNodeCopy = (DefaultMetaTreeNode)CloneHelper.clone(sourceNode); if (this.addOrLinkNode(metaTree, destinationNode, sourceNodeCopy, true)) { this.addTreeNode(metaTree, destinationNode, sourceNodeCopy); return true; } } catch (CloneNotSupportedException cnse) { logger.error("could not create copy of linked node " + sourceNode, cnse); // NOI18N ExceptionManager.getManager() .showExceptionDialog( ExceptionManager.WARNING, org.openide.util.NbBundle.getMessage( MethodManager.class, "MethodManager.linkNode(MetaCatalogueTree,DefaultMetaTreeNode,DefaultMetaTreeNode).ExceptionManager_anon.title"), // NOI18N org.openide.util.NbBundle.getMessage( MethodManager.class, "MethodManager.linkNode(MetaCatalogueTree,DefaultMetaTreeNode,DefaultMetaTreeNode).ExceptionManager_anon.message", sourceNode), // NOI18N cnse); } } return false; } /** * DOCUMENT ME! * * @param sourceParentNode DOCUMENT ME! * @param sourceNode DOCUMENT ME! * * @return DOCUMENT ME! */ private int[] getChildIndices(final TreeNode sourceParentNode, final TreeNode sourceNode) { for (int i = 0; i < sourceParentNode.getChildCount(); i++) { if (sourceParentNode.getChildAt(i).equals(sourceNode)) { return new int[] { i }; } } logger.warn("getChildIndices() child index of node " + sourceNode + " not found in parent node " + sourceParentNode); // NOI18N return new int[] { -1 }; } /** * DOCUMENT ME! * * @param node DOCUMENT ME! * @param permission DOCUMENT ME! * * @return DOCUMENT ME! */ public boolean checkPermission(final Node node, final Permission permission) { boolean hasPermission = false; final User user = SessionManager.getSession().getUser(); final UserGroup userGroup = user.getUserGroup(); if (userGroup != null) { hasPermission = checkPermission(node, permission, userGroup); } else { for (final UserGroup potentialUserGroup : user.getPotentialUserGroups()) { if (checkPermission(node, permission, potentialUserGroup)) { hasPermission = true; break; } } } if (!hasPermission) { JOptionPane.showMessageDialog(ComponentRegistry.getRegistry().getMainWindow(), org.openide.util.NbBundle.getMessage( MethodManager.class, "MethodManager.checkPermission(Node,Permission).JOptionPane_anon.message"), // NOI18N org.openide.util.NbBundle.getMessage( MethodManager.class, "MethodManager.checkPermission(Node,Permission).JOptionPane_anon.title"), // NOI18N JOptionPane.INFORMATION_MESSAGE); } return hasPermission; } /** * DOCUMENT ME! * * @param node DOCUMENT ME! * @param permission DOCUMENT ME! * @param userGroup DOCUMENT ME! * * @return DOCUMENT ME! */ private boolean checkPermission(final Node node, final Permission permission, final UserGroup userGroup) { boolean hasPermission = false; try { final String key = userGroup.getKey().toString(); hasPermission = node.getPermissions().hasPermission(key, permission); if (logger.isDebugEnabled()) { logger.debug("Permissions for node" + node + " " + node.getPermissions() + " with key" + key); // NOI18N } } catch (Exception exp) { logger.error("checkPermission(): could not check permission '" + permission + "' of node '" + node + "'", exp); // NOI18N hasPermission = false; } return hasPermission; } /** * DOCUMENT ME! * * @param node DOCUMENT ME! * @param permission DOCUMENT ME! * * @return DOCUMENT ME! */ public boolean checkPermission(final MetaObjectNode node, final Permission permission) { boolean hasPermission = false; final User user = SessionManager.getSession().getUser(); final UserGroup userGroup = user.getUserGroup(); if (userGroup != null) { hasPermission = checkPermission(node, permission, userGroup); } else { for (final UserGroup potentialUserGroup : user.getPotentialUserGroups()) { if (checkPermission(node, permission, potentialUserGroup)) { hasPermission = true; break; } } } if (!hasPermission) { JOptionPane.showMessageDialog(ComponentRegistry.getRegistry().getMainWindow(), org.openide.util.NbBundle.getMessage( MethodManager.class, "MethodManager.checkPermission(MetaObjectNode,Permission).JOptionPane_anon.message"), // NOI18N org.openide.util.NbBundle.getMessage( MethodManager.class, "MethodManager.checkPermission(MetaObjectNode,Permission).JOptionPane_anon.title"), // NOI18N JOptionPane.INFORMATION_MESSAGE); } return hasPermission; } /** * DOCUMENT ME! * * @param node DOCUMENT ME! * @param permission DOCUMENT ME! * @param userGroup DOCUMENT ME! * * @return DOCUMENT ME! */ private boolean checkPermission(final MetaObjectNode node, final Permission permission, final UserGroup userGroup) { boolean hasPermission = false; try { final String key = userGroup.getKey().toString(); final MetaClass c = SessionManager.getProxy().getMetaClass(node.getClassId(), node.getDomain()); // wenn MON dann editieren wenn Rechte am Knoten und and der Klasse hasPermission = c.getPermissions().hasPermission(key, permission); hasPermission &= node.getPermissions().hasPermission(key, permission); // und am Objekt hasPermission &= node.getObject().getBean().hasObjectWritePermission(SessionManager.getSession().getUser()); if (logger.isDebugEnabled()) { logger.debug("Check ClassPermissions for node" + node + " " + c.getPermissions() + " with key" + key); // NOI18N } } catch (Exception exp) { logger.error("checkPermission(): could not check permission '" + permission + "' of node '" + node + "'", exp); // NOI18N hasPermission = false; } return hasPermission; } /** * Durchsucht ein MetaObject nach leeren Attributen. * * @param MetaObject das MetaObject, dass durchsucht werden soll * * @return der Name des leeren Attributs oder null falls kein leeres Attribut gefunden wurde */ public String findEmptyAttributes(final MetaObject MetaObject) { return this.findEmptyAttributes(MetaObject.getAttributes().values().iterator()); } /** * DOCUMENT ME! * * @param attributeIterator DOCUMENT ME! * * @return DOCUMENT ME! */ private String findEmptyAttributes(final Iterator attributeIterator) { String attributeName = null; while (attributeIterator.hasNext() && (attributeName == null)) { final Sirius.server.localserver.attribute.Attribute attribute = (Sirius.server.localserver.attribute.Attribute)attributeIterator.next(); if (!attribute.isPrimaryKey() && attribute.isOptional()) { if (attribute.getValue() != null) { if (attribute.getValue() instanceof MetaObject) { attributeName = this.findEmptyAttributes((MetaObject)attribute.getValue()); } } else // if (attribute.referencesObject())/* if attribute.value == null*/ { try { if (logger.isDebugEnabled()) { logger.debug("looking for default value for mandantory attribute '" + attribute.getName() + "'"); // NOI18N } // Woraround Anfang if (attribute.isOptional()) { if (logger.isDebugEnabled()) { logger.debug(attribute.getName() + "is optional. Set it to null"); // NOI18N } attribute.setValue(null); attributeName = null; } // Workaround Ende } catch (Exception exp) { logger.error("could net set default value of attribute '" + attribute.getName() + "'", exp); // NOI18N attributeName = attribute.getName(); } } } } return attributeName; } }