public override PersistencyHelper.SaveResult Save(bool activateOpcaoCancelar) { var preTransactionAction = new PreTransactionAction(); var args = new PersistencyHelper.FedoraIngestPreTransactionArguments(); preTransactionAction.args = args; bool ingestSuccess = true; if (controlObjetoDigital1.disableSave) { return(PersistencyHelper.SaveResult.nothingToSave); } preTransactionAction.preTransactionDelegate = delegate(PersistencyHelper.PreTransactionArguments preTransactionArgs) { string msg = null; if (odHelper.currentODComp != null) { ingestSuccess = SessionHelper.AppConfiguration.GetCurrentAppconfiguration().FedoraHelperSingleton.Ingest(odHelper.currentODComp, out msg); } else { odHelper.currentODSimples.ForEach(odSimples => ingestSuccess &= SessionHelper.AppConfiguration.GetCurrentAppconfiguration().FedoraHelperSingleton.Ingest(odSimples, out msg)); } if (ingestSuccess) { odHelper.newObjects.Keys.ToList().ForEach(k => { k.pid = odHelper.newObjects[k].pid; }); } preTransactionArgs.cancelAction = !ingestSuccess; preTransactionArgs.message = msg; }; PersistencyHelper.SaveResult successfulSave = PersistencyHelper.save(preTransactionAction, activateOpcaoCancelar); if (successfulSave != PersistencyHelper.SaveResult.successful && !ingestSuccess) { MessageBox.Show("Ocorreu um erro na ingestão do objeto digital.", "Ingestão", MessageBoxButtons.OK, MessageBoxIcon.Warning); odHelper.newObjects.Clear(); odHelper.mContexto = ObjetoDigitalFedoraHelper.Contexto.nenhum; odHelper.currentODComp = null; odHelper.currentODSimples = null; } else if (successfulSave == PersistencyHelper.SaveResult.successful) { GISA.Search.Updater.updateNivelDocumental(odHelper.currentNivel.ID); } return(successfulSave); }
public override PersistencyHelper.SaveResult Save(bool activateOpcaoCancelar) { if (this.CurrentFRDBase == null) { return(PersistencyHelper.SaveResult.unsuccessful); } List <long> IDs = new List <long>(); List <string> idsToUpdate = new List <string>(); List <NivelRule.PublicacaoDocumentos> DocsID = new List <NivelRule.PublicacaoDocumentos> (); GISADataset.RelacaoHierarquicaRow rhRow = null; PersistencyHelper.SaveResult successfulSave = PersistencyHelper.SaveResult.unsuccessful; if ((CurrentFRDBase.NivelRow.GetRelacaoHierarquicaRowsByNivelRelacaoHierarquica().Length > 0)) { rhRow = CurrentFRDBase.NivelRow.GetRelacaoHierarquicaRowsByNivelRelacaoHierarquica()[0]; PersistencyHelper.PublishSubDocumentosPreSaveArguments psArgs1 = new PersistencyHelper.PublishSubDocumentosPreSaveArguments(); PersistencyHelper.AvaliaDocumentosTabelaPreSaveArguments psArgs2 = new PersistencyHelper.AvaliaDocumentosTabelaPreSaveArguments(); // publicação de subdocumentos baseado na publicação dos documentos respectivos if (rhRow.IDTipoNivelRelacionado == TipoNivelRelacionado.D) { //contexto é um documento if (CurrentFRDBase.GetSFRDAvaliacaoRows().Length > 0) { GISADataset.SFRDAvaliacaoRow relRow = CurrentFRDBase.GetSFRDAvaliacaoRows()[0]; if ((relRow.RowState == DataRowState.Added && relRow.Publicar) || relRow.RowState == DataRowState.Modified) { DocsID.Add(new DBAbstractDataLayer.DataAccessRules.NivelRule.PublicacaoDocumentos(CurrentFRDBase.NivelRow.ID, CurrentFRDBase.GetSFRDAvaliacaoRows()[0].Publicar)); IDs.Add(CurrentFRDBase.NivelRow.ID); PermissoesHelper.ChangeDocPermissionPublicados(CurrentFRDBase.NivelRow.ID, (CurrentFRDBase.GetSFRDAvaliacaoRows())[0].Publicar); } } } else if (rhRow.IDTipoNivelRelacionado == TipoNivelRelacionado.SR || rhRow.IDTipoNivelRelacionado == TipoNivelRelacionado.SSR) { //o contexto é uma série ou subsérie e é alterado o estado de publicação de vários documentos simultaneamente foreach (GISADataset.SFRDAvaliacaoRow sfrdAv in GisaDataSetHelper.GetInstance().SFRDAvaliacao.Select("", "", DataViewRowState.Added | DataViewRowState.ModifiedCurrent)) { if (sfrdAv.FRDBaseRow.ID != CurrentFRDBase.ID) { DocsID.Add(new DBAbstractDataLayer.DataAccessRules.NivelRule.PublicacaoDocumentos(sfrdAv.FRDBaseRow.NivelRow.ID, sfrdAv.Publicar)); IDs.Add(sfrdAv.FRDBaseRow.NivelRow.ID); PermissoesHelper.ChangeDocPermissionPublicados(sfrdAv.FRDBaseRow.NivelRow.ID, sfrdAv.Publicar); } else { IDs.Add(sfrdAv.FRDBaseRow.IDNivel); } } if (!(CurrentFRDBase.GetSFRDAvaliacaoRows().Length == 0 || CurrentFRDBase.GetSFRDAvaliacaoRows()[0].IsIDModeloAvaliacaoNull() || (!(CurrentFRDBase.GetSFRDAvaliacaoRows()[0].RowState == DataRowState.Added) && !(CurrentFRDBase.GetSFRDAvaliacaoRows()[0]["IDModeloAvaliacao", DataRowVersion.Original] == DBNull.Value) && ((long)(CurrentFRDBase.GetSFRDAvaliacaoRows()[0]["IDModeloAvaliacao", DataRowVersion.Original])) == (long)(CurrentFRDBase.GetSFRDAvaliacaoRows()[0]["IDModeloAvaliacao", DataRowVersion.Current])))) { psArgs2.frdID = CurrentFRDBase.ID; psArgs2.modeloAvaliacaoID = CurrentFRDBase.GetSFRDAvaliacaoRows()[0].IDModeloAvaliacao; psArgs2.avaliacaoTabela = CurrentFRDBase.GetSFRDAvaliacaoRows()[0].AvaliacaoTabela; if (CurrentFRDBase.GetSFRDAvaliacaoRows()[0].IsPrazoConservacaoNull()) { psArgs2.prazoConservacao = 0; } else { psArgs2.prazoConservacao = CurrentFRDBase.GetSFRDAvaliacaoRows()[0].PrazoConservacao; } psArgs2.preservar = CurrentFRDBase.GetSFRDAvaliacaoRows()[0].Preservar; } } else { foreach (GISADataset.SFRDAvaliacaoRow sfrdAv in GisaDataSetHelper.GetInstance().SFRDAvaliacao.Select("", "", DataViewRowState.Added | DataViewRowState.ModifiedCurrent)) { PermissoesHelper.ChangeDocPermissionPublicados(sfrdAv.FRDBaseRow.NivelRow.ID, sfrdAv.Publicar); IDs.Add(sfrdAv.FRDBaseRow.IDNivel); } } // actualização do objecto digital caso exista ou o módulo esteja activo rhRow = CurrentFRDBase.NivelRow.GetRelacaoHierarquicaRowsByNivelRelacaoHierarquica().First(); var objDigital = default(ObjDigital); if (rhRow.IDTipoNivelRelacionado >= (long)TipoNivelRelacionado.D && SessionHelper.AppConfiguration.GetCurrentAppconfiguration().IsFedoraEnable()) { GisaDataSetHelper.HoldOpen ho = new GisaDataSetHelper.HoldOpen(GisaDataSetHelper.GetConnection()); try { GisaDataSetHelper.ManageDatasetConstraints(false); if (!PanelAmbitoConteudo1.IsLoaded) { PanelAmbitoConteudo1.LoadData(CurrentFRDBase, ho.Connection); } if (!PanelIndexacao1.IsLoaded) { PanelIndexacao1.LoadData(CurrentFRDBase, ho.Connection); } GisaDataSetHelper.ManageDatasetConstraints(true); } catch (System.Data.ConstraintException Ex) { Trace.WriteLine(Ex); GisaDataSetHelper.FixDataSet(GisaDataSetHelper.GetInstance(), ho.Connection); } catch (Exception e) { Trace.WriteLine(e); throw; } finally { ho.Dispose(); } // verificar alterações na tipologia e indexação var tipologia = string.Empty; var hasNewTip = Nivel.HasTipologiaChanged(CurrentFRDBase, out tipologia); var assuntos = Nivel.HasIndexacaoChanged(CurrentFRDBase); if (hasNewTip || assuntos != null) { objDigital = FedoraHelper.UpdateTipAssuntos(CurrentFRDBase.NivelRow, hasNewTip ? tipologia : null, assuntos); } } // actualizar objecto digital caso exista var preTransactionAction = new PreTransactionAction(); var fedArgs = new PersistencyHelper.FedoraIngestPreTransactionArguments(); preTransactionAction.args = fedArgs; preTransactionAction.preTransactionDelegate = delegate(PersistencyHelper.PreTransactionArguments preTransactionArgs) { var odComp = this.PanelObjetoDigitalFedora1.GetObjDigitalComp(); var odSimples = this.PanelObjetoDigitalFedora1.GetObjDigitalSimples(); bool ingestSuccess = true; string msg = null; if (odComp != null) { ingestSuccess = SessionHelper.AppConfiguration.GetCurrentAppconfiguration().FedoraHelperSingleton.Ingest(odComp, out msg); } else if (odSimples != null && odSimples.Count > 0) { odSimples.ForEach(od => ingestSuccess &= SessionHelper.AppConfiguration.GetCurrentAppconfiguration().FedoraHelperSingleton.Ingest(od, out msg)); } if (ingestSuccess) { this.PanelObjetoDigitalFedora1.odHelper.newObjects.Keys.ToList().ForEach(k => { k.pid = this.PanelObjetoDigitalFedora1.odHelper.newObjects[k].pid; }); } preTransactionArgs.cancelAction = !ingestSuccess; preTransactionArgs.message = msg; }; psArgs1.DocsID = DocsID; PostSaveAction postSaveAction = new PostSaveAction(); PersistencyHelper.UpdatePermissionsPostSaveArguments argsPSAction = new PersistencyHelper.UpdatePermissionsPostSaveArguments(); argsPSAction.NiveisIDs = IDs; argsPSAction.TrusteeID = PermissoesHelper.GrpAcessoPublicados.ID; postSaveAction.args = argsPSAction; postSaveAction.postSaveDelegate = delegate(PersistencyHelper.PostSaveArguments postSaveArgs) { if (!postSaveArgs.cancelAction && argsPSAction.NiveisIDs.Count > 0) { if (psArgs1 != null) { idsToUpdate = psArgs1.idsToUpdate; } } }; PersistencyHelper.AvaliacaoPublicacaoPreSaveArguments args = new PersistencyHelper.AvaliacaoPublicacaoPreSaveArguments(); args.psArgs1 = psArgs1; args.psArgs2 = psArgs2; successfulSave = PersistencyHelper.save(AvaliacaoPublicacao, args, postSaveAction, preTransactionAction, activateOpcaoCancelar); } else { successfulSave = PersistencyHelper.save(); } if (successfulSave == PersistencyHelper.SaveResult.successful) { GisaDataSetHelper.HoldOpen ho = new GisaDataSetHelper.HoldOpen(GisaDataSetHelper.GetConnection()); try { if (CurrentFRDBase.NivelRow.IDTipoNivel == TipoNivel.DOCUMENTAL) { if (idsToUpdate == null) { idsToUpdate = new List <string>(); } idsToUpdate.Add(CurrentFRDBase.NivelRow.ID.ToString()); GISA.Search.Updater.updateNivelDocumental(idsToUpdate); } ((frmMain)TopLevelControl).SetServerStatus(); } catch (GISA.Search.UpdateServerException) { ((frmMain)TopLevelControl).SetServerStatus(); } catch (Exception ex) { Trace.WriteLine(ex.ToString()); throw; } finally { ho.Dispose(); } } return(successfulSave); }
private void RemoveNivel() { GISADataset.NivelRow nUpperRow = null; GISADataset.RelacaoHierarquicaRow rhRow = null; GISADataset.NivelRow nRow = null; nRow = this.nivelNavigator1.SelectedNivel; // Verificar se a relacção hierárquica ainda é a mesma apresentada na interface (se o // utilizador estiver a ver a lista que contem o nível a apagar e entretanto outro utilizador // o ter colocado noutro ponto da árvore, a relação hierárquica presente em memória deixa // de corresponder com aquela que é apresentada na interface quando esse nível é selecionado; // quando o nível é selecionado a informação no DataSet de trabalho é actualizado mas não // actualiza a interface) if (GisaDataSetHelper.GetInstance().RelacaoHierarquica.Select(string.Format("ID={0} AND IDUpper={1}", nRow.ID, this.nivelNavigator1.ContextBreadCrumbsPathID)).Length > 0) { rhRow = (GISADataset.RelacaoHierarquicaRow)(GisaDataSetHelper.GetInstance().RelacaoHierarquica.Select(string.Format("ID={0} AND IDUpper={1}", nRow.ID, this.nivelNavigator1.ContextBreadCrumbsPathID))[0]); } else { MessageBox.Show("Esta operação não pode ser concluída pelo facto de a localização na estrutura " + System.Environment.NewLine + "do nível selecionado ter sido alterada por outro utilizador.", "Eliminar Nível", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } nUpperRow = (GISADataset.NivelRow)(GisaDataSetHelper.GetInstance().Nivel.Select(string.Format("ID={0}", this.nivelNavigator1.ContextBreadCrumbsPathID))[0]); var assocODs = FedoraHelper.GetAssociatedODsDetailsMsg(nRow.ID); if (assocODs.Length > 0) { FormDeletionReport form = new FormDeletionReport(); form.Text = "Eliminação de unidade de informação"; form.Interrogacao = "A unidade de informação selecionada tem objeto(s) digital(ais) associado(s). " + System.Environment.NewLine + "Se eliminar esta unidade de informação, os objeto(s) digital(ais) " + System.Environment.NewLine + " também serão eliminado(s)." + System.Environment.NewLine + "Pretende continuar?"; form.Detalhes = assocODs; if (form.ShowDialog() == DialogResult.Cancel) { return; } } else if (MessageBox.Show("Tem a certeza que deseja eliminar o nível selecionado?", "Eliminação de relação", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) == DialogResult.Cancel) { return; } if (!FedoraHelper.CanDeleteODsAssociated2UI(nRow, out objetoDigital)) { return; } Trace.WriteLine("A apagar nível..."); if (TipoNivel.isNivelDocumental(nRow) && TipoNivel.isNivelOrganico(nUpperRow)) { // Verificar que existem várias relações hierárquicas deste // nível documental a entidades produtoras superiores. Nesse // caso deverá ser removida a relação, caso contrário, se não // existirem subníveis documentais, será eliminado o próprio // nível(documental) int numRHs = nRow.GetRelacaoHierarquicaRowsByNivelRelacaoHierarquica().Length; if (numRHs > 1) { if (MessageBox.Show( "Por favor tenha em atenção que são vários os produtores deste " + System.Environment.NewLine + "nível documental. O nível documental propriamente dito não " + System.Environment.NewLine + "será eliminado, apenas a sua relação ao nível orgânico " + System.Environment.NewLine + "superior o será.", "Eliminação de relação", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning) == DialogResult.Cancel) { return; } ((frmMain)TopLevelControl).EnterWaitMode(); CurrentContext.RaiseRegisterModificationEvent(nRow.GetFRDBaseRows()[0]); PersistencyHelper.canDeleteRHRowPreConcArguments args = new PersistencyHelper.canDeleteRHRowPreConcArguments(); args.nRowID = nRow.ID; args.nUpperRowID = nUpperRow.ID; args.rhRowID = rhRow.ID; args.rhRowIDUpper = rhRow.IDUpper; PersistencyHelper.SaveResult successfulSave = PersistencyHelper.save(DelegatesHelper.verifyIfCanDeleteRH, args); PersistencyHelper.cleanDeletedData(PersistencyHelper.determinaNuvem("RelacaoHierarquica")); if (args.deleteSuccessful) { if (successfulSave == PersistencyHelper.SaveResult.successful) { List <string> IDNiveis = new List <string>(); IDNiveis.Add(args.nRowID.ToString()); GISA.Search.Updater.updateNivelDocumental(IDNiveis); GISA.Search.Updater.updateNivelDocumentalComProdutores(nRow.ID); } this.nivelNavigator1.RemoveSelectedLVItem(); } else { MessageBox.Show(args.message, "Eliminação de relação", MessageBoxButtons.OK, MessageBoxIcon.Information); } ((frmMain)TopLevelControl).LeaveWaitMode(); } else if (numRHs == 1) { // Verificar que não existem subníveis documentais int numSubRHs = GisaDataSetHelper.GetInstance().RelacaoHierarquica.Select(string.Format("IDUpper={0}", nRow.ID)).Length; if (numSubRHs > 0) { MessageBox.Show("Só é possível eliminar os níveis que não tenham outros directamente associados", "Eliminação de relação", MessageBoxButtons.OK, MessageBoxIcon.Information); return; } else { if (MessageBox.Show( "Por favor tenha em atenção que este nível documental é produzido" + System.Environment.NewLine + "por apenas uma entidade. Ao remover esta relação será perdida " + System.Environment.NewLine + "não só a relação como o nível documental propriamente dito.", "Eliminação de relação", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning) == DialogResult.Cancel) { return; } ((frmMain)TopLevelControl).EnterWaitMode(); CurrentContext.RaiseRegisterModificationEvent(nRow.GetFRDBaseRows()[0]); PersistencyHelper.canDeleteRHRowPreConcArguments argsPca = new PersistencyHelper.canDeleteRHRowPreConcArguments(); argsPca.nRowID = nRow.ID; argsPca.nUpperRowID = nUpperRow.ID; argsPca.rhRowID = 0; argsPca.rhRowIDUpper = 0; PersistencyHelper.DeleteIDXPreSaveArguments argsPsa = new PersistencyHelper.DeleteIDXPreSaveArguments(); argsPsa.ID = nRow.ID; // actualizar objecto digital caso exista var preTransactionAction = new PreTransactionAction(); var args = new PersistencyHelper.FedoraIngestPreTransactionArguments(); preTransactionAction.args = args; preTransactionAction.preTransactionDelegate = delegate(PersistencyHelper.PreTransactionArguments preTransactionArgs) { bool ingestSuccess = true; string msg = null; var odsToIngest = FedoraHelper.DeleteObjDigital(nRow); odsToIngest.ForEach(od => ingestSuccess &= SessionHelper.AppConfiguration.GetCurrentAppconfiguration().FedoraHelperSingleton.Ingest(od, out msg)); preTransactionArgs.cancelAction = !ingestSuccess; preTransactionArgs.message = msg; }; PersistencyHelper.SaveResult successfulSave = PersistencyHelper.save(DelegatesHelper.verifyIfCanDeleteRH, argsPca, Nivel.DeleteNivelXInDataBase, argsPsa, preTransactionAction); if (argsPca.deleteSuccessful) { if (successfulSave == PersistencyHelper.SaveResult.successful) { List <string> IDNiveis = new List <string>(); IDNiveis.Add(nRow.ID.ToString()); GISA.Search.Updater.updateNivelDocumental(IDNiveis); GISA.Search.Updater.updateNivelDocumentalComProdutores(nRow.ID); } this.nivelNavigator1.RemoveSelectedLVItem(); } else { // se o nível a eliminar se tratar de uma série ou documento solto mas que // por motivos de conflito de concorrência não foi possível executar, // o refrescamento dos botões é feito tendo como o contexto o próprio // nível que se pretendeu eliminar para desta forma o estado dos mesmos // estar correcta (caso contrário o estado dos botões referir-se-ia a // não haver qualquer item selecionado MessageBox.Show(argsPca.message, "Eliminação de relação", MessageBoxButtons.OK, MessageBoxIcon.Information); UpdateToolBarButtons(this.nivelNavigator1.SelectedItems[0]); } PersistencyHelper.cleanDeletedData(new List <TableDepthOrdered.TableCloudType>(new TableDepthOrdered.TableCloudType[] { PersistencyHelper.determinaNuvem("RelacaoHierarquica"), PersistencyHelper.determinaNuvem("FRDBase"), PersistencyHelper.determinaNuvem("ObjetoDigital") })); ((frmMain)TopLevelControl).LeaveWaitMode(); } } else { Debug.Assert(false, "Should never happen. There must be a relation with an upper Nivel."); } } else { // Entre todos os outros tipos de nível proceder normalmente if ((nRow.GetRelacaoHierarquicaRowsByNivelRelacaoHierarquica()[0].IDTipoNivelRelacionado == TipoNivelRelacionado.D || nRow.GetRelacaoHierarquicaRowsByNivelRelacaoHierarquica()[0].IDTipoNivelRelacionado == TipoNivelRelacionado.SD) && NiveisHelper.NivelFoiMovimentado(nRow.ID)) { if (MessageBox.Show( "Por favor tenha em atenção que este nível documental já foi " + System.Environment.NewLine + "requisitado/devolvido. Ao remover nível documental serão perdidos " + System.Environment.NewLine + "todos os seus registos referentes a requisições e devoluções.", "Eliminação de nível documental", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning) == DialogResult.Cancel) { return; } } ((frmMain)TopLevelControl).EnterWaitMode(); CurrentContext.RaiseRegisterModificationEvent(nRow.GetFRDBaseRows()[0]); PersistencyHelper.canDeleteRHRowPreConcArguments argsPca = new PersistencyHelper.canDeleteRHRowPreConcArguments(); argsPca.nRowID = nRow.ID; argsPca.nUpperRowID = nUpperRow.ID; argsPca.rhRowID = 0; argsPca.rhRowIDUpper = 0; PersistencyHelper.DeleteIDXPreSaveArguments argsPsa = new PersistencyHelper.DeleteIDXPreSaveArguments(); argsPsa.ID = nRow.ID; // actualizar objecto digital caso exista var preTransactionAction = new PreTransactionAction(); var args = new PersistencyHelper.FedoraIngestPreTransactionArguments(); preTransactionAction.args = args; preTransactionAction.preTransactionDelegate = delegate(PersistencyHelper.PreTransactionArguments preTransactionArgs) { bool ingestSuccess = true; string msg = null; var odsToIngest = FedoraHelper.DeleteObjDigital(nRow); odsToIngest.ForEach(od => ingestSuccess &= SessionHelper.AppConfiguration.GetCurrentAppconfiguration().FedoraHelperSingleton.Ingest(od, out msg)); preTransactionArgs.cancelAction = !ingestSuccess; preTransactionArgs.message = msg; }; PersistencyHelper.SaveResult successfulSave = PersistencyHelper.save(DelegatesHelper.verifyIfCanDeleteRH, argsPca, Nivel.DeleteNivelXInDataBase, argsPsa, preTransactionAction); PersistencyHelper.cleanDeletedData(new List <TableDepthOrdered.TableCloudType>(new TableDepthOrdered.TableCloudType[] { PersistencyHelper.determinaNuvem("RelacaoHierarquica"), PersistencyHelper.determinaNuvem("FRDBase") })); if (argsPca.deleteSuccessful) { if (successfulSave == PersistencyHelper.SaveResult.successful) { List <string> IDNiveis = new List <string>(); IDNiveis.Add(argsPsa.ID.ToString()); GISA.Search.Updater.updateNivelDocumental(IDNiveis); if (nRow.RowState == DataRowState.Detached) { GISA.Search.Updater.updateNivelDocumentalComProdutores(argsPsa.ID); } else { GISA.Search.Updater.updateNivelDocumentalComProdutores(nRow.ID); } this.nivelNavigator1.RemoveSelectedLVItem(); } } else { MessageBox.Show(argsPca.message, "Eliminação de relação", MessageBoxButtons.OK, MessageBoxIcon.Information); } ((frmMain)TopLevelControl).LeaveWaitMode(); } UpdateToolBarButtons(); }
private void EditNivel() { var nRow = this.nivelNavigator1.SelectedNivel; var frdRow = nRow.GetFRDBaseRows().Single(); var rhRow = nRow.GetRelacaoHierarquicaRowsByNivelRelacaoHierarquica().First(); var tnrRow = TipoNivelRelacionado.GetTipoNivelRelacionadoFromRelacaoHierarquica(rhRow); var frm = new FormNivelDocumentalFedora(); frm.IDTipoNivelRelacionado = tnrRow.ID; string WindowTitle = string.Format("Editar {0}", tnrRow.Designacao); frm.Text = WindowTitle; frm.txtCodigo.Text = nRow.Codigo; frm.txtDesignacao.Text = Nivel.GetDesignacao(nRow); frm.FRDBaseRow = nRow.GetFRDBaseRows().Single(); frm.LoadData(); var idxFRDCARow = frdRow.GetIndexFRDCARows().SingleOrDefault(r => r["Selector"] != DBNull.Value && r.Selector == -1); // show form and receive user feedback if (frm.ShowDialog() == DialogResult.OK) { Trace.WriteLine("A editar nível..."); GISADataset.NivelDesignadoRow ndRow = null; nRow.Codigo = frm.txtCodigo.Text; // Um Nivel documental deve ter obrigatoriamente um NivelDesignado. Debug.Assert(nRow.GetNivelDesignadoRows().Length > 0); ndRow = nRow.GetNivelDesignadoRows()[0]; ndRow.Designacao = frm.txtDesignacao.Text; var tipologiaSelected = ((FormNivelDocumentalFedora)frm).Tipologia; if (tipologiaSelected == null && idxFRDCARow != null) { idxFRDCARow.Delete(); } else if (tipologiaSelected != null && idxFRDCARow == null) { idxFRDCARow = GisaDataSetHelper.GetInstance().IndexFRDCA.AddIndexFRDCARow(frdRow, ((FormNivelDocumentalFedora)frm).Tipologia.ControloAutRow, -1, new byte[] { }, 0); } else if (tipologiaSelected != null && idxFRDCARow != null && idxFRDCARow.IDControloAut != tipologiaSelected.IDControloAut) { idxFRDCARow.Delete(); idxFRDCARow = GisaDataSetHelper.GetInstance().IndexFRDCA.AddIndexFRDCARow(frdRow, ((FormNivelDocumentalFedora)frm).Tipologia.ControloAutRow, -1, new byte[] { }, 0); } string termoToCompare = frm.Tipologia == null ? null : ((FormNivelDocumentalFedora)frm).Tipologia.DicionarioRow.Termo; if (objetoDigital != null && objetoDigital.tipologia != termoToCompare) { objetoDigital.tipologia = tipologiaSelected != null ? tipologiaSelected.DicionarioRow.Termo : ""; objetoDigital.state = State.modified; } // registar a edição do item selecionado CurrentContext.RaiseRegisterModificationEvent(nRow.GetFRDBaseRows()[0]); PersistencyHelper.EnsureUniqueCodigoNivelPreConcArguments pcArgs = new PersistencyHelper.EnsureUniqueCodigoNivelPreConcArguments(); pcArgs.nRowID = nRow.ID; pcArgs.ndRowID = ndRow.ID; // Se se tratar de uma entidade detentora não passar os Ids de uma relação // hierárquica para um nível superior pois não existe nenhum. if (nRow.GetRelacaoHierarquicaRowsByNivelRelacaoHierarquica().Length > 0) { pcArgs.rhRowID = nRow.GetRelacaoHierarquicaRowsByNivelRelacaoHierarquica()[0].ID; pcArgs.rhRowIDUpper = nRow.GetRelacaoHierarquicaRowsByNivelRelacaoHierarquica()[0].IDUpper; } pcArgs.testOnlyWithinNivel = true; // actualizar objecto digital caso exista var preTransactionAction = new PreTransactionAction(); var args = new PersistencyHelper.FedoraIngestPreTransactionArguments(); preTransactionAction.args = args; preTransactionAction.preTransactionDelegate = delegate(PersistencyHelper.PreTransactionArguments preTransactionArgs) { string msg = null; if (objetoDigital != null) { preTransactionArgs.cancelAction = !SessionHelper.AppConfiguration.GetCurrentAppconfiguration().FedoraHelperSingleton.Ingest(objetoDigital, out msg); } preTransactionArgs.message = msg; }; PersistencyHelper.SaveResult successfulSave = PersistencyHelper.save(DelegatesHelper.ensureUniqueCodigo, pcArgs, preTransactionAction); if (!pcArgs.successful) { MessageBox.Show(pcArgs.message, "Edição da unidade de descrição", MessageBoxButtons.OK, MessageBoxIcon.Warning); } else if (successfulSave == PersistencyHelper.SaveResult.successful) { GisaDataSetHelper.HoldOpen ho = new GisaDataSetHelper.HoldOpen(GisaDataSetHelper.GetConnection()); try { List <string> IDNiveis = new List <string>(); IDNiveis.Add(nRow.ID.ToString()); GISA.Search.Updater.updateNivelDocumental(IDNiveis); } catch (Exception ex) { Trace.WriteLine(ex.ToString()); throw; } finally { ho.Dispose(); } } PersistencyHelper.cleanDeletedData(); // Actualizar a interface com os novos valores. Se editarmos a // raiz (estrutural) da vista documental é necessário actualizar // automaticamente também a vista estrutural. if (!(nRow.RowState == DataRowState.Detached)) { if (this.nivelNavigator1.PanelToggleState == NivelNavigator.ToggleState.Estrutural) { this.nivelNavigator1.UpdateSelectedNodeName(Nivel.GetDesignacao(nRow)); } else { this.nivelNavigator1.UpdateSelectedListItemName(Nivel.GetDesignacao(nRow)); } } // Forçar a gravação do documento CurrentContext.SetNivelEstrututalDocumental(null); CurrentContext.SetNivelEstrututalDocumental(nRow); } }