Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
RE: [udig-devel] Reloading .umap files

Title: Message
Hi! Jesse,
 
OK, after much contorsion I have got something to work.
(I need to release a Beta version today so just as well!!)
 
When the user selects to open the download dialog, I check to see if they have any open maps. If thye do I put up a message that these need to be closed if that OK.
I then close them.
 
If the users selects any files to actually download I then store the URI's for the projects and maps loaded (I needs them for searching for the downlaoded files positions, and where to put them) and I unload the projects and maps as I go.
 
I can then download the maps and place them in the appropraite places, over-writting existing files.
 
The most complicated bit was working out how to fix the then broken Project Explorer tree.
Eventually I figured out:
 
            ProjectExplorer.getProjectExplorer().getViewer().refresh();
I have a question. If the user downloads a map file for a map they do not have already. I want to load it into the default project (placing the maop in the correct folder etc).
I eventually worked out a tortuous way of doing this. But there must be an easier way:
 
         URI projectURI = fproject.eResource().getURI();
         
         String sPath = projectURI.toString();
         int ind = sPath.lastIndexOf("\\");   
         String sBase = sPath.substring(0, ind);
         String sURIBase = sBase;
         if (sBase.startsWith("file://")) {
             sBase = sBase.substring(7);
         } else if (sBase.startsWith("file:/")) {
             sBase = sBase.substring(6);
         }
         
         String sFilePath = sBase+EcosensusPlugin.sFS+sDownloadFileName;         
         try {
          if (fetchFile(oConnectionData, sFilePath, fsFileName, fsType, fsDirectory)) {  // downloads the file to the default projects directory          
                    URI uri = URI.createURI(sURIBase+"\\"+fsFileNameClean); 
                                           
                    // This loads it into a non-existant project!! 
                    Resource mapResource = ProjectRegistryImpl.getProjectRegistry().eResource()
                            .getResourceSet().getResource(uri, true);
    
                    if (mapResource.getContents().get(0) instanceof Map) {                   
                        Map map = (Map) mapResource.getContents().get(0);
                        map.setName(fsMapName);

                        // not sure I need this but I got some odd behaviour once and it created a different umap file, so I paniced.
                        map.eResource().setURI(URI.createURI(sURIBase+"\\"+fsFileNameClean));                                   
 
                        // Actually set the map into the default project where I want it, not the non-existant one it has been put in.
                        map.setProjectInternal(fproject);
                        Resource resource = fproject.eResource();
                        Resource mapResource2 = resource.getResourceSet().createResource(uri);
                        mapResource2.getContents().add(0, map);
                        mapResource.setTrackingModification(true);
                        mapResource.setModified(true);
                        ProjectRegistryImpl.getProjectRegistry().getProject(projectURI);                     
                    }
          }
         } catch (IOException ioe) {
          ioe.printStackTrace();
         }
Bascially the above code works, but it feels like it is panic code, and not correct code.
Can you simplyfy how you load a map from a mapfile reference into a project.
 
Thanks
 
Michelle
-----Original Message-----
From: udig-devel-bounces@xxxxxxxxxxxxxxxxxxxxx [mailto:udig-devel-bounces@xxxxxxxxxxxxxxxxxxxxx] On Behalf Of Jesse Eichar
Sent: 11 May 2006 17:35
To: User-friendly Desktop Internet GIS
Subject: Re: [udig-devel] Reloading .umap files

So this is a little tricky.  What you need to do is call:

project.eResource().unload();

What this does is walk through all the children of project( and project) and turns them all into proxies so that when they are accessed again they are reloaded.  The problem is that the reloaded objects are new objects so if any objects retain references to the old projects, maps, layers, etc... they will be referencing the wrong objects.  What I suggest is that you close all editors to maps within that project before unloading the project, then unload the project...  I suppose there could be a problem though since the maps try to save the project when being closed,  seems like that would overwrite the changes.

Thinking....

The easy way for me is for you to change you program so that you have a central repository and get copies from the repository and run uDig on those copies instead of directly against the repository projects.  Especially since you are bound to have read/write conflicts if you are directly hacking the repository.  Might be a good plan for you anyhow.  So how it might work is you can close your maps, unload the project, get a new copy and then re-open you maps and project.

Otherwise I think I would have to put in make a change so that you can turn off autosaving is a preference that can be turned off.  But if I do that then when would things be saved?  I guess you would have to implement that yourself and manage all the read/write transactions to the repository anyhow.  So maybe the suggestion is the least amount of work for both of us...  

I'm open to suggestions.

Jesse

On 11-May-06, at 6:16 AM, M.S.Bachler wrote:

Hi!

As part of my use of uDig, people are sharing .umap files (now I have uniquely named them).

If a user downloads a .umap file it overwrite the local file fine.

Q 1) But how to I get uDig to reload the .umap file it is using in its project (eObject - structure etc), and redraw the map / Project View / Layer View etc to reflect any changes in the newly downloaded file?

Any pointers for this would be great as I have a feeling it will not be straight forward.

If the downloaded file does not exist, I want to import it into the current project.
Q 2) How would I do that?

Thanks

Michelle

_______________________________________________
User-friendly Desktop Internet GIS (uDig)


Back to the top