All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.jacpfx.rcp.delegator.ComponentDelegator Maven / Gradle / Ivy

There is a newer version: 2.1
Show newest version
/************************************************************************
 * 
 * Copyright (C) 2010 - 2014
 *
 * [FX2ComponentDelegator.java]
 * JACPFX Project (https://github.com/JacpFX/JacpFX/)
 * All rights reserved.
 *
 * 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.jacpfx.rcp.delegator;

import javafx.application.Platform;
import javafx.event.Event;
import javafx.event.EventHandler;
import org.jacpfx.api.component.Component;
import org.jacpfx.api.component.Perspective;
import org.jacpfx.api.component.SubComponent;
import org.jacpfx.api.handler.ComponentHandler;
import org.jacpfx.api.message.Message;
import org.jacpfx.api.util.QueueSizes;
import org.jacpfx.rcp.context.JacpContextImpl;
import org.jacpfx.rcp.message.MessageImpl;
import org.jacpfx.rcp.registry.PerspectiveRegistry;
import org.jacpfx.rcp.util.FXUtil;
import org.jacpfx.rcp.util.ShutdownThreadsHandler;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.logging.Logger;

/**
 * The component delegator handles a component target change, find the correct
 * perspective an add component to correct perspective
 * 
 * @author Andy Moncsek
 * 
 */
public class ComponentDelegator extends Thread implements
        org.jacpfx.api.delegator.ComponentDelegator, Event, Object> {
	private final Logger logger = Logger.getLogger(this.getClass().getName());
	private final BlockingQueue, Event, Object>> componentDelegateQueue = new ArrayBlockingQueue<>(
            QueueSizes.COMPONENT_DELEGATOR_QUEUE_SIZE);
	private ComponentHandler, Event, Object>, Message> componentHandler;

	public ComponentDelegator() {
		super("ComponentDelegator");
		ShutdownThreadsHandler.registerThread(this);
	}
	@Override
	public final void run() {
		while (!Thread.interrupted()) {
			try {
				final SubComponent, Event, Object> component = this.componentDelegateQueue
						.take();
                final String targetId = JacpContextImpl.class.cast(component.getContext()).getExecutionTarget();
				this.delegateTargetChange(targetId, component);

			} catch (final InterruptedException e) {
				logger.info("queue in ComponentDelegator interrupted");
				break;
			}

		}
	}

	private void delegateTargetChange(final String target,
			final SubComponent, Event, Object> component) {
		// find responsible perspective
		final Perspective, Event, Object> responsiblePerspective = PerspectiveRegistry.findPerspectiveById(target);
		// find correct target in perspective
		if (responsiblePerspective != null) {
			this.handleTargetHit(responsiblePerspective, component);

		} // End if
		else {
			this.handleTargetMiss();
		} // End else
	}

	/**
	 * handle component delegate when target was found
	 * 
	 * @param responsiblePerspective
	 * @param component
	 */
	private void handleTargetHit(
			final Perspective, Event, Object> responsiblePerspective,
			final SubComponent, Event, Object> component) {
        activateInactiveComponent(responsiblePerspective);
		responsiblePerspective.registerComponent(component);
		responsiblePerspective.getComponentHandler().initComponent(
				new MessageImpl(component.getContext().getId(), component.getContext().getId(), FXUtil.MessageUtil.INIT, null),
				component);
	}

    private void activateInactiveComponent(
            final Perspective, Event, Object> responsiblePerspective) {
        if (!responsiblePerspective.getContext().isActive()) {
            // 1. init perspective (do not register component before perspective
            // is active, otherwise component will be handled once again)
            this.handleInActivePerspective(responsiblePerspective,
                    new MessageImpl(responsiblePerspective.getContext().getId(),
                            responsiblePerspective.getContext().getId(), FXUtil.MessageUtil.INIT, null));
        } // End if
    }

	private 

, Object>> void handleInActivePerspective( final P component, final Message action) { component.getContext().setActive(true); //noinspection unchecked Platform.runLater(() -> ComponentDelegator.this.componentHandler .initComponent( action, (Perspective, Event, Object>) component)); } /** * handle component delegate when no target found */ private void handleTargetMiss() { throw new UnsupportedOperationException( "No responsible perspective found. Handling not implemented yet."); } @SuppressWarnings("unchecked") @Override public

, Object>> void setPerspectiveHandler( final ComponentHandler> handler) { this.componentHandler = (ComponentHandler, Event, Object>, Message>) handler; } @Override public BlockingQueue, Event, Object>> getComponentDelegateQueue() { return this.componentDelegateQueue; } @Override public void delegateComponent( final SubComponent, Event, Object> component) { try { this.componentDelegateQueue.put(component); } catch (InterruptedException e) { e.printStackTrace(); //TODO handle exception global } } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy