@Override public ReturnCode save(final Item item, final boolean careDependency) { ReturnCode rc = new ReturnCode(); RepositoryWorkUnit<Object> repositoryWorkUnit = new RepositoryWorkUnit<Object>("save DQRule item") { // $NON-NLS-1$ @Override protected void run() throws LoginException, PersistenceException { TDQBusinessRuleItem ruleItem = (TDQBusinessRuleItem) item; DQRule rule = ruleItem.getDqrule(); // MOD yyi 2012-02-07 TDQ-4621:Update dependencies(connection) when careDependency is // true. if (careDependency) { saveWithDependencies(ruleItem, rule); } else { saveWithoutDependencies(ruleItem, rule); } } }; repositoryWorkUnit.setAvoidUnloadResources(true); ProxyRepositoryFactory.getInstance().executeRepositoryWorkUnit(repositoryWorkUnit); try { repositoryWorkUnit.throwPersistenceExceptionIfAny(); } catch (PersistenceException e) { log.error(e, e); rc.setOk(Boolean.FALSE); rc.setMessage(e.getMessage()); } return rc; }
public void importItemRecords( final IProgressMonitor progressMonitor, final ResourcesManager resManager, final List<ImportItem> checkedItemRecords, final boolean overwrite, final ImportItem[] allImportItemRecords, final IPath destinationPath) throws InvocationTargetException { TimeMeasure.display = CommonsPlugin.isDebugMode(); TimeMeasure.displaySteps = CommonsPlugin.isDebugMode(); TimeMeasure.measureActive = CommonsPlugin.isDebugMode(); TimeMeasure.begin("ImportingItems"); // $NON-NLS-1$ /* * Re-order the import items according to the priority of extension point. */ final List<IImportItemsHandler> importItemHandlersList = new ArrayList<IImportItemsHandler>(Arrays.asList(getImportHandlers())); Collections.sort( checkedItemRecords, new Comparator<ImportItem>() { @Override public int compare(ImportItem o1, ImportItem o2) { IImportItemsHandler importHandler1 = o1.getImportHandler(); IImportItemsHandler importHandler2 = o2.getImportHandler(); if (importHandler1 != null && importHandler2 != null) { int index1 = importItemHandlersList.indexOf(importHandler1); int index2 = importItemHandlersList.indexOf(importHandler2); if (index1 > -1 && index2 > -1) { // both found return index1 - index2; } } return 0; } }); ImportCacheHelper importCacheHelper = ImportCacheHelper.getInstance(); try { // cache importCacheHelper.beforeImportItems(); if (resManager == null || checkedItemRecords.isEmpty()) { return; } progressMonitor.beginTask( Messages.getString("ImportExportHandlersManager_importingItemsMessage"), checkedItemRecords.size() * 2 + 1); // $NON-NLS-1$ /* * FIXME ????? why need sort it? * * Maybe, Have done by priority for import handler, so no need. */ // Collections.sort(itemRecords, new Comparator<ImportItem>() { // // @Override // public int compare(ImportItem o1, ImportItem o2) { // if (o1.getProperty().getItem() instanceof RoutineItem && o2.getProperty().getItem() // instanceof // RoutineItem) { // return 0; // } else if (!(o1.getProperty().getItem() instanceof RoutineItem) // && !(o2.getProperty().getItem() instanceof RoutineItem)) { // return 0; // } else if (o1.getProperty().getItem() instanceof RoutineItem) { // return -1; // } else { // return 1; // } // } // }); // RepositoryWorkUnit repositoryWorkUnit = new RepositoryWorkUnit( Messages.getString( "ImportExportHandlersManager_importingItemsMessage")) { //$NON-NLS-1$ @Override public void run() throws PersistenceException { final IWorkspaceRunnable op = new IWorkspaceRunnable() { @Override public void run(final IProgressMonitor monitor) throws CoreException { // pre import preImport( monitor, resManager, checkedItemRecords.toArray(new ImportItem[0]), allImportItemRecords); // bug 10520 final Set<String> overwriteDeletedItems = new HashSet<String>(); final Set<String> idDeletedBeforeImport = new HashSet<String>(); Map<String, String> nameToIdMap = new HashMap<String, String>(); for (ImportItem itemRecord : checkedItemRecords) { if (monitor.isCanceled()) { return; } if (itemRecord.isValid()) { if (itemRecord.getState() == State.ID_EXISTED) { String id = nameToIdMap.get( itemRecord.getProperty().getLabel() + ERepositoryObjectType.getItemType( itemRecord.getProperty().getItem()) .toString()); if (id == null) { /* * if id exsist then need to genrate new id for this job,in this case the * job won't override the old one */ id = EcoreUtil.generateUUID(); nameToIdMap.put( itemRecord.getProperty().getLabel() + ERepositoryObjectType.getItemType( itemRecord.getProperty().getItem()) .toString(), id); } itemRecord.getProperty().setId(id); } } } try { importItemRecordsWithRelations( monitor, resManager, checkedItemRecords, overwrite, allImportItemRecords, destinationPath, overwriteDeletedItems, idDeletedBeforeImport); } catch (Exception e) { if (Platform.inDebugMode()) { ExceptionHandler.process(e); } throw new CoreException( new Status( IStatus.ERROR, FrameworkUtil.getBundle(this.getClass()).getSymbolicName(), Messages.getString( "ImportExportHandlersManager_importingItemsError"), e)); //$NON-NLS-1$ } if (PluginChecker.isJobLetPluginLoaded()) { IJobletProviderService service = (IJobletProviderService) GlobalServiceRegister.getDefault() .getService(IJobletProviderService.class); if (service != null) { service.loadComponentsFromProviders(); } } ImportCacheHelper.getInstance().checkDeletedFolders(); monitor.done(); TimeMeasure.step( "importItemRecords", "before save"); // $NON-NLS-1$ //$NON-NLS-2$ if (RelationshipItemBuilder.getInstance().isNeedSaveRelations()) { RelationshipItemBuilder.getInstance().saveRelations(); TimeMeasure.step( "importItemRecords", "save relations"); // $NON-NLS-1$ //$NON-NLS-2$ } else { // only save the project here if no relation need to be saved, since project // will // already be // saved // with relations try { final IProxyRepositoryFactory factory = CoreRuntimePlugin.getInstance().getProxyRepositoryFactory(); factory.saveProject(ProjectManager.getInstance().getCurrentProject()); } catch (PersistenceException e) { if (Platform.inDebugMode()) { ExceptionHandler.process(e); } throw new CoreException( new Status( IStatus.ERROR, FrameworkUtil.getBundle(this.getClass()).getSymbolicName(), Messages.getString( "ImportExportHandlersManager_importingItemsError"), e)); //$NON-NLS-1$ } TimeMeasure.step( "importItemRecords", "save project"); // $NON-NLS-1$//$NON-NLS-2$ } // post import List<ImportItem> importedItemRecords = ImportCacheHelper.getInstance().getImportedItemRecords(); postImport( monitor, resManager, importedItemRecords.toArray(new ImportItem[0])); } private void importItemRecordsWithRelations( final IProgressMonitor monitor, final ResourcesManager manager, final List<ImportItem> processingItemRecords, final boolean overwriting, ImportItem[] allPopulatedImportItemRecords, IPath destinationPath, final Set<String> overwriteDeletedItems, final Set<String> idDeletedBeforeImport) throws Exception { for (ImportItem itemRecord : processingItemRecords) { if (monitor.isCanceled()) { return; } if (itemRecord.isImported()) { continue; // have imported } try { final IImportItemsHandler importHandler = itemRecord.getImportHandler(); if (importHandler != null && itemRecord.isValid()) { List<ImportItem> relatedItemRecord = importHandler.findRelatedImportItems( monitor, manager, itemRecord, allPopulatedImportItemRecords); // import related items first if (importHandler.isPriorImportRelatedItem()) { if (!relatedItemRecord.isEmpty()) { importItemRecordsWithRelations( monitor, manager, relatedItemRecord, overwriting, allPopulatedImportItemRecords, destinationPath, overwriteDeletedItems, idDeletedBeforeImport); } } if (monitor.isCanceled()) { return; } // will import importHandler.doImport( monitor, manager, itemRecord, overwriting, destinationPath, overwriteDeletedItems, idDeletedBeforeImport); if (monitor.isCanceled()) { return; } // if import related items behind current item if (!importHandler.isPriorImportRelatedItem()) { if (!relatedItemRecord.isEmpty()) { importItemRecordsWithRelations( monitor, manager, relatedItemRecord, overwriting, allPopulatedImportItemRecords, destinationPath, overwriteDeletedItems, idDeletedBeforeImport); } } importHandler.afterImportingItems(monitor, manager, itemRecord); // record the imported items with related items too. ImportCacheHelper.getInstance() .getImportedItemRecords() .add(itemRecord); monitor.worked(1); } } catch (Exception e) { // ???, PTODO if there one error, need throw error or not. if (Platform.inDebugMode()) { // FIXME, catch the exception, and don't block others to import itemRecord.addError(e.getMessage()); // same the the ImportBasicHandler.logError ImportCacheHelper.getInstance().setImportingError(true); ExceptionHandler.process(e); } } } } }; IWorkspace workspace = ResourcesPlugin.getWorkspace(); try { ISchedulingRule schedulingRule = workspace.getRoot(); // the update the project files need to be done in the workspace runnable to avoid // all // notification // of changes before the end of the modifications. workspace.run(op, schedulingRule, IWorkspace.AVOID_UPDATE, progressMonitor); } catch (CoreException e) { if (Platform.inDebugMode()) { ExceptionHandler.process(e); } } } }; repositoryWorkUnit.setAvoidUnloadResources(true); repositoryWorkUnit.setUnloadResourcesAfterRun(true); ProxyRepositoryFactory.getInstance().executeRepositoryWorkUnit(repositoryWorkUnit); progressMonitor.done(); if (ImportCacheHelper.getInstance().hasImportingError()) { throw new InvocationTargetException( new CoreException( new Status( IStatus.ERROR, FrameworkUtil.getBundle(this.getClass()).getSymbolicName(), Messages.getString( "ImportExportHandlersManager_importingItemsError")))); //$NON-NLS-1$ } } finally { // cache importCacheHelper.afterImportItems(); // TimeMeasure.end("ImportingItems"); // $NON-NLS-1$ TimeMeasure.display = false; TimeMeasure.displaySteps = false; TimeMeasure.measureActive = false; } }