com.nokia.carbide.trk.support.connection.TCPIPPortMappingConnectionFactory.java Source code

Java tutorial

Introduction

Here is the source code for com.nokia.carbide.trk.support.connection.TCPIPPortMappingConnectionFactory.java

Source

/*
* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of the License "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description: 
*
*/

package com.nokia.carbide.trk.support.connection;

import com.nokia.carbide.remoteconnections.RemoteConnectionsActivator;
import com.nokia.carbide.remoteconnections.interfaces.*;
import com.nokia.carbide.trk.support.Messages;

import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.viewers.*;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.*;

import java.util.*;
import java.util.List;

public class TCPIPPortMappingConnectionFactory extends TCPIPConnectionFactory {

    private final class PortColumnEditingSupport extends EditingSupport {
        private TextCellEditor editor;

        private PortColumnEditingSupport(ColumnViewer viewer) {
            super(viewer);
            editor = new TextCellEditor((Composite) viewer.getControl(), SWT.NONE);
        }

        @Override
        protected boolean canEdit(Object element) {
            return true;
        }

        @Override
        protected CellEditor getCellEditor(Object element) {
            return editor;
        }

        @Override
        protected Object getValue(Object element) {
            return serviceIdToPortMappings.get(element.toString()).toString();
        }

        @Override
        protected void setValue(Object element, Object value) {
            Integer integer = getValidValue((String) value);
            if (integer != null) {
                serviceIdToPortMappings.put(element.toString(), integer);
                viewer.refresh(true);
                packColumns();
            }
        }

    }

    private final class TableLabelProvider implements ITableLabelProvider {
        public Image getColumnImage(Object element, int columnIndex) {
            return null;
        }

        public String getColumnText(Object element, int columnIndex) {
            String serviceId = element.toString();
            if (columnIndex == SERVICE_COLUMN) {
                IService service = RemoteConnectionsActivator.getConnectionTypeProvider()
                        .findServiceByID(serviceId);
                return service.getDisplayName();
            } else if (columnIndex == PORT_COLUMN) {
                return String.valueOf(serviceIdToPortMappings.get(serviceId).intValue());
            }
            return null;
        }

        public void addListener(ILabelProviderListener listener) {
        }

        public void dispose() {
        }

        public boolean isLabelProperty(Object element, String property) {
            return false;
        }

        public void removeListener(ILabelProviderListener listener) {
        }
    }

    private static final int MIN_DYN_PORT_NUM = 49152;
    private static final int MAX_DYN_PORT_NUM = 65535;
    private static final int SERVICE_COLUMN = 0;
    private static final int PORT_COLUMN = 1;
    private Map<String, Integer> serviceIdToPortMappings;
    private TableViewer viewer;

    public TCPIPPortMappingConnectionFactory(IConnectionType connectionType) {
        super(connectionType);
        serviceIdToPortMappings = new HashMap<String, Integer>();
        initializePortMappings();
    }

    private void initializePortMappings() {
        Collection<IService> services = RemoteConnectionsActivator.getConnectionTypeProvider()
                .getCompatibleServices(connectionType);
        for (IService service : services) {
            IService2 service2 = service instanceof IService2 ? (IService2) service : null;
            Integer defaultPort = null;
            if (service2 != null) {
                try {
                    String defaultPortString = service2.getDefaults().get(IP_PORT);
                    defaultPort = Integer.valueOf(defaultPortString);
                } catch (NumberFormatException e) {
                    // if it doesn't parse as an int, we ignore it and provide a dynamic default
                }
            }
            if (defaultPort != null)
                serviceIdToPortMappings.put(service.getIdentifier(), defaultPort);
        }
        for (IService service : services) {
            String identifier = service.getIdentifier();
            if (!serviceIdToPortMappings.containsKey(identifier))
                serviceIdToPortMappings.put(identifier, getUnusedDynamicDefault());
        }

    }

    private Integer getUnusedDynamicDefault() {
        for (Integer val = MIN_DYN_PORT_NUM; val < MAX_DYN_PORT_NUM; val++) {
            if (!serviceIdToPortMappings.containsValue(val))
                return val;
        }
        return -1; // should never get here!!!
    }

    @Override
    public IConnection createConnection(Map<String, String> settings) {
        if (settings == null)
            settings = getSettingsFromUI();
        return new TCPIPPortMappingConnection(connectionType, settings);
    }

    @Override
    public void createEditingUI(Composite parent, IValidationErrorReporter errorReporter,
            Map<String, String> initialSettings) {
        super.createEditingUI(parent, errorReporter, initialSettings);
        updatePortMappings(initialSettings);
        Label label = new Label(composite, SWT.NONE);
        GridDataFactory.defaultsFor(label).span(2, 1).applyTo(label);
        label.setText(Messages.getString("TCPIPPortMappingConnectionFactory.ViewerLabel")); //$NON-NLS-1$

        viewer = new TableViewer(composite,
                SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER | SWT.FULL_SELECTION);
        viewer.setContentProvider(new ArrayContentProvider());

        TableViewerColumn serviceColumn = new TableViewerColumn(viewer, SWT.LEFT);
        serviceColumn.getColumn().setText(Messages.getString("TCPIPPortMappingConnectionFactory.ServiceHeader")); //$NON-NLS-1$

        TableViewerColumn portColumn = new TableViewerColumn(viewer, SWT.RIGHT);
        portColumn.getColumn().setText(Messages.getString("TCPIPPortMappingConnectionFactory.PortHeader")); //$NON-NLS-1$
        portColumn.setEditingSupport(new PortColumnEditingSupport(viewer));

        viewer.setLabelProvider(new TableLabelProvider());
        viewer.setInput(serviceIdToPortMappings.keySet());

        Table table = viewer.getTable();
        table.setHeaderVisible(true);
        GridDataFactory.defaultsFor(table).span(2, 1).hint(SWT.DEFAULT, 60).grab(true, false).applyTo(table);
        table.setToolTipText(Messages.getString("TCPIPPortMappingConnectionFactory.ViewerTooltip")); //$NON-NLS-1$
        table.setData(UID, "TCPIPPortMappingConnectionFactory.table"); //$NON-NLS-1$
        table.setData("viewer", viewer); //$NON-NLS-1$
        packColumns();
    }

    private Integer getValidValue(String value) {
        try {
            int intVal = Integer.parseInt(value);
            if (intVal < 0)
                return new Integer(0);
            else if (intVal > MAX_DYN_PORT_NUM)
                return new Integer(MAX_DYN_PORT_NUM);
            else
                return new Integer(intVal);
        } catch (Exception e) {
        }
        return null;
    }

    private void updatePortMappings(Map<String, String> initialSettings) {
        if (initialSettings != null) {
            List<String> serviceIds = new ArrayList<String>(serviceIdToPortMappings.keySet());
            for (String serviceId : serviceIds) {
                String value = initialSettings.get(serviceId);
                Integer validValue = getValidValue(value);
                if (validValue != null)
                    serviceIdToPortMappings.put(serviceId, validValue);
            }
        }

    }

    @Override
    public Map<String, String> getSettingsFromUI() {
        Map<String, String> settings = super.getSettingsFromUI();
        addMappings(settings);
        return settings;
    }

    private void addMappings(Map<String, String> settings) {
        for (String serviceId : serviceIdToPortMappings.keySet()) {
            settings.put(serviceId, String.valueOf(serviceIdToPortMappings.get(serviceId).intValue()));
        }
        settings.remove(IP_PORT);
    }

    private void packColumns() {
        TableColumn[] columns = viewer.getTable().getColumns();
        for (TableColumn tableColumn : columns) {
            tableColumn.pack();
        }
    }
}