コード例 #1
3
ファイル: FedoraModel.cs プロジェクト: aureliopires/gisa
 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;
 }
コード例 #2
3
 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());
     }
 }
コード例 #3
2
        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);
        }
コード例 #4
1
 public void Deactivate()
 {
     mContexto = ObjetoDigitalFedoraHelper.Contexto.nenhum;
     currentODComp = null;
     currentODSimples = null;
     currentObjetoDigitalRow = null;
     currentObjetoDigitalRowComp = null;
     docSimplesSemOD = null;
     newObjects.Clear();
 }
コード例 #5
0
 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);
 }
コード例 #6
0
 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;
 }
コード例 #7
0
        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);
        }
コード例 #8
0
        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;
                });
            }
        }
コード例 #9
0
        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();
        }
コード例 #10
0
 public MetsExporter(ObjDigComposto document, string owner, string[] logMessage)
 {
     this.userName = owner;
     this.sonPIDs  = document.objSimples;
     DoTheMETS(document, logMessage);
 }
コード例 #11
0
        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++;
                }
            }
        }
コード例 #12
0
        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);
        }
コード例 #13
0
ファイル: FedoraHandler.cs プロジェクト: aureliopires/gisa
        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); }
        }
コード例 #14
0
        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);
            }
        }
コード例 #15
0
        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); }
        }