org.jabylon.rest.ui.wicket.config.sections.WorkspaceConfigSection.java Source code

Java tutorial

Introduction

Here is the source code for org.jabylon.rest.ui.wicket.config.sections.WorkspaceConfigSection.java

Source

/**
 * (C) Copyright 2013 Jabylon (http://www.jabylon.org) and others.
 *
 * 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 org.jabylon.rest.ui.wicket.config.sections;

import java.io.File;

import org.apache.wicket.Component;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.attributes.AjaxCallListener;
import org.apache.wicket.ajax.attributes.AjaxRequestAttributes;
import org.apache.wicket.extensions.ajax.markup.html.IndicatingAjaxButton;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.Button;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.link.BookmarkablePageLink;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;
import org.apache.wicket.model.IModel;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.eclipse.emf.cdo.transaction.CDOTransaction;
import org.eclipse.emf.cdo.util.CommitException;
import org.jabylon.common.util.FileUtil;
import org.jabylon.common.util.PreferencesUtil;
import org.jabylon.properties.Project;
import org.jabylon.properties.PropertiesPackage;
import org.jabylon.properties.Workspace;
import org.jabylon.rest.ui.Activator;
import org.jabylon.rest.ui.model.ComplexEObjectListDataProvider;
import org.jabylon.rest.ui.util.WicketUtil;
import org.jabylon.rest.ui.wicket.BasicPanel;
import org.jabylon.rest.ui.wicket.config.SettingsPage;
import org.jabylon.rest.ui.wicket.config.SettingsPanel;
import org.osgi.service.prefs.BackingStoreException;
import org.osgi.service.prefs.Preferences;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * @author Johannes Utzig (jutzig.dev@googlemail.com)
 *
 */
public class WorkspaceConfigSection extends BasicPanel<Workspace> {

    private static final long serialVersionUID = -5358263608301930488L;
    private static final Logger logger = LoggerFactory.getLogger(WorkspaceConfigSection.class);

    public WorkspaceConfigSection(String id, IModel<Workspace> object, Preferences prefs) {
        super(id, object);
        add(buildAddNewLink(object));
        ComplexEObjectListDataProvider<Project> provider = new ComplexEObjectListDataProvider<Project>(object,
                PropertiesPackage.Literals.RESOLVABLE__CHILDREN);
        ListView<Project> project = new ListView<Project>("projects", provider) {

            private static final long serialVersionUID = 1L;

            @Override
            protected void populateItem(ListItem<Project> item) {

                item.add(new BookmarkablePageLink<Void>("edit", SettingsPage.class,
                        WicketUtil.buildPageParametersFor(item.getModelObject())));
                item.add(new Label("project-name", item.getModelObject().getName()));
                item.add(createDeleteAction(item.getModel()));
            }
        };
        project.setReuseItems(true);
        add(project);
    }

    private Component buildAddNewLink(IModel<Workspace> model) {
        PageParameters params = WicketUtil.buildPageParametersFor(model.getObject());
        params.add(SettingsPanel.QUERY_PARAM_CREATE, PropertiesPackage.Literals.PROJECT.getName());
        return new BookmarkablePageLink<Void>("addNew", SettingsPage.class, params);
    }

    protected Component createDeleteAction(final IModel<Project> model) {

        Button button = new DeleteAction("delete", model,
                nls("WorkspaceConfigSection.delete.action.confirmation", model.getObject().getName()));
        button.setDefaultFormProcessing(false);
        return button;
    }

    static class DeleteAction extends IndicatingAjaxButton {

        private IModel<Project> model;
        private IModel<String> confirmationText;
        private static final long serialVersionUID = 1L;

        public DeleteAction(String id, IModel<Project> model, IModel<String> confirmationText) {
            super(id);
            this.model = model;
            this.confirmationText = confirmationText;
        }

        @Override
        protected void onAfterSubmit(AjaxRequestTarget target, Form<?> form) {

            Project project = model.getObject();
            CDOTransaction transaction = Activator.getDefault().getRepositoryConnector().openTransaction();
            project = transaction.getObject(project);
            Preferences preferences = PreferencesUtil.scopeFor(project);
            try {
                PreferencesUtil.deleteNode(preferences);
                File directory = new File(project.absolutPath().toFileString());
                FileUtil.delete(directory);
                project.getParent().getChildren().remove(project);
                transaction.commit();
                setResponsePage(SettingsPage.class, getPage().getPageParameters());
            } catch (CommitException e) {
                logger.error("Commit failed", e);
                getSession().error(e.getMessage());
            } catch (BackingStoreException e) {
                logger.error("Failed to delete project preferences", e);
                getSession().error(e.getMessage());
            } finally {
                transaction.close();
            }
        }

        @Override
        protected void updateAjaxAttributes(AjaxRequestAttributes attributes) {
            super.updateAjaxAttributes(attributes);

            AjaxCallListener ajaxCallListener = new AjaxCallListener();
            ajaxCallListener.onPrecondition("return confirm('" + confirmationText.getObject() + "');");
            attributes.getAjaxCallListeners().add(ajaxCallListener);
        }

    }
}