[ strain @ 08.03.2012. 14:50 ] @
Na faxu sam dobio sledeci zadatak:

Tekst zadatka: Napraviti Tapestry aplikaciju kojoj uploadujemo zip fajl. Aplikacija raspakuje fajl u neki
unapred zadati foler i na strani prikaže spisak svih fajlova iz tog foldera.

Napomena: Aplikacija ovo treba da radi pomoæu Ajax tehnologije što znaèi da ne prikazuje novu
stranu veæ da to radi asinhrono na istoj strani. Što znaèi da na istoj strani se uploaduje fajl i kada se
upload završi odreðen deo strane prikaže informaciju o sadržaju fajla.

I ja sam uradio da se odabrani zip raspakuje, ali nikako da uspem da prikazem listu na strani. Znam to treba pomocu @InjectComponent... ali nikako da to uradim kako treba vec dva dana se maltretiram i nikako da resim evo ovo je kod.

Index.java
Code:

package cs230.bi175.dz01.pages;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import org.apache.tapestry5.annotations.InjectComponent;
import org.apache.tapestry5.annotations.Property;
import org.apache.tapestry5.corelib.components.Zone;
import org.apache.tapestry5.upload.services.UploadedFile;

/**
 *
 * @author Marko Strainovic
 */
public class Index {


    @Property
    private UploadedFile file;
    @InjectComponent
    private Zone spisak;
    @Property
    private List<String> fileList;
    
    private static final String OUTPUT_FOLDER = "C:\\outputzip";
 
 
    public Object onSuccess() {
        dekompresija(file.getFilePath(), OUTPUT_FOLDER);
        return spisak;
    }
    
    
    /**Raspakuje zip file na unapred definisanu lokaciju
     * 
     * @param zipFile - fajl koji treba raspakovati
     * @param outputFolder - folder u koji ce zipFile biti raspakovan
     */
    public void dekompresija(String zipFile, String outputFolder){
 
     byte[] buffer = new byte[1024];
 
     try{
 
         //creira output direktorijum ako ne postoji
        File folder = new File(OUTPUT_FOLDER);
        if(!folder.exists()){
            folder.mkdir();
        }
 
        //uzima sadrzaj zip fajla
        ZipInputStream zis = 
            new ZipInputStream(new FileInputStream(zipFile));

        //uzima listu zipovane datoteke
        ZipEntry ze = zis.getNextEntry();
 
        while(ze!=null){
 
           String fileName = ze.getName();
           File newFile = new File(outputFolder + File.separator + fileName);
 
           System.out.println("file unzip : "+ newFile.getAbsoluteFile());
 
            //kreira sve nepostojece foldere
            //inace se dobija FileNotFoundException za kompresovane foldere
            new File(newFile.getParent()).mkdirs();
 
            FileOutputStream fos = new FileOutputStream(newFile);             
 
            int len;
            while ((len = zis.read(buffer)) > 0) {
               fos.write(buffer, 0, len);
            }
 
            fos.close();   
            ze = zis.getNextEntry();
        }
 
        zis.closeEntry();
        zis.close();
 
        System.out.println("Done");
 
    }catch(IOException ex){
       ex.printStackTrace(); 
    }
   }    
}


Index.tml
Code:

<html xmlns:t="http://tapestry.apache.org/schema/tapestry_5_0_0.xsd">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <title>${message:title}</title>
    </head>
    <body>
        <h1>${message:title}</h1>
        <t:form>
            <t:errors/>
            <input t:type="upload" t:id="file" validate="required"/>
            <br/>
            <input type="submit" value="Upload"/>
        </t:form>

        <t:zone t:id="spisak" id="spisak">

        </t:zone>


    </body>
</html>


Da li neko zna gde gresim, odnosno sta fali?
[ vXv_aliGator @ 20.03.2012. 23:04 ] @
Mislim da ti ovo moze pomoci.

U *.tml stranici dodaj sledece:
Code:

<t:zone t:id="mainZone">
      <t:delegate to="upload"/>
</t:zone>

<t:block id="upload">
  <form t:type="Form" t:id="form" t:zone="mainZone">
    <!-- Ovde dodaj sve potrebne komponente ukljucujuci submit dugme -->
  </form>
</t:block>

<t:block id="display">
  <!-- Ovde dodaj sve sta treba biti prikazano kada se upload zavrsi -->
</t:block>


U *.java fajlu dodaj sledece:
Code:

@Property
@Inject
private Block upload; // mora biti isto ime kao id u tml stranici!

@Property
@Inject
private Block display; // mora biti isto ime kao id u tml stranici!

Object onSuccess() {
       dekompresija(file.getFilePath(), OUTPUT_FOLDER);
       return display; // ovo ce prikazati sadrzaj bloka display
}


Srecno!
[ strain @ 22.03.2012. 12:49 ] @
Ovo sad ovako nece ni da raspakuje zip file.

Ja sam uspeo da raspakujem fajl smo mi je problem da prikazem spisak fajlova na istoj strani.
[ vXv_aliGator @ 22.03.2012. 22:22 ] @
Napravio sam jednu aplikaciju koja bi ti mogla pomoci. Jedini problem koji imam jeste da upload komponenta nikako ne moze da prodje validaciju. Nemam pojma do cega je to. Ovo su glavni kodovi tog projekta:
Ukoliko hoces da imas cio kod mozes ga preuzeti sa google.code sajta koristeci mercurial. https://code.google.com/p/tapestry-upload-test

Index.java
Code:

package com.unziper.helpapp.tapestry.pages;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

import org.apache.tapestry5.annotations.InjectComponent;
import org.apache.tapestry5.annotations.Persist;
import org.apache.tapestry5.annotations.Property;
import org.apache.tapestry5.annotations.SetupRender;
import org.apache.tapestry5.corelib.components.Zone;
import org.apache.tapestry5.upload.services.UploadedFile;

import com.unziper.helpapp.util.IUnZiper;
import com.unziper.helpapp.util.UnZiper;

/**
 * Start page of application helpapp.
 */
public class Index {

    @Property
    private UploadedFile file;

    @InjectComponent
    private Zone displayZone;

    @Persist
    private IUnZiper unZiper;

    @SetupRender
    public void initialize() {
        unZiper = new UnZiper();
    }

    @Property
    private String currentFilePath;

    public List<String> fileList() {
        if (unZiper.isUnziped()) {
            File outFile = new File(UnZiper.OUTPUT_FOLDER);
            List<String> result = new ArrayList<String>();
            for (String s : outFile.list()) {
                result.add(s);
            }
            return result;
        }
        return null;
    }

    public Object onSuccess() {
        System.out.println("Hello: " + file.getFileName());
        unZiper.unzip(new File(file.getFileName()));
        return displayZone.getBody();
    }
}


Index.tml
Code:

<html t:type="layout"
    xmlns:t="http://tapestry.apache.org/schema/tapestry_5_3.xsd"
    xmlns:p="tapestry:parameter">
    <h2>Upload ziped file:</h2>
    <t:form t:type="Form" t:id="uploadForm" t:zone="displayZone">
        <t:errors/>
        <table>
            <tr>
                <td><p>File Path: </p></td>
                <td><input t:type="upload" t:id="file" t:value="file" validate="required" /></td>
            </tr>
            <tr>
                <td><input type="submit" value="Upload" /></td>
            </tr>
        </table>
    </t:form>
    <t:zone t:id="displayZone" id="displayZone" visible="false">
        <h2>Unziped file list:</h2> 
        <table>
            <thead>
                <tr>
                    <th>File Path</th>
                </tr>
            </thead>
            <tr>
                <t:loop source="fileList()" value="currentFilePath">
                    <td><p>${currentFilePath}</p></td>
                </t:loop>
            </tr>
        </table>
    </t:zone>
</html>


UnZiper.java
Code:

package com.unziper.helpapp.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

public class UnZiper implements IUnZiper {

    public static void main(String[] args) {
        UnZiper unZiper = new UnZiper();
        File inFile = new File("C:\\Users\\BoRko\\Desktop\\com.zip");
        unZiper.unzip(inFile);
    }

    public static final String OUTPUT_FOLDER = "C:\\UnzipedContent";

    private File inFile;
    private File outFile;
    private boolean isUnziped;

    public UnZiper() {
        initialize();
    }

    public UnZiper(File inFile) {
        setInFile(inFile);
        initialize();
    }

    public void unzip(File inFile) {
        setInFile(inFile);
        byte[] buffer = new byte[1024];

        // Create output directory if don't exist.
        if (!getOutFile().exists()) {
            getOutFile().mkdir();
        }

        try {
            ZipInputStream inputStream = new ZipInputStream(new FileInputStream(getInFile()));
            ZipEntry zipEntry = inputStream.getNextEntry();

            while (zipEntry != null) {
                String currentFileName = zipEntry.getName();
                File currentFile = new File(getOutFile() + File.separator + currentFileName);

                System.out.println("file unzip : " + currentFile.getAbsolutePath());
                if (!currentFile.getName().contains(".")) {
                    currentFile.mkdirs();
                } else {
                    currentFile.createNewFile();
                    FileOutputStream outputStream = new FileOutputStream(currentFile);

                    int lenght = 0;
                    while ((lenght = inputStream.read(buffer)) > 0) {
                        outputStream.write(buffer, 0, lenght);
                    }
                    outputStream.close();
                }
                zipEntry = inputStream.getNextEntry();
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        setUnziped(true);
    }

    private void initialize() {
        setOutFile(new File(OUTPUT_FOLDER));
    }

    public File getInFile() {
        return inFile;
    }

    public void setInFile(File inFile) {
        this.inFile = inFile;
    }

    public File getOutFile() {
        return outFile;
    }

    public void setOutFile(File outFile) {
        this.outFile = outFile;
    }

    public boolean isUnziped() {
        return isUnziped;
    }

    public void setUnziped(boolean isUnziped) {
        this.isUnziped = isUnziped;
    }

}

[ vXv_aliGator @ 22.03.2012. 22:32 ] @
Da i onaj kod za unzipovanje koji si postovao nije htio da radi kod mene, pa sam malo doradjivao. Primjetices da nisam koristio onu metodu sto sam ti predlozio jer je izgleda zastarila. Pozdrav
[ strain @ 23.03.2012. 12:31 ] @
Ja nisam nikad koristio ovaj google code pa cu sad da vidim kako to funkcionise pa cu probati da nesto iskoristim.

Ako imas neki savet za google code valjalo bi.

Hvala puno za pomoc, vec sam poceo da dizem ruke nije bilo nikog danima.
[ strain @ 23.03.2012. 13:12 ] @
Nesto sam na brzinu prebacio kod mene ovako sa foruma i nesto ne radi. Nemam sad vremena da detaljnije pogledam ali nesto nece.

Prijavljuje

Code:

Component Index does not contain an embedded component with id 'displayZone'. Available components: (none).
[ vXv_aliGator @ 23.03.2012. 13:24 ] @
Instaliraj mercurijal sa ovog sajta: http://mercurial.selenic.com/, zatim idi na http://code.google.com/p/tapestry-upload-test/source/checkout i vidjeces ispisanu komandu kako da kloniras projekat na tvoj komp. Ta komanda je: hg clone https://[email protected]/p/tapestry-upload-test/

Znaci to radis sa command prompt-om sto se tice merkurijala. Potrebno je da dodjes do workspace-a u koji smjestas projekat i izvrsis komandu. Ukoliko se ne snadjes mogu ti pomoci preko Team Viewer-a. To je neki program za remote desktop assistance. Naravno treba da imas instaliran maven. I plugin mavena u eclipse IDE-u (ukoliko radis u eclipse). Kad skines projekat u workspace, potrebno je da ga pomocu maven plugina za eclipse importujes "Import Exsisting Maven Project".

Inace moj nik na skype-u je "pro-feler", ukoliko ti treba pomoc oko instalacija.
[ vXv_aliGator @ 24.03.2012. 00:54 ] @
Popravio sam neke stvari... sad radi sve kako treba. Zadatak je bio dosta interesantan. Sad konacno i radi. Upload-ovo sam finalne izmjene na http://code.google.com/p/tapestry-upload-test/ sajtu. Obrisi stari i kloniraj ponovo na komp sa mercurijal-om.

Pozdrav.
[ strain @ 24.03.2012. 17:58 ] @
Super, ovo sto si uradio je odlicno.

Hvala puno na pomoci.