Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/org.eclipse.osee.framework.ui.workspacebundleloader')
-rw-r--r--plugins/org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/SafeWorkspaceTracker.java67
-rw-r--r--plugins/org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/WorkspaceBundleLoadCoordinator.java333
-rw-r--r--plugins/org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/internal/ManagedFolderArea.java113
3 files changed, 258 insertions, 255 deletions
diff --git a/plugins/org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/SafeWorkspaceTracker.java b/plugins/org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/SafeWorkspaceTracker.java
index 9085c672269..d966ce83fab 100644
--- a/plugins/org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/SafeWorkspaceTracker.java
+++ b/plugins/org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/SafeWorkspaceTracker.java
@@ -13,22 +13,16 @@ package org.eclipse.osee.framework.ui.workspacebundleloader;
import java.io.File;
import java.net.URL;
import java.util.logging.Level;
+
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.SubMonitor;
-import org.eclipse.core.runtime.jobs.IJobChangeEvent;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.core.runtime.jobs.JobChangeAdapter;
import org.eclipse.osee.framework.core.operation.AbstractOperation;
-import org.eclipse.osee.framework.core.operation.IOperation;
-import org.eclipse.osee.framework.core.operation.Operations;
import org.eclipse.osee.framework.logging.OseeLog;
import org.eclipse.osee.framework.plugin.core.util.Jobs;
import org.eclipse.osee.framework.plugin.core.util.OseeData;
import org.eclipse.osee.framework.ui.plugin.workspace.SafeWorkspaceAccess;
import org.eclipse.osee.framework.ui.workspacebundleloader.internal.Activator;
-import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchListener;
import org.eclipse.ui.PlatformUI;
@@ -132,9 +126,8 @@ public class SafeWorkspaceTracker extends ServiceTracker implements IJarChangeLi
}
}
}
- SubMonitor master = SubMonitor.convert(monitor, 100);
- bundleCoordinator.updateBundles(master.newChild(10));
- bundleCoordinator.installLatestBundles(master.newChild(90));
+ bundleCoordinator.updateBundles(monitor);
+ bundleCoordinator.installLatestBundles(monitor);
}
@Override
@@ -144,62 +137,16 @@ public class SafeWorkspaceTracker extends ServiceTracker implements IJarChangeLi
@Override
public boolean preShutdown(IWorkbench workbench, boolean forced) {
- JobComplete jobComplete = new JobComplete();
- IOperation operation = new PrecompileShutdown("Closing Precompiled Libraries", Activator.BUNDLE_ID);
- Operations.executeAsJob(operation, false, Job.INTERACTIVE, jobComplete);
- for (int i = 0; i < 100 && !jobComplete.isDone(); i++) {//wait up to 10 seconds or until job completion
- yieldDisplay100ms();
- }
- return true;
- }
-
- private static class JobComplete extends JobChangeAdapter {
- private volatile boolean done = false;
-
- public boolean isDone() {
- return done;
- }
-
- @Override
- public void done(IJobChangeEvent event) {
- done = true;
- }
- }
-
- private class PrecompileShutdown extends AbstractOperation {
- public PrecompileShutdown(String operationName, String pluginId) {
- super(operationName, pluginId);
- }
-
- @Override
- protected void doWork(IProgressMonitor monitor) throws Exception {
+ try{
bundleCoordinator.uninstallBundles();
+ } catch (Throwable th){
+ th.printStackTrace();
}
+ return true;
}
@Override
public void postShutdown(IWorkbench workbench) {
}
- /**
- * This method gives UI updates that happen from bundle unloading to happen before the workbench shuts down, view
- * shutdown and extension point registry based UI updates. If we don't do this we get unexpected errors in logView
- * and other places.
- */
- private void yieldDisplay100ms() {
- while (Display.getCurrent().readAndDispatch()) {
- }
- try {
- Thread.sleep(50);
- } catch (InterruptedException e) {
- }
- while (Display.getCurrent().readAndDispatch()) {
- }
- try {
- Thread.sleep(50);
- } catch (InterruptedException e) {
- }
- while (Display.getCurrent().readAndDispatch()) {
- }
- }
}
diff --git a/plugins/org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/WorkspaceBundleLoadCoordinator.java b/plugins/org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/WorkspaceBundleLoadCoordinator.java
index dff772331d3..2143c7cd41f 100644
--- a/plugins/org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/WorkspaceBundleLoadCoordinator.java
+++ b/plugins/org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/WorkspaceBundleLoadCoordinator.java
@@ -20,7 +20,6 @@ import java.io.OutputStreamWriter;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.net.MalformedURLException;
-import java.net.URISyntaxException;
import java.net.URL;
import java.nio.channels.FileChannel;
import java.util.ArrayList;
@@ -38,13 +37,13 @@ import org.eclipse.core.runtime.IExtensionPoint;
import org.eclipse.core.runtime.IExtensionRegistry;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.SubMonitor;
import org.eclipse.osee.framework.core.operation.AbstractOperation;
+import org.eclipse.osee.framework.core.operation.Operations;
import org.eclipse.osee.framework.jdk.core.util.Lib;
import org.eclipse.osee.framework.logging.OseeLog;
-import org.eclipse.osee.framework.plugin.core.util.Jobs;
import org.eclipse.osee.framework.plugin.core.util.OseeData;
import org.eclipse.osee.framework.ui.workspacebundleloader.internal.Activator;
+import org.eclipse.osee.framework.ui.workspacebundleloader.internal.ManagedFolderArea;
import org.eclipse.ui.IMemento;
import org.eclipse.ui.IPerspectiveDescriptor;
import org.eclipse.ui.IViewPart;
@@ -73,56 +72,50 @@ public class WorkspaceBundleLoadCoordinator {
private static final String TAG_PERSPECTIVE = "perspective";
private static final String TAG_OTE_PRECOMPILED = "OTEPrecompiled";
private static final String OTE_MEMENTO = "OTEMemento";
- private File temporaryBundleLocationFolder;
+
+ private ManagedFolderArea managedFolderArea;
private Set<String> bundlesToCheck;
private BundleCollection managedArea = new BundleCollection();
private FrameworkWiring wiring;
public WorkspaceBundleLoadCoordinator(File temporaryBundleLocationFolder) {
bundlesToCheck = new HashSet<String>();
- this.temporaryBundleLocationFolder = temporaryBundleLocationFolder;
- if(!temporaryBundleLocationFolder.exists()){
- if(!temporaryBundleLocationFolder.mkdirs()){
- this.temporaryBundleLocationFolder = makeTempFolder();
- }
- } else if(temporaryBundleLocationFolder.exists() && !temporaryBundleLocationFolder.isDirectory()){
- this.temporaryBundleLocationFolder = makeTempFolder();
- } else if(temporaryBundleLocationFolder.exists()){
- cleanOutDirectory();
- }
-
- Bundle bundle = FrameworkUtil.getBundle(getClass());
- for(Bundle findit:bundle.getBundleContext().getBundles()){
- wiring = findit.adapt(FrameworkWiring.class);
- if(wiring != null){
- break;
- }
- }
+ this.managedFolderArea = new ManagedFolderArea(temporaryBundleLocationFolder);
+ managedFolderArea.initialize();
+ this.wiring = getFrameworkWiring();
Thread th = new Thread(new Runnable() {
@Override
public void run() {
int lastSize = 0;
+ boolean extraWait = false;
while(true){
try {
- Thread.sleep(5000);
+ if(extraWait){
+ Thread.sleep(15000);
+ extraWait = false;
+ } else {
+ Thread.sleep(5000);
+ }
} catch (InterruptedException e) {
}
if(lastSize == bundlesToCheck.size()){
if(lastSize != 0){
if(bundlesToCheck.size() > 0){
lastSize = 0;
- Jobs.runInJob(new RefreshWorkspaceBundles(), false);
+ Operations.executeAsJob(new RefreshWorkspaceBundles(), false);
try {
- Thread.sleep(1000*30); //give time to load so we don't get called twice
+ Thread.sleep(1000*60); //give time to load so we don't get called twice
} catch (InterruptedException e) {
}
}
}
} else {
+ if(bundlesToCheck.size() - lastSize > 5){
+ extraWait = true;//big import allow for extra time for file imports
+ }
lastSize = bundlesToCheck.size();
}
-
}
}
});
@@ -131,6 +124,20 @@ public class WorkspaceBundleLoadCoordinator {
th.start();
}
+ private FrameworkWiring getFrameworkWiring() {
+ FrameworkWiring frameworkWiring = null;
+ Bundle bundle = FrameworkUtil.getBundle(getClass());
+ for(Bundle findit:bundle.getBundleContext().getBundles()){
+ frameworkWiring = findit.adapt(FrameworkWiring.class);
+ if(frameworkWiring != null){
+ break;
+ }
+ }
+ return frameworkWiring;
+ }
+
+
+
private class RefreshWorkspaceBundles extends AbstractOperation {
public RefreshWorkspaceBundles() {
@@ -139,43 +146,13 @@ public class WorkspaceBundleLoadCoordinator {
@Override
protected void doWork(IProgressMonitor monitor) throws Exception {
- SubMonitor master = SubMonitor.convert(monitor, 100);
- updateBundles(master.newChild(50));
- installLatestBundles(master.newChild(50));
+ updateBundles(monitor);
+ installLatestBundles(monitor);
}
}
-
- /**
- * should be a flat list of folders with the symbolic name of the bundle and then a version for each jar underneath each folder.
- */
- private void cleanOutDirectory() {
- File[] symbolicNameFolders = this.temporaryBundleLocationFolder.listFiles();
- for(File folder:symbolicNameFolders){
- if(folder.isDirectory()){
- for(File file :folder.listFiles()){
- file.delete();
- }
- folder.delete();
- }
- }
- }
- private File makeTempFolder(){
- File folder = new File(System.getProperty("java.io.tmpdir"));
- File oteFolder = new File(folder, "otebundleload");
- if(!oteFolder.exists()){
- oteFolder.mkdirs();
- }
- return oteFolder;
- }
-
- File getFolder(){
- return temporaryBundleLocationFolder;
- }
-
-
- private void saveAndCloseViews(){
+ public void saveAndCloseViews(){
PlatformUI.getWorkbench().getDisplay().syncExec(new Runnable(){
@Override
public void run() {
@@ -193,6 +170,8 @@ public class WorkspaceBundleLoadCoordinator {
});
}
+
+
public synchronized void uninstallBundles(){
saveAndCloseViews();
for(BundleInfoLite info:managedArea.getInstalledBundles()){
@@ -203,8 +182,14 @@ public class WorkspaceBundleLoadCoordinator {
}
}
if(wiring != null){
- wiring.refreshBundles(null);
+ wiring.refreshBundles(null);
}
+ IWorkbench workbench = PlatformUI.getWorkbench();
+ if (workbench != null && workbench.getActiveWorkbenchWindow() != null){
+ IViewRegistry registry = workbench.getViewRegistry();
+ forceViewRegistryReload(workbench, registry);
+ }
+ waitForViewsToBeRegistered(null);
}
@@ -264,7 +249,10 @@ public class WorkspaceBundleLoadCoordinator {
//Ignore, we failed during view save
}
}
- page.hideView(viewReference);
+ try{
+ page.hideView(viewReference);
+ } catch (Throwable th){
+ }
}
}
}
@@ -335,9 +323,8 @@ public class WorkspaceBundleLoadCoordinator {
out = new FileOutputStream(new File(destination, source.getName())).getChannel();
} else {
if (destination.exists()) {
- destination.delete(); // to work around some file permission
+ destination.delete(); // to work around some file permission problems
}
- // problems
out = new FileOutputStream(destination).getChannel();
}
try {
@@ -354,50 +341,7 @@ public class WorkspaceBundleLoadCoordinator {
}
}
- private List<BundleInfoLite> copyDeltasToManagedFolder(List<BundleInfoLite> copies) {
- List<BundleInfoLite> lockedFiles = new ArrayList<BundleInfoLite>();
- for(BundleInfoLite info: copies){
- File folder = new File(temporaryBundleLocationFolder, info.getSymbolicName());
- folder.mkdirs();
- File newFile = new File(folder, info.getVersion() + ".jar");
- if(newFile.exists()){
- newFile.delete();
- }
- FileChannel out = null;
- FileChannel in = null;
- try {
- out = new FileOutputStream(newFile).getChannel();
- String path = info.getSystemLocation().toURI().getPath();
- in = new FileInputStream(new File(path)).getChannel();
-
- long position = 0;
- long size = in.size();
- while (position < size) {
- position += in.transferTo(position, size, out);
- }
- BundleInfoLite newBundle = new BundleInfoLite(newFile.toURI().toURL());
- managedArea.add(newBundle);
- } catch (IOException e) {
- OseeLog.log(WorkspaceBundleLoadCoordinator.class, Level.WARNING, e);
- } catch (URISyntaxException e) {
- OseeLog.log(WorkspaceBundleLoadCoordinator.class, Level.WARNING, e);
- } finally {
- try {
- if(in != null){
- in.close();
- }
- } catch (IOException e) {
- }
- try {
- if(out != null){
- out.close();
- }
- } catch (IOException e) {
- }
- }
- }
- return lockedFiles;
- }
+
private List<BundleInfoLite> determineDeltasBetweenBundlesToLoad() {
List<BundleInfoLite> bundlesToOperateOn = new ArrayList<BundleInfoLite>();
@@ -444,55 +388,56 @@ public class WorkspaceBundleLoadCoordinator {
this.bundlesToCheck.add(urlString);
}
- public synchronized void updateBundles(SubMonitor subMonitor){
- final SubMonitor master = SubMonitor.convert(subMonitor, 100);
+ public synchronized void updateBundles(IProgressMonitor monitor){
List<BundleInfoLite> deltas = determineDeltasBetweenBundlesToLoad();
- master.worked(30);
- List<BundleInfoLite> lockedFiles = copyDeltasToManagedFolder(deltas);
- master.worked(65);
- for(BundleInfoLite info: lockedFiles){
- addBundleToCheck(info.getSystemLocation().toString());
- OseeLog.log(WorkspaceBundleLoadCoordinator.class, Level.WARNING, String.format("Unable to copy and load locked file: [%s]", info.getSystemLocation().toString()));
+ monitor.worked(Operations.calculateWork(Operations.TASK_WORK_RESOLUTION, 0.15));
+ List<BundleInfoLite> bundlesToAdd = managedFolderArea.copyDeltasToManagedFolder(deltas);
+ monitor.worked(Operations.calculateWork(Operations.TASK_WORK_RESOLUTION, 0.30));
+ for(BundleInfoLite bundle:bundlesToAdd){
+ managedArea.add(bundle);
}
- master.worked(5);
+ monitor.worked(Operations.calculateWork(Operations.TASK_WORK_RESOLUTION, 0.05));
}
- public synchronized void installLatestBundles(SubMonitor subMonitor){
- final SubMonitor master = SubMonitor.convert(subMonitor, 100);
+ public synchronized void installLatestBundles(final IProgressMonitor subMonitor){
final List<BundleInfoLite> bundles = managedArea.getLatestBundles();
Collection<Bundle> bundlesToRefresh = new ArrayList<Bundle>();
+ List<BundleInfoLite> uninstallListAll = new ArrayList<BundleInfoLite>();
for(BundleInfoLite info:bundles){
if(!info.isInstalled()){
- try {
- List<BundleInfoLite> uninstallList = managedArea.getByBundleName(info.getSymbolicName());
- if(uninstallList.size() > 1){
- for(BundleInfoLite toUninstall:uninstallList){
- if(toUninstall.isInstalled()){
- closeUpdatedViews(uninstallList);
- Bundle bundle = toUninstall.uninstall();
- bundlesToRefresh.add(bundle);
- }
- }
- }
-
- } catch (BundleException e) {
- OseeLog.log(WorkspaceBundleLoadCoordinator.class, Level.WARNING, e);
- }
+ List<BundleInfoLite> uninstallList = managedArea.getByBundleName(info.getSymbolicName());
+ if(uninstallList.size() > 1){
+ for(BundleInfoLite toUninstall:uninstallList){
+ if(toUninstall.isInstalled()){
+ uninstallListAll.add(toUninstall);
+ }
+ }
+ }
}
}
+ closeUpdatedViews(uninstallListAll);
+ for(BundleInfoLite toUninstall:uninstallListAll){
+ try {
+ Bundle bundle = toUninstall.uninstall();
+ bundlesToRefresh.add(bundle);
+ } catch (BundleException e) {
+ OseeLog.log(WorkspaceBundleLoadCoordinator.class, Level.WARNING, e);
+ }
+ }
+
if(wiring != null && bundlesToRefresh.size() > 0){
final Object waitForLoad = new Object();
wiring.refreshBundles(bundlesToRefresh, new FrameworkListener(){
@Override
public void frameworkEvent(FrameworkEvent event) {
if(FrameworkEvent.PACKAGES_REFRESHED == event.getType()){
- startBundles(bundles, master.newChild(80));
- waitForViewsToBeRegistered(master.newChild(15));
+ startBundles(bundles, subMonitor);
+ waitForViewsToBeRegistered(subMonitor);
PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable(){
@Override
public void run() {
- restoreStateFromMemento(master.newChild(5));
+ restoreStateFromMemento(subMonitor);
}
});
synchronized (waitForLoad) {
@@ -508,23 +453,23 @@ public class WorkspaceBundleLoadCoordinator {
}
}
} else {
- startBundles(bundles, master.newChild(80));
- waitForViewsToBeRegistered(master.newChild(15));
- final SubMonitor restore = master.newChild(5);
+ startBundles(bundles, subMonitor);
+ waitForViewsToBeRegistered(subMonitor);
PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable(){
@Override
public void run() {
- restoreStateFromMemento(restore);
+ restoreStateFromMemento(subMonitor);
}
});
}
}
- private boolean waitForViewsToBeRegistered(SubMonitor subMonitor){
- SubMonitor monitor = SubMonitor.convert(subMonitor, 10);
- monitor.setTaskName("Waiting for views to register.");
+ private boolean waitForViewsToBeRegistered(IProgressMonitor monitor){
+ if(monitor != null)
+ monitor.setTaskName("Waiting for views to register.");
for(int i = 0; i < 10; i++){
- monitor.worked(1);
+ if(monitor != null)
+ monitor.worked(1);
CheckViewsRegistered check = new CheckViewsRegistered();
PlatformUI.getWorkbench().getDisplay().syncExec(check);
if(check.isLoaded()){
@@ -568,57 +513,54 @@ public class WorkspaceBundleLoadCoordinator {
}
- @SuppressWarnings({ "rawtypes" })
- private void forceViewRegistryReload(IWorkbench workbench, IViewRegistry registry){
- try{
-// private Map<String, IViewDescriptor> descriptors = new HashMap<String, IViewDescriptor>();
-// private List<IStickyViewDescriptor> stickyDescriptors = new ArrayList<IStickyViewDescriptor>();
-// private HashMap<String, ViewCategory> categories = new HashMap<String, ViewCategory>();
-
- Field field1 = registry.getClass().getDeclaredField("descriptors");
- Field field2 = registry.getClass().getDeclaredField("stickyDescriptors");
- Field field3 = registry.getClass().getDeclaredField("categories");
-
- field1.setAccessible(true);
- field2.setAccessible(true);
- field3.setAccessible(true);
-
- ((Map)field1.get(registry)).clear();
- ((List)field2.get(registry)).clear();
- ((Map)field3.get(registry)).clear();
-
- field1.setAccessible(false);
- field2.setAccessible(false);
- field3.setAccessible(false);
-
- Method[] methods = registry.getClass().getDeclaredMethods();
- Method method = null;
- for(Method m:methods){
- if(m.getName().equals("postConstruct")){
- method = m;
- break;
- }
- }
- if(method != null){
- boolean access = method.isAccessible();
- method.setAccessible(true);
- try{
- method.invoke(registry);
- } finally {
- method.setAccessible(access);
- }
- }
- } catch (Throwable th){
- OseeLog.log(this.getClass(), Level.SEVERE, th);
- }
- }
-
public boolean isLoaded(){
return isLoaded;
}
}
+
+ @SuppressWarnings({ "rawtypes" })
+ private void forceViewRegistryReload(IWorkbench workbench, IViewRegistry registry){
+ try{
+ Field field1 = registry.getClass().getDeclaredField("descriptors");
+ Field field2 = registry.getClass().getDeclaredField("stickyDescriptors");
+ Field field3 = registry.getClass().getDeclaredField("categories");
+
+ field1.setAccessible(true);
+ field2.setAccessible(true);
+ field3.setAccessible(true);
+
+ ((Map)field1.get(registry)).clear();
+ ((List)field2.get(registry)).clear();
+ ((Map)field3.get(registry)).clear();
+
+ field1.setAccessible(false);
+ field2.setAccessible(false);
+ field3.setAccessible(false);
+
+ Method[] methods = registry.getClass().getDeclaredMethods();
+ Method method = null;
+ for(Method m:methods){
+ if(m.getName().equals("postConstruct")){
+ method = m;
+ break;
+ }
+ }
+ if(method != null){
+ boolean access = method.isAccessible();
+ method.setAccessible(true);
+ try{
+ method.invoke(registry);
+ } finally {
+ method.setAccessible(access);
+ }
+ }
+ } catch (Throwable th){
+ OseeLog.log(this.getClass(), Level.SEVERE, th);
+ }
+ }
+
- private void restoreStateFromMemento(SubMonitor restore) {
+ private void restoreStateFromMemento(IProgressMonitor restore) {
File mementoFile = OseeData.getFile(OTE_MEMENTO);
if(mementoFile.exists()){
try {
@@ -669,28 +611,29 @@ public class WorkspaceBundleLoadCoordinator {
}
}
- private void startBundles(Collection<BundleInfoLite> bundles, SubMonitor subMonitor){
- final SubMonitor master = SubMonitor.convert(subMonitor, bundles.size() * 3);
+ private void startBundles(Collection<BundleInfoLite> bundles, IProgressMonitor subMonitor){
BundleContext context = FrameworkUtil.getBundle(this.getClass()).getBundleContext();
- master.setTaskName("Installing Bundles");
+ subMonitor.setTaskName("Installing Bundles");
+ double workPercentage = 0.50 / (bundles.size()*2);
+ int workAmount = Operations.calculateWork(Operations.TASK_WORK_RESOLUTION, workPercentage);
for(BundleInfoLite info:bundles){
if(!info.isInstalled()){
try {
info.install(context);
- master.worked(2);
} catch (BundleException e) {
} catch (IOException e) {
}
}
+ subMonitor.worked(workAmount*2);
}
for(BundleInfoLite info:bundles){
if(!info.isStarted()){
try {
info.start(context);
- master.worked(1);
} catch (BundleException e) {
}
}
+ subMonitor.worked(workAmount);
}
}
diff --git a/plugins/org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/internal/ManagedFolderArea.java b/plugins/org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/internal/ManagedFolderArea.java
new file mode 100644
index 00000000000..cfa3fee6360
--- /dev/null
+++ b/plugins/org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/internal/ManagedFolderArea.java
@@ -0,0 +1,113 @@
+package org.eclipse.osee.framework.ui.workspacebundleloader.internal;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.net.URISyntaxException;
+import java.nio.channels.FileChannel;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.logging.Level;
+
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.workspacebundleloader.BundleInfoLite;
+import org.eclipse.osee.framework.ui.workspacebundleloader.WorkspaceBundleLoadCoordinator;
+
+public class ManagedFolderArea {
+
+ private File bundleLocationFolder;
+
+ public ManagedFolderArea(File temporaryBundleLocationFolder) {
+ this.bundleLocationFolder = temporaryBundleLocationFolder;
+ }
+
+ public void initialize(){
+ bundleLocationFolder = setupTemporaryBundle(this.bundleLocationFolder);
+ }
+
+ private File setupTemporaryBundle(final File folder){
+ File folderToReturn = folder;
+ if(!folderToReturn.exists()){
+ if(!folderToReturn.mkdirs()){
+ folderToReturn = makeTempFolder();
+ }
+ } else if(folderToReturn.exists() && !folderToReturn.isDirectory()){
+ folderToReturn = makeTempFolder();
+ } else if(folderToReturn.exists()){
+ cleanOutDirectory(folderToReturn);
+ }
+ return folderToReturn;
+ }
+
+ /**
+ * should be a flat list of folders with the symbolic name of the bundle and then a version for each jar underneath each folder.
+ * @param folderToReturn
+ */
+ private void cleanOutDirectory(File folderRoot) {
+ File[] symbolicNameFolders = folderRoot.listFiles();
+ for(File folder:symbolicNameFolders){
+ if(folder.isDirectory()){
+ for(File file :folder.listFiles()){
+ file.delete();
+ }
+ folder.delete();
+ }
+ }
+ }
+
+ private File makeTempFolder(){
+ File folder = new File(System.getProperty("java.io.tmpdir"));
+ File oteFolder = new File(folder, "otebundleload");
+ if(!oteFolder.exists()){
+ oteFolder.mkdirs();
+ }
+ return oteFolder;
+ }
+
+ public List<BundleInfoLite> copyDeltasToManagedFolder(List<BundleInfoLite> copies) {
+ List<BundleInfoLite> bundlesAdded = new ArrayList<BundleInfoLite>();
+ for(BundleInfoLite info: copies){
+ File folder = new File(bundleLocationFolder, info.getSymbolicName());
+ folder.mkdirs();
+ File newFile = new File(folder, info.getVersion() + ".jar");
+ if(newFile.exists()){
+ newFile.delete();
+ }
+ FileChannel out = null;
+ FileChannel in = null;
+ try {
+ out = new FileOutputStream(newFile).getChannel();
+ String path = info.getSystemLocation().toURI().getPath();
+ in = new FileInputStream(new File(path)).getChannel();
+
+ long position = 0;
+ long size = in.size();
+ while (position < size) {
+ position += in.transferTo(position, size, out);
+ }
+ BundleInfoLite newBundle = new BundleInfoLite(newFile.toURI().toURL());
+ bundlesAdded.add(newBundle);
+ } catch (IOException e) {
+ OseeLog.log(WorkspaceBundleLoadCoordinator.class, Level.WARNING, e);
+ } catch (URISyntaxException e) {
+ OseeLog.log(WorkspaceBundleLoadCoordinator.class, Level.WARNING, e);
+ } finally {
+ try {
+ if(in != null){
+ in.close();
+ }
+ } catch (IOException e) {
+ }
+ try {
+ if(out != null){
+ out.close();
+ }
+ } catch (IOException e) {
+ }
+ }
+ }
+ return bundlesAdded;
+ }
+
+}

Back to the top