/** * (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 ); } } }