Veröffentlichen ohne Sprachverzeichnis

hoebbel
e-Spirit employee
4 5 1,182

Immer wieder werde ich gefragt, ob es denn nicht möglich sei, auf die Sprachkürzel bei der Generierung komplett zu verzichten.

Manchmal kommt auch eine Anfrage, in der explizit die üblichen Lösungswege (Redirect im Apache, Multiview, Infix) nicht gewünscht werden.

Es sollte ein sauberer Auftritt erzeugt werden, in dem es keine Sprachkürzel gibt, da nur eine Sprache verwendet wird.

Da das Schreiben eines eigenen URLCreators out-of-scope ist, habe ich die zweitbeste Lösung umgesetzt, die mir eingefallen ist (prototypischer Lösungsansatz für Linux)

  1. Generierung mit Multiview URLs (Sprachkürzel wird als an den Dateinamen angehängt, z.B. index.html.de)
    Wird bei der Generierungsaktion eingestellt, siehe Handbuch für Administratoren, Kapitel "7.5.9.2 Generierung ausführen"
  2. Nach der Generierung wird ein Skript ausgeführt, welches die nicht benötigten Sprachkürzel entfernt.

Da bei dieser Generierungsmethode Links ohne Sprachkürzel erzeugt werden, hat man danach einen sauberen Auftritt.

Das Beanshell Skript ist etwas länger geraten, da die Rückgabe komplett verarbeitet werden soll.

Hier das entsprechende Shell-Skript (zu entfernendes Sprachkürzel ist .de)

IFS=$(echo) find $1 -name \*.de | while read f; do export FILE=$(basename "$f" .de); export DIR=$(dirname "$f"); mv -v "$f" "$DIR/$FILE"; done

und das Beanshell Skript, welches dieses Shellskript (welches im Beispiel unter

/home/fs41/firstspirit4/temp/rename.sh abgelegt wurde)

aufruft:

import java.util.*;

class StreamCapture extends Thread {
    InputStream i;
    boolean useErrlog;
    StreamCapture(InputStream inputstream, boolean useErrorlog) {
        i = inputstream;
        useErrlog = useErrorlog;
    }

public void run() {
    try {
        InputStreamReader reader = new InputStreamReader(i);
        BufferedReader buffr = new BufferedReader(reader);
        String l = null;
        while ((l = buffr.readLine()) != null) {
            if(useErrlog) {
                context.logError(l);
            } else {
                context.logInfo(l);
            }
        }
    } catch (IOException ex) {
        context.logError( " failed: " + ex);

    } finally {
            try {            

                i.close();

            } catch (IOException exClose) {
                // ignore
            }
        }
}
}

// Hier wird das bzw. die Dateikommandos zusammengebaut
cmd = new Vector();

cmd1 = new Vector();
context.logInfo("Generierungsverzeichnis: " + context.getPath());

//filesystem script for linux
// we need this:
// bash -c 'IFS=$(echo) find test -name \*.de | while read f; do export FILE=$(basename "$f" .de); export DIR=$(dirname "$f"); mv -v "$f" "$DIR/$FILE"; done'

cmd1 = new Vector();
cmd1.add("/home/fs41/firstspirit4/temp/rename.sh");
cmd1.add(context.getPath());
cmd.add(cmd1);

for(c: cmd) {
    cmdstr = "";
    for (String s : c) {
        cmdstr += " " + s;
    }
    cmdstr = "ProcessBuilder(" + cmdstr.substring(1) + ")";
    context.logInfo(cmdstr);
    Process p = null;
    try {
        p = new ProcessBuilder(c).start();
        InputStream is = p.getInputStream();
        StreamCapture stdout = new StreamCapture(p.getInputStream(),false);
        StreamCapture stderr = new StreamCapture(p.getErrorStream(), true);
        stdout.start();
        stderr.start();
        result = p.waitFor();
        stdout.join(3000);
        stderr.join(3000);
        p.getOutputStream().close();
        if ( result == 0 ) {
            context.logInfo("command completed");
        } else {
            context.logError("failed with exitcode "    + result + " for " + cmdstr);
        }
    } catch (InterruptedException e) {
        context.logError("timeout for " + cmdstr + ": " + e);
    } catch (Exception e) {
        context.logError("failed for " + cmdstr + ": " + e);
    } finally {
        if (p != null) {
            try {
                p.getOutputStream().close();
            } catch (IOException ignore) {
                // ignore
            }
        }

    }

}

Edited: Beanshell-Skript so geändert, dass keine Filehandles liegen bleiben.

Edited: Fehlende Klammer in der vorletzten Zeile hinzugefügt

5 Comments