gov.redhawk.sca.internal.ui.SadComponentInstantiationAdapterFactory.java Source code

Java tutorial

Introduction

Here is the source code for gov.redhawk.sca.internal.ui.SadComponentInstantiationAdapterFactory.java

Source

/**
 * This file is protected by Copyright. 
 * Please refer to the COPYRIGHT file distributed with this source distribution.
 * 
 * This file is part of REDHAWK IDE.
 * 
 * All rights reserved.  This program and the accompanying materials are made available under 
 * the terms of the Eclipse Public License v1.0 which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html.
 *
 */
package gov.redhawk.sca.internal.ui;

import gov.redhawk.model.sca.ScaComponent;
import gov.redhawk.model.sca.ScaModelPlugin;
import gov.redhawk.model.sca.ScaWaveform;
import gov.redhawk.sca.ui.ScaUiPlugin;

import java.lang.reflect.InvocationTargetException;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeoutException;

import mil.jpeojtrs.sca.sad.SadComponentInstantiation;

import mil.jpeojtrs.sca.util.CorbaUtils;

import mil.jpeojtrs.sca.util.ProtectedThreadExecutor;
import mil.jpeojtrs.sca.util.QueryParser;
import mil.jpeojtrs.sca.util.ScaFileSystemConstants;

import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IAdapterFactory;

import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.Status;

import org.eclipse.emf.common.util.URI;
import org.eclipse.jface.dialogs.ProgressMonitorDialog;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.statushandlers.StatusManager;

public class SadComponentInstantiationAdapterFactory implements IAdapterFactory {

    private static final Class<?>[] SUPPORTED_TYPES = new Class[] { ScaComponent.class }; // SUPPRESS CHECKSTYLE Name

    /**
     * {@inheritDoc}
     */
    @Override
    public Object getAdapter(final Object adaptableObject, @SuppressWarnings("rawtypes") final Class adapterType) {
        if (adapterType == ScaComponent.class && adaptableObject instanceof SadComponentInstantiation) {
            final SadComponentInstantiation compInst = (SadComponentInstantiation) adaptableObject;
            if (compInst.eResource() == null) {
                return null;
            }

            final URI uri = compInst.eResource().getURI();
            final Map<String, String> query = QueryParser.parseQuery(uri.query());
            final String wfRef = query.get(ScaFileSystemConstants.QUERY_PARAM_WF);
            final ScaWaveform waveform = ScaModelPlugin.getDefault().findEObject(ScaWaveform.class, wfRef);
            final String myId = compInst.getId();
            if (waveform != null) {
                List<ScaComponent> components = Collections.emptyList();
                if (waveform.isSetComponents()) {
                    components = waveform.getComponents();
                } else {
                    if (Display.getCurrent() != null) {
                        ProgressMonitorDialog dialog = new ProgressMonitorDialog(
                                Display.getCurrent().getActiveShell());
                        try {
                            dialog.run(true, true, new IRunnableWithProgress() {

                                @Override
                                public void run(final IProgressMonitor monitor)
                                        throws InvocationTargetException, InterruptedException {
                                    monitor.beginTask("Fetching components...", IProgressMonitor.UNKNOWN);
                                    try {
                                        CorbaUtils.invoke(new Callable<Object>() {

                                            @Override
                                            public Object call() throws Exception {
                                                waveform.fetchComponents(monitor);
                                                return null;
                                            }

                                        }, monitor);
                                    } catch (CoreException e) {
                                        throw new InvocationTargetException(e);
                                    } catch (InterruptedException e) {
                                        // PASS
                                    }
                                }
                            });
                        } catch (InvocationTargetException e) {
                            StatusManager.getManager()
                                    .handle(new Status(Status.ERROR, ScaUiPlugin.PLUGIN_ID,
                                            "Failed to fetch components.", e),
                                            StatusManager.LOG | StatusManager.SHOW);
                        } catch (InterruptedException e) {
                            // PASS
                        }
                    } else {
                        try {
                            ProtectedThreadExecutor.submit(new Callable<Object>() {

                                @Override
                                public Object call() throws Exception {
                                    waveform.fetchComponents(null);
                                    return null;
                                }

                            });
                        } catch (InterruptedException e) {
                            // PASS
                        } catch (ExecutionException e) {
                            StatusManager.getManager()
                                    .handle(new Status(Status.ERROR, ScaUiPlugin.PLUGIN_ID,
                                            "Failed to fetch components.", e),
                                            StatusManager.LOG | StatusManager.SHOW);
                        } catch (TimeoutException e) {
                            StatusManager.getManager()
                                    .handle(new Status(Status.WARNING, ScaUiPlugin.PLUGIN_ID,
                                            "Timed out while trying to fetch components.", e),
                                            StatusManager.LOG | StatusManager.SHOW);
                        }
                    }
                }
                for (final ScaComponent component : components) {
                    final String scaComponentId = component.identifier();
                    if (scaComponentId.startsWith(myId)) {
                        return component;
                    }
                }

            }
        }

        return null;
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public Class<?>[] getAdapterList() {
        return SadComponentInstantiationAdapterFactory.SUPPORTED_TYPES;
    }

}