### Eclipse Workspace Patch 1.0 #P org.eclipse.rse.services.dstore Index: src/org/eclipse/rse/internal/services/dstore/files/DStoreFileService.java =================================================================== RCS file: /cvsroot/dsdp/org.eclipse.tm.rse/plugins/org.eclipse.rse.services.dstore/src/org/eclipse/rse/internal/services/dstore/files/DStoreFileService.java,v retrieving revision 1.17 diff -u -r1.17 DStoreFileService.java --- src/org/eclipse/rse/internal/services/dstore/files/DStoreFileService.java 23 Aug 2007 15:26:06 -0000 1.17 +++ src/org/eclipse/rse/internal/services/dstore/files/DStoreFileService.java 12 Sep 2007 19:06:21 -0000 @@ -200,11 +200,8 @@ String hostEncoding, IProgressMonitor monitor) { BufferedInputStream bufInputStream = null; - - - boolean isCancelled = false; - + boolean isCancelled = false; try { Index: miners/org/eclipse/rse/internal/dstore/universal/miners/command/CommandMinerThread.java =================================================================== RCS file: /cvsroot/dsdp/org.eclipse.tm.rse/plugins/org.eclipse.rse.services.dstore/miners/org/eclipse/rse/internal/dstore/universal/miners/command/CommandMinerThread.java,v retrieving revision 1.9 diff -u -r1.9 CommandMinerThread.java --- miners/org/eclipse/rse/internal/dstore/universal/miners/command/CommandMinerThread.java 31 Aug 2007 14:13:13 -0000 1.9 +++ miners/org/eclipse/rse/internal/dstore/universal/miners/command/CommandMinerThread.java 12 Sep 2007 19:06:21 -0000 @@ -13,6 +13,7 @@ * * Contributors: * {Name} (company) - description of contribution. + * David McKnight (IBM) - [202822] updating cleanup *******************************************************************************/ package org.eclipse.rse.internal.dstore.universal.miners.command; @@ -833,41 +834,23 @@ } } + + public void cleanupThread() { - // disconnecting all - _dataStore.disconnectObjects(_status); - - // clean up the associated environment - List projectEnvReference = _subject.getAssociated("inhabits"); //$NON-NLS-1$ - - if (projectEnvReference != null) + _isDone = true; + try { - DataElement env = (DataElement)projectEnvReference.get(0); - DataElement envParent = env.getParent(); - _dataStore.deleteObject(envParent, env); - _dataStore.refresh(envParent); - } - _dataStore.disconnectObject(_subject); //bug 70420 - + - refreshStatus(); + /* if (_isShell) { sendInput("#exit"); }*/ - - _isDone = true; - try - { - _status.setAttribute(DE.A_NAME, "done"); //$NON-NLS-1$ - _dataStore.refresh(_status, true); - _stdOutputHandler.finish(); - _stdErrorHandler.finish(); - _stdInput.close(); - _stdError.close(); + if (_theProcess != null) { int exitcode; @@ -880,7 +863,7 @@ else { exitcode = _theProcess.exitValue(); - createObject("prompt", "> Shell Completed (exit code = " + exitcode + ")"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + createObject("prompt", "> Shell Completed (exit code = " + exitcode + ")"); } } catch (IllegalThreadStateException e) @@ -890,13 +873,41 @@ } _theProcess = null; } + + + _stdOutputHandler.finish(); + _stdErrorHandler.finish(); + _stdInput.close(); + _stdError.close(); + + _status.setAttribute(DE.A_NAME, "done"); + _dataStore.refresh(_status); + + System.out.println("cleaupThread"); + + // disconnecting all + + _dataStore.disconnectObjects(_status); + + + // clean up the associated environment + List projectEnvReference = _subject.getAssociated("inhabits"); + + if (projectEnvReference != null) + { + DataElement env = (DataElement)projectEnvReference.get(0); + DataElement envParent = env.getParent(); + _dataStore.deleteObject(envParent, env); + _dataStore.refresh(envParent); + } + _dataStore.disconnectObject(_subject); //bug 70420 } catch (IOException e) { e.printStackTrace(); - } + } } - + public void interpretLine(String line, boolean stdError) { // for prompting Index: miners/org/eclipse/rse/dstore/universal/miners/CommandMiner.java =================================================================== RCS file: /cvsroot/dsdp/org.eclipse.tm.rse/plugins/org.eclipse.rse.services.dstore/miners/org/eclipse/rse/dstore/universal/miners/CommandMiner.java,v retrieving revision 1.4 diff -u -r1.4 CommandMiner.java --- miners/org/eclipse/rse/dstore/universal/miners/CommandMiner.java 31 Aug 2007 14:13:16 -0000 1.4 +++ miners/org/eclipse/rse/dstore/universal/miners/CommandMiner.java 12 Sep 2007 19:06:21 -0000 @@ -13,6 +13,7 @@ * * Contributors: * David McKnight (IBM) - [191599] use specified encoding for shell + * David McKnight (IBM) - [202822] canceled output should be created before thread cleanup *******************************************************************************/ package org.eclipse.rse.dstore.universal.miners; @@ -265,7 +266,9 @@ { CommandMinerThread theThread = (CommandMinerThread) _threads.get(status.getAttribute(DE.A_ID)); if (theThread != null) - { + { + _dataStore.createObject(status, "stdout", "Command Cancelled by User Request"); //$NON-NLS-1$ //$NON-NLS-2$ + theThread.stopThread(); theThread.sendExit(); @@ -274,14 +277,12 @@ while (!done) if ((!theThread.isAlive()) || (stopIn < System.currentTimeMillis())) done = true; - _dataStore.createObject(status, "stdout", "Command Cancelled by User Request"); //$NON-NLS-1$ //$NON-NLS-2$ - _dataStore.refresh(status); } } public String getVersion() { - return "6.4.0"; //$NON-NLS-1$ + return "8.0.0"; //$NON-NLS-1$ } } #P org.eclipse.dstore.core Index: src/org/eclipse/dstore/core/model/DataElement.java =================================================================== RCS file: /cvsroot/dsdp/org.eclipse.tm.rse/plugins/org.eclipse.dstore.core/src/org/eclipse/dstore/core/model/DataElement.java,v retrieving revision 1.13 diff -u -r1.13 DataElement.java --- src/org/eclipse/dstore/core/model/DataElement.java 31 Aug 2007 14:41:30 -0000 1.13 +++ src/org/eclipse/dstore/core/model/DataElement.java 12 Sep 2007 19:06:23 -0000 @@ -1657,7 +1657,7 @@ _isUpdated = false; _isExpanded = true; _buffer = null; - //_nestedData = null; + //_nestedData = null; // commented out this null setting so that the children of this element can be properly deleted } } Index: src/org/eclipse/dstore/core/model/DataStore.java =================================================================== RCS file: /cvsroot/dsdp/org.eclipse.tm.rse/plugins/org.eclipse.dstore.core/src/org/eclipse/dstore/core/model/DataStore.java,v retrieving revision 1.17 diff -u -r1.17 DataStore.java --- src/org/eclipse/dstore/core/model/DataStore.java 31 Aug 2007 14:41:29 -0000 1.17 +++ src/org/eclipse/dstore/core/model/DataStore.java 12 Sep 2007 19:06:23 -0000 @@ -14,6 +14,7 @@ * Contributors: * Michael Berger (IBM) - 146326 fixed erroneously disconnected dstore elements. * Michael Berger (IBM) - 145799 added refresh() method with depth parameter. + * David McKnight (IBM) - 202822 findDeleted should not be synchronized *******************************************************************************/ package org.eclipse.dstore.core.model; @@ -1657,7 +1658,11 @@ */ public void disconnectObjects(DataElement from) { - if (!isDoSpirit()) return; + if (!isDoSpirit()) + { + System.out.println("not doing spirit"); + return; + } if (from != null) { for (int i = from.getNestedSize() - 1; i >= 0; i--) @@ -2629,7 +2634,7 @@ * @param root where to search from * @return a list of elements */ - public synchronized List findDeleted(DataElement root) + public List findDeleted(DataElement root) { return findDeleted(root, 10); } @@ -2641,10 +2646,12 @@ * @param type the descriptor representing the type of the objects to search for * @return a list of elements */ - public synchronized List findDeleted(DataElement root, int depth) + public List findDeleted(DataElement root, int depth) { ArrayList results = new ArrayList(); - synchronized (root) +// synchronized (root) + // synchronized can cause hang here..but may not be necessary anyway since + // we're not adding or removing anything here { if (root != null && root.getDataStore() == this) { @@ -3756,8 +3763,7 @@ for (int i = 0; i < toDelete.getNestedSize(); i++) { DataElement subDelete = toDelete.get(i); - if (subDelete != null && subDelete.getDataStore() == this/* && !subDelete.isDeleted()*/) // on server, spirited are considered deleted - { + if (subDelete != null && subDelete.getDataStore() == this && !subDelete.isDeleted()) { deleteObjectHelper(toDelete, subDelete, depth); } } Index: src/org/eclipse/dstore/core/model/UpdateHandler.java =================================================================== RCS file: /cvsroot/dsdp/org.eclipse.tm.rse/plugins/org.eclipse.dstore.core/src/org/eclipse/dstore/core/model/UpdateHandler.java,v retrieving revision 1.10 diff -u -r1.10 UpdateHandler.java --- src/org/eclipse/dstore/core/model/UpdateHandler.java 31 Aug 2007 14:13:39 -0000 1.10 +++ src/org/eclipse/dstore/core/model/UpdateHandler.java 12 Sep 2007 19:06:23 -0000 @@ -13,6 +13,7 @@ * * Contributors: * {Name} (company) - description of contribution. + * David McKnight (IBM) [202822] should not be synchronizing on clean method *******************************************************************************/ package org.eclipse.dstore.core.model; @@ -67,7 +68,7 @@ clean(object, 2); } - protected synchronized void clean(DataElement object, int depth) + protected void clean(DataElement object, int depth) { if ((depth > 0) && (object != null) && object.getNestedSize() > 0) { @@ -78,7 +79,6 @@ DataElement child = (DataElement) deletedList.get(i); if (child != null && child.isDeleted()) { - clean(child, depth - 1); DataElement parent = child.getParent(); DataElementRemover.addToRemovedCount(); @@ -91,15 +91,19 @@ if (parent != null) { - parent.removeNestedData(child); + synchronized (parent) + { + parent.removeNestedData(child); + } } - _dataStore.addToRecycled(child); + // _dataStore.addToRecycled(child); } } deletedList.clear(); } - + // delete objects under temproot + _dataStore.getTempRoot().removeNestedData(); } Index: src/org/eclipse/dstore/internal/core/util/DataElementRemover.java =================================================================== RCS file: /cvsroot/dsdp/org.eclipse.tm.rse/plugins/org.eclipse.dstore.core/src/org/eclipse/dstore/internal/core/util/DataElementRemover.java,v retrieving revision 1.4 diff -u -r1.4 DataElementRemover.java --- src/org/eclipse/dstore/internal/core/util/DataElementRemover.java 31 Aug 2007 14:13:38 -0000 1.4 +++ src/org/eclipse/dstore/internal/core/util/DataElementRemover.java 12 Sep 2007 19:06:23 -0000 @@ -13,12 +13,13 @@ * * Contributors: * {Name} (company) - description of contribution. + * David McKnight (IBM) - [202822] don't need to remove children from map here *******************************************************************************/ package org.eclipse.dstore.internal.core.util; +import java.util.ArrayList; import java.util.LinkedList; -import java.util.List; import org.eclipse.dstore.core.model.DataElement; import org.eclipse.dstore.core.model.DataStore; @@ -39,8 +40,8 @@ // that are older than _expiryTime milliseconds are removed. public static final int DEFAULT_EXPIRY_TIME = 600; // in seconds public static final int DEFAULT_INTERVAL_TIME = 60; // in seconds - private int _intervalTime = DEFAULT_INTERVAL_TIME * 100; - private int _expiryTime = DEFAULT_EXPIRY_TIME * 100; + private int _intervalTime = DEFAULT_INTERVAL_TIME * 10; + private int _expiryTime = DEFAULT_EXPIRY_TIME * 10; public static final String EXPIRY_TIME_PROPERTY_NAME = "SPIRIT_EXPIRY_TIME"; //$NON-NLS-1$ public static final String INTERVAL_TIME_PROPERTY_NAME = "SPIRIT_INTERVAL_TIME"; //$NON-NLS-1$ @@ -96,9 +97,11 @@ } public synchronized void addToQueueForRemoval(DataElement element) - { + { + System.out.println("dis:"+element.getName()); synchronized (_queue) { + if (_dataStore.isDoSpirit() && _dataStore == element.getDataStore()) { QueueItem item = new QueueItem(element, System.currentTimeMillis()); @@ -116,6 +119,8 @@ { synchronized (_queue) { + + System.out.println("spiriting"); _dataStore.memLog(" "); //$NON-NLS-1$ int disconnected = 0; if (!_dataStore.isDoSpirit()) @@ -136,13 +141,20 @@ _dataStore.memLog("Size of queue: " + _queue.size()); //$NON-NLS-1$ + ArrayList toRefresh = new ArrayList(); while (_queue.size() > 0 && System.currentTimeMillis() - ((QueueItem) _queue.getFirst()).timeStamp > _expiryTime) { DataElement toBeDisconnected = ((QueueItem) _queue.removeFirst()).dataElement; if (!toBeDisconnected.isSpirit()) { toBeDisconnected.setSpirit(true); - _dataStore.refresh(toBeDisconnected); + toBeDisconnected.setUpdated(false); + DataElement parent = toBeDisconnected.getParent(); + if (!toRefresh.contains(parent)) + { + toRefresh.add(toBeDisconnected.getParent()); + } + //_dataStore.refresh(toBeDisconnected); disconnected++; numDisconnected++; } @@ -152,6 +164,9 @@ } unmap(toBeDisconnected); } + + _dataStore.refresh(toRefresh); + _dataStore.memLog("Disconnected " + disconnected + " DataElements."); //$NON-NLS-1$ //$NON-NLS-2$ _dataStore.memLog("Elements created so far: " + numCreated); //$NON-NLS-1$ _dataStore.memLog("Elements disconnected so far: " + numDisconnected); //$NON-NLS-1$ @@ -162,15 +177,6 @@ private void unmap(DataElement element) { - List children = element.getNestedData(); - if (children != null) - { - for (int i = 0; i < children.size(); i++) - { - DataElement child = (DataElement)children.get(i); - unmap(child); - } - } _dataStore.getHashMap().remove(element.getId()); } #P org.eclipse.rse.connectorservice.dstore Index: src/org/eclipse/rse/connectorservice/dstore/DStoreConnectorService.java =================================================================== RCS file: /cvsroot/dsdp/org.eclipse.tm.rse/plugins/org.eclipse.rse.connectorservice.dstore/src/org/eclipse/rse/connectorservice/dstore/DStoreConnectorService.java,v retrieving revision 1.47 diff -u -r1.47 DStoreConnectorService.java --- src/org/eclipse/rse/connectorservice/dstore/DStoreConnectorService.java 15 May 2007 23:53:27 -0000 1.47 +++ src/org/eclipse/rse/connectorservice/dstore/DStoreConnectorService.java 12 Sep 2007 19:06:24 -0000 @@ -15,6 +15,7 @@ * Martin Oberhuber (Wind River) - [175262] IHost.getSystemType() should return IRSESystemType * Martin Oberhuber (Wind River) - [186640] Add IRSESystemType.testProperty() * Martin Oberhuber (Wind River) - [186128][refactoring] Move IProgressMonitor last in public base classes + * David McKnight (IBM) - [202822] need to enable spiriting on the server side ********************************************************************************/ package org.eclipse.rse.connectorservice.dstore; @@ -85,6 +86,20 @@ */ public class DStoreConnectorService extends StandardConnectorService implements IDataStoreProvider { + private class StartSpiritThread extends Thread + { + private DataStore _dataStore; + public StartSpiritThread(DataStore dataStore) + { + _dataStore = dataStore; + } + + public void run() + { + if (_dataStore.isDoSpirit()) _dataStore.queryServerSpiritState(); + } + } + private ClientConnection clientConnection = null; private ConnectionStatusListener _connectionStatusListener = null; private IServerLauncher starter = null; @@ -834,7 +849,9 @@ dataStore.showTicket(null); } - if (dataStore.isDoSpirit()) dataStore.queryServerSpiritState(); + // if (dataStore.isDoSpirit()) dataStore.queryServerSpiritState(); + StartSpiritThread thread = new StartSpiritThread(dataStore); + thread.start(); // Fire comm event to signal state changed fireCommunicationsEvent(CommunicationsEvent.AFTER_CONNECT); @@ -869,6 +886,7 @@ boolean cacheRemoteClasses = store.getBoolean(IUniversalDStoreConstants.RESID_PREF_CACHE_REMOTE_CLASSES); dataStore.setPreference(RemoteClassLoader.CACHING_PREFERENCE, cacheRemoteClasses ? "true" : "false"); //$NON-NLS-1$ //$NON-NLS-2$ + } else { #P org.eclipse.rse.subsystems.shells.dstore Index: src/org/eclipse/rse/internal/subsystems/shells/dstore/DStoreServiceCommandShell.java =================================================================== RCS file: /cvsroot/dsdp/org.eclipse.tm.rse/plugins/org.eclipse.rse.subsystems.shells.dstore/src/org/eclipse/rse/internal/subsystems/shells/dstore/DStoreServiceCommandShell.java,v retrieving revision 1.6 diff -u -r1.6 DStoreServiceCommandShell.java --- src/org/eclipse/rse/internal/subsystems/shells/dstore/DStoreServiceCommandShell.java 5 Jun 2007 11:03:57 -0000 1.6 +++ src/org/eclipse/rse/internal/subsystems/shells/dstore/DStoreServiceCommandShell.java 12 Sep 2007 19:06:27 -0000 @@ -13,12 +13,16 @@ * * Contributors: * {Name} (company) - description of contribution. + * David McKnight (IBM) - [202822] cleanup output datalements after use *******************************************************************************/ package org.eclipse.rse.internal.subsystems.shells.dstore; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.dstore.core.model.DataElement; +import org.eclipse.dstore.core.model.DataStore; +import org.eclipse.dstore.extra.DomainEvent; +import org.eclipse.dstore.extra.IDomainListener; import org.eclipse.rse.internal.services.dstore.shells.DStoreHostOutput; import org.eclipse.rse.internal.services.dstore.shells.DStoreHostShell; import org.eclipse.rse.internal.services.dstore.shells.DStoreShellOutputReader; @@ -32,10 +36,79 @@ import org.eclipse.rse.subsystems.shells.core.subsystems.IRemoteCmdSubSystem; import org.eclipse.rse.subsystems.shells.core.subsystems.IRemoteOutput; import org.eclipse.rse.subsystems.shells.core.subsystems.servicesubsystem.ServiceCommandShell; +import org.eclipse.swt.widgets.Shell; public class DStoreServiceCommandShell extends ServiceCommandShell { + private class CleanUpSpirited extends Thread implements IDomainListener + { + private DataElement _status; + private DataStore _ds; + private String _name; + private boolean _done = false; + + public CleanUpSpirited(DataElement status, String name) + { + _status = status; + _ds = status.getDataStore(); + _ds.getDomainNotifier().addDomainListener(this); + _name = name; + } + + public void domainChanged(DomainEvent e) + { + deleteElements(); + } + + public void run() + { + while (!_done) + { + try + { + Thread.sleep(10000); + } + catch (Exception e) + { + } + deleteElements(); + } + } + + private void deleteElements() + { + if (_status.getNestedSize() > 0) + { + //synchronized (_status) + { + int ssize = _status.getNestedSize(); + if (_status.get(ssize - 1).isSpirit()) + { + System.out.println("deleting for "+ _name); + // delete + _ds.deleteObjects(_status); + _ds.refresh(_status); + + _ds.getDomainNotifier().removeDomainListener(this); + _done = true; + } + } + } + } + public Shell getShell() { + // TODO Auto-generated method stub + return null; + } + + public boolean listeningTo(DomainEvent e) { + if (e.getParent() == _status) + return true; + return false; + } + + } + public DStoreServiceCommandShell(IRemoteCmdSubSystem cmdSS, IHostShell hostShell) { super(cmdSS, hostShell); @@ -158,4 +231,40 @@ return activeShell; } + public void removeOutput() + { + DStoreHostShell shell = (DStoreHostShell)getHostShell(); + DataElement status = shell.getStatus(); + DataStore ds = status.getDataStore(); + + int ssize = status.getNestedSize(); + if (status.get(ssize - 1).isSpirit() || !ds.isDoSpirit()) + { + // objects can be deleted directly at this point since there will be no more updates from the server + ds.deleteObjects(status); + ds.refresh(status); + } + else + { + // cleanup later + // objects need to be deleted later since the server will still be sending spirited update + // if we don't defer this, then the deleted elements would get recreated when the spirits are updated + CleanUpSpirited cleanUp = new CleanUpSpirited(status, getId()); + cleanUp.start(); + } + + + // cleanup on host should be taking care of that + // ds.setObject(_commandElement); + + synchronized(_output) + { + _output.clear(); + } + + // noDE = ds.getHashMap().size(); + // System.out.println("DataElements:"+noDE); + //ds.printTree("2>", ds.getLogRoot()); + } + } #P org.eclipse.rse.subsystems.shells.core Index: src/org/eclipse/rse/subsystems/shells/core/model/RemoteCommandShell.java =================================================================== RCS file: /cvsroot/dsdp/org.eclipse.tm.rse/plugins/org.eclipse.rse.subsystems.shells.core/src/org/eclipse/rse/subsystems/shells/core/model/RemoteCommandShell.java,v retrieving revision 1.8 diff -u -r1.8 RemoteCommandShell.java --- src/org/eclipse/rse/subsystems/shells/core/model/RemoteCommandShell.java 14 May 2007 13:03:39 -0000 1.8 +++ src/org/eclipse/rse/subsystems/shells/core/model/RemoteCommandShell.java 12 Sep 2007 19:06:28 -0000 @@ -127,7 +127,12 @@ public Object[] listOutput() { - return _output.toArray(); + Object[] array = new Object[_output.size()]; + synchronized (_output) + { + _output.toArray(array); + } + return array; } public int getIndexOf(Object output)