jawecontroller.java
来自「jawe的最新版本,基于Java的图形化工作流编辑器。图形化工作流编辑器 。使用」· Java 代码 · 共 1,644 行 · 第 1/5 页
JAVA
1,644 行
xpdlId = mainPackage.getId(); } JaWEManager.getInstance() .getLoggingManager() .info("JaWEController -> closing package " + xpdlId); if (mainPackage != null && mainPackage.getId().equals(xpdlId)) { String filePath = JaWEManager.getInstance() .getXPDLHandler() .getAbsoluteFilePath(mainPackage); List allPackages = new ArrayList(xpdlhandler.getAllPackages()); List notToClose = new ArrayList(); for (int i = 0; i < allPackages.size(); i++) { Package pkg = (Package) allPackages.get(i); if (!pkg.isTransient() || closeTransient) { xpdlhandler.closePackageVersion(pkg.getId(), pkg.getInternalVersion()); } else { notToClose.add(pkg); } } allPackages.removeAll(notToClose); setChanged(); XPDLElementChangeInfo info = createInfo(mainPackage, allPackages, XMLElementChangeInfo.REMOVED); info.setOldValue(filePath); notifyObservers(info); clearXPDLListenerObservables(closeTransient); } JaWEManager.getInstance().getLoggingManager().info("JaWEController -> package " + xpdlId + " closed"); // xpdlhandler.printDebug(); updateTitle(); frame.repaint(); adjustActions(); System.gc(); } public boolean isSaveEnabled(boolean isSaveAs) { if (getMainPackageId() != null) { if (isSaveAs) return true; return isPackageModified(getMainPackageId()); } return false; } public void savePackage(String xpdlId, String filename) { XPDLHandler xpdlhandler = JaWEManager.getInstance().getXPDLHandler(); Package pkg = xpdlhandler.getPackageById(xpdlId); String oldFilename = xpdlhandler.getAbsoluteFilePath(pkg); try { // if SaveAs was performed and the document was previously saved, // change ExternalPackage's relative paths boolean isNewFile = !filename.equals(oldFilename); if (oldFilename != null && isNewFile) { boolean crossRefs = JaWEManager.getInstance() .getXPDLUtils() .doesCrossreferenceExist(pkg); int r = JOptionPane.YES_OPTION; if (crossRefs) { r = JOptionPane.showConfirmDialog(getJaWEFrame(), settings.getLanguageDependentString("MessageCrossReferenceExistDoYouWantToProceed"), getJaWEFrame().getAppTitle(), JOptionPane.YES_NO_OPTION); } if (r == JOptionPane.YES_OPTION) { updateExternalPackagesRelativePaths(pkg, filename); } else { // JaWEManager.getInstance().getJaWEController().setFilename(null); return; } } Document document = null; DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder dbuilder = dbf.newDocumentBuilder(); document = dbuilder.newDocument(); // retrieve the file writter RandomAccessFile raf = xpdlhandler.getRaf(pkg); // output stream will either be the FileOutputStream in the // case of save as, or the ByteArrayOutputStream if we are // saving an existing file OutputStream os; if (isNewFile) { // try to open random access file as rw, if it fails // the saving shouldn't occur try { File f = new File(filename); RandomAccessFile r = new RandomAccessFile(f, "rw"); FileLock flck = r.getChannel().tryLock(); flck.release(); r.close(); // Harald Meister // this exception happens when using jdk1.4 under Linux // if it happens, just catch it and proceed with saving // because Linux with jdk1.4.0 doesn't support locking } catch (IOException ioe) { // ioe.printStackTrace(); // this happens when the locking fails, and null is returned, // and after that release method is called on the null; // This means that the file we want to save the given // package as, is already locked, so we do not allow saving } catch (NullPointerException npe) { // npe.printStackTrace(); throw new Exception(); } // if we are at this point, this means either the locking // succeeded, or we use jdk1.4 under Linux that does not // support locking os = new FileOutputStream(filename); } else { os = new ByteArrayOutputStream(); } // Here we get all document elements set JaWEManager.getInstance() .getXPDLHandler() .getXPDLRepositoryHandler() .toXML(document, pkg); // Use a Transformer for output TransformerFactory tFactory = TransformerFactory.newInstance(); Transformer transformer = tFactory.newTransformer(); transformer.setOutputProperty("indent", "yes"); transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4"); transformer.setOutputProperty("encoding", settings.getEncoding()); DOMSource source = new DOMSource(document); StreamResult result = new StreamResult(os); transformer.transform(source, result); if (!isNewFile && raf != null && os instanceof ByteArrayOutputStream) { if (raf != null) { // must go to the beginning - otherwise, it will not // truncate the file correctly in some Java-OS combination raf.seek(0); raf.getChannel().truncate(0); raf.write(((ByteArrayOutputStream) os).toByteArray()); } } os.close(); XPDLListenerAndObservable xpdl = getXPDLListenerObservable(pkg); if (xpdl != null) { xpdl.setModified(false); } if (isNewFile) { xpdlhandler.registerPackageFilename(filename, pkg); } try { System.setProperty("user.dir", xpdlhandler.getParentDirectory(pkg)); } catch (Exception ex) { ex.printStackTrace(); } // try { // JaWE.getInstance().addToRecentFiles(filename); // } catch (Exception ex) {} } catch (NonWritableChannelException nwcex) { nwcex.printStackTrace(); getJaWEFrame().message(settings.getLanguageDependentString("ErrorCannotSaveReadOnlyFile"), JOptionPane.ERROR_MESSAGE); } catch (Exception ex) { ex.printStackTrace(); getJaWEFrame().message(settings.getLanguageDependentString("ErrorCannotSaveDocument"), JOptionPane.ERROR_MESSAGE); // ex.printStackTrace(); } // xpdlhandler.printDebug(); // XPDLElementChangeInfo info = createInfo(pkg, XPDLElementChangeInfo.SELECTED); // sendEvent(info); updateTitle(); adjustActions(); } /* * Method for closing document. Returns true if the user really wants to close. Gives * chance to save work. */ public boolean tryToClosePackage(String xpdlId, boolean closeTransient) { if (xpdlId == null) xpdlId = getMainPackageId(); if (xpdlId == null) return true; int r = JOptionPane.NO_OPTION; boolean modified = isPackageModified(xpdlId); String filename = getPackageFilename(xpdlId); if (modified || filename == null) { r = JOptionPane.showConfirmDialog(getJaWEFrame(), settings.getLanguageDependentString("DialogSaveChanges"), getJaWEFrame().getAppTitle(), JOptionPane.YES_NO_CANCEL_OPTION); } if (r == JOptionPane.YES_OPTION) { String dialogTitle = settings.getLanguageDependentString("Save" + BarFactory.LABEL_POSTFIX); if (filename == null) { dialogTitle = settings.getLanguageDependentString("SaveAs" + BarFactory.LABEL_POSTFIX); } if (filename == null) { filename = getJaWEFrame().saveDialog(dialogTitle, 0, xpdlId); } savePackage(xpdlId, filename); if (isPackageModified(xpdlId)) { r = JOptionPane.CANCEL_OPTION; } } if (r == JOptionPane.CANCEL_OPTION) { // getWindow().dispose(); return false; } closePackage(xpdlId, closeTransient); return true; } protected XPDLListenerAndObservable createNewXPDLListenerObservable(Package pkg, boolean receiveEvents, boolean modified) { XPDLListenerAndObservable xpdl = new XPDLListenerAndObservable(pkg, receiveEvents); xpdl.setModified(modified); xpdlListenerObservables.add(xpdl); xpdl.addObserver(this); return xpdl; } protected XPDLListenerAndObservable getXPDLListenerObservable(Package pkg) { Iterator it = xpdlListenerObservables.iterator(); while (it.hasNext()) { XPDLListenerAndObservable xpdl = (XPDLListenerAndObservable) it.next(); if (xpdl.getPackage() == pkg) { return xpdl; } } return null; } protected XPDLListenerAndObservable getWorkingXPDLListenerObservable() { Iterator it = xpdlListenerObservables.iterator(); while (it.hasNext()) { XPDLListenerAndObservable xpdl = (XPDLListenerAndObservable) it.next(); if (xpdl.getPackage() == selectionMng.getWorkingPKG()) { return xpdl; } } return null; } protected void changePackageId(Package pkg, String oldId, String newId) { XPDLHandler xpdlhandler = JaWEManager.getInstance().getXPDLHandler(); xpdlhandler.changePackageId(pkg, oldId, newId); } protected void updateExternalPackagesRelativePaths(Package pkg, String newFilename) { XPDLHandler xpdlhandler = JaWEManager.getInstance().getXPDLHandler(); File f = new File(newFilename); String parentF = f.getParent(); Path newPath = new Path(parentF); Iterator eps = pkg.getExternalPackages().toElements().iterator(); while (eps.hasNext()) { ExternalPackage ep = (ExternalPackage) eps.next(); String oldRelativePath = ep.getHref(); try { Package extP = xpdlhandler.getExternalPackageByRelativeFilePath(oldRelativePath, pkg); String oldFullPath = xpdlhandler.getAbsoluteFilePath(extP); String relativePath = Path.getRelativePath(new Path(oldFullPath), newPath); // System.out.println("RP="+relativePath); ep.setHref(XMLUtil.replaceBackslashesWithSlashes(relativePath)); } catch (Exception ex) { System.err.println("Failed to update old external package's relative path " + oldRelativePath + " for main package " + pkg.getId() + " with a new filename " + newFilename); // ex.printStackTrace(); } } } // ////////////////////////// END Of XPDL File Handling ///////////////////// public XPDLElementChangeInfo createInfo(XMLElement el, int action) { XPDLElementChangeInfo info = new XPDLElementChangeInfo(); info.setChangedElement(el); info.setAction(action); info.setSource(this); return info; } public XPDLElementChangeInfo createInfo(XMLElement main, List elements, int action) { XPDLElementChangeInfo info = new XPDLElementChangeInfo(); info.setChangedElement(main); info.setChangedSubElements(elements); info.setAction(action); info.setSource(this); return info; } public boolean canCreateElement(XMLCollection col, boolean checkReadOnly) { if (checkReadOnly && col.isReadOnly()) { return false; } if (col instanceof TransitionRestrictions || col instanceof TransitionRefs || col instanceof ExternalPackages) { return false; } if (col instanceof Responsibles) { Map m = JaWEManager.getInstance() .getXPDLUtils() .getPossibleResponsibles((Responsibles) col, null); if (m.size() == 0) { return false; } } if (col instanceof Tools) { Map m = XMLUtil.getPossibleApplications(XMLUtil.getWorkflowProcess(col), JaWEManager.getInstance()
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?