package org.korsakow.ide.ui.controller.action.snu; import javax.swing.JFrame; import org.dsrg.soenea.domain.MapperException; import org.dsrg.soenea.domain.command.CommandException; import org.dsrg.soenea.uow.UoW; import org.korsakow.domain.CommandExecutor; import org.korsakow.domain.Snu; import org.korsakow.domain.command.AbstractCommand; import org.korsakow.domain.command.InsertSnuCommand; import org.korsakow.domain.command.Request; import org.korsakow.domain.command.Response; import org.korsakow.domain.command.UpdateSnuCommand; import org.korsakow.domain.interf.IMedia; import org.korsakow.domain.interf.ISnu; import org.korsakow.domain.mapper.input.MediaInputMapper; import org.korsakow.domain.mapper.input.SnuInputMapper; import org.korsakow.ide.Application; import org.korsakow.ide.DataRegistry; import org.korsakow.ide.lang.LanguageBundle; import org.korsakow.ide.ui.components.tree.KNode; import org.korsakow.ide.ui.components.tree.ResourceNode; import org.korsakow.ide.ui.controller.action.AbstractAction; import org.korsakow.ide.ui.resourceexplorer.ResourceTreeTableModel; import org.korsakow.ide.ui.resources.SnuResourceView; public class SaveSnuAction extends AbstractAction { public static SaveSnuAction insert(SnuResourceView view) { return new SaveSnuAction(view, null); } public static SaveSnuAction update(SnuResourceView view, long id) { return new SaveSnuAction(view, id); } private final SnuResourceView view; private Long id; private final boolean isNew; private SaveSnuAction(SnuResourceView view, Long id) { this.view = view; this.id = id; isNew = id==null; } @Override public boolean isUndoable() { return true; } @Override // UndoableEdit public String getUndoPresentationName() { try { return (isNew)?String.format("Create SNU '%s'", view.getNameFieldText()):String.format("Edit SNU '%s'", SnuInputMapper.map(id).getName()); } catch (MapperException e) { Application.getInstance().showUnhandledErrorDialog(LanguageBundle.getString("general.errors.uncaughtexception.title"), e); return ""; } } @Override public void undo() { try { ResourceTreeTableModel model = Application.getInstance().getProjectExplorer().getResourceBrowser().getResourceTreeTable().getTreeTableModel(); Snu snu = SnuInputMapper.map(id); IMedia media = snu.getMainMedia(); media.getVersion(); // force proxy KNode node = model.findResource( snu.getId() ); KNode insertParent = node.getParent(); int insertIndex = model.getIndexOfChild( insertParent, node ); if (isNew) { Application.getInstance().notifyResourceDeleted(snu); model.remove( snu.getId() ); } super.undo(); UoW.newCurrent(); media = MediaInputMapper.map( media.getId() ); if (isNew) { Application.getInstance().notifyResourceAdded( media ); } else { snu = SnuInputMapper.map(id); Application.getInstance().notifyResourceModified(snu); } } catch (MapperException e) { Application.getInstance().showUnhandledErrorDialog(LanguageBundle.getString("general.errors.uncaughtexception.title"), e); } } @Override public void performAction() { try { Response response = save(view, id); id = ((ISnu)response.get(UpdateSnuCommand.SNU)).getId(); UoW.newCurrent(); DataRegistry.rollback(); } catch (CommandException e) { Application.getInstance().showUnhandledErrorDialog(LanguageBundle.getString("general.errors.uncaughtexception.title"), e); } catch (InterruptedException e) { Application.getInstance().showUnhandledErrorDialog(LanguageBundle.getString("general.errors.uncaughtexception.title"), e); } finally { ((JFrame)view.getTopLevelAncestor()).dispose(); } } private Response save(SnuResourceView view, Long id) throws CommandException, InterruptedException { Class<? extends AbstractCommand> command; if (isNew) command = InsertSnuCommand.class; else command = UpdateSnuCommand.class; Response response = new Response(); Request request = SnuHelper.createRequest(view, id); CommandExecutor.executeCommand(command, request, response); ISnu snu = (ISnu)response.get( UpdateSnuCommand.SNU ); ResourceTreeTableModel model = Application.getInstance().getProjectExplorer().getResourceBrowser().getResourceTreeTable().getTreeTableModel(); if ( isNew ) { KNode node = model.findResource( snu.getMainMedia().getId() ); if ( node != null ) { KNode insertParent = node.getParent(); int insertIndex = model.getIndexOfChild( insertParent, node ); model.removeNodeFromParent( node ); model.insertNodeInto( ResourceNode.create( snu ), insertParent, insertIndex ); } else { model.appendNode( ResourceNode.create( snu ), model.getRoot() ); } Application.getInstance().notifyResourceAdded( snu ); } else Application.getInstance().notifyResourceModified( snu ); return response; } }