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

org.apache.cayenne.modeler.dialog.datadomain.CacheSyncConfigController Maven / Gradle / Ivy

The newest version!
/*****************************************************************
 *   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.cayenne.modeler.dialog.datadomain;

import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.HashMap;
import java.util.Map;

import javax.swing.WindowConstants;

import org.apache.cayenne.access.DataRowStore;
import org.apache.cayenne.configuration.DataChannelDescriptor;
import org.apache.cayenne.configuration.event.DomainEvent;
import org.apache.cayenne.event.JMSBridgeFactory;
import org.apache.cayenne.event.JavaGroupsBridgeFactory;
import org.apache.cayenne.modeler.ProjectController;
import org.apache.cayenne.modeler.util.CayenneController;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * A controller for CacheSyncConfigDialog and its subviews. This controller 
 * manages one main dialog view, and its subviews organized using CardLayout.
 * 
 */
public class CacheSyncConfigController extends CayenneController {

    private static Log logObj = LogFactory.getLog(CacheSyncConfigController.class);

    // using strings instead of the actioal factory classes, since we
    // JMS and JavaGroups libraries may not be around, and Modeler
    // may throw CNFE
    private static final String JGROUPS_FACTORY_CLASS = "org.apache.cayenne.event.JavaGroupsBridgeFactory";
    private static final String JMS_FACTORY_CLASS = "org.apache.cayenne.event.JMSBridgeFactory";

    public static final String SAVE_CONFIG_CONTROL = "Done";
    public static final String CANCEL_CONFIG_CONTROL = "Cancel";

    public static final String JGROUPS_DEFAULT_CONTROL = "Standard Configuration";

    public static final String JGROUPS_URL_CONTROL = "Use Configuration File";
    
    public static final String JGROUPS_FACTORY_LABEL = "JavaGroups Multicast (Default)";
    public static final String JMS_FACTORY_LABEL = "JMS Transport";
    public static final String CUSTOM_FACTORY_LABEL = "Custom Transport";

    protected Map existingCards;
    protected Map properties;
    protected boolean modified;
    protected ProjectController eventController;
    
    protected CacheSyncConfigView view;

    public CacheSyncConfigController(ProjectController eventController) {
        super(eventController);
        this.eventController = eventController;
    }

    /**
     * Creates and shows a new modal dialog window.
     */
    public void startup() { 
        DataChannelDescriptor domain = (DataChannelDescriptor)eventController.getProject().getRootNode();
        
        String factory = (String) domain.getProperties().get(
                DataRowStore.EVENT_BRIDGE_FACTORY_PROPERTY);

        view = new CacheSyncConfigView();
        initView();
        
        properties = new HashMap(((DataChannelDescriptor)eventController.getProject()
                .getRootNode()).getProperties());
        
        // build cards, showing the one corresponding to DataDomain state
        prepareChildren(factory);
        
        view.pack();
        view.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
        view.setModal(true);
        makeCloseableOnEscape();
        centerView();
        view.setVisible(true);
    }
    
    public Component getView() {
        return this.view;
    }
    
    private void initView() {
        view.getCancelButton().addActionListener(new ActionListener() {
            
            public void actionPerformed(ActionEvent e) {
                view.dispose();
            }
        });
        view.getSaveButton().addActionListener(new ActionListener() {
            
            public void actionPerformed(ActionEvent e) {
                commitChanges();
            }
        });
        view.getTypeSelector().addActionListener(new ActionListener() {
            
            public void actionPerformed(ActionEvent e) {
                selectCard();
            }
        });
    }
    
    protected void selectCard() {
        view.showCard((String)view.getTypeSelector().getSelectedItem());
    }

    protected void jgroupsDefaultConfig() {
        JGroupsConfigPanel view = (JGroupsConfigPanel) existingCards
                .get(JGROUPS_FACTORY_LABEL);
        if (view != null) {
            view.showDefaultConfig();
        }
    }

    protected void jgroupsURLConfig() {
        JGroupsConfigPanel view = (JGroupsConfigPanel) existingCards
                .get(JGROUPS_FACTORY_LABEL);
        if (view != null) {
            view.showCustomConfig();
        }
    }

    /**
     * Stores configuration changes in the data domain properties.
     */
    protected void commitChanges() {
        DataChannelDescriptor domain = (DataChannelDescriptor)eventController.getProject().getRootNode();
        logObj.warn("domain properties BEFORE: " + domain.getProperties());
        
        Map props = domain.getProperties();
        
        String type = (String)view.getTypeSelector().getSelectedItem();
        if (JGROUPS_FACTORY_LABEL.equals(type)) {
            JGroupsConfigPanel jgroupsPanel = (JGroupsConfigPanel) existingCards
                    .get(JGROUPS_FACTORY_LABEL);
            props.put(DataRowStore.EVENT_BRIDGE_FACTORY_PROPERTY, JGROUPS_FACTORY_CLASS);
            if (jgroupsPanel.useConfigFile.isSelected()) {
                props.remove(JavaGroupsBridgeFactory.MCAST_ADDRESS_PROPERTY);
                props.remove(JavaGroupsBridgeFactory.MCAST_PORT_PROPERTY);
                if (!"".equals(jgroupsPanel.configURL.getText())) {
                    props.put(JavaGroupsBridgeFactory.JGROUPS_CONFIG_URL_PROPERTY, 
                            jgroupsPanel.configURL.getText());
                }
                else {
                    props.put(JavaGroupsBridgeFactory.JGROUPS_CONFIG_URL_PROPERTY, null);
                }
            }
            else {
                props.remove(JavaGroupsBridgeFactory.JGROUPS_CONFIG_URL_PROPERTY);
                if (!"".equals(jgroupsPanel.multicastAddress.getText())) {
                    props.put(JavaGroupsBridgeFactory.MCAST_ADDRESS_PROPERTY, 
                            jgroupsPanel.multicastAddress.getText());
                }
                else {
                    props.put(JavaGroupsBridgeFactory.MCAST_ADDRESS_PROPERTY, null);
                }
                if (!"".equals(jgroupsPanel.multicastPort.getText())) { 
                    props.put(JavaGroupsBridgeFactory.MCAST_PORT_PROPERTY, 
                            jgroupsPanel.multicastPort.getText());
                }
                else {
                    props.put(JavaGroupsBridgeFactory.MCAST_PORT_PROPERTY, null);
                }
            }
        }
        else if (JMS_FACTORY_LABEL.equals(type)) {
            JMSConfigPanel jmsPanel = (JMSConfigPanel) existingCards
                    .get(JMS_FACTORY_LABEL);
            props.put(DataRowStore.EVENT_BRIDGE_FACTORY_PROPERTY, JMS_FACTORY_CLASS);
            if (!"".equals(jmsPanel.topicFactory.getText())) {
                props.put(JMSBridgeFactory.TOPIC_CONNECTION_FACTORY_PROPERTY, 
                        jmsPanel.topicFactory.getText());
            }
            else {
                props.put(JMSBridgeFactory.TOPIC_CONNECTION_FACTORY_PROPERTY, null);
            }
        }
        else if (CUSTOM_FACTORY_LABEL.equals(type)) {
            CustomRemoteEventsConfigPanel customPanel = (CustomRemoteEventsConfigPanel) existingCards
                    .get(CUSTOM_FACTORY_LABEL);
            if (!"".equals(customPanel.factoryClass.getText())) {
                props.put(DataRowStore.EVENT_BRIDGE_FACTORY_PROPERTY, customPanel.factoryClass.getText());
            }
            else {
                props.put(DataRowStore.EVENT_BRIDGE_FACTORY_PROPERTY, null);
            }
        }
        
        logObj.warn("domain properties: " + domain.getProperties());
        
        eventController.fireDomainEvent(new DomainEvent(this, domain));

        view.dispose();
    }
    
    protected void loadProperties(String factory) {
        String configUrl = (String)properties.get(JavaGroupsBridgeFactory.JGROUPS_CONFIG_URL_PROPERTY);
        String multicastAddress = (String)properties.get(JavaGroupsBridgeFactory.MCAST_ADDRESS_PROPERTY);
        String multicastPort = (String)properties.get(JavaGroupsBridgeFactory.MCAST_PORT_PROPERTY);
        String topicFactory = (String)properties.get(JMSBridgeFactory.TOPIC_CONNECTION_FACTORY_PROPERTY);
        
        JGroupsConfigPanel jgroupsPanel = (JGroupsConfigPanel) existingCards
                .get(JGROUPS_FACTORY_LABEL);
        
        if (configUrl != null) {
            jgroupsPanel.useConfigFile.setSelected(true);
            jgroupsURLConfig();
            jgroupsPanel.configURL.setText(configUrl);
        }
        else {
            jgroupsPanel.useDefaultConfig.setSelected(true);
            jgroupsDefaultConfig();
        }
        
        if (multicastAddress != null) {
            jgroupsPanel.multicastAddress.setText(multicastAddress);
        }
        else {
            jgroupsPanel.multicastAddress.setText(JavaGroupsBridgeFactory.MCAST_ADDRESS_DEFAULT);
        }
        
        if (multicastPort != null) {
            jgroupsPanel.multicastPort.setText(multicastPort);
        }
        else {
            jgroupsPanel.multicastPort.setText(JavaGroupsBridgeFactory.MCAST_PORT_DEFAULT);
        }
        
        JMSConfigPanel jmsPanel = (JMSConfigPanel) existingCards
                .get(JMS_FACTORY_LABEL);
     
        if (topicFactory != null) {
            jmsPanel.topicFactory.setText(topicFactory);
        }
        else {
            jmsPanel.topicFactory.setText(JMSBridgeFactory.TOPIC_CONNECTION_FACTORY_DEFAULT);
        }
        
        CustomRemoteEventsConfigPanel customPanel = (CustomRemoteEventsConfigPanel) existingCards
                .get(CUSTOM_FACTORY_LABEL);
        String factoryClass = (String)properties.get(DataRowStore.EVENT_BRIDGE_FACTORY_PROPERTY);
        if (factoryClass != null) {
            customPanel.factoryClass.setText(factoryClass);
        }
        else {
            customPanel.factoryClass.setText(DataRowStore.EVENT_BRIDGE_FACTORY_DEFAULT);
        }
        
        if (JGROUPS_FACTORY_CLASS.equals(factory)) {
            view.getTypeSelector().setSelectedItem(JGROUPS_FACTORY_LABEL);
        }
        else if (JMS_FACTORY_CLASS.equals(factory)) {
            view.getTypeSelector().setSelectedItem(JMS_FACTORY_LABEL);
        }
        else {
            view.getTypeSelector().setSelectedItem(CUSTOM_FACTORY_LABEL);
        }
    }

    protected void prepareChildren(String factory) {
        existingCards = new HashMap();
        CacheSyncConfigView topView = (CacheSyncConfigView) getView();

        // note that none of the panels need a controller
        // if they issue controls, they will use this object taken from parent

        JGroupsConfigPanel jgroupsPanel = new JGroupsConfigPanel();
        existingCards.put(JGROUPS_FACTORY_LABEL, jgroupsPanel);
        topView.addCard(jgroupsPanel, JGROUPS_FACTORY_LABEL);
        
        jgroupsPanel.getUseDefaultConfig().addActionListener(new ActionListener() {
            
            public void actionPerformed(ActionEvent e) {
                jgroupsDefaultConfig();
            }
        });
        jgroupsPanel.getUseConfigFile().addActionListener(new ActionListener() {
            
            public void actionPerformed(ActionEvent e) {
                jgroupsURLConfig();
            }
        });

        JMSConfigPanel jmsPanel = new JMSConfigPanel();
        existingCards.put(JMS_FACTORY_LABEL, jmsPanel);
        topView.addCard(jmsPanel, JMS_FACTORY_LABEL);

        CustomRemoteEventsConfigPanel customFactoryPanel = new CustomRemoteEventsConfigPanel();
        existingCards.put(CUSTOM_FACTORY_LABEL, customFactoryPanel);
        topView.addCard(customFactoryPanel, CUSTOM_FACTORY_LABEL);

        if (factory == null) {
            factory = DataRowStore.EVENT_BRIDGE_FACTORY_DEFAULT;
        }

        if (JGROUPS_FACTORY_CLASS.equals(factory)) {
            ((CacheSyncConfigView) getView())
                    .showCard(JGROUPS_FACTORY_LABEL);
        }
        else if (JMS_FACTORY_CLASS.equals(factory)) {
            ((CacheSyncConfigView) getView())
                    .showCard(JMS_FACTORY_LABEL);
        }
        else {
            ((CacheSyncConfigView) getView())
                    .showCard(CUSTOM_FACTORY_LABEL);
        }
        
        loadProperties(factory);
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy