/* * * * 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.inject.Inject; import net.engio.mbassy.listener.Handler; import net.engio.mbassy.listener.Listener; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import uk.q3c.krail.core.guice.vsscope.VaadinSessionScoped; import uk.q3c.krail.core.shiro.SubjectProvider; import uk.q3c.krail.core.user.status.UserStatusBusMessage; import uk.q3c.util.SourceTreeWrapper_BasicForest; import uk.q3c.util.TargetTreeWrapper_BasicForest; import uk.q3c.util.TreeCopy; import javax.annotation.concurrent.ThreadSafe; import java.io.Serializable; @VaadinSessionScoped @Listener @ThreadSafe public class UserSitemapBuilder implements Serializable { private static Logger log = LoggerFactory.getLogger(UserSitemapBuilder.class); private final UserSitemap userSitemap; private final UserSitemapCopyExtension copyExtension; private UserSitemapNodeModifier nodeModifier; private SubjectProvider subjectProvider; private TargetTreeWrapper_BasicForest<MasterSitemapNode, UserSitemapNode> target; private MasterSitemap masterSitemap; @Inject protected UserSitemapBuilder(UserSitemap userSitemap, UserSitemapNodeModifier nodeModifier, UserSitemapCopyExtension copyExtension, SubjectProvider subjectProvider) { this.userSitemap = userSitemap; this.nodeModifier = nodeModifier; this.copyExtension = copyExtension; this.subjectProvider = subjectProvider; this.target = new TargetTreeWrapper_BasicForest<>(userSitemap.getForest()); target.setNodeModifier(nodeModifier); } public UserSitemap getUserSitemap() { return userSitemap; } @Handler public synchronized void userStatusChanged(UserStatusBusMessage busMessage) { log.debug("UserStatusBusMessage received"); log.debug("user status is now authenticated = '{}', rebuild the userSitemap", busMessage.isAuthenticated()); userSitemap.clear(); build(); } public synchronized void build() { log.debug("building or rebuilding the map, user status is {}", subjectProvider.get() .isAuthenticated()); copyExtension.setMasterSitemap(masterSitemap); SourceTreeWrapper_BasicForest<MasterSitemapNode> source = new SourceTreeWrapper_BasicForest<>(masterSitemap.getForest()); TreeCopy<MasterSitemapNode, UserSitemapNode> treeCopy = new TreeCopy<>(source, target); treeCopy.setExtension(copyExtension); if (!userSitemap.isLoaded()) { treeCopy.copy(); userSitemap.setLoaded(true); } } public synchronized void setMasterSitemap(MasterSitemap masterSitemap) { this.masterSitemap = masterSitemap; nodeModifier.setMasterSitemap(masterSitemap); } }