Package org.geoserver.importer.web

Source Code of org.geoserver.importer.web.AbstractDbPanel

/* (c) 2014 Open Source Geospatial Foundation - all rights reserved
* (c) 2001 - 2013 OpenPlans
* This code is licensed under the GPL 2.0 license, available at the root
* application directory.
*/
package org.geoserver.importer.web;

import static org.geotools.data.postgis.PostgisNGDataStoreFactory.PREPARED_STATEMENTS;
import static org.geotools.jdbc.JDBCDataStoreFactory.FETCHSIZE;
import static org.geotools.jdbc.JDBCDataStoreFactory.MAXCONN;
import static org.geotools.jdbc.JDBCDataStoreFactory.MAXWAIT;
import static org.geotools.jdbc.JDBCDataStoreFactory.MINCONN;
import static org.geotools.jdbc.JDBCDataStoreFactory.VALIDATECONN;
import static org.geotools.jdbc.JDBCJNDIDataStoreFactory.JNDI_REFNAME;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;

import org.apache.wicket.Component;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.form.DropDownChoice;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.IChoiceRenderer;
import org.apache.wicket.markup.repeater.RepeatingView;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.PropertyModel;
import org.geoserver.web.wicket.ParamResourceModel;
import org.geotools.data.DataStoreFactorySpi;
import org.geotools.jdbc.JDBCDataStoreFactory;
import org.geoserver.importer.Database;
import org.geoserver.importer.ImportData;

/**
* Base class for database configuration panels.
*
* @author Andrea Aime - OpenGeo
* @author Justin Deoliveira, OpenGeo
*
*/
@SuppressWarnings("serial")
public abstract class AbstractDbPanel extends ImportSourcePanel {

    /**
     * available connection types
     */
    protected static final String CONNECTION_DEFAULT = "Default";
    protected static final String CONNECTION_JNDI = "JNDI";

    /** connection type */
    protected String connectionType;

    protected WebMarkupContainer paramPanelContainer;
    protected RepeatingView paramPanels;
    protected AdvancedDbParamPanel advancedParamPanel;

    protected LinkedHashMap<String, Component> paramPanelMap;

    public AbstractDbPanel(String id) {
        super(id);
       
        Form form = new Form("form");
        add(form);

        // connection type chooser
        paramPanelMap = buildParamPanels();
        connectionType = paramPanelMap.keySet().iterator().next();
        updatePanelVisibility(null);
        form.add(connectionTypeChoice(paramPanelMap));

        // default param panels
        paramPanelContainer = new WebMarkupContainer("paramPanelContainer");
        form.add(paramPanelContainer);
        paramPanelContainer.setOutputMarkupId(true);
        paramPanels = new RepeatingView("paramPanels");
        for (Component panel : paramPanelMap.values()) {
            paramPanels.add(panel);
        }
        paramPanelContainer.add(paramPanels);

        // advanced panel
        form.add(advancedParamPanel = buildAdvancedPanel("advancedPanel"));
    }

    public ImportData createImportSource() {
//        try {

          // build up the store connection param map
          Map<String, Serializable> params = new HashMap<String, Serializable>();
          DataStoreFactorySpi factory = fillStoreParams(params);

          return new Database(params);

//          // ok, check we can connect
//          DataAccess store = null;
//          try {
//              store = DataAccessFinder.getDataStore(params);
//              // force the store to open a connection
//              store.getNames();
//              store.dispose();
//          } catch (Throwable e) {
//              LOGGER.log(Level.INFO, "Could not connect to the datastore", e);
//              error(new ParamResourceModel("ImporterError.databaseConnectionError",
//                      AbstractDBMSPage.this, e.getMessage()).getString());
//              return;
//          } finally {
//              if (store != null)
//                  store.dispose();
//          }
//
//          // build the store
//          CatalogBuilder builder = new CatalogBuilder(getCatalog());
//          builder.setWorkspace(workspace);
//          StoreInfo si = builder.buildDataStore(generalParams.name);
//          si.setDescription(generalParams.description);
//          si.getConnectionParameters().putAll(params);
//          si.setEnabled(true);
//          si.setType(factory.getDisplayName());
//          getCatalog().add(si);
//
//          // redirect to the layer chooser
//          PageParameters pp = new PageParameters();
//          pp.put("store", si.getName());
//          pp.put("workspace", workspace.getName());
//          pp.put("storeNew", true);
//          pp.put("workspaceNew", false);
//          pp.put("skipGeometryless", isGeometrylessExcluded());
//          setResponsePage(VectorLayerChooserPage.class, pp);
//      } catch (Exception e) {
//          LOGGER.log(Level.SEVERE, "Error while setting up mass import", e);
//      }
//        return new DataStoreSource()
    };
   
    /**
     * Switches between the types of param panels
     */
    Component connectionTypeChoice(final Map<String, Component> paramPanelMap) {
        ArrayList<String> connectionTypeList = new ArrayList<String>(paramPanelMap.keySet());
        DropDownChoice choice = new DropDownChoice("connType", new PropertyModel(this,
                "connectionType"), new Model(connectionTypeList), new IChoiceRenderer() {

            public String getIdValue(Object object, int index) {
                return String.valueOf(object);
            }

            public Object getDisplayValue(Object object) {
                return new ParamResourceModel("ConnectionType." + object, null).getString();
            }
        });

        choice.add(new AjaxFormComponentUpdatingBehavior("onchange") {

            @Override
            protected void onUpdate(AjaxRequestTarget target) {
                updatePanelVisibility(target);
                target.addComponent(paramPanelContainer);
            }

        });

        return choice;
    }
   
    /**
     * Updates the panel visibility to show only the currently selected one.
     * Can also be used to perform actions when the panel visibility is updated
     *
     * @param paramPanelMap
     * @param target Used when doing ajax updates, might be null
     */
    protected void updatePanelVisibility(AjaxRequestTarget target) {
        for (String type : paramPanelMap.keySet()) {
            Component panel = paramPanelMap.get(type);
            panel.setVisible(connectionType.equals(type));
        }
    }

    /**
     * Setups the datastore and moves to the next page
     *
     * @return
     */
//    SubmitLink submitLink() {
//        // TODO: fill this up with the required parameters
//        return new SubmitLink("next") {
//
//            @Override
//            public void onSubmit() {
//                try {
//                    // check there is not another store with the same name
//                    WorkspaceInfo workspace = generalParams.getWorkpace();
//                    NamespaceInfo namespace = getCatalog()
//                            .getNamespaceByPrefix(workspace.getName());
//                    StoreInfo oldStore = getCatalog().getStoreByName(workspace, generalParams.name,
//                            StoreInfo.class);
//                    if (oldStore != null) {
//                        error(new ParamResourceModel("ImporterError.duplicateStore",
//                                AbstractDBMSPage.this, generalParams.name, workspace.getName())
//                                .getString());
//                        return;
//                    }
//
//                    // build up the store connection param map
//                    Map<String, Serializable> params = new HashMap<String, Serializable>();
//                    DataStoreFactorySpi factory = fillStoreParams(namespace, params);
//
//                    // ok, check we can connect
//                    DataAccess store = null;
//                    try {
//                        store = DataAccessFinder.getDataStore(params);
//                        // force the store to open a connection
//                        store.getNames();
//                        store.dispose();
//                    } catch (Throwable e) {
//                        LOGGER.log(Level.INFO, "Could not connect to the datastore", e);
//                        error(new ParamResourceModel("ImporterError.databaseConnectionError",
//                                AbstractDBMSPage.this, e.getMessage()).getString());
//                        return;
//                    } finally {
//                        if (store != null)
//                            store.dispose();
//                    }
//
//                    // build the store
//                    CatalogBuilder builder = new CatalogBuilder(getCatalog());
//                    builder.setWorkspace(workspace);
//                    StoreInfo si = builder.buildDataStore(generalParams.name);
//                    si.setDescription(generalParams.description);
//                    si.getConnectionParameters().putAll(params);
//                    si.setEnabled(true);
//                    si.setType(factory.getDisplayName());
//                    getCatalog().add(si);
//
//                    // redirect to the layer chooser
//                    PageParameters pp = new PageParameters();
//                    pp.put("store", si.getName());
//                    pp.put("workspace", workspace.getName());
//                    pp.put("storeNew", true);
//                    pp.put("workspaceNew", false);
//                    pp.put("skipGeometryless", isGeometrylessExcluded());
//                    setResponsePage(VectorLayerChooserPage.class, pp);
//                } catch (Exception e) {
//                    LOGGER.log(Level.SEVERE, "Error while setting up mass import", e);
//                }
//
//            }
//        };
//    }
   
    /**
     * Builds and returns a map with parameter panels.
     * <p>
     * The keys are used to fill in the drop down choice and to look for the i18n key using the
     * "ConnectionType.${key}" convention. The panels built should have ids made of digits only,
     * otherwise Wicket will complain about non safe ids in repeater.
     * </p>
     */
    protected abstract LinkedHashMap<String, Component> buildParamPanels();

    /**
     * Builds the advanced panel.
     */
    protected AdvancedDbParamPanel buildAdvancedPanel(String id) {
        return new AdvancedDbParamPanel(id, false);
    }
   
    /**
     * Populates the connection parameters needed to connect to the datastore and returns the
     * data store factory.
     *
     * @param params Empty parameter map.
     */
    protected abstract DataStoreFactorySpi fillStoreParams(Map<String, Serializable> params);

    protected void fillInConnPoolParams(Map<String,Serializable> params, BasicDbParamPanel basicParamPanel) {
        params.put(MINCONN.key, basicParamPanel.connPoolPanel.minConnection);
        params.put(MAXCONN.key, basicParamPanel.connPoolPanel.maxConnection);
        params.put(FETCHSIZE.key, basicParamPanel.connPoolPanel.fetchSize);
        params.put(MAXWAIT.key, basicParamPanel.connPoolPanel.timeout);
        params.put(VALIDATECONN.key, basicParamPanel.connPoolPanel.validate);
        params.put(PREPARED_STATEMENTS.key, basicParamPanel.connPoolPanel.preparedStatements);
    }

    protected void fillInJndiParams(Map<String,Serializable> params, JNDIDbParamPanel jndiParamPanel) {
        params.put(JNDI_REFNAME.key, jndiParamPanel.jndiReferenceName);
        params.put(JDBCDataStoreFactory.SCHEMA.key, jndiParamPanel.schema);
    }
}
TOP

Related Classes of org.geoserver.importer.web.AbstractDbPanel

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.