public override ObjDigital Clone() { var theOriginal = new ObjDigComposto(); theOriginal.titulo = this.titulo; theOriginal.tipologia = this.tipologia; theOriginal.assuntos = new List<string>(this.assuntos); theOriginal.gisa_id = this.gisa_id; theOriginal.pid = this.pid; theOriginal.publicado = this.publicado; theOriginal.version = this.version; theOriginal.objSimples = new List<ObjDigSimples>(); this.objSimples.ForEach(objSimples => { var newClone = objSimples.Clone() as ObjDigSimples; theOriginal.objSimples.Add(newClone); objSimples.original = newClone; }); return theOriginal; }
private void AddOrRemoveODRelations(ObjDigComposto odComp, ObjDigSimples odSimples, GISADataset.ObjetoDigitalRow odRow) { var frdRow = currentNivel.GetFRDBaseRows().Single(); if (odComp.state == State.added) { var imgODRow = odRow.GetSFRDImagemObjetoDigitalRows().SingleOrDefault(r => r.IDFRDBase == frdRow.ID); if (imgODRow != null) // esta row é nula no caso dos ODs Simples associados a subdocumentos { imgODRow.SFRDImagemRowParent.Delete(); imgODRow.Delete(); } GisaDataSetHelper.GetInstance().ObjetoDigitalRelacaoHierarquica.AddObjetoDigitalRelacaoHierarquicaRow(odRow, currentObjetoDigitalRowComp, new byte[] { }, 0); } else if (odComp.state == State.deleted) { if (odRow.GetSFRDImagemObjetoDigitalRows().Count() == 0) // se se tratar de um od simples sem estar relacionado com um subdocumento cria-se relacao com a UI selecionada FedoraHelper.RelateODtoUI(odSimples, odRow, currentNivel.GetFRDBaseRows().Single()); } }
private void CreateDatabaseObjDigSimples(ObjDigComposto odComp, GISADataset.ObjetoDigitalRow odRowComp, ObjDigSimples odSimples) { Debug.Assert(odComp != null); Debug.Assert(odSimples != null); Debug.Assert(odRowComp != null && odRowComp.RowState != DataRowState.Deleted); var orderNr = odComp.objSimples.IndexOf(odSimples); var odRow = GisaDataSetHelper.GetInstance().ObjetoDigital.AddObjetoDigitalRow(odSimples.pid, odSimples.titulo, odSimples.publicado, (orderNr + 1), new byte[] { }, 0); GisaDataSetHelper.GetInstance().ObjetoDigitalRelacaoHierarquica.AddObjetoDigitalRelacaoHierarquicaRow(odRow, odRowComp, new byte[] { }, 0); //PermissoesHelper.AddNewObjDigGrantPermissions(odRow, currentNivel); newObjects.Add(odRow, odSimples); }
public void Deactivate() { mContexto = ObjetoDigitalFedoraHelper.Contexto.nenhum; currentODComp = null; currentODSimples = null; currentObjetoDigitalRow = null; currentObjetoDigitalRowComp = null; docSimplesSemOD = null; newObjects.Clear(); }
public FoxmlExporter(ObjDigComposto document, string owner, string pid, List <ObjDigSimples> sonPIDs, string nmspace) { this.userName = owner; this.pid = pid; this.sonPIDs = sonPIDs; this.nmspace = nmspace; this.DoTheFOXML(document); }
public DublinCoreExporter(ObjDigComposto doc) { this.title = doc.titulo; this.type = doc.tipologia; this.ids = new List <string>() { doc.pid, doc.gisa_id }; this.parts.AddRange(doc.objSimples.Select(simples => simples.titulo)); this.subjects = doc.assuntos.ToArray(); this.daddy = true; }
public override ObjDigital Clone() { var theOriginal = new ObjDigComposto(); theOriginal.titulo = this.titulo; theOriginal.tipologia = this.tipologia; theOriginal.assuntos = new List <string>(this.assuntos); theOriginal.gisa_id = this.gisa_id; theOriginal.pid = this.pid; theOriginal.publicado = this.publicado; theOriginal.version = this.version; theOriginal.objSimples = new List <ObjDigSimples>(); this.objSimples.ForEach(objSimples => { var newClone = objSimples.Clone() as ObjDigSimples; theOriginal.objSimples.Add(newClone); objSimples.original = newClone; }); return(theOriginal); }
private void ViewToModelObjsSimples(List<ObjDigSimples> odsSimples, ObjDigComposto odComp, GISADataset.ObjetoDigitalRow odRowComp) { odsSimples.ForEach(odSimples => { var odRow = default(GISADataset.ObjetoDigitalRow); switch (odSimples.state) { case State.added: if (odComp != null && odComp.state != State.deleted) CreateDatabaseObjDigSimples(odComp, odRowComp, odSimples); else CreateDatabaseObjDigSimplesSolto(odSimples); break; case State.modified: odRow = GisaDataSetHelper.GetInstance().ObjetoDigital.Cast<GISADataset.ObjetoDigitalRow>().Single(r => r.RowState != DataRowState.Deleted && r.pid.Equals(odSimples.pid)); odRow.Titulo = odSimples.titulo; odRow.Publicado = odSimples.publicado; odRow.GUIOrder = odSimples.guiorder; UpdateNvlDocSimplesOrderNr(odSimples); if (odComp != null) AddOrRemoveODRelations(odComp, odSimples, odRow); break; case State.deleted: odRow = GisaDataSetHelper.GetInstance().ObjetoDigital.Cast<GISADataset.ObjetoDigitalRow>().Single(r => r.RowState != DataRowState.Deleted && r.pid.Equals(odSimples.pid)); FedoraHelper.DeleteObjDigitalRows(odRow); break; case State.unchanged: // apanhar o caso de a ordem do OD Simples ter mudado odRow = GisaDataSetHelper.GetInstance().ObjetoDigital.Cast<GISADataset.ObjetoDigitalRow>().Single(r => r.RowState != DataRowState.Deleted && r.pid.Equals(odSimples.pid)); odRow.GUIOrder = odSimples.guiorder; UpdateNvlDocSimplesOrderNr(odSimples); if (odComp != null) AddOrRemoveODRelations(odComp, odSimples, odRow); break; } }); // atualizar a tipologia e assuntos dos objetos simples // - se houver um objeto composto, nenhum dos seus simples não pode ter tipologia e assuntos definidos // - se não houver um objeto composto: // * se o nro de objetos simples for um, então esse objeto simples pode ter tipologia e assuntos definidos // * se o nro de objetos simples for maior que um, então nenhum desses objetos pode ter tipologia e assuntos definidos if (odComp == null || odComp.state == State.deleted) { var ods = odsSimples.Where(od => od.state != State.deleted); if (ods.Count() == 1) { var odSimples = ods.Single(); var frdRow = currentNivel.GetFRDBaseRows().Single(); var idxTip = frdRow.GetIndexFRDCARows().SingleOrDefault(idx => idx["Selector"] != DBNull.Value && idx.Selector == -1); if (idxTip != null) odSimples.tipologia = idxTip.ControloAutRow.GetControloAutDicionarioRows().Single(cad => cad.IDTipoControloAutForma == (long)TipoControloAutForma.FormaAutorizada).DicionarioRow.Termo; var assuntos = frdRow.GetIndexFRDCARows().Where(idx => idx.ControloAutRow.IDTipoNoticiaAut < 4).SelectMany(idx => idx.ControloAutRow.GetControloAutDicionarioRows()).Where(cad => cad.IDTipoControloAutForma == (long)TipoControloAutForma.FormaAutorizada).Select(cad => cad.DicionarioRow.Termo); if (assuntos.Count() > 0) odSimples.assuntos = assuntos.ToList(); } else { odsSimples.Where(od => od.state != State.deleted).ToList().ForEach(od => { od.tipologia = ""; od.assuntos.Clear(); if (od.state == State.unchanged) od.state = State.modified; }); } } else { odsSimples.Where(od => od.state != State.deleted).ToList().ForEach(od => { od.tipologia = ""; od.assuntos.Clear(); if (od.state == State.unchanged) od.state = State.modified; }); } }
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(); }
public MetsExporter(ObjDigComposto document, string owner, string[] logMessage) { this.userName = owner; this.sonPIDs = document.objSimples; DoTheMETS(document, logMessage); }
private void DoTheFOXML(ObjDigital obj) { var title = obj.titulo; // Construir os headers foxml = new FoxmlDigitalObject("1.1", this.pid); foxml.properties = new FoxmlObjectProperties(); foxml.properties.AddProperty(new FoxmlProperty("info:fedora/fedora-system:def/model#state", "A")); foxml.properties.AddProperty(new FoxmlProperty("info:fedora/fedora-system:def/model#label", title)); // Add the DC datastream DublinCoreExporter dcXml; MetsExporter metsXml; if (obj.GetType() == typeof(ObjDigSimples)) { ObjDigSimples objSimples = obj as ObjDigSimples; metsXml = new MetsExporter(objSimples, userName, new string[] { "Ingestão do documento " + this.pid }); dcXml = new DublinCoreExporter(obj as ObjDigSimples); } else { ObjDigComposto objComposto = obj as ObjDigComposto; metsXml = new MetsExporter(objComposto, userName, new string[] { "Ingestão do documento " + this.pid }); dcXml = new DublinCoreExporter(obj as ObjDigComposto); } FoxmlDatastream dcStream = new FoxmlDatastream("DC", FoxmlDatastreamState.Active, FoxmlControlGroup.InlineXML, true); FoxmlDatastreamVersion dcStream1 = new FoxmlDatastreamVersion("DC.0", "http://www.openarchives.org/OAI/2.0/oai_dc/", "text/xml", "Metadados em Dublin Core", null, null); dcStream1.inlineXML = dcXml.DublinCore; dcStream1.contentDigest = new FoxmlContentDigest(FoxmlChecksumTypes.DEFAULT, null); dcStream.AddVersion(dcStream1); foxml.AddDatastream(dcStream); // Add the RELS-EXT datastream FoxmlDatastream relsStream = new FoxmlDatastream("RELS-EXT", FoxmlDatastreamState.Active, FoxmlControlGroup.InlineXML, true); FoxmlDatastreamVersion relsStream1 = new FoxmlDatastreamVersion("RELS-EXT.0", "info:fedora/fedora-system:FedoraRELSExt-1.0", "application/rdf+xml", "RDF Statements about this object", null, null); relsStream1.inlineXML = GetRdf(this.pid, this.nmspace); relsStream.AddVersion(relsStream1); foxml.AddDatastream(relsStream); // Add the METS datastream for this document FoxmlDatastream metsStream = new FoxmlDatastream("METS", FoxmlDatastreamState.Active, FoxmlControlGroup.InlineXML, true); FoxmlDatastreamVersion metsStream1 = new FoxmlDatastreamVersion("METS.0", "http://www.loc.gov/METS/", "text/xml", "Metadados adicionais em METS", null, null); metsStream1.inlineXML = metsXml.METS; metsStream1.contentDigest = new FoxmlContentDigest(FoxmlChecksumTypes.DEFAULT, null); metsStream.AddVersion(metsStream1); foxml.AddDatastream(metsStream); // Add the content datastreams FoxmlDatastream datastream; FoxmlDatastreamVersion dsversion; if (obj.GetType() == typeof(ObjDigSimples)) { int cnt = 1; ObjDigSimples objSimples = obj as ObjDigSimples; foreach (Anexo s in objSimples.fich_associados) { string uName = s.dataStreamID; datastream = new FoxmlDatastream(uName, FoxmlDatastreamState.Active, FoxmlControlGroup.ExternallyReferenceContent, true); dsversion = new FoxmlDatastreamVersion(uName + ".0", null, s.mimeType, null, null, null); dsversion.contentLocation = new FoxmlContentLocation(s.url, "URL"); dsversion.contentDigest = new FoxmlContentDigest(FoxmlChecksumTypes.DEFAULT, null); datastream.AddVersion(dsversion); foxml.AddDatastream(datastream); cnt++; } } }
private void DoTheMETS(ObjDigital obj, string[] logMessage) { var idsGisa = new string[] { obj.gisa_id }; var title = obj.titulo; var type = obj.tipologia; // Ficheiro METS mets = new MetsFile(null, null, title, type, null); // Header - criador, hora de criação, e IDs alternativos mets.header = new MetsHeaderSection(null, null, Utility.Now(), null, null); mets.header.AddAgent(new MetsAgent(null, MetsAgentRole.Archivist, null, MetsAgentType.Individual, null, userName, logMessage)); foreach (string s in idsGisa.Where(id => id.Length > 0)) { string typeID = s.Substring(0, s.IndexOf(':')); mets.header.AddAltID(new MetsAlternativeIdentifier(null, typeID, s)); } // Criar a secção de Ficheiros mets.fileSection = new MetsFileSection(null); MetsFileGroup fileGrp = new MetsFileGroup(null, null, null, "Conteúdos"); mets.fileSection.AddFileGroupElement(fileGrp); MetsStructMap structa = null; MetsStructDivision largeFile = null; if (obj.GetType() == typeof(ObjDigSimples)) { ObjDigSimples objSimples = obj as ObjDigSimples; structa = new MetsStructMap(null, "PHYSICAL", "Estruturação em imagens do " + title); largeFile = new MetsStructDivision(null, type, title, null, null, null, null, null, null); for (int i = 0; i < objSimples.fich_associados.Count; i++) { Anexo ficheiro = objSimples.fich_associados[i]; if (ficheiro.dataStreamID == null) { ficheiro.dataStreamID = "IMG" + objSimples.nextDatastreamId; objSimples.nextDatastreamId++; } string uName = ficheiro.dataStreamID; MetsFileElement file = new MetsFileElement(uName, ficheiro.mimeType, (i + 1).ToString(), null, null, null, MetsChecksumType.NONE, null, null, null, null, null); file.AddFLocat(new MetsXLinkElement(null, null, MetsLocatorType.Other, "Nome de Datastream", uName, null, null, null, null, null)); fileGrp.AddFileElement(file); MetsStructDivision div = new MetsStructDivision(null, ficheiro.mimeType, title, null, null, (i + 1).ToString(), null, null, null); div.AddFilePointer(new MetsFilePointer(null, uName, null)); largeFile.AddDivision(div); } } else { ObjDigComposto objComposto = obj as ObjDigComposto; structa = new MetsStructMap(null, "LOGICAL", "Estruturação em partes do " + title); largeFile = new MetsStructDivision(null, type, title, null, null, null, null, null, null); foreach (ObjDigSimples sd in objComposto.objSimples) { // Apenas queremos fazer isto se o objecto não estiver marcado como apagado if (sd.state != State.deleted) { string pid = sd.pid; MetsStructDivision div = new MetsStructDivision(null, sd.tipologia, sd.titulo, null, null, (objComposto.objSimples.IndexOf(sd) + 1).ToString(), null, null, null); div.AddFilePointer(new MetsFilePointer(null, pid, null)); largeFile.AddDivision(div); } } } structa.AddDivision(largeFile); mets.AddStructMap(structa); }
public ObjDigital GetStructureForPid(string pid, string originalTimestamp, bool loadVersions) { XmlDocument metsDoc; XmlDocument dcDoc; XmlNamespaceManager nameSpaceManager; XmlNamespaceManager dcNameSpaceManager; string versionTimestamp = null; try { versionTimestamp = manager.getDatastream(pid, "METS", originalTimestamp).createDate; MIMETypedStream stream = service.getDatastreamDissemination(pid, "METS", originalTimestamp); metsDoc = GetXmlFromStream(stream); nameSpaceManager = new XmlNamespaceManager(metsDoc.NameTable); nameSpaceManager.AddNamespace("mets", "http://www.loc.gov/METS/"); nameSpaceManager.AddNamespace("xlink", "http://www.w3.org/TR/xlink/"); // Temos de pedir o DC mais próximo da versão mais actualizada do METS (logo passamos o versionTimestamp) MIMETypedStream dcStream = service.getDatastreamDissemination(pid, "DC", versionTimestamp); dcDoc = GetXmlFromStream(dcStream); dcNameSpaceManager = new XmlNamespaceManager(dcDoc.NameTable); dcNameSpaceManager.AddNamespace("dc", "http://purl.org/dc/elements/1.1/"); dcNameSpaceManager.AddNamespace("oai_dc", "http://www.openarchives.org/OAI/2.0/oai_dc/"); dcNameSpaceManager.AddNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance"); } catch (Exception ex) { throw new Exception("Datastreams METS e/ou DC inválidos para o objecto " + pid + ".", ex); } try { XmlNode structMap = metsDoc.SelectSingleNode("mets:mets/mets:structMap", nameSpaceManager); XmlNode mainDiv = structMap.SelectSingleNode("mets:div", nameSpaceManager); XmlNode recordID = metsDoc.SelectSingleNode("mets:mets/mets:metsHdr/mets:altRecordID", nameSpaceManager); string type; try { type = structMap.Attributes["TYPE"].Value.ToString().ToUpper(); } catch { type = "PHYSICAL"; } ObjDigital newDocumentType = null; if (type == "LOGICAL") { newDocumentType = new ObjDigComposto(); newDocumentType.state = State.unchanged; newDocumentType.serverState = GetState(pid); ObjDigSimples[] parts = new ObjDigSimples[mainDiv.SelectNodes("mets:div", nameSpaceManager).Count]; foreach (XmlNode subDiv in mainDiv.SelectNodes("mets:div", nameSpaceManager)) { // Ler objecto directamente XmlNode fptr = subDiv.SelectSingleNode("mets:fptr", nameSpaceManager); ObjDigSimples objSimples = GetStructureForPid(fptr.Attributes["FILEID"].Value, originalTimestamp, true) as ObjDigSimples; parts[int.Parse(subDiv.Attributes["ORDER"].Value) - 1] = objSimples; } ((ObjDigComposto)newDocumentType).objSimples.AddRange(parts); } else { newDocumentType = new ObjDigSimples(); newDocumentType.state = State.unchanged; newDocumentType.serverState = GetState(pid); Anexo[] parts = new Anexo[mainDiv.SelectNodes("mets:div", nameSpaceManager).Count]; foreach (XmlNode subDiv in mainDiv.SelectNodes("mets:div", nameSpaceManager)) { XmlNode fptr = subDiv.SelectSingleNode("mets:fptr", nameSpaceManager); Anexo anexo = new Anexo(); anexo.pid = pid; anexo.dataStreamID = fptr.Attributes["FILEID"].Value; anexo.mimeType = subDiv.Attributes["TYPE"].Value; parts[int.Parse(subDiv.Attributes["ORDER"].Value) - 1] = anexo; try { Datastream data = manager.getDatastream(pid, anexo.dataStreamID, null); anexo.url = data.location; anexo.checksum = data.checksum; } catch (Exception ex) { Trace.WriteLine(ex.ToString()); throw new Exception("URL de datastream " + anexo.dataStreamID + " no objecto " + pid + " não foi encontrado.", ex); } } ((ObjDigSimples)newDocumentType).nextDatastreamId = service.listDatastreams(pid, null).Count(ds => ds.ID.Contains("IMG")) + 1; ((ObjDigSimples)newDocumentType).fich_associados.AddRange(parts); if(loadVersions) ((ObjDigSimples)newDocumentType).historico.AddRange(GetHistoric(pid)); } newDocumentType.pid = pid; newDocumentType.version = versionTimestamp; newDocumentType.titulo = mainDiv.Attributes["LABEL"].Value; if (mainDiv.Attributes["TYPE"] != null) newDocumentType.tipologia = mainDiv.Attributes["TYPE"].Value; if (recordID != null) // há objetos que não têm gisa_id newDocumentType.gisa_id = recordID.InnerText; else newDocumentType.gisa_id = ""; XmlNodeList assuntos = dcDoc.SelectNodes("oai_dc:dc/dc:subject", dcNameSpaceManager); if (assuntos.Count > 0) { List<string> listAssuntos = new List<string>(); foreach (XmlNode node in assuntos) listAssuntos.Add(node.InnerText); newDocumentType.assuntos = listAssuntos; } return newDocumentType; } catch (Exception ex) { Trace.WriteLine(ex.ToString()); throw new Exception("Erro ao analisar objecto " + pid + ".", ex); } }
private void CutPasteObjetoDigital(PersistencyHelper.ManageDocsPermissionsPreConcArguments manageDocsPermissionsPreConcArguments, PersistencyHelper.SetNivelOrderPreConcArguments setNivelOrderPreConcArguments, long IDTipoNivelRelacionado, GISADataset.ObjetoDigitalRow odCompSourceRow, ObjDigComposto odCompSource, GISADataset.ObjetoDigitalRow odCompTargetRow, ObjDigComposto odCompTarget, ref List<ObjDigital> odsToIngest) { // cut/paste dos objetos digitais simples associados aos documentos simples cortados if (IDTipoNivelRelacionado == TipoNivelRelacionado.SD) { var odSimples = FedoraHelper.CutPasteODSimples(manageDocsPermissionsPreConcArguments.nRow, odCompSourceRow, odCompSource, odCompTargetRow, odCompTarget); if (odSimples != null) odsToIngest.Add(odSimples); } // roolback sobre a atribuição das permissões if (manageDocsPermissionsPreConcArguments.changePermissions) ManageDocsPermissions(manageDocsPermissionsPreConcArguments); // atribuir número de ordem aos documentos simples cortados if (IDTipoNivelRelacionado == TipoNivelRelacionado.SD && setNivelOrderPreConcArguments != null) { DelegatesHelper.SetOrdemDocSimples(setNivelOrderPreConcArguments.nRowID, setNivelOrderPreConcArguments.nRowIDUpper, setNivelOrderPreConcArguments.tran); // actualizar ordem do objeto digital caso exista FedoraHelper.UpdateODRowGUIOrder(setNivelOrderPreConcArguments.nRowID); } }
public ObjDigital GetStructureForPid(string pid, string originalTimestamp, bool loadVersions) { XmlDocument metsDoc; XmlDocument dcDoc; XmlNamespaceManager nameSpaceManager; XmlNamespaceManager dcNameSpaceManager; string versionTimestamp = null; try { versionTimestamp = manager.getDatastream(pid, "METS", originalTimestamp).createDate; MIMETypedStream stream = service.getDatastreamDissemination(pid, "METS", originalTimestamp); metsDoc = GetXmlFromStream(stream); nameSpaceManager = new XmlNamespaceManager(metsDoc.NameTable); nameSpaceManager.AddNamespace("mets", "http://www.loc.gov/METS/"); nameSpaceManager.AddNamespace("xlink", "http://www.w3.org/TR/xlink/"); // Temos de pedir o DC mais próximo da versão mais actualizada do METS (logo passamos o versionTimestamp) MIMETypedStream dcStream = service.getDatastreamDissemination(pid, "DC", versionTimestamp); dcDoc = GetXmlFromStream(dcStream); dcNameSpaceManager = new XmlNamespaceManager(dcDoc.NameTable); dcNameSpaceManager.AddNamespace("dc", "http://purl.org/dc/elements/1.1/"); dcNameSpaceManager.AddNamespace("oai_dc", "http://www.openarchives.org/OAI/2.0/oai_dc/"); dcNameSpaceManager.AddNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance"); } catch (Exception ex) { throw new Exception("Datastreams METS e/ou DC inválidos para o objecto " + pid + ".", ex); } try { XmlNode structMap = metsDoc.SelectSingleNode("mets:mets/mets:structMap", nameSpaceManager); XmlNode mainDiv = structMap.SelectSingleNode("mets:div", nameSpaceManager); XmlNode recordID = metsDoc.SelectSingleNode("mets:mets/mets:metsHdr/mets:altRecordID", nameSpaceManager); string type; try { type = structMap.Attributes["TYPE"].Value.ToString().ToUpper(); } catch { type = "PHYSICAL"; } ObjDigital newDocumentType = null; if (type == "LOGICAL") { newDocumentType = new ObjDigComposto(); newDocumentType.state = State.unchanged; newDocumentType.serverState = GetState(pid); ObjDigSimples[] parts = new ObjDigSimples[mainDiv.SelectNodes("mets:div", nameSpaceManager).Count]; foreach (XmlNode subDiv in mainDiv.SelectNodes("mets:div", nameSpaceManager)) { // Ler objecto directamente XmlNode fptr = subDiv.SelectSingleNode("mets:fptr", nameSpaceManager); ObjDigSimples objSimples = GetStructureForPid(fptr.Attributes["FILEID"].Value, originalTimestamp, true) as ObjDigSimples; parts[int.Parse(subDiv.Attributes["ORDER"].Value) - 1] = objSimples; } ((ObjDigComposto)newDocumentType).objSimples.AddRange(parts); } else { newDocumentType = new ObjDigSimples(); newDocumentType.state = State.unchanged; newDocumentType.serverState = GetState(pid); Anexo[] parts = new Anexo[mainDiv.SelectNodes("mets:div", nameSpaceManager).Count]; foreach (XmlNode subDiv in mainDiv.SelectNodes("mets:div", nameSpaceManager)) { XmlNode fptr = subDiv.SelectSingleNode("mets:fptr", nameSpaceManager); Anexo anexo = new Anexo(); anexo.pid = pid; anexo.dataStreamID = fptr.Attributes["FILEID"].Value; anexo.mimeType = subDiv.Attributes["TYPE"].Value; parts[int.Parse(subDiv.Attributes["ORDER"].Value) - 1] = anexo; try { Datastream data = manager.getDatastream(pid, anexo.dataStreamID, null); anexo.url = data.location; anexo.checksum = data.checksum; } catch (Exception ex) { Trace.WriteLine(ex.ToString()); throw new Exception("URL de datastream " + anexo.dataStreamID + " no objecto " + pid + " não foi encontrado.", ex); } } ((ObjDigSimples)newDocumentType).nextDatastreamId = service.listDatastreams(pid, null).Count(ds => ds.ID.Contains("IMG")) + 1; ((ObjDigSimples)newDocumentType).fich_associados.AddRange(parts); if (loadVersions) { ((ObjDigSimples)newDocumentType).historico.AddRange(GetHistoric(pid)); } } newDocumentType.pid = pid; newDocumentType.version = versionTimestamp; newDocumentType.titulo = mainDiv.Attributes["LABEL"].Value; if (mainDiv.Attributes["TYPE"] != null) { newDocumentType.tipologia = mainDiv.Attributes["TYPE"].Value; } if (recordID != null) // há objetos que não têm gisa_id { newDocumentType.gisa_id = recordID.InnerText; } else { newDocumentType.gisa_id = ""; } XmlNodeList assuntos = dcDoc.SelectNodes("oai_dc:dc/dc:subject", dcNameSpaceManager); if (assuntos.Count > 0) { List <string> listAssuntos = new List <string>(); foreach (XmlNode node in assuntos) { listAssuntos.Add(node.InnerText); } newDocumentType.assuntos = listAssuntos; } return(newDocumentType); } catch (Exception ex) { Trace.WriteLine(ex.ToString()); throw new Exception("Erro ao analisar objecto " + pid + ".", ex); } }