/******************************************************************************* | |
* Copyright (c) 2014 Formal Mind GmbH, University of Duesseldorf 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 | |
* | |
* Contributors: | |
* Michael Jastram - initial API and implementation | |
*******************************************************************************/ | |
package org.eclipse.rmf.reqif10.pror.editor.presentation; | |
import java.util.ArrayList; | |
import java.util.Calendar; | |
import java.util.Collections; | |
import java.util.Date; | |
import java.util.GregorianCalendar; | |
import java.util.HashSet; | |
import java.util.ListIterator; | |
import java.util.Set; | |
import javax.xml.datatype.DatatypeConfigurationException; | |
import javax.xml.datatype.DatatypeFactory; | |
import javax.xml.datatype.XMLGregorianCalendar; | |
import org.eclipse.emf.common.CommonPlugin; | |
import org.eclipse.emf.common.command.Command; | |
import org.eclipse.emf.common.command.CompoundCommand; | |
import org.eclipse.emf.common.util.WrappedException; | |
import org.eclipse.emf.edit.domain.EditingDomain; | |
import org.eclipse.rmf.reqif10.Identifiable; | |
import com.google.common.collect.Lists; | |
/** | |
* @author Graf | |
* | |
*/ | |
public class TimestampedCompoundCommand extends CompoundCommand { | |
private EditingDomain domain; | |
public TimestampedCompoundCommand(EditingDomain domain, Command command) { | |
super(Collections.singletonList(command)); | |
this.domain = domain; | |
} | |
@Override | |
public void execute() { | |
System.out.println("Executing timestamp command"); | |
Calendar cal = Calendar.getInstance(); | |
Date lastChange = cal.getTime(); | |
GregorianCalendar c = new GregorianCalendar(); | |
c.setTime(lastChange); | |
XMLGregorianCalendar date2 = null; | |
try { | |
date2 = DatatypeFactory.newInstance().newXMLGregorianCalendar(c); | |
} catch (DatatypeConfigurationException e) { | |
// TODO Auto-generated catch block | |
e.printStackTrace(); | |
} | |
Set<Object> lastChangeObjects = new HashSet<Object>(); | |
ArrayList<Command> arrList = Lists.newArrayList(commandList); | |
commandList = arrList; | |
for (ListIterator<Command> commands = arrList.listIterator(); commands | |
.hasNext();) { | |
try { | |
Command command = commands.next(); | |
System.out.println("Executing "+command); | |
command.execute(); | |
for(Object obj: command.getAffectedObjects() ) { | |
System.out.println("Affected "+obj); | |
if(obj instanceof Identifiable && lastChangeObjects.add(obj)) { | |
System.out.println("Adding setLastChange"); | |
SetLastChangeCommand setLastChangeCommand = new SetLastChangeCommand(domain,(Identifiable)obj,date2); | |
commands.add(setLastChangeCommand); | |
for(int i = 0 ; i< 2 ; i++) | |
if(commands.hasPrevious()) | |
commands.previous(); | |
} | |
} | |
} catch (RuntimeException exception) { | |
// Skip over the command that threw the exception. | |
// | |
commands.previous(); | |
try { | |
// Iterate back over the executed commands to undo them. | |
// | |
while (commands.hasPrevious()) { | |
Command command = commands.previous(); | |
if (command.canUndo()) { | |
command.undo(); | |
} else { | |
break; | |
} | |
} | |
} catch (RuntimeException nestedException) { | |
CommonPlugin.INSTANCE | |
.log(new WrappedException( | |
CommonPlugin.INSTANCE | |
.getString("_UI_IgnoreException_exception"), | |
nestedException).fillInStackTrace()); | |
} | |
throw exception; | |
} | |
} | |
} | |
} |