wrong leftover import
[udig:moovidas-udig-platform.git] / plugins / eu.udig.catalog.jgrass / src / eu / udig / catalog / jgrass / core / JGrassServiceExtension.java
1 /*
2  * JGrass - Free Open Source Java GIS http://www.jgrass.org 
3  * (C) HydroloGIS - www.hydrologis.com 
4  * (C) C.U.D.A.M. Universita' di Trento
5  *
6  * This program is free software: you can redistribute it and/or modify
7  * it under the terms of the GNU Lesser General Public License as published by
8  * the Free Software Foundation, either version 3 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public License
17  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
18  */
19 package eu.udig.catalog.jgrass.core;
20
21 import java.io.BufferedWriter;
22 import java.io.File;
23 import java.io.FileWriter;
24 import java.io.Serializable;
25 import java.net.URL;
26 import java.util.HashMap;
27 import java.util.Map;
28
29 import net.refractions.udig.catalog.IService;
30 import net.refractions.udig.catalog.ServiceExtension;
31 import net.refractions.udig.catalog.URLUtils;
32
33 import org.eclipse.swt.widgets.Display;
34 import org.eclipse.swt.widgets.Shell;
35 import org.eclipse.ui.PlatformUI;
36 import org.geotools.gce.grassraster.JGrassConstants;
37 import org.geotools.gce.grassraster.JGrassMapEnvironment;
38 import org.opengis.referencing.crs.CoordinateReferenceSystem;
39
40 import eu.udig.catalog.jgrass.JGrassPlugin;
41
42 /**
43  * <p>
44  * Creates a service extention for the JGrass database service.
45  * </p>
46  * 
47  * @author Andrea Antonello - www.hydrologis.com
48  * @since 1.1.0
49  */
50 public class JGrassServiceExtension implements ServiceExtension {
51
52     /**
53      * the jgrass service key, it is used to store the url to the jgrass location
54      */
55     public static final String KEY = "eu.udig.catalog.jgrass.urlKey"; //$NON-NLS-1$
56
57     public JGrassServiceExtension() {
58         super();
59     }
60
61     /**
62      * this method must check the url to determine if it points to a valid <b>jgrass location folder</b>.
63      * It must return <b>null</b> if the url is not intended for this service.
64      * 
65      * @param url the url points to the actual service itself. In this case to the jgrass location
66      *        folder
67      * @return a parameter map containing the necessary info or null if the url is not for this
68      *         service
69      */
70     public Map<String, Serializable> createParams( URL url ) {
71         Map<String, Serializable> params = null;
72         /*
73          * does the url represent a jgrass location folder?
74          */
75         try {
76             /*
77              * if the file is a file of extention *.jgrass and inside the location, than it was
78              * dragged. That is for now the JGrass d&d support.
79              */
80             File startFile = URLUtils.urlToFile(url);
81             if (startFile == null)
82                 return null;
83             String path = startFile.getAbsolutePath();
84             if (path.endsWith(".jgrass")) {
85                 path = new File(path).getParent();
86                 url = new File(path).toURI().toURL();
87             }
88
89             File file = new File(path);
90             // is it a map resource
91             if (file.exists() && file.isFile()) {
92                 File cellFolderFile = file.getParentFile();
93                 if (cellFolderFile.getName().equalsIgnoreCase(JGrassConstants.CELL)) {
94                     // try to get its location
95                     JGrassMapEnvironment env = new JGrassMapEnvironment(file);
96                     file = env.getLOCATION();
97                     url = file.toURI().toURL();
98                 }
99             }
100
101             /*
102              * check one: is it a folder?
103              */
104             if (file.exists() && file.isDirectory()) {
105                 /*
106                  * check two: is it a jgrass folder
107                  */
108                 // does it have a PERMANENT folder?
109                 File permanentFolder = new File(file.getAbsolutePath() + File.separator + JGrassConstants.PERMANENT_MAPSET);
110                 if (permanentFolder.exists() && permanentFolder.isDirectory()) {
111
112                     boolean windexists = true;
113                     File windFile = new File(permanentFolder + File.separator + JGrassConstants.WIND);
114                     if (!windFile.exists()) {
115                         windexists = false;
116                         // try to see if it is a casesensitivity problem
117                         File tmpWindFile = new File(permanentFolder + File.separator + JGrassConstants.WIND.toLowerCase());
118                         if (tmpWindFile.exists()) {
119                             // if that exists, try to change its case
120                             tmpWindFile.renameTo(windFile);
121                             windexists = true;
122                         }
123                     }
124
125                     // does it have a region file?
126                     if (windexists) {
127                         /*
128                          * ok, it is for the service
129                          */
130                         params = new HashMap<String, Serializable>();
131                         params.put(KEY, url);
132                         /*
133                          * now check the crs
134                          */
135                         File projWtkFile = new File(file.getAbsolutePath() + File.separator + JGrassConstants.PERMANENT_MAPSET
136                                 + File.separator + JGrassConstants.PROJ_WKT);
137                         if (!setJGrassCrs(projWtkFile)) {
138                             return null;
139                         }
140                     } else {
141                         return null;
142                     }
143                 }
144             }
145
146         } catch (Throwable e) {
147             JGrassPlugin.log(
148                     "JGrassPlugin problem: eu.hydrologis.udig.catalog.internal.jgrass#JGrassServiceExtension#createParams", e); //$NON-NLS-1$
149
150             e.printStackTrace();
151         }
152
153         return params;
154     }
155
156     /**
157      * create the JGrass database service
158      */
159     public IService createService( URL id, Map<String, Serializable> params ) {
160         // good defensive programming
161         if (params == null)
162             return null;
163
164         // check for the properties service key
165         if (params.containsKey(KEY)) {
166             // found it, create the service handle
167             return new JGrassService(params);
168         }
169
170         // key not found
171         return null;
172     }
173
174     public synchronized boolean setJGrassCrs( File projFile ) {
175         try {
176             if (projFile.exists()) {
177                 return true;
178             } else {
179
180                 final ChooseCoordinateReferenceSystemDialog crsChooser = new ChooseCoordinateReferenceSystemDialog();
181                 Display.getDefault().syncExec(new Runnable(){
182
183                     public void run() {
184
185                         Shell shell = PlatformUI.getWorkbench().getDisplay().getActiveShell();
186                         crsChooser.open(shell);
187
188                     }
189
190                 });
191
192                 CoordinateReferenceSystem readCrs = crsChooser.getCrs();
193                 if (readCrs != null) {
194                     BufferedWriter bWriter = new BufferedWriter(new FileWriter(projFile));
195                     String crsString = readCrs.toWKT();
196                     bWriter.write(crsString);
197                     bWriter.close();
198                 } else {
199                     return false;
200                 }
201
202             }
203
204         } catch (Exception e1) {
205             JGrassPlugin.log(
206                     "JGrassPlugin problem: eu.hydrologis.udig.catalog.internal.jgrass#JGrassServiceExtension#setJGrassCrs", e1); //$NON-NLS-1$
207
208             e1.printStackTrace();
209         }
210         return true;
211     }
212
213 }