Ejemplo n.º 1
0
        /**
         * Recursively copy namespace parts to the destination namespace
         */
        private static void Copy(OPCPackage pkg, PackagePart part, OPCPackage tgt, PackagePart part_tgt) {
        PackageRelationshipCollection rels = part.Relationships;
        if(rels != null) 
            foreach (PackageRelationship rel in rels) {
            PackagePart p;
            if(rel.TargetMode == TargetMode.External){
                part_tgt.AddExternalRelationship(rel.TargetUri.ToString(), rel.RelationshipType, rel.Id);
                //external relations don't have associated namespace parts
                continue;
            }
            Uri uri = rel.TargetUri;

            if(uri.Fragment != null) {
                part_tgt.AddRelationship(uri, (TargetMode)rel.TargetMode, rel.RelationshipType, rel.Id);
                continue;
            }
            PackagePartName relName = PackagingUriHelper.CreatePartName(rel.TargetUri);
            p = pkg.GetPart(relName);
            part_tgt.AddRelationship(p.PartName, (TargetMode)rel.TargetMode, rel.RelationshipType, rel.Id);




            PackagePart dest;
            if(!tgt.ContainPart(p.PartName)){
                dest = tgt.CreatePart(p.PartName, p.ContentType);
                Stream out1 = dest.GetOutputStream();
                IOUtils.Copy(p.GetInputStream(), out1);
                out1.Close();
                Copy(pkg, p, tgt, dest);
            }
        }
    }
Ejemplo n.º 2
0
        /**
         * Add a new child POIXMLDocumentPart
         *
         * @param relId the preferred relation id, when null the next free relation id will be used
         * @param relationshipType the package relationship type
         * @param part the child to add
         *
         * @since 3.14-Beta1
         */
        public RelationPart AddRelation(String relId, POIXMLRelation relationshipType, POIXMLDocumentPart part)
        {
            PackageRelationship pr = FindExistingRelation(part);

            if (pr == null)
            {
                PackagePartName ppn     = part.GetPackagePart().PartName;
                String          relType = relationshipType.Relation;
                pr = packagePart.AddRelationship(ppn, TargetMode.Internal, relType, relId);
            }
            AddRelation(pr, part);
            return(new RelationPart(pr, part));
        }
Ejemplo n.º 3
0
        public void TestSelfRelations_bug51187()
        {
            MemoryStream baos = new MemoryStream();
            OPCPackage   pkg  = OPCPackage.Create(baos);

            PackagePart partA =
                pkg.CreatePart(PackagingUriHelper.CreatePartName("/partA"), "text/plain");

            Assert.IsNotNull(partA);

            // reference itself
            PackageRelationship rel1 = partA.AddRelationship(partA.PartName, TargetMode.Internal, "partA");


            // Save, and re-load
            pkg.Close();
            MemoryStream bais = new MemoryStream(baos.ToArray());

            pkg = OPCPackage.Open(bais);

            partA = pkg.GetPart(PackagingUriHelper.CreatePartName("/partA"));


            // Check the relations
            Assert.AreEqual(1, partA.Relationships.Size);

            PackageRelationship rel2 = partA.Relationships.GetRelationship(0);

            Assert.AreEqual(rel1.RelationshipType, rel2.RelationshipType);
            Assert.AreEqual(rel1.Id, rel2.Id);
            Assert.AreEqual(rel1.SourceUri, rel2.SourceUri);
            Assert.AreEqual(rel1.TargetUri, rel2.TargetUri);
            Assert.AreEqual(rel1.TargetMode, rel2.TargetMode);
        }
Ejemplo n.º 4
0
 /**
  * Create a new child POIXMLDocumentPart
  *
  * @param descriptor the part descriptor
  * @param factory the factory that will create an instance of the requested relation
  * @param idx part number
  * @param noRelation if true, then no relationship is Added.
  * @return the Created child POIXMLDocumentPart
  */
 protected POIXMLDocumentPart CreateRelationship(POIXMLRelation descriptor, POIXMLFactory factory, int idx, bool noRelation)
 {
     try
     {
         PackagePartName     ppName = PackagingUriHelper.CreatePartName(descriptor.GetFileName(idx));
         PackageRelationship rel    = null;
         PackagePart         part   = packagePart.Package.CreatePart(ppName, descriptor.ContentType);
         if (!noRelation)
         {
             /* only add to relations, if according relationship is being Created. */
             rel = packagePart.AddRelationship(ppName, TargetMode.Internal, descriptor.Relation);
         }
         POIXMLDocumentPart doc = factory.CreateDocumentPart(descriptor);
         doc.packageRel  = rel;
         doc.packagePart = part;
         doc.parent      = this;
         if (!noRelation)
         {
             /* only add to relations, if according relationship is being Created. */
             AddRelation(rel.Id, doc);
         }
         return(doc);
     }
     catch (PartAlreadyExistsException pae)
     {
         // Return the specific exception so the user knows
         //  that the name is already taken
         throw pae;
     }
     catch (Exception e)
     {
         // Give a general wrapped exception for the problem
         throw new POIXMLException(e);
     }
 }
Ejemplo n.º 5
0
 /**
  * Create a new child POIXMLDocumentPart
  *
  * @param descriptor the part descriptor
  * @param factory the factory that will create an instance of the requested relation
  * @param idx part number
  * @param noRelation if true, then no relationship is Added.
  * @return the Created child POIXMLDocumentPart
  */
 protected POIXMLDocumentPart CreateRelationship(POIXMLRelation descriptor, POIXMLFactory factory, int idx, bool noRelation)
 {
     try {
         PackagePartName     ppName = PackagingUriHelper.CreatePartName(descriptor.GetFileName(idx));
         PackageRelationship rel    = null;
         PackagePart         part   = packagePart.Package.CreatePart(ppName, descriptor.ContentType);
         if (!noRelation)
         {
             /* only add to relations, if according relationship is being Created. */
             rel = packagePart.AddRelationship(ppName, TargetMode.Internal, descriptor.Relation);
         }
         POIXMLDocumentPart doc = factory.CreateDocumentPart(descriptor);
         doc.packageRel  = rel;
         doc.packagePart = part;
         doc.parent      = this;
         if (!noRelation)
         {
             /* only add to relations, if according relationship is being Created. */
             AddRelation(rel.Id, doc);
         }
         return(doc);
     } catch (Exception e) {
         throw new POIXMLException(e);
     }
 }
Ejemplo n.º 6
0
        public void TestCreateRelationsFromScratch()
        {
            MemoryStream baos = new MemoryStream();
            OPCPackage   pkg  = OPCPackage.Create(baos);

            PackagePart partA =
                pkg.CreatePart(PackagingUriHelper.CreatePartName("/partA"), "text/plain");
            PackagePart partB =
                pkg.CreatePart(PackagingUriHelper.CreatePartName("/partB"), "image/png");

            Assert.IsNotNull(partA);
            Assert.IsNotNull(partB);

            // Internal
            partA.AddRelationship(partB.PartName, TargetMode.Internal, "http://example/Rel");

            // External
            partA.AddExternalRelationship("http://poi.apache.org/", "http://example/poi");
            partB.AddExternalRelationship("http://poi.apache.org/ss/", "http://example/poi/ss");

            // Check as expected currently
            Assert.AreEqual("/partB", partA.GetRelationship("rId1").TargetUri.ToString());
            Assert.AreEqual("http://poi.apache.org/",
                            partA.GetRelationship("rId2").TargetUri.ToString());
            Assert.AreEqual("http://poi.apache.org/ss/",
                            partB.GetRelationship("rId1").TargetUri.ToString());


            // Save, and re-load
            pkg.Close();
            MemoryStream bais = new MemoryStream(baos.ToArray());

            pkg = OPCPackage.Open(bais);

            partA = pkg.GetPart(PackagingUriHelper.CreatePartName("/partA"));
            partB = pkg.GetPart(PackagingUriHelper.CreatePartName("/partB"));


            // Check the relations
            Assert.AreEqual(2, partA.Relationships.Size);
            Assert.AreEqual(1, partB.Relationships.Size);

            Assert.AreEqual("/partB", partA.GetRelationship("rId1").TargetUri.OriginalString);
            Assert.AreEqual("http://poi.apache.org/",
                            partA.GetRelationship("rId2").TargetUri.ToString());
            Assert.AreEqual("http://poi.apache.org/ss/",
                            partB.GetRelationship("rId1").TargetUri.ToString());
            // Check core too
            Assert.AreEqual("/docProps/core.xml",
                            pkg.GetRelationshipsByType(
                                "http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties").GetRelationship(0).TargetUri.ToString());
        }
Ejemplo n.º 7
0
        private static void Copy(OPCPackage pkg, PackagePart part, OPCPackage tgt, PackagePart part_tgt)
        {
            PackageRelationshipCollection relationships = part.Relationships;

            if (relationships == null)
            {
                return;
            }
            foreach (PackageRelationship packageRelationship in relationships)
            {
                TargetMode?targetMode = packageRelationship.TargetMode;
                if ((targetMode.GetValueOrDefault() != TargetMode.External ? 0 : (targetMode.HasValue ? 1 : 0)) != 0)
                {
                    part_tgt.AddExternalRelationship(packageRelationship.TargetUri.ToString(), packageRelationship.RelationshipType, packageRelationship.Id);
                }
                else
                {
                    Uri targetUri = packageRelationship.TargetUri;
                    if (targetUri.Fragment != null)
                    {
                        part_tgt.AddRelationship(targetUri, packageRelationship.TargetMode.Value, packageRelationship.RelationshipType, packageRelationship.Id);
                    }
                    else
                    {
                        PackagePartName partName = PackagingUriHelper.CreatePartName(packageRelationship.TargetUri);
                        PackagePart     part1    = pkg.GetPart(partName);
                        part_tgt.AddRelationship(part1.PartName, packageRelationship.TargetMode.Value, packageRelationship.RelationshipType, packageRelationship.Id);
                        if (!tgt.ContainPart(part1.PartName))
                        {
                            PackagePart part2        = tgt.CreatePart(part1.PartName, part1.ContentType);
                            Stream      outputStream = part2.GetOutputStream();
                            IOUtils.Copy(part1.GetInputStream(), outputStream);
                            outputStream.Close();
                            PackageHelper.Copy(pkg, part1, tgt, part2);
                        }
                    }
                }
            }
        }
Ejemplo n.º 8
0
        //[Ignore("add relation Uri #Sheet1!A1")]
        public void TestCreatePackageWithCoreDocument()
        {
            MemoryStream baos = new MemoryStream();
            OPCPackage   pkg  = OPCPackage.Create(baos);

            // Add a core document
            PackagePartName corePartName = PackagingUriHelper.CreatePartName("/xl/workbook.xml");

            // Create main part relationship
            pkg.AddRelationship(corePartName, TargetMode.Internal, PackageRelationshipTypes.CORE_DOCUMENT, "rId1");
            // Create main document part
            PackagePart corePart = pkg.CreatePart(corePartName, "application/vnd.Openxmlformats-officedocument.spreadsheetml.sheet.main+xml");
            // Put in some dummy content
            Stream coreOut = corePart.GetOutputStream();

            byte[] buffer = Encoding.UTF8.GetBytes("<dummy-xml />");
            coreOut.Write(buffer, 0, buffer.Length);
            coreOut.Close();

            // And another bit
            PackagePartName     sheetPartName = PackagingUriHelper.CreatePartName("/xl/worksheets/sheet1.xml");
            PackageRelationship rel           =
                corePart.AddRelationship(sheetPartName, TargetMode.Internal, "http://schemas.Openxmlformats.org/officeDocument/2006/relationships/worksheet", "rSheet1");

            Assert.IsNotNull(rel);

            PackagePart part = pkg.CreatePart(sheetPartName, "application/vnd.Openxmlformats-officedocument.spreadsheetml.worksheet+xml");

            Assert.IsNotNull(part);

            // Dummy content again
            coreOut = corePart.GetOutputStream();
            buffer  = Encoding.UTF8.GetBytes("<dummy-xml2 />");
            coreOut.Write(buffer, 0, buffer.Length);
            coreOut.Close();

            //add a relationship with internal target: "#Sheet1!A1"
            corePart.AddRelationship(PackagingUriHelper.ToUri("#Sheet1!A1"), TargetMode.Internal, "http://schemas.Openxmlformats.org/officeDocument/2006/relationships/hyperlink", "rId2");

            // Check things are as expected
            PackageRelationshipCollection coreRels =
                pkg.GetRelationshipsByType(PackageRelationshipTypes.CORE_DOCUMENT);

            Assert.AreEqual(1, coreRels.Size);
            PackageRelationship coreRel = coreRels.GetRelationship(0);

            Assert.IsNotNull(coreRel);
            Assert.AreEqual("/", coreRel.SourceUri.ToString());
            Assert.AreEqual("/xl/workbook.xml", coreRel.TargetUri.ToString());
            Assert.IsNotNull(pkg.GetPart(coreRel));


            // Save and re-load
            pkg.Close();
            FileInfo   tmp  = TempFile.CreateTempFile("testCreatePackageWithCoreDocument", ".zip");
            FileStream fout = new FileStream(tmp.FullName, FileMode.Create, FileAccess.ReadWrite);

            try
            {
                buffer = baos.ToArray();
                fout.Write(buffer, 0, buffer.Length);
            }
            finally
            {
                fout.Close();
            }
            pkg = OPCPackage.Open(tmp.FullName);
            //tmp.Delete();

            try
            {
                // Check still right
                coreRels = pkg.GetRelationshipsByType(PackageRelationshipTypes.CORE_DOCUMENT);
                Assert.AreEqual(1, coreRels.Size);
                coreRel = coreRels.GetRelationship(0);
                Assert.IsNotNull(coreRel);

                Assert.AreEqual("/", coreRel.SourceUri.ToString());
                Assert.AreEqual("/xl/workbook.xml", coreRel.TargetUri.ToString());
                corePart = pkg.GetPart(coreRel);
                Assert.IsNotNull(corePart);

                PackageRelationshipCollection rels = corePart.GetRelationshipsByType("http://schemas.Openxmlformats.org/officeDocument/2006/relationships/hyperlink");
                Assert.AreEqual(1, rels.Size);
                rel = rels.GetRelationship(0);
                Assert.IsNotNull(rel);
                Assert.Warn(" 'Sheet1!A1' and rel.TargetUri.Fragment should be equal.");
                //Assert.AreEqual("Sheet1!A1", rel.TargetUri.Fragment);

                assertMSCompatibility(pkg);
            }
            finally
            {
                pkg.Close();
            }

            Assert.AreEqual(0, Directory.GetFiles(AppDomain.CurrentDomain.BaseDirectory, "*.tmp").Length, "At Last: There are no temporary files.");
        }