org.apache.jetspeed.portlets.prm.ApplicationsListHome.java Source code

Java tutorial

Introduction

Here is the source code for org.apache.jetspeed.portlets.prm.ApplicationsListHome.java

Source

/*
 * 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.jetspeed.portlets.prm;

import java.io.NotSerializableException;
import java.util.Locale;

import org.apache.jetspeed.audit.AuditActivity;
import org.apache.jetspeed.components.portletregistry.PortletRegistry;
import org.apache.jetspeed.om.portlet.PortletApplication;
import org.apache.jetspeed.om.portlet.PortletDefinition;
import org.apache.jetspeed.portlets.AdminPortletWebPage;
import org.apache.jetspeed.portlets.JetspeedServiceLocator;
import org.apache.jetspeed.portlets.prm.ApplicationDataProvider.AppOrderBy;
import org.apache.jetspeed.portlets.prm.PortletDataProvider.PortletOrderBy;
import org.apache.jetspeed.portlets.wicket.AbstractAdminWebApplication;
import org.apache.jetspeed.request.RequestContext;
import org.apache.jetspeed.tools.pamanager.PortletApplicationManagement;
import org.apache.jetspeed.tools.pamanager.servletcontainer.ApplicationServerManager;
import org.apache.jetspeed.tools.pamanager.servletcontainer.ApplicationServerManagerResult;
import org.apache.portals.messaging.PortletMessaging;
import org.apache.wicket.Page;
import org.apache.wicket.ResourceReference;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.AjaxLink;
import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow;
import org.apache.wicket.extensions.markup.html.repeater.data.sort.OrderByBorder;
import org.apache.wicket.extensions.markup.html.repeater.data.sort.OrderByLink;
import org.apache.wicket.extensions.markup.html.repeater.data.sort.OrderByLink.VoidCssProvider;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.Button;
import org.apache.wicket.markup.html.form.CheckBox;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.markup.html.image.Image;
import org.apache.wicket.markup.html.link.Link;
import org.apache.wicket.markup.html.navigation.paging.PagingNavigator;
import org.apache.wicket.markup.html.pages.RedirectPage;
import org.apache.wicket.markup.html.panel.FeedbackPanel;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.markup.repeater.Item;
import org.apache.wicket.markup.repeater.data.DataView;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.PropertyModel;
import org.apache.wicket.model.ResourceModel;
import org.apache.wicket.model.StringResourceModel;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * View Mode for Portlet Application List widget
 * 
 * @author <a href="mailto:taylor@apache.org">David Sean Taylor</a>
 * @version $Id: ApplicationsListHome.java 1090090 2011-04-08 02:21:14Z woonsan $
 */
public class ApplicationsListHome extends AdminPortletWebPage {
    private static final String APP_TABLE = "appTable";
    private static final String PORTLET_TABLE = "portletTable";

    static final Logger logger = LoggerFactory.getLogger(ApplicationsListHome.class);

    public static final String PORTLET_REGISTRY_MANAGER = "Portlet Registry Manager";

    private String clonePopupPagePath = "/system/prm/cloneportlet.psml";
    private String currentModalWindowCloseScript;

    public ApplicationsListHome() {
        SearchForm form = new SearchForm("appSearchForm");
        add(form);

        // Construct Data View
        final JetspeedServiceLocator locator = ((AbstractAdminWebApplication) getApplication()).getServiceLocator();
        final Locale locale = (((AbstractAdminWebApplication) getApplication()).getPortletRequest()).getLocale();
        final ApplicationDataProvider applicationDataProvider = new ApplicationDataProvider(locator);
        final PortletDataProvider portletListDataProvider = new PortletDataProvider("j2-admin", locale, locator);

        final DataView<ApplicationBean> dataView = new DataView<ApplicationBean>(APP_TABLE,
                applicationDataProvider) {
            private static final long serialVersionUID = 1L;

            protected void populateItem(final Item<ApplicationBean> item) {
                final ApplicationBean pa = item.getModelObject();

                Link<ApplicationBean> nameLink = new Link<ApplicationBean>("nameLink") {
                    private static final long serialVersionUID = 1L;

                    public void onClick() {
                        String appName = this.get("nameLabel").getDefaultModelObjectAsString();
                        portletListDataProvider.changeAppName(appName);

                        try {
                            PortletMessaging.publish(
                                    ((AbstractAdminWebApplication) getApplication()).getPortletRequest(),
                                    ApplicationsListApplication.PRM_TOPIC,
                                    ApplicationsListApplication.SELECTED_APPLICATION_EVENT, pa);
                            DataView portletView = (DataView) getPage().get(PORTLET_TABLE);
                            PortletDataProvider pdp = (PortletDataProvider) portletView.getDataProvider();
                            if (pdp.getSearchMode() == true) {
                                pdp.setSearchMode(false);
                                pdp.refresh();
                            }
                        } catch (NotSerializableException e) {
                            logger.error("Message to publish is not serializable.", e);
                        }
                    }
                };

                nameLink.add(new Label("nameLabel", pa.getApplicationName()));
                item.add(nameLink);
                item.add(new Label("version", pa.getVersion()));
                item.add(new Label("path", pa.getPath()));
                item.add(new RunningPanel("running", item.getModel()));
                item.add(new ActionPanel("actions", item.getModel()));
            }
        };

        dataView.setItemsPerPage(
                ((AbstractAdminWebApplication) getApplication()).getPreferenceValueAsInteger("appRows"));

        add(new OrderByLink("appOrderByName", "name", applicationDataProvider, VoidCssProvider.getInstance()) {
            private static final long serialVersionUID = 1L;

            protected void onSortChanged() {
                if (applicationDataProvider.getOrderBy() == AppOrderBy.NAME_ASC) {
                    applicationDataProvider.setOrderBy(AppOrderBy.NAME_DESC);
                } else {
                    applicationDataProvider.setOrderBy(AppOrderBy.NAME_ASC);
                }
                applicationDataProvider.sort();
                dataView.setCurrentPage(0);
            }
        });

        add(new OrderByLink("appOrderByVersion", "version", applicationDataProvider,
                VoidCssProvider.getInstance()) {
            private static final long serialVersionUID = 1L;

            protected void onSortChanged() {
                if (applicationDataProvider.getOrderBy() == AppOrderBy.VERSION_ASC) {
                    applicationDataProvider.setOrderBy(AppOrderBy.VERSION_DESC);
                } else {
                    applicationDataProvider.setOrderBy(AppOrderBy.VERSION_ASC);
                }
                applicationDataProvider.sort();
                dataView.setCurrentPage(0);
            }
        });

        add(new OrderByLink("appOrderByPath", "path", applicationDataProvider, VoidCssProvider.getInstance()) {
            private static final long serialVersionUID = 1L;

            protected void onSortChanged() {
                if (applicationDataProvider.getOrderBy() == AppOrderBy.PATH_ASC) {
                    applicationDataProvider.setOrderBy(AppOrderBy.PATH_DESC);
                } else {
                    applicationDataProvider.setOrderBy(AppOrderBy.PATH_ASC);
                }
                applicationDataProvider.sort();
                dataView.setCurrentPage(0);
            }
        });

        add(dataView);
        add(new PagingNavigator("appNavigator", dataView));
        FeedbackPanel feedback = new FeedbackPanel("feedback");
        feedback.setEscapeModelStrings(false);
        add(feedback);

        final DataView<PortletDefinitionBean> portletListView = new DataView<PortletDefinitionBean>(PORTLET_TABLE,
                portletListDataProvider) {
            private static final long serialVersionUID = 1L;

            protected void populateItem(final Item<PortletDefinitionBean> item) {
                final PortletDefinitionBean portletDefinitionBean = item.getModelObject();

                Link<PortletDefinitionBean> link = new Link<PortletDefinitionBean>("nameLink", item.getModel()) {
                    private static final long serialVersionUID = 1L;

                    @Override
                    public void onClick() {
                        try {
                            PortletMessaging.publish(
                                    ((AbstractAdminWebApplication) getApplication()).getPortletRequest(),
                                    ApplicationsListApplication.PRM_TOPIC,
                                    ApplicationsListApplication.SELECTED_PORTLET_EVENT, portletDefinitionBean);
                            PortletMessaging.publish(
                                    ((AbstractAdminWebApplication) getApplication()).getPortletRequest(),
                                    ApplicationsListApplication.PRM_TOPIC,
                                    ApplicationsListApplication.SELECTED_APPLICATION_EVENT,
                                    new ApplicationBean(
                                            locator.getPortletRegistry().getPortletApplication(
                                                    portletDefinitionBean.getApplicationName()),
                                            locator.getPortletFactory().isPortletApplicationRegistered(
                                                    locator.getPortletRegistry().getPortletApplication(
                                                            portletDefinitionBean.getApplicationName()))));
                        } catch (NotSerializableException e) {
                            logger.error("Message to publish is not serializable.", e);
                        }
                    }
                };

                link.add(new Label("nameLabel", portletDefinitionBean.getDisplayName()));

                item.add(link);
                item.add(new CloneStatusPanel("status", item.getModel()));
                item.add(new PortletActionPanel("actions", item.getModel()));
            }
        };

        portletListView.setItemsPerPage(
                ((AbstractAdminWebApplication) getApplication()).getPreferenceValueAsInteger("portletRows"));
        add(new OrderByBorder("plOrderByDisplayName", "name", portletListDataProvider) {
            private static final long serialVersionUID = 1L;

            protected void onSortChanged() {
                if (portletListDataProvider.getOrderBy() == PortletOrderBy.DISPLAY_NAME_ASC) {
                    portletListDataProvider.setOrderBy(PortletOrderBy.DISPLAY_NAME_DESC);
                } else {
                    portletListDataProvider.setOrderBy(PortletOrderBy.DISPLAY_NAME_ASC);
                }
                portletListDataProvider.sort();
                dataView.setCurrentPage(0);
            }
        });

        add(portletListView);
        add(new PagingNavigator("plNavigator", portletListView));

        CloneModalWindow modalWindow = new CloneModalWindow("modalwindow");
        add(modalWindow);

        Label modalWindowCloseScript = new Label("modalWindowCloseScript",
                new PropertyModel<String>(this, "currentModalWindowCloseScript"));
        modalWindowCloseScript.setOutputMarkupId(true);
        add(modalWindowCloseScript);
    }

    public String getCurrentModalWindowCloseScript() {
        return currentModalWindowCloseScript;
    }

    public void setCurrentModalWindowCloseScript(String currentModalWindowCloseScript) {
        this.currentModalWindowCloseScript = currentModalWindowCloseScript;
    }

    class CloneModalWindow extends ModalWindow {
        private static final long serialVersionUID = 1L;

        public CloneModalWindow(String id) {
            super(id);
        }

        public String getCloseJavacript() {
            return super.getCloseJavacript();
        }
    }

    class RunningPanel extends Panel {
        private static final long serialVersionUID = 1L;

        public RunningPanel(String id, final IModel<ApplicationBean> model) {
            super(id, model);
            ApplicationBean pa = (ApplicationBean) model.getObject();

            if (pa.isRunning()) {
                add(new Image("running", new ResourceReference(ApplicationsListHome.class, "running.gif")));
            } else {
                add(new Image("running", new ResourceReference(ApplicationsListHome.class, "stop.gif")));
            }
        }
    }

    class CloneStatusPanel extends Panel {
        private static final long serialVersionUID = 1L;

        public CloneStatusPanel(String id, final IModel<PortletDefinitionBean> model) {
            super(id, model);
            PortletDefinitionBean pd = (PortletDefinitionBean) model.getObject();

            if (pd.isCloned()) {
                add(new Label("status", new StringResourceModel("pam.details.status.cloned", this, null)));
            } else {
                add(new Label("status", ""));
            }
        }
    }

    class ActionPanel extends Panel {
        private static final long serialVersionUID = 1L;

        @Override
        protected void onBeforeRender() {
            ApplicationBean pab = (ApplicationBean) getDefaultModelObject();

            final JetspeedServiceLocator locator = ((AbstractAdminWebApplication) getApplication())
                    .getServiceLocator();
            ApplicationServerManager asm = locator.getApplicationServerManager();
            PortletApplication pa = locator.getPortletRegistry().getPortletApplication(pab.getApplicationName());

            boolean isRunning = (pa != null && locator.getPortletFactory().isPortletApplicationRegistered(pa));
            boolean isLocal = (pa != null && pa.getApplicationType() == PortletApplication.LOCAL);
            boolean isAdmin = ((pa != null) && (pa.getContextPath().equals(
                    ((AbstractAdminWebApplication) getApplication()).getPortletRequest().getContextPath())));

            get("start").setVisible((asm != null && !isRunning) && !(isLocal || isAdmin));

            get("stop").setVisible((asm != null && isRunning) && !(isLocal || isAdmin));

            get("undeploy").setVisible((asm != null && !isRunning) && !(isLocal || isAdmin));

            get("delete").setVisible(!(isLocal || isAdmin) && !isRunning);

            super.onBeforeRender();
        }

        /**
         * @param id
         *            component id
         * @param model
         *            model for contact
         */
        public ActionPanel(String id, final IModel<ApplicationBean> model) {
            super(id, model);

            Link<String> start = new Link<String>("start") {
                private static final long serialVersionUID = 1L;

                public void onClick() {
                    JetspeedServiceLocator locator = ((AbstractAdminWebApplication) getApplication())
                            .getServiceLocator();
                    PortletRegistry registry = locator.getPortletRegistry();
                    ApplicationServerManager asm = locator.getApplicationServerManager();
                    AuditActivity auditActivity = locator.getAuditActivity();

                    ApplicationBean pab = (ApplicationBean) model.getObject();
                    PortletApplication pa = registry.getPortletApplication(pab.getApplicationName());
                    FeedbackPanel feed = (FeedbackPanel) getPage().get("feedback");

                    if (isServerReady(asm, feed, "start", pa, pab)) {
                        try {
                            ApplicationServerManagerResult result = asm.start(pa.getContextPath());

                            if (!result.isOk()) {
                                throw new Exception(getString("pam.details.action.status.appServerNotConfigured"));
                            } else {
                                StringResourceModel resModel = new StringResourceModel(
                                        "pam.details.action.status.startOK", this, null,
                                        new Object[] { pab.getPath() });
                                feed.info(resModel.getString());
                                auditActivity.logAdminRegistryActivity(
                                        ((AbstractAdminWebApplication) getApplication()).getUserPrincipalName(),
                                        ((AbstractAdminWebApplication) getApplication()).getIPAddress(),
                                        AuditActivity.REGISTRY_START, PORTLET_REGISTRY_MANAGER);
                            }
                        } catch (Exception e) {
                            StringResourceModel resModel = new StringResourceModel(
                                    "pam.details.action.status.startFailure", this, null,
                                    new Object[] { pab.getPath(), e.getMessage() });
                            feed.error(resModel.getString());
                        }
                    }
                }
            };

            Link<String> stop = new Link<String>("stop") {
                private static final long serialVersionUID = 1L;

                public void onClick() {
                    JetspeedServiceLocator locator = ((AbstractAdminWebApplication) getApplication())
                            .getServiceLocator();
                    PortletRegistry registry = locator.getPortletRegistry();
                    ApplicationServerManager asm = locator.getApplicationServerManager();
                    AuditActivity auditActivity = locator.getAuditActivity();

                    ApplicationBean pab = (ApplicationBean) model.getObject();
                    PortletApplication pa = registry.getPortletApplication(pab.getApplicationName());
                    FeedbackPanel feed = (FeedbackPanel) getPage().get("feedback");

                    if (isServerReady(asm, feed, "stop", pa, pab)) {
                        try {
                            ApplicationServerManagerResult result = asm.stop(pa.getContextPath());

                            if (!result.isOk()) {
                                throw new Exception(getString("pam.details.action.status.appServerNotConfigured"));
                            } else {
                                StringResourceModel resModel = new StringResourceModel(
                                        "pam.details.action.status.stopOK", this, null,
                                        new Object[] { pab.getPath() });
                                feed.info(resModel.getString());

                                auditActivity.logAdminRegistryActivity(
                                        ((AbstractAdminWebApplication) getApplication()).getUserPrincipalName(),
                                        ((AbstractAdminWebApplication) getApplication()).getIPAddress(),
                                        AuditActivity.REGISTRY_STOP, PORTLET_REGISTRY_MANAGER);
                            }
                        } catch (Exception e) {
                            StringResourceModel resModel = new StringResourceModel(
                                    "pam.details.action.status.stopFailure", this, null,
                                    new Object[] { pab.getPath(), e.getMessage() });
                            feed.error(resModel.getString());
                        }
                    }
                }
            };

            Link<String> undeploy = new Link<String>("undeploy") {
                private static final long serialVersionUID = 1L;

                public void onClick() {
                    JetspeedServiceLocator locator = ((AbstractAdminWebApplication) getApplication())
                            .getServiceLocator();
                    PortletRegistry registry = locator.getPortletRegistry();
                    ApplicationServerManager asm = locator.getApplicationServerManager();
                    AuditActivity auditActivity = locator.getAuditActivity();

                    ApplicationBean pab = (ApplicationBean) model.getObject();
                    PortletApplication pa = registry.getPortletApplication(pab.getApplicationName());
                    FeedbackPanel feed = (FeedbackPanel) getPage().get("feedback");

                    if (isServerReady(asm, feed, "undeploy", pa, pab)) {
                        try {
                            ApplicationServerManagerResult result = asm.undeploy(pa.getContextPath());

                            if (!result.isOk()) {
                                throw new Exception(getString("pam.details.action.status.appServerNotConfigured"));
                            } else {
                                StringResourceModel resModel = new StringResourceModel(
                                        "pam.details.action.status.undeployOK", this, null,
                                        new Object[] { pab.getPath() });
                                feed.info(resModel.getString());
                                auditActivity.logAdminRegistryActivity(
                                        ((AbstractAdminWebApplication) getApplication()).getUserPrincipalName(),
                                        ((AbstractAdminWebApplication) getApplication()).getIPAddress(),
                                        AuditActivity.REGISTRY_UNDEPLOY, PORTLET_REGISTRY_MANAGER);
                            }
                        } catch (Exception e) {
                            StringResourceModel resModel = new StringResourceModel(
                                    "pam.details.action.status.undeployFailure", this, null,
                                    new Object[] { pab.getPath(), e.getMessage() });
                            feed.error(resModel.getString());
                        }
                    }
                }
            };

            Link<String> del = new Link<String>("delete") {
                private static final long serialVersionUID = 1L;

                public void onClick() {
                    JetspeedServiceLocator locator = ((AbstractAdminWebApplication) getApplication())
                            .getServiceLocator();
                    PortletRegistry registry = locator.getPortletRegistry();
                    ApplicationServerManager asm = locator.getApplicationServerManager();
                    AuditActivity auditActivity = locator.getAuditActivity();
                    PortletApplicationManagement pam = locator.getPortletApplicationManager();

                    ApplicationBean pab = (ApplicationBean) model.getObject();
                    PortletApplication pa = registry.getPortletApplication(pab.getApplicationName());
                    FeedbackPanel feed = (FeedbackPanel) getPage().get("feedback");

                    if (isServerReady(asm, feed, "remove from registry", pa, pab)) {
                        try {
                            pam.unregisterPortletApplication(pa.getName());
                            StringResourceModel resModel = new StringResourceModel(
                                    "pam.details.action.status.deleteOK", this, null,
                                    new Object[] { pab.getPath() });
                            feed.info(resModel.getString());
                            auditActivity.logAdminRegistryActivity(
                                    ((AbstractAdminWebApplication) getApplication()).getUserPrincipalName(),
                                    ((AbstractAdminWebApplication) getApplication()).getIPAddress(),
                                    AuditActivity.REGISTRY_DELETE, PORTLET_REGISTRY_MANAGER);
                        } catch (Exception e) {
                            StringResourceModel resModel = new StringResourceModel(
                                    "pam.details.action.status.deleteFailure", this, null,
                                    new Object[] { pab.getPath(), e.getMessage() });
                            feed.error(resModel.getString());
                        }
                    }
                }
            };

            add(start);
            add(stop);
            add(undeploy);
            add(del);
        }
    }

    protected boolean isServerReady(ApplicationServerManager asm, FeedbackPanel feedback, String operation,
            PortletApplication pa, ApplicationBean pab) {
        if (pa == null) {
            StringResourceModel resModel = new StringResourceModel("pam.details.action.status.serverReadyFailure",
                    this, null, new Object[] { pab.getPath(), operation });
            feedback.error(resModel.getString());
            return false;
        } else if (asm == null || !asm.isConnected()) {
            StringResourceModel resModel = new StringResourceModel("pam.details.action.status.serverNotAvailable",
                    this, null, new Object[] { pab.getPath(), operation });
            feedback.error(resModel.getString());
            return false;
        }

        return true;
    }

    class PortletActionPanel extends Panel {
        private static final long serialVersionUID = 1L;

        @Override
        protected void onBeforeRender() {
            PortletDefinitionBean pdb = (PortletDefinitionBean) getDefaultModelObject();

            get("clone").setVisible(true);
            get("delete").setVisible(pdb.isCloned());

            super.onBeforeRender();
        }

        /**
         * @param id
         *            component id
         * @param model
         *            model for contact
         */
        public PortletActionPanel(String id, final IModel<PortletDefinitionBean> model) {
            super(id, model);

            AjaxLink<String> clone = new AjaxLink<String>("clone") {
                private static final long serialVersionUID = 1L;

                public void onClick(AjaxRequestTarget target) {
                    PortletDefinitionBean pdb = (PortletDefinitionBean) model.getObject();
                    FeedbackPanel feed = (FeedbackPanel) getPage().get("feedback");

                    try {
                        JetspeedServiceLocator locator = ((AbstractAdminWebApplication) getApplication())
                                .getServiceLocator();
                        PortletRegistry registry = locator.getPortletRegistry();
                        PortletDefinition def = registry.getPortletDefinitionByUniqueName(pdb.getUniqueName());

                        CloneModalWindow modalWindow = (CloneModalWindow) getPage().get("modalwindow");
                        RequestContext rc = ((AbstractAdminWebApplication) getApplication())
                                .getPortalRequestContext();
                        final String pagePath = rc.getPortalURL().getBasePath() + clonePopupPagePath + "?portlet="
                                + def.getUniqueName();
                        modalWindow.setPageCreator(new ModalWindow.PageCreator() {
                            private static final long serialVersionUID = 1L;

                            public Page createPage() {
                                return new RedirectPage(pagePath);
                            }
                        });
                        ((ApplicationsListHome) getPage())
                                .setCurrentModalWindowCloseScript(modalWindow.getCloseJavacript());
                        target.addComponent(getPage().get("modalWindowCloseScript"));
                        modalWindow.show(target);
                    } catch (Exception e) {
                        logger.error("Failed to remove a cloned portlet, {}. {}", pdb.getUniqueName(), e);
                        StringResourceModel resModel = new StringResourceModel(
                                "pam.details.action.status.clonePortletFailure", this, null,
                                new Object[] { pdb.getUniqueName(), e.getMessage() });
                        feed.error(resModel.getString());
                    }
                }
            };

            add(clone);

            Link<String> del = new Link<String>("delete") {
                private static final long serialVersionUID = 1L;

                public void onClick() {
                    PortletDefinitionBean pdb = (PortletDefinitionBean) model.getObject();
                    FeedbackPanel feed = (FeedbackPanel) getPage().get("feedback");

                    try {
                        JetspeedServiceLocator locator = ((AbstractAdminWebApplication) getApplication())
                                .getServiceLocator();
                        PortletRegistry registry = locator.getPortletRegistry();
                        PortletDefinition def = registry.getPortletDefinitionByUniqueName(pdb.getUniqueName());

                        if (def != null && def.isClone()) {
                            registry.removeClone(def);

                            DataView portletView = (DataView) getPage().get(PORTLET_TABLE);
                            PortletDataProvider pdp = (PortletDataProvider) portletView.getDataProvider();

                            if (pdp.getSearchMode()) {
                                SearchForm searchForm = (SearchForm) getPage().get("appSearchForm");
                                pdp.searchPortlets(searchForm.getAppSearchField(), searchForm.isFilterPortlet(),
                                        searchForm.isFilterClone());
                            }
                            pdp.refresh();
                        }
                    } catch (Exception e) {
                        logger.error("Failed to remove a cloned portlet, {}. {}", pdb.getUniqueName(), e);
                        StringResourceModel resModel = new StringResourceModel(
                                "pam.details.action.status.removeCloneFailure", this, null,
                                new Object[] { pdb.getUniqueName(), e.getMessage() });
                        feed.error(resModel.getString());
                    }
                }
            };

            add(del);
        }
    }

    private class SearchForm extends Form<Void> {
        private static final long serialVersionUID = 1L;

        private String appSearchField;
        private boolean filterPortlet = true;
        private boolean filterClone = true;

        public SearchForm(String name) {
            super(name);

            add(new TextField("appSearchField", new PropertyModel(this, "appSearchField")));

            add(new Button("appSearchButton", new ResourceModel("pam.details.action.search")) {
                @Override
                public void onSubmit() {
                    DataView appView = (DataView) getPage().get(APP_TABLE);
                    DataView portletView = (DataView) getPage().get(PORTLET_TABLE);
                    ApplicationDataProvider adp = (ApplicationDataProvider) appView.getDataProvider();
                    adp.searchApplications(getAppSearchField());
                    PortletDataProvider pdp = (PortletDataProvider) portletView.getDataProvider();
                    pdp.searchPortlets(getAppSearchField(), isFilterPortlet(), isFilterClone());
                }
            });

            add(new Link<String>("appDeploy") {
                private static final long serialVersionUID = 1L;

                @Override
                public void onClick() {
                    UploadPortletApp upa = new UploadPortletApp((((AbstractAdminWebApplication) getApplication())
                            .getServiceLocator().getDeploymentManager()));
                    this.setResponsePage(upa);
                }
            });

            add(new Link<String>("appHome") {
                private static final long serialVersionUID = 1L;

                @Override
                public void onClick() {
                    DataView appView = (DataView) getPage().get(APP_TABLE);
                    ApplicationDataProvider adp = (ApplicationDataProvider) appView.getDataProvider();
                    adp.setSearchMode(false);
                    adp.refresh();
                    DataView portletView = (DataView) getPage().get(PORTLET_TABLE);
                    PortletDataProvider pdp = (PortletDataProvider) portletView.getDataProvider();
                    pdp.setSearchMode(false);
                    pdp.refresh();
                }
            });

            add(new CheckBox("filterPortlet", new PropertyModel(this, "filterPortlet")));
            add(new CheckBox("filterClone", new PropertyModel(this, "filterClone")));
        }

        public String getAppSearchField() {
            return appSearchField;
        }

        public void setAppSearchField(String appSearchField) {
            this.appSearchField = appSearchField;
        }

        public boolean isFilterPortlet() {
            return filterPortlet;
        }

        public void setFilterPortlet(boolean filterPortlet) {
            this.filterPortlet = filterPortlet;
        }

        public boolean isFilterClone() {
            return filterClone;
        }

        public void setFilterClone(boolean filterClone) {
            this.filterClone = filterClone;
        }

    }
}