/*******************************************************************************
* Copyright (c) 2004, 2010 BREDEX GmbH.
* 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
*
* Contributors:
* BREDEX GmbH - initial API and implementation and/or initial documentation
*******************************************************************************/
package org.eclipse.jubula.client.ui.rcp.controllers.dnd;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import javax.persistence.EntityManager;
import org.eclipse.jubula.client.core.businessprocess.db.NodeBP;
import org.eclipse.jubula.client.core.events.DataChangedEvent;
import org.eclipse.jubula.client.core.events.DataEventDispatcher;
import org.eclipse.jubula.client.core.events.DataEventDispatcher.DataState;
import org.eclipse.jubula.client.core.events.DataEventDispatcher.UpdateState;
import org.eclipse.jubula.client.core.model.IExecObjContPO;
import org.eclipse.jubula.client.core.model.INodePO;
import org.eclipse.jubula.client.core.model.IPersistentObject;
import org.eclipse.jubula.client.core.model.IProjectPO;
import org.eclipse.jubula.client.core.model.ISpecObjContPO;
import org.eclipse.jubula.client.core.persistence.GeneralStorage;
import org.eclipse.jubula.client.core.persistence.TransactionSupport.ITransaction;
import org.eclipse.jubula.client.core.utils.NativeSQLUtils;
import org.eclipse.jubula.client.ui.rcp.actions.TransactionWrapper;
/**
* Utility class containing methods for use in drag and drop as well as
* cut and paste operations in the Test Case Browser.
*
* @author BREDEX GmbH
* @created 19.10.2011
*/
public abstract class AbstractBrowserDndSupport {
/**
* Private constructor
*/
protected AbstractBrowserDndSupport() {
// Do nothing
}
/**
* tries to move all selected node into the target node. Operates on the GUI model
* and on the INodePO model
* @param target
* GuiNode
* @param nodes
* List <INodePO>
* @return whether the operation was successfull
*/
protected static boolean doMove(final List<INodePO> nodes,
final IPersistentObject target) {
boolean tC = NodeBP.isTC(nodes.get(0));
final Set<IPersistentObject> toLock = new HashSet<>();
final Set<IPersistentObject> toRefresh = new HashSet<>();
IProjectPO proj = GeneralStorage.getInstance().getProject();
for (INodePO node : nodes) {
if (node.getParentNode() == ISpecObjContPO.TCB_ROOT_NODE) {
toLock.add(proj.getSpecObjCont());
toRefresh.add(proj.getSpecObjCont());
} else if (node.getParentNode() == IExecObjContPO.TSB_ROOT_NODE) {
toLock.add(proj.getExecObjCont());
toRefresh.add(proj.getExecObjCont());
} else {
toLock.add(node.getParentNode());
toRefresh.add(node.getParentNode());
}
toLock.add(node);
toRefresh.add(node);
}
toLock.add(target);
toRefresh.add(target);
boolean succ = TransactionWrapper.executeOperation(new
ITransaction() {
/** {@inheritDoc} */
public void run(EntityManager sess) {
for (INodePO node : nodes) {
NativeSQLUtils.moveNode(sess, node, target);
}
}
/** {@inheritDoc} */
public Collection<? extends IPersistentObject> getToRefresh() {
return toRefresh;
}
/** {@inheritDoc} */
public Collection<? extends IPersistentObject> getToLock() {
return toLock;
}
/** {@inheritDoc} */
public Collection<? extends IPersistentObject> getToMerge() {
return null;
}
});
if (!succ) {
return false;
}
List<DataChangedEvent> eventList =
new ArrayList<DataChangedEvent>();
for (INodePO nodeToMove : nodes) {
eventList.add(new DataChangedEvent(target,
DataState.StructureModified, UpdateState.notInEditor));
eventList.add(new DataChangedEvent(nodeToMove.getParentNode(),
DataState.StructureModified, UpdateState.notInEditor));
}
// notify listener for updates
DataEventDispatcher.getInstance().fireDataChangedListener(
eventList.toArray(new DataChangedEvent[0]));
return true;
}
}