Diskuze: Apache Velocity - template tvořený z hashmapy dvou hashmap

Java Java Apache Velocity - template tvořený z hashmapy dvou hashmap

Avatar
nalimleinad
Člen
Avatar
nalimleinad:

Zdravím, dělám prvně s touto templatovou knihovnou a potřeboval bych vygenerovat playlist včetně písniček pro jPlayer.

Můj template vypadá takto:

**#foreach( $playlist in $playlists )
    ("$playlist.playlistnumber").click(function() {
                myPlaylist.setPlaylist([
        #foreach( $file in $fileList )
    {
      title:"$file.title",
      artist:"ARTIST",
      mp3:"music/$file.filename",
      poster: "images/m0.jpg"
    },
    #end
                ]);
        });
#end**

A funkce pro generování:

HashMap<HashMap<String, String>, HashMap<String, String>> hm = new HashMap<HashMap<String, String>, HashMap<String, String>>();

        for (int i = 0; i<listFiles.size(); i++) {
            HashMap<String, String> playlists = new HashMap<String, String>();
            HashMap<String, String> songs = new HashMap<String, String>();
            playlists.put("playlistnumber", "playlist" + i);

            for (int j = 0; j<listFiles.get(listDirectories().get(i)).size(); j++) {
                songs.put("filename", listFiles.get(listDirectories().get(i)).toString());
                songs.put("title", prefix + Integer.toString(i+1));
            }
            hm.put(playlists, songs);
        }

        System.out.println("hm: " + hm);

        VelocityContext context = new VelocityContext();
        context.put("playlists", hm);
        context.put("fileList", list);

Jako output dostanu:

hm: {{playlistnumber=playlist0}={title=1, filename=[C:\Data\java_workspace\Demo example file generator\music\analfabet\00c0af12-3f94-4ce6-b1ca-704f24c77941.mp3]}, {playlistnumber=playlist1}={title=2, filename=[C:\Data\java_workspace\Demo example file generator\music\dálava\00c0af12-3f94-4ce6-b1ca-704f24c77941.mp3]}, {playlistnumber=playlist2}={title=3, filename=[C:\Data\java_workspace\Demo example file generator\music\erb\00c0af12-3f94-4ce6-b1ca-704f24c77941.mp3]}}

což vypadá, že je v pořádku a v takovém formátu, jaký potřebuju, avšak output z templatu vypadá takto:

("$playlist.playlistnumber").click(function() {
            myPlaylist.setPlaylist([
                    ]);
    });
("$playlist.playlistnumber").click(function() {
            myPlaylist.setPlaylist([
                    ]);
    });
("$playlist.playlistnumber").click(function() {
            myPlaylist.setPlaylist([
                    ]);
    });

Dělá někdo s Velocity, popř. byl by schopný mi napovědět, kde dělám chybu ?

 
Odpovědět 25. července 10:09
Avatar
nalimleinad
Člen
Avatar
nalimleinad:

Upravil jsem template na:

#foreach( $playlist in $playlists.keySet() )
    ("$playlist.playlistnumber").click(function() {
                myPlaylist.setPlaylist([
        #foreach( $filename in $playlist )
    {
      title:"$playlist.playlistNumber.title",
      artist:"GAIA",
      mp3:"music/$playlist.playlistnumber.filename",
      poster: "images/m0.jpg"
    },
    #end
                ]);
        });
#end

A z outputu už mi leze již půlka v pohodě:

("playlist0").click(function() {
                myPlaylist.setPlaylist([
            {
      title:"[playlistnumber=playlist0]",
      artist:"ARTIST",
      mp3:"music/$playlist.playlistnumber.filename",
      poster: "images/m0.jpg"
    },
                ]);
        });
    ("playlist1").click(function() {
                myPlaylist.setPlaylist([
            {
      title:"[playlistnumber=playlist1]",
      artist:"ARTIST",
      mp3:"music/$playlist.playlistnumber.filename",
      poster: "images/m0.jpg"
    },
                ]);
        });
    ("playlist2").click(function() {
                myPlaylist.setPlaylist([
            {
      title:"[playlistnumber=playlist2]",
      artist:"ARTIST",
      mp3:"music/$playlist.playlistnumber.filename",
      poster: "images/m0.jpg"
    },
                ]);
        });

Nyní bych se však potřeboval dostat do vnitřních hodnot jednotlivých playlistů, což se mi nedaří.

 
Nahoru Odpovědět 25. července 10:51
Avatar
Atrament
Člen
Avatar
Atrament:

Nemůže bejt chyba, že v tom vnořeném for-cyklu používáš i místo j?

for (int j = 0; j<listFiles.get(listDirectories().get(i)).size(); j++) {  //deklaruješ proměnnou j
                songs.put("filename", listFiles.get(listDirectories().get(i)).toString()); //ale v cyklu samotném používáš i a j není nikde použito
                songs.put("title", prefix + Integer.toString(i+1));
}

Popravdě jsem to moc pečlivě nezkoumal co to dělá, takže jsem možná mimo, a má to tak být, akorát, že mě to praštilo do očí :)

 
Nahoru Odpovědět 25. července 22:24
Avatar
nalimleinad
Člen
Avatar
nalimleinad:

Je pravda, že ho tam zbytečně deklaruju, ale ničemu to nevadí. Měl jsem ho tam předtím ještě na další účely, každopádně jak píšu výše - output z javové funkce mi leze správný, jen ho potřebuji nějak dostat do template filu.

 
Nahoru Odpovědět 25. července 22:41
Avatar
nalimleinad
Člen
Avatar
nalimleinad:

Tak jsem problém vyřešil úpravou funkce na

HashMap<HashMap<String, String>, TreeMap<String, String>> output = new HashMap<HashMap<String, String>, TreeMap<String, String>>();
        TreeMap<String, String> playlistFiles = new TreeMap<String, String>();
        ArrayList<String> filenames = new ArrayList<String>();

        for (int i = 0; i < listFiles.size(); i++) {
            HashMap<String, String> playlist = new HashMap<String, String>();

            playlist.put("playlistnumber", "playlist" + i);

            filenames = listFiles.get(listDirectories().get(i));

            playlistFiles = new TreeMap<String, String>();
            for (int j = 0; j < filenames.size(); j++) {
                playlistFiles.put(prefix + Integer.toString(j + 1), listDirectories().get(i) + "/" + filenames.get(j));
            }

            output.put(playlist, playlistFiles);
        }

a template filu na:

#foreach( $playlist in $playlists.keySet() )
    $("#$playlist.playlistnumber").click(function() {
        myPlaylist.setPlaylist([
    #set ($map = $playlists.get($playlist) )
    #foreach( $mapEntry in $map.entrySet() )
    {
            title:"$mapEntry.key",
            artist:"ARTIST",
            mp3:"music/$mapEntry.value",
            poster: "images/m0.jpg"
            },
    #end
    ]);
    });
#end

Vše nyní funguje jak má :)

Akceptované řešení
+5 Zkušeností
Řešení problému
 
Nahoru Odpovědět 1. srpna 13:38
Avatar
Atrament
Člen
Avatar
Odpovídá na nalimleinad
Atrament:

Diamond operátor znáš? Pokud ne tak věz, že

HashMap<HashMap<String, String>, TreeMap<String, String>> output = new HashMap<HashMap<String, String>, TreeMap<String, String>>();

se od verze javy 7 dá zapsat takto:

HashMap<HashMap<String, String>, TreeMap<String, String>> output = new HashMap<>();

a když už jsem v tom, tak ještě líp by to bylo

Map<Map<String, String>, Map<String, String>> output = new HashMap<>();

programujeme oproti interface, ne oproti implementaci ;)

 
Nahoru Odpovědět 2. srpna 0:02
Avatar
nalimleinad
Člen
Avatar
Odpovídá na Atrament
nalimleinad:

Java 7 ? To je něco z budoucnosti ? :-O

Díky za info, do budoucna na to budu myslet. ;-)

 
Nahoru Odpovědět 2. srpna 8:11
Avatar
ostrozan
Redaktor
Avatar
Odpovídá na nalimleinad
ostrozan:

Java 7 ? To je něco z budoucnosti ? :-O

I ty šprýmaři - aktuální je java 8 a devítka se chystá

 
Nahoru Odpovědět 2. srpna 8:29
Avatar
nalimleinad
Člen
Avatar
Odpovídá na ostrozan
nalimleinad:

To já vím, jen si dělám srandu :)

Bohužel nepíšu v javě tak moc, jak bych si možná i přál, takže určité znalosti mi stále trochu chybí, každopádně zapamatuji si a budu používat. ;-)

 
Nahoru Odpovědět 2. srpna 21:06
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 9 zpráv z 9.