Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
[udig-devel] RE: Loading a Udig project programatically (Mario Nu?ez Jimenez)

Hi Mario,

Here is my code: I open an existing project ,or create one if not found.
Then I check if new layers exists or are (un)authorized for a particular
user. So the user's layers are customisable by an administrator. List of
authorized layers comes from a properties files for test purpose.

the method 'LoadProject.createProject();' is called into
ApplicationWorkbenchWindowAdvisor.postWindowOpen()
the method 'LoadProject.UpdateProject();' is called into
MapOpenInterceptor.run(Map map)

I hope it helps.

Regards,

Frederick.
***************************
public class LoadProject {

	private static boolean newproject=false; // when creating a new
project, 'UpdateProject' is also called at map opening. this key avoid
this. ( bad programming I know )
	private LoadProject(){}
	
	public static void UpdateProject() { 
		
		boolean projectChanged=false;
		if(newproject)
			return;
		
		try {
		
			ProjectRegistry projectRegistry =
ProjectPlugin.getPlugin().getProjectRegistry();
			// get project
			Project project
=projectRegistry.getCurrentProject();
			project.setName("TranslogisticProject");
			// get map
			Map map1 = (Map)
project.getElements(Map.class).get(0);
			IProgressMonitor monitor = new
NullProgressMonitor();
				
			 List<IService> services  =
sodServices(sodUrlFactory());
			// Add Layers
			List<? extends IGeoResource>
localresources=null;
			
			// Create list of authorized layers
			String
autString=TelticProperties.getProp("AUTHORIZEDLAYERS").toLowerCase();
			
			for (Iterator iterator = services.iterator();
iterator.hasNext();) {

				IService service = (IService)
iterator.next();

					localresources =
service.resources(monitor);

					for (Iterator iterator2 =
localresources.iterator(); iterator2	.hasNext();) {
						IGeoResource geoResource
= (IGeoResource) iterator2	.next();
						
						// Get layer name:
suppress prefix like sod: or sod_
						String
layerName=getLayerName(geoResource,monitor);
						
						// Search into
authorized list if layer exist
						if(autString.indexOf(
layerName )<0)
							// not
authorized -> suppress from list
	
iterator2.remove();
					}
// 					Add only inexisting layers
					for (Iterator iterator2 =
localresources.iterator(); iterator2	.hasNext();) {
						IGeoResource geoResource
= (IGeoResource) iterator2	.next();
						String rlname =
getLayerName(geoResource, monitor);
						List<Layer> layers =
map1.getLayersInternal();
						for (Layer layer :
layers) {
							String
layerName=getLayerName(layer.getGeoResource(), monitor);

							if
(layerName.indexOf(rlname) >= 0){
								//
already present into list -> suppress from list
	
iterator2.remove();
								break;
							}
						}
					}
					// Add layers
					if(localresources.size()>0){
 					 AddLayersCommand alCommand =
new AddLayersCommand( localresources, 0);
 
map1.sendCommandASync(alCommand);
					}

			}
			
			// Check if there is layers to suppress
			
			List<Layer> layers = map1.getLayersInternal();
			for (Layer layer : layers) {
				
				if
(autString.indexOf(getLayerName(layer.getGeoResource(), monitor)) < 0) {
					// delete layers
					DeleteLayerCommand delCommand =
new DeleteLayerCommand(layer);
	
map1.sendCommandASync(delCommand);
				}
			}			
            // open project
        	OpenProjectElementCommand command=new
OpenProjectElementCommand(map1);
            project.sendASync(command);
            
		} catch (MalformedURLException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public static void createProject() {
		try {
		
			ProjectRegistry projectRegistry =
ProjectPlugin.getPlugin().getProjectRegistry();
			ProjectFactory projectFactory =
ProjectFactory.eINSTANCE;
			// create project
			Project project
=projectRegistry.getCurrentProject();

			// create map
			if( project.getElements().size()>0)
				// project already created : update
				return;
			Map map1 =
projectFactory.createMap(project,"Translogistic",new
ArrayList<Layer>());
			IProgressMonitor monitor = new
NullProgressMonitor();
			
			List<? extends IGeoResource>
localresources=null;
			String
autString=TelticProperties.getProp("AUTHORIZEDLAYERS");

			List<IService> services  =
sodServices(sodUrlFactory());
			
			
			
			for (Iterator iterator = services.iterator();
iterator.hasNext();) {
				
				IService service = (IService)
iterator.next();
				System.out.println(("open
service:"+service.getInfo(monitor).getTitle()));
				
					localresources =
service.resources(monitor);

					for (Iterator iterator2 =
localresources.iterator(); iterator2	.hasNext();) {
						IGeoResource geoResource
= (IGeoResource) iterator2	.next();
						String nm =
geoResource.getInfo(monitor).getName();
						
						// Get layer name:
suppress prefix like sod: or sod_
						String
layerName=getLayerName(geoResource,monitor);
						
						// Search into
authorized list if layer exist
	
if(autString.toLowerCase().indexOf( layerName )<0)
							// not
authorized -> suppress from list
	
iterator2.remove();
					}
					// Add layers
					 AddLayersCommand alCommand =
new AddLayersCommand( localresources, 0);
			         map1.executeSyncWithoutUndo(alCommand);
			         for (Iterator iterator2 =
localresources.iterator(); iterator2
							.hasNext();) {
						IGeoResource lrsrc =
(IGeoResource) iterator2.next();
						System.out.println("Add
layer:"+lrsrc.getInfo(monitor).getName());
						
					}
			         
			}
			// open project
		
	    	OpenProjectElementCommand command=new
OpenProjectElementCommand(map1);// ???  NOK with wms , needed with
shapefile!
	        project.sendASync(command);

            newproject=true;
		} catch (MalformedURLException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	private static List<IService> sodServices(List<URL> urls) {

		IServiceFactory serviceFactory =
CatalogPlugin.getDefault()
				.getServiceFactory();
		List<IService> services = new LinkedList<IService>();
		List<IService> servicesShape = new
LinkedList<IService>();

		if (urls.size() <= 0)
			return services;

		for (URL url : urls) {
	
if(url.getFile().toLowerCase().indexOf(".shp")>0){
				// SHAPEFILE URL		
//				System.out.println("create service
shape:"+serviceFactory.createService(url).get(1).getIdentifier());
 
servicesShape.add(serviceFactory.createService(url).get(0));
			}
			else
				// OTHER URL
			services=serviceFactory.createService(url);
			 
		}
		for (Iterator iterator = servicesShape.iterator();
iterator.hasNext();) {
			IService service = (IService) iterator.next();
			try {
				System.out.println("Service shape:
"+service.getIdentifier()+"/"+service.getInfo(new
NullProgressMonitor()).getTitle());
			} catch (IOException e) {
			}
			
		}
		services.addAll(servicesShape);
		for (Iterator iterator = services.iterator();
iterator.hasNext();) {
			IService service = (IService) iterator.next();
			try {
				System.out.println("Services:
"+service.getIdentifier()+"/"+service.getInfo(new
NullProgressMonitor()).getTitle());
			} catch (IOException e) {
			}
			
		}
		return services;
	}
	
	private static List<URL> sodUrlFactory() throws
MalformedURLException{
		
		/* WMS URLS */
		 List<URL> urls = new ArrayList<URL>();
		 urls.add(MapGraphicService.SERVICE_URL);
		 try {
			 urls.add(new
URL(TelticProperties.getProp("CARTOSERVER")));
		} catch (TlticException e) {}
			
		 
		 /* SHAPEFILE URLS */
		try {
		String path = TelticProperties.getProp("SHAPEFILEDIR");
			// get Shapefile list
			if (new File(path).exists()) {
				// String[] filenames = {
"sod_communes_bel_wgs84.shp",
				// "sod_eu_country_wgs84.shp" };
				SufixFilter shapefilesSufixFilter = new
SufixFilter(".shp");
				File[] shapefiles = new File(path)
	
.listFiles(shapefilesSufixFilter);

				for (int i = 0; i < shapefiles.length;
i++) {
					urls.add(shapefiles[i].toURL());
				}
			}
		} catch (TlticException e) {}
		 for (Iterator iterator = urls.iterator();
iterator.hasNext();) {
			URL url = (URL) iterator.next();
			System.out.println("URL="+url.toString());
		}
		return urls;
		
	}
	
	/*
	 * Get layer name: suppress prefix like sod: or sod_
	 */
	private static String getLayerName(IGeoResource geoResource,
IProgressMonitor monitor) throws TlticException, IOException{
		
		String
shapefilePrefix=TelticProperties.getProp("SHAPEFILEPREFIX").toLowerCase(
);
		String
wmsPrefix=TelticProperties.getProp("WMSPREFIX").toLowerCase();
		String
layerName=geoResource.getInfo(monitor).getName().toLowerCase();
		
	
		if ( layerName.startsWith(shapefilePrefix)){
			layerName=layerName.split(shapefilePrefix)[1];
		}
		if ( layerName.startsWith(wmsPrefix)){
			layerName=layerName.split(wmsPrefix)[1];
		}
		return layerName;
	}
	private static class SufixFilter implements FileFilter{
		String afn;
		SufixFilter(String afn) { this.afn = afn; }
		public boolean accept(File arg0) {
	
if(arg0.getName().toLowerCase().endsWith(this.afn.toLowerCase()))
				return true;
			return false;
		}
		
	}
	// OPEN MY OWN PROJECT ( FROM TEXT PROJECT FILE )
// ProjectRegistry registry =
ProjectPlugin.getPlugin().getProjectRegistry();
//	Project project;
//	String
prj=TelticProperties.getRootPath()+"\\Translogistic.product\\project.udi
g";
//	project = registry.getProject(prj);
//	project.getElements(IMap.class);
//	
}




Back to the top