uk.q3c.krail.core.navigate.sitemap.UserSitemapCopyExtension.java Source code

Java tutorial

Introduction

Here is the source code for uk.q3c.krail.core.navigate.sitemap.UserSitemapCopyExtension.java

Source

/*
 *
 *  * Copyright (c) 2016. David Sowerby
 *  *
 *  * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
 *  * the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
 *  *
 *  * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
 *  * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
 *  * specific language governing permissions and limitations under the License.
 *
 */
package uk.q3c.krail.core.navigate.sitemap;

import com.google.common.collect.ImmutableMap;
import com.google.inject.Inject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import uk.q3c.krail.core.navigate.LoginNavigationRule;
import uk.q3c.krail.i18n.CurrentLocale;
import uk.q3c.krail.i18n.Translate;
import uk.q3c.util.forest.SourceTreeWrapper;
import uk.q3c.util.forest.TargetTreeWrapper;
import uk.q3c.util.forest.TreeCopy;
import uk.q3c.util.forest.TreeCopyExtension;

import java.text.Collator;
import java.util.Map;
import java.util.Map.Entry;

/**
 * Post processing for the {@link TreeCopy} process from {@link MasterSitemap} to {@link UserSitemap}. Copies the
 * standard key nodes from the master, translating to {@link UserSitemapNode}
 *
 * @author David Sowerby
 * @date 9 Jun 2014
 */
public class UserSitemapCopyExtension implements TreeCopyExtension<MasterSitemapNode, UserSitemapNode> {
    private static Logger log = LoggerFactory.getLogger(UserSitemapCopyExtension.class);
    private final UserSitemap userSitemap;
    private MasterSitemap masterSitemap;
    private CurrentLocale currentLocale;
    private Translate translate;

    @Inject
    protected UserSitemapCopyExtension(UserSitemap userSitemap, Translate translate, CurrentLocale currentLocale) {
        this.userSitemap = userSitemap;
        this.translate = translate;
        this.currentLocale = currentLocale;
    }

    public void setMasterSitemap(MasterSitemap masterSitemap) {
        this.masterSitemap = masterSitemap;
    }

    @Override
    public void invoke(SourceTreeWrapper<MasterSitemapNode> source,
            TargetTreeWrapper<MasterSitemapNode, UserSitemapNode> target,
            Map<MasterSitemapNode, UserSitemapNode> nodeMap) {
        log.debug("invoked");
        userSitemap.buildUriMap();
        copyStandardPages();
        loadRedirects();

    }

    /**
     * All the standard pages are always copied, even though they may not appear in the main uriMap.  The standard pages are often used for comparison in
     * things
     * like {@link LoginNavigationRule}s, so need always to be available, even though they are not necessarily displayed in navigation components
     */
    private void copyStandardPages() {
        log.debug("copying standard pages");
        ImmutableMap<StandardPageKey, MasterSitemapNode> sourcePages = masterSitemap.getStandardPages();
        Collator collator = Collator.getInstance(currentLocale.getLocale());

        for (StandardPageKey spk : sourcePages.keySet()) {
            MasterSitemapNode masterNode = sourcePages.get(spk);
            UserSitemapNode userNode = new UserSitemapNode(masterNode);
            userNode.setLabel(translate.from(masterNode.getLabelKey()));
            userNode.setCollationKey(collator.getCollationKey(userNode.getLabel()));
            userSitemap.addStandardPage(userNode, masterSitemap.uri(masterNode));
        }

    }

    /**
     * Copies the redirects from the {@link MasterSitemap},. but only adds it to this {@link UserSitemap} if the target
     * exists in this sitemap.
     */
    private void loadRedirects() {
        log.debug("loading redirects");
        for (Entry<String, String> entry : masterSitemap.getRedirects().entrySet()) {
            // only add the entry if the target exists
            if (userSitemap.hasUri(entry.getValue())) {
                userSitemap.addRedirect(entry.getKey(), entry.getValue());
            }
        }
    }

}