public void LoadData() { currentODSimples = new List <ObjDigSimples>(); docSimplesSemOD = new List <SubDocumento>(); var tnrID = currentNivel.GetRelacaoHierarquicaRowsByNivelRelacaoHierarquica().First().IDTipoNivelRelacionado; // só é considerado válido um contexto definido por um nivel documental if (currentNivel.IDTipoNivel != TipoNivel.DOCUMENTAL) { mContexto = ObjetoDigitalFedoraHelper.Contexto.nenhum; return; } mContexto = IdentifyViewMode(currentNivel); GisaDataSetHelper.HoldOpen ho = new GisaDataSetHelper.HoldOpen(GisaDataSetHelper.GetConnection()); try { GisaDataSetHelper.ManageDatasetConstraints(false); // carregar a informação da bd consuante o tipo nivel selecionado if (tnrID == (long)TipoNivelRelacionado.SD) { var nUpperRow = currentNivel.GetRelacaoHierarquicaRowsByNivelRelacaoHierarquica().Single().NivelRowByNivelRelacaoHierarquicaUpper; DBAbstractDataLayer.DataAccessRules.FedoraRule.Current.LoadObjDigitalData(GisaDataSetHelper.GetInstance(), nUpperRow.ID, nUpperRow.GetRelacaoHierarquicaRowsByNivelRelacaoHierarquica().First().IDTipoNivelRelacionado, ho.Connection); } else { DBAbstractDataLayer.DataAccessRules.FedoraRule.Current.LoadObjDigitalData(GisaDataSetHelper.GetInstance(), currentNivel.ID, tnrID, ho.Connection); } GisaDataSetHelper.ManageDatasetConstraints(true); } catch (Exception e) { // TODO: apanhar a excepção provocada por uma falha com a comunicação com o servidor Trace.WriteLine(e); throw; } finally { ho.Dispose(); } List <string> pidsParaApagar = new List <string>(); // por algum motivo, no repositório, o objeto composto tem na sua estrutura ods simples que já foram apagados var frdRow = currentNivel.GetFRDBaseRows().Single(); var imgRows = new List <GISADataset.SFRDImagemRow>(); imgRows.AddRange(frdRow.GetSFRDImagemRows().Where(r => r.Tipo.Equals(FedoraHelper.typeFedora))); if (imgRows.Count == 0) { if (tnrID == (long)TipoNivelRelacionado.SD) // Identificar, caso exista, o OD Composto no documento/processo do subdocumento { var nUpperRow = currentNivel.GetRelacaoHierarquicaRowsByNivelRelacaoHierarquica().Single().NivelRowByNivelRelacaoHierarquicaUpper; // determinar se o documento/processo tem um OD composto associado var imgRowsUpper = nUpperRow.GetFRDBaseRows().Single().GetSFRDImagemRows().Where(r => r.Tipo.Equals(FedoraHelper.typeFedora)).ToList(); if (imgRowsUpper.Count != 1) { return; // não existe nenhum OD composto para o OD simples associado ao subdocumento } // o documento/processo tem um OD associado. Determinar se esse OD é composto var odRowUpper = imgRowsUpper[0].GetSFRDImagemObjetoDigitalRows().Single().ObjetoDigitalRow; if (odRowUpper.GetObjetoDigitalRelacaoHierarquicaRowsByObjetoDigitalObjetoDigitalRelacaoHierarquicaUpper().Count() > 0) { // o OD é composto currentODComp = SessionHelper.AppConfiguration.GetCurrentAppconfiguration().FedoraHelperSingleton.LoadID(odRowUpper.pid, null) as ObjDigComposto; currentObjetoDigitalRowComp = odRowUpper; if (currentODComp == null) { return; // não se conseguiu obter o OD do servidor... } // clona o próprio e todos os seus simples currentODComp.original = currentODComp.Clone(); } } else if (tnrID == (long)TipoNivelRelacionado.D) // documento/processo sem ODs associados directamente mas com subdocumentos com ODs simples { GetSubDocsImgRows(imgRows); GetODRows(imgRows); } } else if (imgRows.Count == 1) // existe 1 OD associado mas não se sabe se é simples ou composto { var odRow = imgRows[0].GetSFRDImagemObjetoDigitalRows().Single().ObjetoDigitalRow; var od = SessionHelper.AppConfiguration.GetCurrentAppconfiguration().FedoraHelperSingleton.LoadID(odRow.pid, null); if (od == null) { ObjectNotFound(odRow.pid); return; } od.publicado = odRow.Publicado; if (tnrID == (long)TipoNivelRelacionado.SD) // o OD é garantidamente simples { PermissoesHelper.LoadObjDigitalPermissions(currentNivel, SessionHelper.GetGisaPrincipal().TrusteeUserOperator.TrusteeRow); currentObjetoDigitalRow = odRow; currentODSimples = new List <ObjDigSimples>() { od as ObjDigSimples }; var nUpperRow = currentNivel.GetRelacaoHierarquicaRowsByNivelRelacaoHierarquica().Single().NivelRowByNivelRelacaoHierarquicaUpper; // determinar se o documento/processo tem um OD composto associado var imgRowsUpper = nUpperRow.GetFRDBaseRows().Single().GetSFRDImagemRows().Where(r => r.Tipo.Equals(FedoraHelper.typeFedora)).ToList(); if (imgRowsUpper.Count == 1) { // o documento/processo tem um OD associado. Determinar se esse OD é composto var odRowUpper = imgRowsUpper[0].GetSFRDImagemObjetoDigitalRows().Single().ObjetoDigitalRow; if (odRowUpper.GetObjetoDigitalRelacaoHierarquicaRowsByObjetoDigitalObjetoDigitalRelacaoHierarquicaUpper().Count() > 0) { // o OD é composto currentODComp = SessionHelper.AppConfiguration.GetCurrentAppconfiguration().FedoraHelperSingleton.LoadID(odRowUpper.pid, null) as ObjDigComposto; currentObjetoDigitalRowComp = odRowUpper; if (currentODComp == null) { ObjectNotFound(odRowUpper.pid); return; } // não se conseguiu obter o OD do servidor... ((ObjDigSimples)od).parentDocumentTitle = nUpperRow.GetNivelDesignadoRows().Single().Designacao; //currentODComp.publicado = currentObjetoDigitalRowComp.Publicado; currentODComp.objSimples[currentODComp.objSimples.FindIndex(obj => obj.pid == od.pid)] = od as ObjDigSimples; // clona o próprio e todos os seus simples currentODComp.original = currentODComp.Clone(); } } } else if (tnrID == (long)TipoNivelRelacionado.D) // se a UI selecionada for um documento/processo também tem que se ter em conta os OD simples de subdocumentos { if (od.GetType() == typeof(ObjDigSimples)) { currentObjetoDigitalRow = imgRows.Single().GetSFRDImagemObjetoDigitalRows().Single().ObjetoDigitalRow; GetSubDocsImgRows(imgRows); GetODRows(imgRows); } else { currentODComp = od as ObjDigComposto; currentObjetoDigitalRowComp = odRow; currentODComp.objSimples.ForEach(odSimples => { var odSimplesRow = GisaDataSetHelper.GetInstance().ObjetoDigital.Cast <GISADataset.ObjetoDigitalRow>().SingleOrDefault(r => r.pid.Equals(odSimples.pid)); if (odSimplesRow != null) { odSimples.guiorder = odSimplesRow.GUIOrder; odSimples.publicado = odSimplesRow.Publicado; } else if (odSimples.serverState == ServerState.Deleted) { pidsParaApagar.Add(odSimples.pid); } }); if (pidsParaApagar.Count > 0) { FedoraHelper.FixObjetoDigital(ref currentODComp, pidsParaApagar, frdRow, ref currentObjetoDigitalRowComp, ref currentObjetoDigitalRow); } } } else { if (od.GetType() == typeof(ObjDigSimples)) { currentODSimples = new List <ObjDigSimples>() { od as ObjDigSimples }; currentObjetoDigitalRow = odRow; } else { currentODComp = od as ObjDigComposto; currentObjetoDigitalRowComp = odRow; } } od.original = od.Clone(); } else { // caso onde estão associados vários simples soltos e garantidamente a UI selecionada não é um subdocumento (um subdocumento só pode ter um OD simples associado) Trace.Assert(tnrID != (long)TipoNivelRelacionado.SD); GetSubDocsImgRows(imgRows); GetODRows(imgRows); } // preencher o estado publicado nos objetos digitais if (currentODComp != null) { var odRow = default(GISADataset.ObjetoDigitalRow); currentODComp.objSimples.ToList().ForEach(odSimples => { odRow = GisaDataSetHelper.GetInstance().ObjetoDigital.Cast <GISADataset.ObjetoDigitalRow>().SingleOrDefault(r => r.pid.Equals(odSimples.pid)); odSimples.publicado = odRow.Publicado; }); odRow = GisaDataSetHelper.GetInstance().ObjetoDigital.Cast <GISADataset.ObjetoDigitalRow>().Single(r => r.pid.Equals(currentODComp.pid)); currentODComp.publicado = odRow.Publicado; } else { currentODSimples.ToList().ForEach(odSimples => { var odRow = GisaDataSetHelper.GetInstance().ObjetoDigital.Cast <GISADataset.ObjetoDigitalRow>().Single(r => r.pid.Equals(odSimples.pid)); odSimples.publicado = odRow.Publicado; }); } // obter documentos simples sem objeto digital para efeitos de ordenação GetSubDocsSemODs(); }