>
> On Apr 11, 2008, at 3:52 PM, [EMAIL PROTECTED] wrote:
>
>>> Hi Anca,
>>>
>>> cool for the tests :)
>>
>> Hi Vincent,
>>
>> Thanks a lot for the feedback, I've been waiting for some for a
>> while :).
>>
>>>
>>> if you don't mind, some comments:
>>> * Why name the test ImportTest when the practice is to name it
>>> PackageTest and that class already exists?
>>> * There are lots of duplications with PackageTest
>>
>> It's because the setup for the two test suites is different: I
>> needed a
>> 'deeper level of mocking' than the PackageTest.
>> Indeed, it would probably be better to try to merge the two (i.e.
>> rewrite
>> the PackageTest) and use the hairy big thing for the PackageTest
>> too, even
>> if it does not actually need it.
>>
>> I don't like to duplicate the code either, I know it is not good
>> practice,
>> that's why I've been thinking for a while that we should have a nice
>> xwiki
>> testing framework that would help us mock xwiki (and maybe store too)
>> fast, and not duplicate from other tests when we need it. As we all
>> know,
>> it is not only my opinion that testing is pretty uncomfortable right
>> now
>> (I changed 3 lines in the packager, I'm pretty sure they can't go
>> wrong
>> but I had to write a 300 lines test class...)
>
> 300 lines for 3 new lines is definitely wrong somewhere... :)
>
> We don't need a "testing framework" (not even sure what this means)
> but we do need to refactor existing code to make it easily testable yes.

I mean a set of base test classes that I can inherit and automatically
have the mocks / stubs / whatever you call it inside, done and ready, not
to have to write the setUp again and again and do the same things.

>
> Sometimes it's easy sometimes it's hard. My own rule is when I start
> to find that the test setup is too long (like I need to mock too many
> classes) then it means the code under tests is not nicely writen and
> it requires some refactoring. There are some easy refactoring (like
> introduce a protected method) and harder ones (like fix the whole
> design - which is what I'm doing for the rendering component, velocity
> component, observation component, etc).

And this is the moment when any normal person thinks of giving up writing
tests for 3 lines of code that will work for sure, isn't it? :) I would
never do that, fortunately.

>
>>> * The test setup sounds very (too) complex
>>
>> Yes, it might be a little too complex, but that is only because I
>> needed
>> to mock the store.
>
> You say you need to mock it but in the code I see you're stubbing it
> instead. Do you know why you need to do that?

Bad use of words (replace, wherever you feel needed, mock with stub).
I need to do that because I want to have a seemingly fully functional
xwiki and documents and everything without a real database, hibernate to
connect to it, etc, etc. And all that, is, I repeat, only because I want
to test how / if the API works after I put my code in, not how my code
works fullstop.

>
>> The access to Package functions is also the cause: the
>> impacted code was in a private function that I could have tested far
>> easier and faster if only I would have had access to it, so I had to
>> test
>> the function that calls the impacted function, etc, etc.
>> Actually I would love to know the xwiki guideline for writing unit
>> tests:
>> testing particular functions (I wrote a function, I need to test it)
>> --
>> how they work, the result, etc -- or testing the behaviour and the
>> result
>> of the XWiki API after the new code gets in. The latter is what I
>> tried to
>> do there, that's why the big setup.
>
> You are allowed (it's even recommended) to modify the code you're
> testing to make it more testable.
>
>>> * Missing spaces after comment //something vs // Something (note the
>>> uppercase to start a sentence :))
>>
>> Arguable, some of my comments are not full sentences :).
>>
>>> * several typos ;)
>>
>> guilty as charged
>
> Thanks
> -Vincent
>
>>> On Apr 11, 2008, at 3:01 PM, lucaa (SVN) wrote:
>>>
>>>> Author: lucaa
>>>> Date: 2008-04-11 15:01:25 +0200 (Fri, 11 Apr 2008)
>>>> New Revision: 9090
>>>>
>>>> Added:
>>>>  xwiki-platform/core/trunk/xwiki-core/src/test/java/com/xpn/xwiki/
>>>> plugin/packaging/ImportTest.java
>>>> Modified:
>>>>  xwiki-platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/
>>>> plugin/packaging/Package.java
>>>> Log:
>>>> XWIKI-2283: Overwrite on importing translation documents deletes the
>>>> original document too
>>>> * Added a test on import overwrite to delete the translated document
>>>> * Added a couple of tests on importing in the ImportTest class
>>>>
>>>>
>>>> Modified: xwiki-platform/core/trunk/xwiki-core/src/main/java/com/
>>>> xpn/
>>>> xwiki/plugin/packaging/Package.java
>>>> ===================================================================
>>>> --- xwiki-platform/core/trunk/xwiki-core/src/main/java/com/xpn/
>>>> xwiki/
>>>> plugin/packaging/Package.java      2008-04-11 12:45:37 UTC (rev 9089)
>>>> +++ xwiki-platform/core/trunk/xwiki-core/src/main/java/com/xpn/
>>>> xwiki/
>>>> plugin/packaging/Package.java      2008-04-11 13:01:25 UTC (rev 9090)
>>>> @@ -574,8 +574,11 @@
>>>>        if (status == DocumentInfo.INSTALL_OK || status ==
>>>> DocumentInfo.INSTALL_ALREADY_EXIST
>>>>            && doc.getAction() == DocumentInfo.ACTION_OVERWRITE) {
>>>>            if (status == DocumentInfo.INSTALL_ALREADY_EXIST) {
>>>> -                XWikiDocument deleteddoc =
>>>> -
>>>> context.getWiki().getDocument(doc.getFullName(), context);
>>>> +                  XWikiDocument deleteddoc =
>>>> context.getWiki().getDocument(doc.getFullName(), context);
>>>> +                  //if this document is a translation: we should only
>>>> delete the translation
>>>> +                if (doc.getDoc().getTranslation() != 0) {
>>>> +                    deleteddoc =
>>>> deleteddoc.getTranslatedDocument(doc.getLanguage(), context);
>>>> +                }
>>>>                try {
>>>>                    context.getWiki().deleteDocument(deleteddoc,
>>>> context);
>>>>                } catch (Exception e) {
>>>>
>>>> Added: xwiki-platform/core/trunk/xwiki-core/src/test/java/com/xpn/
>>>> xwiki/plugin/packaging/ImportTest.java
>>>> ===================================================================
>>>> --- xwiki-platform/core/trunk/xwiki-core/src/test/java/com/xpn/
>>>> xwiki/
>>>> plugin/packaging/ImportTest.java                           (rev 0)
>>>> +++ xwiki-platform/core/trunk/xwiki-core/src/test/java/com/xpn/
>>>> xwiki/
>>>> plugin/packaging/ImportTest.java   2008-04-11 13:01:25 UTC (rev 9090)
>>>> @@ -0,0 +1,357 @@
>>>> +/*
>>>> + * See the NOTICE file distributed with this work for additional
>>>> + * information regarding copyright ownership.
>>>> + *
>>>> + * This is free software; you can redistribute it and/or modify it
>>>> + * under the terms of the GNU Lesser General Public License as
>>>> + * published by the Free Software Foundation; either version 2.1 of
>>>> + * the License, or (at your option) any later version.
>>>> + *
>>>> + * This software is distributed in the hope that it will be useful,
>>>> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
>>>> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
>>>> + * Lesser General Public License for more details.
>>>> + *
>>>> + * You should have received a copy of the GNU Lesser General Public
>>>> + * License along with this software; if not, write to the Free
>>>> + * Software Foundation, Inc., 51 Franklin St, Fifth Floor,
>>>> Boston, MA
>>>> + * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
>>>> + */
>>>> +
>>>> +package com.xpn.xwiki.plugin.packaging;
>>>> +
>>>> +import java.io.BufferedReader;
>>>> +import java.io.ByteArrayOutputStream;
>>>> +import java.io.IOException;
>>>> +import java.io.OutputStreamWriter;
>>>> +import java.io.StringReader;
>>>> +import java.util.ArrayList;
>>>> +import java.util.Collections;
>>>> +import java.util.HashMap;
>>>> +import java.util.Iterator;
>>>> +import java.util.List;
>>>> +import java.util.Map;
>>>> +import java.util.zip.ZipEntry;
>>>> +import java.util.zip.ZipOutputStream;
>>>> +
>>>> +import org.jmock.Mock;
>>>> +import org.jmock.core.Invocation;
>>>> +import org.jmock.core.stub.CustomStub;
>>>> +import org.jmock.core.stub.VoidStub;
>>>> +import org.xwiki.component.manager.ComponentManager;
>>>> +
>>>> +import sun.reflect.generics.tree.VoidDescriptor;
>>>> +
>>>> +import com.xpn.xwiki.XWiki;
>>>> +import com.xpn.xwiki.XWikiConfig;
>>>> +import com.xpn.xwiki.XWikiContext;
>>>> +import com.xpn.xwiki.doc.XWikiDocument;
>>>> +import com.xpn.xwiki.store.XWikiHibernateRecycleBinStore;
>>>> +import com.xpn.xwiki.store.XWikiHibernateStore;
>>>> +import com.xpn.xwiki.store.XWikiHibernateVersioningStore;
>>>> +import com.xpn.xwiki.store.XWikiStoreInterface;
>>>> +import com.xpn.xwiki.store.XWikiVersioningStoreInterface;
>>>> +import com.xpn.xwiki.test.AbstractXWikiComponentTestCase;
>>>> +import com.xpn.xwiki.user.api.XWikiRightService;
>>>> +
>>>> +public class ImportTest extends AbstractXWikiComponentTestCase
>>>> +{
>>>> +  private Package pack;
>>>> +    private XWikiContext context;
>>>> +    private XWiki xwiki;
>>>> +    private Mock mockXWikiStore;
>>>> +    private Mock mockRecycleBinStore;
>>>> +    private Mock mockXWikiVersioningStore;
>>>> +    private Mock mockRightService;
>>>> +    private Map docs = new HashMap();
>>>> +
>>>> +    protected void setUp() throws Exception
>>>> +    {
>>>> +          this.pack = new Package();
>>>> +        this.context = new XWikiContext();
>>>> +        this.xwiki = new XWiki(new XWikiConfig(), this.context);
>>>> +
>>>> +        // We need to initialize the Component Manager so that
>>>> tcomponents can be looked up
>>>> +        this.context.put(ComponentManager.class.getName(),
>>>> getComponentManager());
>>>> +
>>>> +        //mock a store that would also hansle translations
>>>> +        this.mockXWikiStore =
>>>> +            mock(XWikiHibernateStore.class, new Class[]
>>>> {XWiki.class, XWikiContext.class},
>>>> +                new Object[] {this.xwiki, this.context});
>>>> +        this.mockXWikiStore.stubs().method("loadXWikiDoc").will(
>>>> +            new CustomStub("Implements
>>>> XWikiStoreInterface.loadXWikiDoc")
>>>> +            {
>>>> +                public Object invoke(Invocation invocation) throws
>>>> Throwable
>>>> +                {
>>>> +                    XWikiDocument shallowDoc = (XWikiDocument)
>>>> invocation.parameterValues.get(0);
>>>> +                  String documentKey = shallowDoc.getFullName();
>>>> +                  if (!shallowDoc.getLanguage().equals("")) {
>>>> +                          documentKey += "." + shallowDoc.getLanguage();
>>>> +                  }
>>>> +                    if (docs.containsKey(documentKey)) {
>>>> +                        return (XWikiDocument)
>>>> docs.get(documentKey);
>>>> +                    } else {
>>>> +                        return shallowDoc;
>>>> +                    }
>>>> +                }
>>>> +            });
>>>> +        this.mockXWikiStore.stubs().method("saveXWikiDoc").will(
>>>> +            new CustomStub("Implements
>>>> XWikiStoreInterface.saveXWikiDoc")
>>>> +            {
>>>> +                public Object invoke(Invocation invocation) throws
>>>> Throwable
>>>> +                {
>>>> +                    XWikiDocument document = (XWikiDocument)
>>>> invocation.parameterValues.get(0);
>>>> +                    document.setNew(false);
>>>> +                    document.setStore((XWikiStoreInterface)
>>>> mockXWikiStore.proxy());
>>>> +                    //if this is a translated document, append a
>>>> language prefix
>>>> +                    String documentKey = document.getFullName();
>>>> +                  if (!document.getLanguage().equals("")) {
>>>> +                          documentKey += "." + document.getLanguage();
>>>> +                  }
>>>> +                    docs.put(documentKey, document);
>>>> +                    return null;
>>>> +                }
>>>> +            });
>>>> +        this.mockXWikiStore.stubs().method("deleteXWikiDoc").will(
>>>> +                  new CustomStub("Implements
>>>> XWikiStoreInterface.deleteXWikiDoc")
>>>> +                  {
>>>> +                          public Object invoke(Invocation invocation) 
>>>> throws
>>>> Throwable
>>>> +                          {
>>>> +                                  XWikiDocument document = (XWikiDocument)
>>>> invocation.parameterValues.get(0);
>>>> +                                  //delete the document from the map
>>>> +                        String documentKey =
>>>> document.getFullName();
>>>> +                          if (!document.getLanguage().equals("")) {
>>>> +                                  documentKey += "." + 
>>>> document.getLanguage();
>>>> +                          }
>>>> +                          docs.remove(documentKey);
>>>> +                                  return null;
>>>> +                          }
>>>> +                  });
>>>> +
>>>> this.mockXWikiStore.stubs().method("getTranslationList").will(
>>>> +                  new CustomStub("Implements
>>>> XWikiStoreInterface.getTranslationList")
>>>> +                  {
>>>> +                          public Object invoke(Invocation invocation) 
>>>> throws
>>>> Throwable
>>>> +                          {
>>>> +                                  XWikiDocument document =
>>>> (XWikiDocument)invocation.parameterValues.get(0);
>>>> +                                  //search for this document in the map 
>>>> and return it's
>>>> translations
>>>> +                                  List translationList = new ArrayList();
>>>> +                                  for (Iterator pairsIt  = 
>>>> docs.entrySet().iterator();
>>>> pairsIt.hasNext();) {
>>>> +                                          Map.Entry currentEntry = 
>>>> (Map.Entry)pairsIt.next();
>>>> +                                          if
>>>> (((String)currentEntry.getKey()).startsWith(document.getFullName())
>>>> +                                                          && !
>>>> ((XWikiDocument)currentEntry.getValue()).getLanguage().equals("")) {
>>>> +                                                  //yeeey, it's a 
>>>> translation
>>>> +
>>>> translationList
>>>> .add(((XWikiDocument)currentEntry.getValue()).getLanguage());
>>>> +                                          }
>>>> +                                  }
>>>> +                                  return translationList;
>>>> +                          }
>>>> +                  }
>>>> +            );
>>>> +
>>>> this
>>>> .mockXWikiStore
>>>> .stubs().method("injectCustomMapping").will(returnValue(false));
>>>> +
>>>> +        this.mockRecycleBinStore =
>>>> mock(XWikiHibernateRecycleBinStore.class,
>>>> +                  new Class[] {XWikiContext.class}, new Object[]
>>>> {this.context});
>>>> +
>>>> this
>>>> .mockRecycleBinStore
>>>> .stubs().method("saveToRecycleBin").will(VoidStub.INSTANCE);
>>>> +
>>>> +        this.mockXWikiVersioningStore =
>>>> +            mock(XWikiHibernateVersioningStore.class, new Class[]
>>>> {XWiki.class,
>>>> +            XWikiContext.class}, new Object[] {this.xwiki,
>>>> this.context});
>>>> +
>>>> this
>>>> .mockXWikiVersioningStore
>>>> .stubs().method("getXWikiDocumentArchive").will(
>>>> +            returnValue(null));
>>>> +
>>>> this
>>>> .mockXWikiVersioningStore
>>>> .stubs().method("resetRCSArchive").will(returnValue(null));
>>>> +
>>>> +        this.xwiki.setStore((XWikiStoreInterface)
>>>> mockXWikiStore.proxy());
>>>> +
>>>> this
>>>> .xwiki
>>>> .setRecycleBinStore
>>>> ((XWikiHibernateRecycleBinStore)this.mockRecycleBinStore.proxy());
>>>> +
>>>> this.xwiki.setVersioningStore((XWikiVersioningStoreInterface)
>>>> mockXWikiVersioningStore
>>>> +            .proxy());
>>>> +
>>>> +        //mock the right service
>>>> +        this.mockRightService = mock(XWikiRightService.class);
>>>> +
>>>> this
>>>> .mockRightService
>>>> .stubs().method("checkAccess").will(returnValue(true));
>>>> +
>>>> this
>>>> .mockRightService
>>>> .stubs().method("hasAdminRights").will(returnValue(true));
>>>> +
>>>> this
>>>> .xwiki
>>>> .setRightService((XWikiRightService)this.mockRightService.proxy());
>>>> +    }
>>>> +
>>>> +    /**
>>>> +     * Test the regular document import.
>>>> +     *
>>>> +     * @throws Exception
>>>> +     */
>>>> +    public void testImportDocument() throws Exception
>>>> +    {
>>>> +          XWikiDocument doc1 = new XWikiDocument("Test", "DocImport");
>>>> +          doc1.setDefaultLanguage("en");
>>>> +
>>>> +          byte[] zipFile = this.createZipFile(new XWikiDocument[]
>>>> {doc1}, new String[] {"ISO-8859-1"});
>>>> +
>>>> +          //make sure no data is in the packager from the other tests
>>>> run
>>>> +          this.pack = new Package();
>>>> +          //import and install this document
>>>> +          this.pack.Import(zipFile, this.context);
>>>> +          this.pack.install(this.context);
>>>> +
>>>> +          //check if it is there
>>>> +          XWikiDocument foundDocument =
>>>> this.xwiki.getDocument("Test.DocImport", this.context);
>>>> +          assertFalse(foundDocument.isNew());
>>>> +
>>>> +          XWikiDocument nonExistingDocument =
>>>> this.xwiki.getDocument("Test.DocImportNonexisting", this.context);
>>>> +          assertTrue(nonExistingDocument.isNew());
>>>> +
>>>> +          XWikiDocument foundTranslationDocument =
>>>> foundDocument.getTranslatedDocument("fr", this.context);
>>>> +          assertSame(foundDocument, foundTranslationDocument);
>>>> +
>>>> +          XWikiDocument doc1Translation = new XWikiDocument("Test",
>>>> "DocImport");
>>>> +          doc1Translation.setLanguage("fr");
>>>> +          doc1Translation.setDefaultLanguage("en");
>>>> +          this.xwiki.saveDocument(doc1Translation, this.context);
>>>> +          foundTranslationDocument =
>>>> foundDocument.getTranslatedDocument("fr", this.context);
>>>> +          assertNotSame(foundDocument, foundTranslationDocument);
>>>> +    }
>>>> +
>>>> +    /**
>>>> +     * Test the import with document overwrite.
>>>> +     *
>>>> +     * @throws Exception
>>>> +     */
>>>> +    public void testImportOverwriteDocument() throws Exception
>>>> +    {
>>>> +          XWikiDocument doc1 = new XWikiDocument("Test",
>>>> "DocImportOverwrite");
>>>> +          doc1.setDefaultLanguage("en");
>>>> +
>>>> +          byte[] zipFile = this.createZipFile(new XWikiDocument[]
>>>> {doc1}, new String[] {"ISO-8859-1"});
>>>> +
>>>> +          //make sure no data is in the packager from the other tests
>>>> run
>>>> +          this.pack = new Package();
>>>> +          //import and install this document
>>>> +          this.pack.Import(zipFile, this.context);
>>>> +          this.pack.install(this.context);
>>>> +
>>>> +          //check if it is there
>>>> +          XWikiDocument foundDocument =
>>>> this.xwiki.getDocument("Test.DocImportOverwrite", this.context);
>>>> +          assertFalse(foundDocument.isNew());
>>>> +
>>>> +          //create the overwriting document
>>>> +          String newContent = "This is new content";
>>>> +          XWikiDocument overwritingDoc = new XWikiDocument("Test",
>>>> "DocImportOverwrite");
>>>> +          overwritingDoc.setContent(newContent);
>>>> +
>>>> +          zipFile = this.createZipFile(new XWikiDocument[]
>>>> {overwritingDoc}, new String[] {"ISO-8859-1"});
>>>> +
>>>> +          //use a new packager because we need to clean-up import data
>>>> (files list, doucument data)
>>>> +          this.pack = new Package();
>>>> +          //import and install
>>>> +          this.pack.Import(zipFile, this.context);
>>>> +          this.pack.install(this.context);
>>>> +
>>>> +          //check if the document is there
>>>> +          XWikiDocument foundOverwritingDoc =
>>>> this.xwiki.getDocument("Test.DocImportOverwrite", this.context);
>>>> +          assertFalse(foundOverwritingDoc.isNew());
>>>> +          assertEquals(foundOverwritingDoc.getContent(), newContent);
>>>> +    }
>>>> +
>>>> +    /**
>>>> +     * Test the import of translation files, with overwrite.
>>>> +     * @throws Exception
>>>> +     */
>>>> +    public void testImportTranslationsOverwrite() throws Exception
>>>> +    {
>>>> +          XWikiDocument original = new XWikiDocument("Test",
>>>> "DocTranslation");
>>>> +          original.setDefaultLanguage("en");
>>>> +          original.setTranslation(0);
>>>> +          XWikiDocument translation = new XWikiDocument("Test",
>>>> "DocTranslation");
>>>> +          translation.setLanguage("fr");
>>>> +          translation.setDefaultLanguage("en");
>>>> +          translation.setTranslation(1);
>>>> +          translation.setOriginalDocument(original);
>>>> +
>>>> +          //import and install those twice with tests
>>>> +          byte[] zipFile = this.createZipFile(new XWikiDocument[]
>>>> {original, translation},
>>>> +                          new String[] {"ISO-8859-1", "ISO-8859-1"});
>>>> +
>>>> +          //make sure no data is in the packager from the other tests
>>>> run
>>>> +          this.pack = new Package();
>>>> +          this.pack.Import(zipFile, this.context);
>>>> +          this.pack.install(this.context);
>>>> +          XWikiDocument foundDocument =
>>>> this.xwiki.getDocument("Test.DocTranslation", this.context);
>>>> +          assertFalse(foundDocument.isNew());
>>>> +          //get the translation
>>>> +          XWikiDocument translationDoc =
>>>> foundDocument.getTranslatedDocument("fr", this.context);
>>>> +          assertFalse(translationDoc.isNew());
>>>> +
>>>> +          //use a new packager because we need to clean-up import data
>>>> (files list, doucument data)
>>>> +          this.pack = new Package();
>>>> +          //import again and do the same tests
>>>> +          this.pack.Import(zipFile, this.context);
>>>> +          this.pack.install(this.context);
>>>> +          foundDocument = this.xwiki.getDocument("Test.DocTranslation",
>>>> this.context);
>>>> +          //might not be the best method to test the document is in the
>>>> store though...
>>>> +          assertFalse(foundDocument.isNew());
>>>> +          //get the translation
>>>> +          translationDoc = foundDocument.getTranslatedDocument("fr",
>>>> this.context);
>>>> +          assertFalse(translationDoc.isNew());
>>>> +    }
>>>> +
>>>> +    private String getPackageXML(XWikiDocument docs[])
>>>> +    {
>>>> +        StringBuilder sb = new StringBuilder();
>>>> +        sb.append("<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>
>>>> \n");
>>>> +        sb.append("<package>\n").append("<infos>
>>>> \n").append("<name>Backup</name>\n");
>>>> +        sb.append("<description>on Mon Jan 01 01:44:32 CET 2007 by
>>>> XWiki.Admin</description>\n");
>>>> +        sb.append("<licence></licence>\n");
>>>> +        sb.append("<author>XWiki.Admin</author>\n");
>>>> +        sb.append("<version></version>\n");
>>>> +        sb.append("<backupPack>true</backupPack>\n");
>>>> +        sb.append("</infos>\n");
>>>> +        sb.append("<files>\n");
>>>> +        for (int i = 0; i < docs.length; i++) {
>>>> +
>>>> +            sb.append(
>>>> +                "<file defaultAction=\"0\" language=\"" +
>>>> docs[i].getLanguage() + "\">" + docs[i].getFullName() + "</file>
>>>> \n");
>>>> +        }
>>>> +        sb.append("</files></package>\n");
>>>> +        return sb.toString();
>>>> +    }
>>>> +
>>>> +    private byte[] getEncodedByteArray(String content, String
>>>> charset) throws IOException
>>>> +    {
>>>> +        StringReader rdr = new StringReader(content);
>>>> +        BufferedReader bfr = new BufferedReader(rdr);
>>>> +        ByteArrayOutputStream ostr = new ByteArrayOutputStream();
>>>> +        OutputStreamWriter os = new OutputStreamWriter(ostr,
>>>> charset);
>>>> +
>>>> +        // Voluntarily ignore the first line... as it's the xml
>>>> declaration
>>>> +        String line = bfr.readLine();
>>>> +        os.append("<?xml version=\"1.0\" encoding=\"" + charset +
>>>> "\"?>\n");
>>>> +
>>>> +        line = bfr.readLine();
>>>> +        while (null != line) {
>>>> +            os.append(line);
>>>> +            os.append("\n");
>>>> +            line = bfr.readLine();
>>>> +        }
>>>> +        os.flush();
>>>> +        os.close();
>>>> +        return ostr.toByteArray();
>>>> +    }
>>>> +
>>>> +    private byte[] createZipFile(XWikiDocument docs[], String[]
>>>> encodings) throws Exception
>>>> +    {
>>>> +        ByteArrayOutputStream baos = new ByteArrayOutputStream();
>>>> +        ZipOutputStream zos = new ZipOutputStream(baos);
>>>> +        ZipEntry zipp = new ZipEntry("package.xml");
>>>> +        zos.putNextEntry(zipp);
>>>> +        zos.write(getEncodedByteArray(getPackageXML(docs),
>>>> "ISO-8859-1"));
>>>> +        for (int i = 0; i < docs.length; i++) {
>>>> +          String zipEntryName = docs[i].getSpace() + "/" +
>>>> docs[i].getName();
>>>> +          if (docs[i].getTranslation() != 0) {
>>>> +                  zipEntryName += "." + docs[i].getLanguage();
>>>> +          }
>>>> +            ZipEntry zipe = new ZipEntry(zipEntryName);
>>>> +            zos.putNextEntry(zipe);
>>>> +            String xmlCode = docs[i].toXML(false, false, false,
>>>> false, context);
>>>> +            zos.write(getEncodedByteArray(xmlCode, encodings[i]));
>>>> +        }
>>>> +        zos.closeEntry();
>>>> +        return baos.toByteArray();
>>>> +    }
>>>> +}
>>>>
>>>> _______________________________________________
>>>> notifications mailing list
>>>> [EMAIL PROTECTED]
>>>> http://lists.xwiki.org/mailman/listinfo/notifications
>>>
>>> _______________________________________________
>>> devs mailing list
>>> [email protected]
>>> http://lists.xwiki.org/mailman/listinfo/devs
>>>
>>
>>
>> _______________________________________________
>> devs mailing list
>> [email protected]
>> http://lists.xwiki.org/mailman/listinfo/devs
>
> _______________________________________________
> devs mailing list
> [email protected]
> http://lists.xwiki.org/mailman/listinfo/devs
>


_______________________________________________
devs mailing list
[email protected]
http://lists.xwiki.org/mailman/listinfo/devs

Reply via email to