Zum Hauptinhalt gehen

Probleme mit URLFactory

Kommentare

29 Kommentare

  • Zendesk API User
    Author: Hendrik - 8/26/2013 9:47

    Hallo Stefan,

    werf doch mal einen Blick in die Logs des Generierungsauftrages. Wenn die besagte URL nicht exakt durch Eure URLFactory erzeugt wurde, kolidiert diese URL höchstwahrscheinlich mit einem URL-Eintrag den FirstSpirit noch gespeichert hat. In unserem Fall werden die gespeicherten URLs von gelöschten Elementen nicht automatisch durch FS zurückgesetzt (bekannter Bug), im Generierungsauftrag finden sich dann für Elemente welche die gleiche URL wie ein zuvor ein gelöschtes bekommen würden Log Ausgaben die auf einen URL Konflikt hinweisen:

    WARN  25.07.2013 18:51:15.981 (de.espirit.firstspirit.generate.path.RegistryUrlFactory): URI conflict detected..

    In einem solchem Fall hängt FS allerdings am Ende der URL die durch die eigene URLFactory erzeugt wurde -n an (also z.B. index.html-2), also etwas anders als du es beschrieben hast. Aber vielleicht hilfts ja dennoch :smileywink:

    Mit einem Skript zur löschen der von FS gespeicherten URLs gelöschter Element könnte ich bei Bedarf dienen :smileycool:

    Gruß,

    Hendrik

    0
  • Zendesk API User
    Author: ampersand83 - 8/26/2013 10:13

    Hallo Hendrik,

    danke für deine Antwort. Aber das scheint es nicht zu sein. Im Log des Generierungsauftrags finde ich nicht den geringsten Heinweis auf einen Konflikt. Ich hänge jetzt einfach mal den Quelltext der URLFactory an. Vielleicht kann ja von euch jemand erkennen, wieso z.B. eine Datei index-2.html erzeugt wird.

    package de.namics.fs.urlfactory;

    import de.espirit.common.StringUtil;

    import de.espirit.common.io.IoError;

    import de.espirit.firstspirit.access.Language;

    import de.espirit.firstspirit.access.project.Resolution;

    import de.espirit.firstspirit.access.project.TemplateSet;

    import de.espirit.firstspirit.access.store.ContentProducer;

    import de.espirit.firstspirit.access.store.IDProvider;

    import de.espirit.firstspirit.access.store.LanguageInfo;

    import de.espirit.firstspirit.access.store.PageParams;

    import de.espirit.firstspirit.access.store.mediastore.File;

    import de.espirit.firstspirit.access.store.mediastore.Media;

    import de.espirit.firstspirit.access.store.mediastore.MediaMetaData;

    import de.espirit.firstspirit.access.store.mediastore.Picture;

    import de.espirit.firstspirit.access.store.sitestore.Content2Params;

    import de.espirit.firstspirit.access.store.sitestore.ContentMultiPageParams.ContentPageParams;

    import de.espirit.firstspirit.access.store.sitestore.PageRef;

    import de.espirit.firstspirit.access.store.sitestore.SiteStoreFolder;

    import de.espirit.firstspirit.generate.PathLookup;

    import de.espirit.firstspirit.generate.UrlFactory;

    import de.espirit.or.schema.Entity;

    import org.jetbrains.annotations.Nullable;

    import java.io.IOException;

    import java.util.List;

    import java.util.Map;

    import java.util.regex.Matcher;

    import java.util.regex.Pattern;

    /**

    * Search engine-optimized path factory.

    */

    public class NamicsUrlFactory implements UrlFactory {

        private PathLookup _pathLookup;

        private boolean _useWelcomeFilenames;

        /**

         * Initialize fields based on various settings and a {@link PathLookup} object.

         * @param settings Settings provided in module.xml file in section {@code <configuration>..</configuration>}.

         * The key is the tag name (converted to lower case), value is the text child node. E.g. {@code <key>value</key>}.

         * @param pathLookup Path lookup for user defined paths.

         */

        @Override

        public void init(final Map<String, String> settings, final PathLookup pathLookup) {

            _pathLookup = pathLookup;

            final String useWelcomeFilenames = settings.get("usewelcomefilenames");

            _useWelcomeFilenames = useWelcomeFilenames == null || "yes".equalsIgnoreCase(useWelcomeFilenames) || "true".equalsIgnoreCase(useWelcomeFilenames);

        }

        /**

         * Build the URL for a content-producing store element.

         * @param contentProducer A store element.

         * @param templateSet The target template set.

         * @param language The target language.

         * @param pageParams Page parameters, used for content projection, etc.

         * @return The URL for the {@code contentProducer}, based on target template, target language and optional page parameters.

         */

        @Override

        public String getUrl(final ContentProducer contentProducer, final TemplateSet templateSet, final Language language, final PageParams pageParams) {

            final String name = getName(contentProducer, templateSet, language, pageParams);

            final String extension = contentProducer.getExtension(templateSet);

            int len = name.length();

            if (!extension.isEmpty()) {

                len += extension.length();

                len ++; // for dot

            }

            final StringBuilder buffer = new StringBuilder(0);

            final String path = _pathLookup.lookupPath(contentProducer, language, templateSet);

            if (path != null) {

                buffer.ensureCapacity(len + path.length() + 2);

                buffer.append('/');

                if (!path.isEmpty()) {

                    buffer.append(path);

                    buffer.append('/');

                }

            } else {

                collectPath(contentProducer.getParent(), language, templateSet, len, buffer);

            }

            buffer.append(name);

            if (!extension.isEmpty()) {

                buffer.append('.');

                buffer.append(extension);

            }

            return buffer.toString();

        }

        /**

         * Build the URL for a Media Store element.

         * @param node The target node, located in the Media Store.

         * @param language Target language or {@code null} for language-independent media nodes.

         * @param resolution Target resolution or {@code null} for media nodes of type {@link de.espirit.firstspirit.access.store.mediastore.Media#FILE}.

         * @return The URL for the {@code node}, based on target language and optional resolution.

         */

        @Override

        public String getUrl(final Media node, @Nullable final Language language, @Nullable final Resolution resolution) {

            final String name = getName(node, language);

            String resolutionString = null;

            int len = name.length();

            if ((resolution != null) && (node.getType() == Media.PICTURE) && !resolution.isOriginal()) {

                resolutionString = resolution.getUid();

                len += resolutionString.length();

                len++; // for underscoure

            }

            final String extension = getExtension(node, language, resolution);

            if (extension != null) {

                len += extension.length();

                len++; // for dot

            }

            final StringBuilder buffer = new StringBuilder(0);

            collectPath(node.getParent(), language, null, len, buffer);

            buffer.append(name);

            if (resolutionString != null) {

                buffer.append('_');

                buffer.append(resolutionString);

            }

            if (extension != null) {

                buffer.append('.');

                buffer.append(extension);

            }

            return buffer.toString();

        }

        /**

         * Build a name for the provided node.

         *

         * This implementation first attempts to identify if the node is a page reference that is used for content projection and displays only a single

         * dataset; if so, the sitemap variable is used to form a name.

         *

         * If the node is not used for content projection, but the following two criteria are met:

         *  - the node is the start node of a Site Store folder

         *  - the configuration parameter "usewelcomefilenames" evaluates to "yes" or "true" (see {@code init(...)}

         * the node is named "index".

         *

         * If none of the above criteria match, the language-dependent display name of the node is retrieved and used as the node's name in the URL that

         * is being built.

         *

         * In all cases, the node names returned are processed using the {@code cleanup(...)} method.

         * @param contentProducer The node to identify a URL name for.

         * @param templateSet The template set for which to generate a URL name.

         * @param language The project language for which to generate a URL name.

         * @param pageParams Page parameters that may indicate if content projection is used.

         * @return The name of this {@code contentProducer}, to be used in forming a URL for this element.

         */

        private String getName(final ContentProducer contentProducer, final TemplateSet templateSet, final Language language, final PageParams pageParams) {

            if ((contentProducer instanceof PageRef) && (pageParams instanceof ContentPageParams) && (pageParams.getSize() == 1)) {

                final Content2Params content2Params = ((PageRef) contentProducer).getContent2Params();

                if (content2Params != null) {

                    String varName = content2Params.getSitemapVariableName();

                    if (varName != null) {

                        if (varName.endsWith("*")) {

                            varName = varName.substring(0, varName.length() - 1);

                        }

                        final ContentPageParams contentPageParams = (ContentPageParams) pageParams;

                        final List<Entity> list = contentPageParams.getData();

                        if (!list.isEmpty()) {

                            final Entity entity = list.get(0);

                            final String result = resolve(entity, varName, language, "");

                            if ( ! StringUtil.isEmpty(result)) {

                                return cleanup(result);

                            }

                        }

                    }

                }

            }

            if (_useWelcomeFilenames && (pageParams.getIndex() == 0) && ! (pageParams instanceof ContentPageParams)) {

                final SiteStoreFolder folder = (SiteStoreFolder) contentProducer.getParent();

                //noinspection ObjectEquality

                if ((folder != null) && (folder.getStartNode() == contentProducer)) {

                    // check if we are the first template set for a specific extension

                    final String extension = templateSet.getExtension();

                    for (final TemplateSet set : contentProducer.getProject().getTemplateSets()) {

                        //noinspection ObjectEquality

                        if (set == templateSet) {

                            return "index";

                        }

                        if (extension.equals(set.getExtension())) {

                            break;

                        }

                    }

                }

            }

            final String name = getName(contentProducer, language);

            final String pageSuffix = pageParams.getPageSuffix();

            if (!pageSuffix.isEmpty()) {

                return name + '_' + pageSuffix;

            }

            return name;

        }

        /**

         * Build a name for the provided node. This implementation takes the language-dependent name (see

         * {@link de.espirit.firstspirit.access.store.IDProvider#getLanguageInfo(Language)}). If this is not set for the

         * provided language, the

         * {@link de.espirit.firstspirit.access.project.Project#getMasterLanguage() project master language} is used. If

         * this is also not set, the {@link de.espirit.firstspirit.access.store.IDProvider#getUid() uid of the node } is

         * used. Then leading and trailing chars are stripped and some chars with special meaning in URLs and file names are

         * replaced by '-' (see {@link #cleanup(String)}).

         *

         * @param node Get the name for this node.

         * @param language Get the name for this language.

         * @return Name part of path for provided node and language.

         */

        private String getName(final IDProvider node, final Language language) {

            LanguageInfo languageInfo = node.getLanguageInfo(language);

            String displayName = languageInfo != null ? languageInfo.getDisplayName() : null;

            if (displayName != null) {

                final String cleaned = cleanup(displayName);

                if ( ! cleaned.isEmpty()) {

                    return cleaned;

                }

            }

            final Language masterLanguage = node.getProject().getMasterLanguage();

            //noinspection ObjectEquality

            if (masterLanguage != language) {

                languageInfo = node.getLanguageInfo(masterLanguage);

                if (languageInfo != null) {

                    displayName = languageInfo.getDisplayName();

                    if (displayName != null) {

                        final String cleaned = cleanup(displayName);

                        if ( ! cleaned.isEmpty()) {

                            return cleaned;

                        }

                    }

                }

            }

            return cleanup(node.getUid());

        }

        /**

         * Recursive method building a slash-delimited path for the provided folder a it's parent chain. For each folder on the

         * chain this methods calls {@link #getName(de.espirit.firstspirit.access.store.IDProvider,de.espirit.firstspirit.access.Language) getName(folder, language)}. For the root folder

         * (<tt>{@link IDProvider#getParent() folder.getParent()} == null</tt>) the constructed path is empty. The

         * constructed path will be appended to the provided {@link StringBuilder}. The constructed path will start and end

         * with a slash.

         *

         * @param folder folder for which the path from root is collected.

         * @param language language, will be forwarded to {@link #getName(IDProvider,Language)} to build the name of each

         * path element

         * @param templateSet template set, piped through to {@link PathLookup#lookupPath(IDProvider, Language, TemplateSet)}

         * - may be {@code null}.

         * @param length size estimation for the StringBuilder, will be increased in every call, used to

         * {@link StringBuilder#ensureCapacity(int) ensure its capacity} to prevent frequent resizing

         * @param collector the builded path is appended to this instance

         */

        final void collectPath(final IDProvider folder, final Language language, @Nullable final TemplateSet templateSet, final int length, final StringBuilder collector) {

            String name = _pathLookup.lookupPath(folder, language, templateSet);

            if (name == null) {

                name = getName(folder, language);

                collectPath(folder.getParent(), language, templateSet, length + name.length() + 1, collector);

                collector.append(name);

                collector.append('/');

            } else {

                final int len = name.length();

                if (len > 0) {

                    collector.ensureCapacity(length + len + 2);

                    if (name.charAt(0) != '/') {

                        collector.append('/');

                    }

                    collector.append(name);

                } else {

                    collector.ensureCapacity(length + 1);

                }

                collector.append('/');

            }

        }

        /**

         * Helper to determine the extension (e.g. "gif", "pdf") for the given media in the given {@code language} and

         * {@code resolution}.<p />

         *

         * Provided language may be {@code null} for language independent media objects, resolution is null media objects

         * of type {@link Media#FILE}.

         *

         * @param media Media node to get the extension for.

         * @param lang Language to get the extension for (is {@code  null} if provided media not isn't langage dependent).

         * @param resolution Resolution to get the extension for (is {@code  null} if provided media is of type {@link Media#FILE}).

         * @return File extension.

         */

        @Nullable

        String getExtension(final Media media, @Nullable final Language lang,  @Nullable final Resolution resolution) {

            if (media.getType() == Media.FILE) {

                final File file = media.getFile(lang);

                if (file == null) {

                    throw new RuntimeException("no file data found for media:\"" + media.getUid() + "\" (id=" + media.getId() + ')');

                }

                return file.getExtension();

            } else {

                try {

                    final Picture picture = media.getPicture(lang);

                    if (picture == null) {

                        throw new RuntimeException("no picture data found for media:\"" + media.getUid() + "\" (id=" + media.getId() + ')');

                    }

                    final MediaMetaData mediaMetaData = picture.getPictureMetaData(resolution);

                    if (mediaMetaData == null) {

                        throw new RuntimeException("no picture data found for media:\"" + media.getUid() + "\" (id=" + media.getId() + ')');

                    }

                    return mediaMetaData.getExtension();

                } catch (final IOException e) {

                    throw new IoError(e);

                }

            }

        }

        /**

         * Matcher for chars (with special meaning in URIs or not valid in windows file names):<ul>

         *     <li>;</li>

         *     <li>@</li>

         *     <li>&</li>

         *     <li>=</li>

         *     <li>+</li>

         *     <li>$</li>

         *     <li>,</li>

         *     <li>/</li>

         *     <li>\</li>

         *     <li><</li>

         *     <li>></li>

         *     <li>:</li>

         *     <li>*</li>

         *     <li>|</li>

         *     <li>#</li>

         *     <li>?</li>

         *     <li>"</li>

         *     <li>whitespace</li>

         * </ul>

         *

         */

        private static final Pattern SPECIAL_CHARS = Pattern.compile("(;|@|&|=|\\+|\\$|,|/|\\\\|<|>|:|\\*|\\||#|\\?|\"|\\s|-)+");

        /**

         * Strips leading and trailing whitespaces and replaces whitespaces and chars wich are have a special meaning in

         * URIs or filenames (e.g. under Windows(TM)) with a single minus character.

         *

         * @param name String to clean up.

         * @return Cleaned string.

         */

        final String cleanup(String name) {

            name = name.toLowerCase().trim();

            final Matcher matcher = SPECIAL_CHARS.matcher(name);

            if (matcher.find()) {

                String cleaned = matcher.replaceAll("-");

                            cleaned = replaceUmlauts(cleaned);

                if (cleaned.length() == 1) {

                    return cleaned;

                }

                if (cleaned.charAt(0) == '-') {

                    cleaned = cleaned.substring(1);

                }

                final int length = cleaned.length();

                if (cleaned.charAt(length - 1) == '-') {

                    cleaned = cleaned.substring(0, length - 1);

                }

                return cleaned;

            }

            return replaceUmlauts(name);

        }

            /**

             * Replaces German Umlauts. ä is replaced by ae, ö is replaced by oe, ü is replaced by ue and ß is replaced by ss.

             *

             * @param name String to replace umlauts in

             * @return Cleaned string

             */

            private String replaceUmlauts(String name){

                return name.replace("ä", "ae").replace("ö", "oe").replace("ü", "ue").replace("ß", "ss");

            }

        private static String resolve(Entity entity, final String varName, final Language language, final String defaultLabel) {

            String attribute = varName;

            final String[] attributes = varName.split("\\.");

            if (attributes.length > 1) {

                final int lastIndex = attributes.length - 1;

                for (int i = 0; i < lastIndex; i++) {

                    final Object value = entity.getValue(attributes[i]);

                    if (value instanceof Entity) {

                        entity = (Entity) value;

                    } else {

                        return defaultLabel;

                    }

                }

                attribute = attributes[lastIndex];

            }

            if (entity.getEntityType().getAttribute(attribute) == null) {

                attribute = attribute + '_' + language.getAbbreviation();

            }

            final Object value = entity.getValue(attribute);

            if (value == null || "".equals(value)) {

                return defaultLabel;

            }

            return value.toString();

        }

    }

    0
  • Zendesk API User
    Author: Hendrik - 8/26/2013 10:52

    Hallo Stefan,

    ich kann auf den ersten Blick nicht erkennen woran es liegen könnte. Rein theoretisch müsste ja die Methode getName(...) einen falschen Namen liefern... Ich würde einfach mal ein paar Log-Ausgaben einbauen, dann hast du schnell Gewissheit ob es an deinem Code liegt oder ob FS deine erzeugte URL abändert. Ich tippe mal auf ersteres ;-) Wenn klar ist das Eure URLFactory die Fehlerquelle ist kannst du diese auch über deine IDE per remote Debugging analysieren.

    Gruß,

    Hendrik

    0
  • Zendesk API User
    Author: ampersand83 - 8/26/2013 13:18

    Mal ne ganz blöde Frage. Wie richtige ich hier das Logging ein?

    Ich nutze hier wie im Entwicklerhandbuch für Komponenten beschrieben die Klasse de.espirit.common.Logging.

    Wo wird jetzt aber die Ausgabe geloggt? Habe jetzt mehrere Logging.logDebug() Ausgabe drin, aber ich kann nicht finden, wo diese ausgegeben werden. Der Server steht bei den Protokollierungseinstellungen auf Debug. Im Generierungslog finde ich keine Ausgaben.

    0
  • Zendesk API User
    Author: Hendrik - 8/26/2013 15:12

    Gegenfrage: Erscheinen andere DEBUG Logausgaben, z.B. eines einfachen ScriptTask der ein context.logDebug("Hello World!") enthält ? Falls nein passt an der Logging Konfiguration irgendetwas nicht. Wir nutzen den gleichen FS Logging-Mechanismus und das funktioniert soweit ganz gut.

    0
  • Zendesk API User
    Author: broszeit - 8/27/2013 6:55

    Hallo,

    das Logging sollte eigentlich auf genau diese Weise funktionieren.

    Beim schnellen nachstellen gab es das Problem, dass der FirstSpirit Server trotz des Modulupdates, weiterhin die Logik der alten Version zum Erzeugen der URL genommen hat.

    Das könnte erklären, warum nachträglich hinzugefügte Logging Ausgaben nicht erscheinen.

    Hast du zufällig die Möglichkeit das Modul auf einem Server zu installieren, wo es bisher noch nicht installiert war, um dort zu testen, ob das Logging funktioniert und die Dateinamen weiterhin eine Zahl angehängt bekommen?

    Viele Grüße

    Rouven

    0
  • Zendesk API User
    Author: Peter_Jodeleit - 8/27/2013 16:15

    Im Log des Generierungsauftrags finde ich nicht den geringsten Heinweis auf einen Konflikt

    Der Konflikt wird auch nur bei der Erzeugung und Überführung in den persistenten Wert protokolliert. Hast du direkt vor der Generierung der Seite die gespeicherten URLs für diese Seite zurückgesetzt?

    0
  • Zendesk API User
    Author: Josef_Awad - 8/28/2013 11:11

    Hallo,

    ich habe genau das gleiche Problem. Hier scheint irgendein Fehler im Beispiel vorzuliegen.

    Viele Grüße,

    Josef

    0
  • Zendesk API User
    Author: ampersand83 - 8/28/2013 12:10

    Hm, also ich habe direkt vor der Generierung due URLs im CMS zurückgesetzt. Das Logfile zeigt aber nichts an. Alles sehr mysteriös.

    0
  • Zendesk API User
    Author: Peter_Jodeleit - 8/28/2013 12:49

    Stefan Zülch schrieb:

    Hm, also ich habe direkt vor der Generierung due URLs im CMS zurückgesetzt. Das Logfile zeigt aber nichts an. Alles sehr mysteriös.

    Wenn weder die Meldung von FirstSpirit noch deine eigenen Debug-Meldungen erscheinen, dann können die Werte nur aus der Persistenz kommen. Lege mal eine komplett neue Seite an und generiere die, um sicherzustellen, das deine Log-Ausgaben tatsächlich kommen.

    0
  • Zendesk API User
    Author: ampersand83 - 9/2/2013 14:31

    Ich bekomme jetzt in den Logs entsprechende Warnings, z.B.:

    WARN  02.09.2013 15:19:26.375{g-node=6836} (de.espirit.firstspirit.generate.path.RegistryUrlFactory): URI conflict detected for SSNodeEntry-12611-3999-DE-, unified URI: /verantwortung-erleben/index-2.html [SSNodeEntry-7213-3999-DE-]

    So wie es aussieht klappt wirklich die Zurücksetzung der gespeicherten URLs nicht. Herr Holst, können Sie mir, das von Ihnen angesprochene Skript schicken? Wird es hier auch mal ein Bugfix von e-Spririt geben?

    Viele Grüße,

    Stefan

    0
  • Zendesk API User
    Author: Hendrik - 9/2/2013 14:54

    Hallo Stefan,

    anbei das Skript um die gespeicherten URLs gelöschter Elemente zurückzusetzen. Das Skript muss mit einem Benutzer mit Änderungsrechten an den URL-Einstellungen der globalen Inhalte auf jeweils einem Knoten in der Medienverwaltung und Strukturverwaltung ausgeführt werden. Das Skript wurde mir ursprünglich vom Helpdesk zur Verfügung gestellt, ich habe es leicht angepasst. Es besteht unter der ID #7524 ein Ticket, das Problem ist bekannt und soll mit dem kommendem Release Ende September ausgerollt werden wenn ich richtig informiert bin.

    Beste Grüße,

    Hendrik Holst

    0
  • Zendesk API User
    Author: ampersand83 - 9/2/2013 16:18

    Hallo Hendrik,

    vielen Dank für das Skript. Ich habe jetzt bei der Ausführung jetzt nur noch das Problem, dass FS in Zeile 7 nicht weiß, was diese Variable e ist. Fehlt da evtl. noch eine Zeile?

    0
  • Zendesk API User
    Author: Hendrik - 9/2/2013 16:51

    Hallo Stefan,

    e ist das Element auf welchem das Skript per Kontextmenü im JavaClient ausgeführt wird. Man könnte auch context.getStoreElement() verwenden, das sollte keinen Unterschied machen. Das Skript kann in dieser Form nur über das Kontextmenü auf einem Element in der Medien bzw. Strukturverwaltung ausgeführt werden, wer das Skript auf dem Server oder über das normale Menü ausführen möchte muss das Skript so anpassen, das der Medien- bzw. Struktur-Store bezogen wird..

    Am einfachsten geht man mit dem Benutzer Admin wie folgt vor:

    1.) Java Console leeren (Falls die nicht angezeigt wird unter Start-> Einstellungen -> Systemsteuerung -> Java -> Tab Erweitert, Java Konsole einblenden aktivieren, Client erneut starten)

    2.) BeanShell auf dem Wurzelverzeichniss der Medien- sowie Strukturverwaltung über das Kontextmenü "Skript ausführen -> Developer Skripts -> BeanShell Console" aufrufen

    2.) in der BeanShell den Befehl "editor();" ausführen, es sollte sich ein weiteres Fenster öffnen.

    3.) den Inhalt des Skriptes in das neue Fenster (Editor) einfügen, anschließend das Skript mit der Schaltfläche "Eval" ausführen

    4.) Log Ausgaben auf der Java Console auswerten, fertig!

    Wichtig ist das man das Skript eben einmal in der Medienverwaltung und einmal in der Strukturverwaltung ausführt da für diese Verwaltungen bzw. deren Element URLs gespeichert werden.

    Gruß,

    Hendrik

    0
  • Zendesk API User
    Author: ampersand83 - 9/3/2013 7:57

    Hallo Hendrik,

    ach so. Ich hatte das Skript jetzt als Skript in FirstSpirit eingebunden und wollte es als Kontextmenü Skript ausführen.

    Starte ich es so, wie du beschrieben hast, kommen INFO Logs, die mir sagen, dass der Sitestore in einer bestimmten Millisekunden Anzahl geladen wurde, aber dann nichts mehr. Der ganze Client ist danach blockiert.

    0
  • Zendesk API User
    Author: Hendrik - 9/3/2013 8:18

    Hallo Stefan,

    je nachdem wieviele gelöschte Elemente in den jeweiligen Stores vorhanden sind kann die Ausführung etwas länger Dauern, in dieser Zeit ist der Java Client blockiert und kann nicht mehr benutzr werden - das ist ganz normal. Du kannst das Skript natürlich um weitere Log-Ausgaben ergänzen um zu sehen welche Elemente gerade verarbeitet werden bzw. um zu sehen das das Skript noch arbeitet.

    Gruß, Hendrik

    0
  • Zendesk API User
    Author: ampersand83 - 9/3/2013 10:10

    Ja, es ist dann durchgelaufen, hat aber nichts geändert. Es werden nach wie vor Dateien mit index-2.html generiert und ich kann mir beim  besten Willen nicht mehr erklären woran das noch liegen könnte.

    Jetzt wird auch wieder nichts mehr geloggt. Gestern waren ja noch sowohl meine Logging Ausgaben als auch diese URI Conflicts in den Log Files, aber jetzt steht wieder gar nichts mehr drin. Ich beginne echt langsam an FS zu zweifeln.

    0
  • Zendesk API User
    Author: mareikeks - 10/8/2013 10:27

    Hallo!

    Ich kann diese Problematik bestätigen. Aktuell habe ich auch ein Projekt, in dem ich diese Konflikte nicht gelöst bekomme, auch nicht mit dem Skript.

    Hier wird bei dem Konflikt auf eine ID verwiesen, die in dem Projekt nicht existiert, weder gelöscht noch freigegeben.

    Gibt es hier inzwischen eine andere Lösung als das Skript?

    Viele Grüße,

    Mareike

    0
  • Zendesk API User
    Author: Peter_Jodeleit - 10/8/2013 11:53

    Das Problem wird mit dem nächsten Release behoben (interne ID #111683). Das Problem tritt nur in Kombination mit Remote-Projekten auf, daher findest du diese ID auch nicht in diesem Projekt.

    Bis zur Freigabe des Updates gibt es leider nur die Möglichkeit, das Skript zu benutzen, oder die Datenbank komplett zu löschen (nur bei heruntergefahrenem Server, Dateisystem-Operation).

    @Stefan:

    Das Logging erfolgt nur beim Eintragen in die URL-Datenbank, nicht beim Auslesen. Und auch nur in diesem Fall wird deine URLFactory angesprochen.


    0
  • Zendesk API User
    Author: Hendrik - 10/8/2013 12:04

    Hallo Herr Jodeleit,

    wann ist den mit dem nächsten Release zu rechnen? Ich dachte eigentlich das Ende September eines kommen sollte..

    Beste Grüße,

    Hendrik Holst

    0
  • Zendesk API User
    Author: mareikeks - 10/8/2013 12:37

    Welche Datenbank ist denn genau gemeint?

    Das Skript funktioniert wie gesagt nicht. Das mit den Remoteprojekten kann ich bestätigen, das ist in diesem Fall so.

    0
  • Zendesk API User
    Author: ampersand83 - 10/8/2013 12:55

    Also ich habe kein Remote Projekt. Wir aktualisieren die Inhalte und Templates lediglich per Content Transport Feature. Ich bin dann ja mal gespannt, ob es mit dem neuen Release bei uns dann auch geht.

    0
  • Zendesk API User
    Author: Peter_Jodeleit - 10/8/2013 13:48

    Mareike Lissek schrieb:

    Welche Datenbank ist denn genau gemeint?

    Das Skript funktioniert wie gesagt nicht. Das mit den Remoteprojekten kann ich bestätigen, das ist in diesem Fall so.

    Das ist eine interne Datenbank. Wenn es für dich sonst keine Lösung gibt, lös das bitte über ein Support-Ticket. Gerne mit Verweis auf diesen Thread.

    0
  • Zendesk API User
    Author: Peter_Jodeleit - 10/8/2013 13:51

    Stefan Zülch schrieb:

    Also ich habe kein Remote Projekt. Wir aktualisieren die Inhalte und Templates lediglich per Content Transport Feature. Ich bin dann ja mal gespannt, ob es mit dem neuen Release bei uns dann auch geht.

    Der andere Fall, wo das auftreten kann ist, wenn eine Seite gelöscht wurde und mit gleichen Eigenschaften neu angelegt wird. Also so, dass die URLFactory die gleiche URL berechnet. Auch dieser Fall sollte mit dem Update behoben werden.

    0
  • Zendesk API User
    Author: ckoenig - 2/4/2014 8:38

    Hallo,

    hat sich bei diesem Problem etwas getan? Gibt es hier schon ein Update?

    Gruß

    0
  • Zendesk API User
    Author: Peter_Jodeleit - 2/4/2014 9:24

    Ja, Fix ist in Version 5.0.413

    0
  • Zendesk API User
    Author: ckoenig - 2/6/2014 13:09

    Hallo Herr Jodeleit,

    ich habe nun die neuste Version einspielen lassen. Leider hat sich das Problem nicht gelößt.

    Version 5.0.425.60000

    Obwohl die ehemalige Datei gelöscht wurde wird die neue immer noch mit index-2.html angelegt.

    Auch nach Reset der Urls.

    Muss ich dazu als Admin angemeldet sein?

    mfg

    0
  • Zendesk API User
    Author: Peter_Jodeleit - 2/6/2014 14:59

    Muss ich dazu als Admin angemeldet sein?

    Für welche Aktion? Reset der URLs sollte nur für Administratoren angeboten werden. Wenn das nicht hilft, ist es wahrscheinlich am Besten, wenn du mit jemanden von unserem Helpdesk auf das konkrete Problem schaust.

    0
  • Zendesk API User
    Author: lschilling - 4/9/2014 9:09

    Hallo,  wir setzen im aktuellen Kundenprojekt die  5.0.425.60000 Version ein. Leider scheint da der BUG nicht behoben. Zumindest haben wir bei Publizierungen von Medien hin und wieder das Problem, das -2 als Suffix angehängt wird. Mit zurücksetzen der URL's auf den Medienstore ist es nicht getan. Es muss das Script das Hendrik Holst gepostet hat ausgeführt werden. Dann funktioniert die Veröffentlichung für einige Zeit, bis eben der Suffix wieder kommt.  Grüße Lars

    0

Bitte melden Sie sich an, um einen Kommentar zu hinterlassen.