/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You 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.apache.wicket.protocol.ws.api; import org.apache.wicket.Application; import org.apache.wicket.Page; import org.apache.wicket.Session; import org.apache.wicket.event.Broadcast; import org.apache.wicket.protocol.ws.WebSocketSettings; import org.apache.wicket.protocol.ws.api.event.WebSocketPayload; import org.apache.wicket.request.IRequestCycle; import org.apache.wicket.request.IRequestHandler; import org.apache.wicket.request.resource.IResource; import org.apache.wicket.request.resource.ResourceReference; import org.apache.wicket.request.resource.SharedResourceReference; import org.apache.wicket.util.lang.Args; import org.apache.wicket.util.lang.Classes; /** * An {@link org.apache.wicket.request.IRequestHandler} that broadcasts the payload to the * page/resource */ public class WebSocketMessageBroadcastHandler implements IRequestHandler { private final int pageId; private final String resourceName; private final WebSocketPayload<?> payload; /** * Constructor. * * @param pageId * The id of the page if {@link org.apache.wicket.protocol.ws.api.WebSocketBehavior} * or {@value org.apache.wicket.protocol.ws.api.AbstractWebSocketProcessor#NO_PAGE_ID} if using a resource * @param resourceName * The name of the shared {@link org.apache.wicket.protocol.ws.api.WebSocketResource} * @param payload * The payload to broadcast */ WebSocketMessageBroadcastHandler(int pageId, String resourceName, WebSocketPayload<?> payload) { this.pageId = pageId; this.resourceName = resourceName; this.payload = Args.notNull(payload, "payload"); } @Override public void respond(IRequestCycle requestCycle) { final Application application = Application.get(); final Runnable action = new Runnable() { @Override public void run() { if (pageId != AbstractWebSocketProcessor.NO_PAGE_ID) { Page page = (Page) Session.get().getPageManager().getPage(pageId); page.send(application, Broadcast.BREADTH, payload); } else { ResourceReference reference = new SharedResourceReference(resourceName); IResource resource = reference.getResource(); if (resource instanceof WebSocketResource) { WebSocketResource wsResource = (WebSocketResource) resource; wsResource.onPayload(payload); } else { throw new IllegalStateException( String.format("Shared resource with name '%s' is not a %s but %s", resourceName, WebSocketResource.class.getSimpleName(), Classes.name(resource.getClass()))); } } } }; WebSocketSettings webSocketSettings = WebSocketSettings.Holder.get(application); webSocketSettings.getSendPayloadExecutor().run(action); } }