/* * Copyright 2016 Red Hat, Inc. and/or its affiliates. * * 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 org.uberfire.wbtest.client.config; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import javax.enterprise.context.ApplicationScoped; import javax.enterprise.inject.Alternative; import com.google.gwt.core.client.Scheduler; import com.google.gwt.core.client.Scheduler.ScheduledCommand; import org.jboss.errai.marshalling.client.Marshalling; import org.uberfire.client.workbench.WorkbenchServicesProxy; import org.uberfire.mvp.Command; import org.uberfire.mvp.ParameterizedCommand; import org.uberfire.workbench.model.PerspectiveDefinition; import org.uberfire.workbench.model.SplashScreenFilter; /** * Implementation of {@link WorkbenchServicesProxy} that stores perspective config in local memory, so it lasts for * the current session but not across page reloads. */ @Alternative @ApplicationScoped public class WorkbenchServicesProxySessionImpl implements WorkbenchServicesProxy { private final Map<String, PerspectiveDefinition> storedPerspectives = new HashMap<String, PerspectiveDefinition>(); private final Map<String, SplashScreenFilter> storedSplashFilters = new HashMap<String, SplashScreenFilter>(); /** * Uses Errai Marshalling to make an independent copy of the given object and everything it references. */ @SuppressWarnings("unchecked") private static <T> T copy(T original) { return (T) Marshalling.fromJSON(Marshalling.toJSON(original), original.getClass()); } @Override public void save(final String perspectiveId, final PerspectiveDefinition activePerspective, final Command callback) { storedPerspectives.put(perspectiveId, copy(activePerspective)); // scheduling as a deferred action to better simulate a real async request to the server Scheduler.get().scheduleDeferred(new ScheduledCommand() { @Override public void execute() { callback.execute(); } }); } @Override public void loadPerspective(final String name, final ParameterizedCommand<PerspectiveDefinition> parameterizedCommand) { // scheduling as a deferred action to better simulate a real async request to the server Scheduler.get().scheduleDeferred(new ScheduledCommand() { @Override public void execute() { parameterizedCommand.execute(storedPerspectives.get(name)); } }); } @Override public void loadPerspectives(final ParameterizedCommand<Set<PerspectiveDefinition>> parameterizedCommand) { // scheduling as a deferred action to better simulate a real async request to the server Scheduler.get().scheduleDeferred(new ScheduledCommand() { @Override public void execute() { parameterizedCommand.execute(new HashSet<PerspectiveDefinition>(storedPerspectives.values())); } }); } @Override public void removePerspectiveState(final String perspectiveId, final Command callback) { storedPerspectives.remove(perspectiveId); // scheduling as a deferred action to better simulate a real async request to the server Scheduler.get().scheduleDeferred(new ScheduledCommand() { @Override public void execute() { callback.execute(); } }); } @Override public void removePerspectiveStates(final Command doWhenFinished) { storedPerspectives.clear(); // scheduling as a deferred action to better simulate a real async request to the server Scheduler.get().scheduleDeferred(new ScheduledCommand() { @Override public void execute() { doWhenFinished.execute(); } }); } @Override public void save(final SplashScreenFilter splashFilter) { storedSplashFilters.put(splashFilter.getName(), copy(splashFilter)); } @Override public void loadSplashScreenFilter(final String name, final ParameterizedCommand<SplashScreenFilter> parameterizedCommand) { // scheduling as a deferred action to better simulate a real async request to the server Scheduler.get().scheduleDeferred(new ScheduledCommand() { @Override public void execute() { parameterizedCommand.execute(storedSplashFilters.get(name)); } }); } }