Revision 20ff13ec
Added by shye0000 over 9 years ago
Asynchronous_Download_java_sitools2/PublicOrderResource.java | ||
---|---|---|
1 |
/******************************************************************************* |
|
2 |
* Copyright 2010-2014 CNES - CENTRE NATIONAL d'ETUDES SPATIALES |
|
3 |
* |
|
4 |
* This file is part of SITools2. |
|
5 |
* |
|
6 |
* SITools2 is free software: you can redistribute it and/or modify |
|
7 |
* it under the terms of the GNU 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 |
* SITools2 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 General Public License |
|
17 |
* along with SITools2. If not, see <http://www.gnu.org/licenses/>. |
|
18 |
******************************************************************************/ |
|
19 |
package fr.cnes.sitools.resources.order; |
|
20 |
|
|
21 |
import java.io.IOException; |
|
22 |
import java.util.ArrayList; |
|
23 |
import java.util.Iterator; |
|
24 |
import java.util.List; |
|
25 |
import java.util.logging.Level; |
|
26 |
import java.util.Map; |
|
27 |
import java.util.HashMap; |
|
28 |
import java.io.UnsupportedEncodingException; |
|
29 |
import java.net.URLEncoder; |
|
30 |
|
|
31 |
import org.restlet.data.Reference; |
|
32 |
import org.restlet.data.Status; |
|
33 |
import org.restlet.representation.Representation; |
|
34 |
import org.restlet.resource.ResourceException; |
|
35 |
import org.restlet.security.User; |
|
36 |
|
|
37 |
import fr.cnes.sitools.common.exception.SitoolsException; |
|
38 |
import fr.cnes.sitools.dataset.database.DatabaseRequest; |
|
39 |
import fr.cnes.sitools.datasource.jdbc.model.AttributeValue; |
|
40 |
import fr.cnes.sitools.datasource.jdbc.model.Record; |
|
41 |
import fr.cnes.sitools.plugins.resources.model.ResourceModel; |
|
42 |
import fr.cnes.sitools.plugins.resources.model.ResourceParameter; |
|
43 |
import fr.cnes.sitools.resources.order.utils.ListReferencesAPI; |
|
44 |
import fr.cnes.sitools.resources.order.utils.OrderAPI; |
|
45 |
import fr.cnes.sitools.resources.order.utils.OrderResourceUtils; |
|
46 |
import fr.cnes.sitools.server.Consts; |
|
47 |
import fr.cnes.sitools.util.RIAPUtils; |
|
48 |
import fr.cnes.sitools.order.model.Order; |
|
49 |
import org.restlet.Context; |
|
50 |
import fr.cnes.sitools.tasks.business.Task; |
|
51 |
import fr.cnes.sitools.mail.model.Mail; |
|
52 |
import org.restlet.Request; |
|
53 |
import org.restlet.data.Method; |
|
54 |
import org.restlet.representation.ObjectRepresentation; |
|
55 |
import fr.cnes.sitools.util.TemplateUtils; |
|
56 |
import fr.cnes.sitools.util.Util; |
|
57 |
|
|
58 |
|
|
59 |
/** |
|
60 |
* Default OrderResource implementation. |
|
61 |
* <p> |
|
62 |
* The parameter colUrl is used to specify a column containing the list of URLs of the files to order. Each file is then |
|
63 |
* either copied or Zipped to the userstorage of the user. |
|
64 |
* </p> |
|
65 |
* |
|
66 |
* |
|
67 |
* @author m.gond |
|
68 |
*/ |
|
69 |
public class PublicOrderResource extends AbstractDatasetOrderResource { |
|
70 |
/** Maximum number of file to download authorized, default to -1 => no limit */ |
|
71 |
private int nbMaxDownload = -1; |
|
72 |
private fr.cnes.sitools.security.model.User userDetails; |
|
73 |
/* |
|
74 |
* (non-Javadoc) |
|
75 |
* |
|
76 |
* @see fr.cnes.sitools.resources.order.AbstractOrderResource#checkUser() |
|
77 |
*/ |
|
78 |
@Override |
|
79 |
public void checkUser() { |
|
80 |
User user = getClientInfo().getUser(); |
|
81 |
if (user == null) { |
|
82 |
userDetails=null; |
|
83 |
} |
|
84 |
else{ |
|
85 |
try { |
|
86 |
userDetails = this.getUserDetails(user.getIdentifier(), getContext()); |
|
87 |
} |
|
88 |
catch (SitoolsException e) { |
|
89 |
userDetails=null; |
|
90 |
} |
|
91 |
|
|
92 |
} |
|
93 |
|
|
94 |
|
|
95 |
} |
|
96 |
|
|
97 |
public void notifyAdminEnd() throws SitoolsException { |
|
98 |
try { |
|
99 |
sendMail(order, getContext(), userDetails, task); |
|
100 |
} |
|
101 |
catch (SitoolsException e) { |
|
102 |
// ne rien faire si le mail n'est pas parti |
|
103 |
OrderAPI.createEvent(order, getContext(), "MAIL_NOT_SEND_TO_USER"); |
|
104 |
} |
|
105 |
} |
|
106 |
|
|
107 |
protected void sendMail(Order order, Context context, fr.cnes.sitools.security.model.User user, Task task) |
|
108 |
throws SitoolsException{ |
|
109 |
List<String> toList = new ArrayList<String>(); |
|
110 |
if(user!=null){ |
|
111 |
String userAdd = user.getEmail(); |
|
112 |
if (userAdd != null && !userAdd.equals("")) { |
|
113 |
// System.out.println("EMAIL ADDRESS = " + userAdd); |
|
114 |
toList.add(userAdd); |
|
115 |
|
|
116 |
Mail mailToUser = new Mail(); |
|
117 |
mailToUser.setToList(toList); |
|
118 |
|
|
119 |
// TODO EVOL : email subject should be a parameter |
|
120 |
mailToUser.setSubject(getMailSubject()); |
|
121 |
|
|
122 |
// default body |
|
123 |
mailToUser.setBody(getMailBody(mailToUser)); |
|
124 |
|
|
125 |
org.restlet.Response sendMailResponse = null; |
|
126 |
try { |
|
127 |
// riap request to MailAdministration application |
|
128 |
Request request = new Request(Method.POST, RIAPUtils.getRiapBase() |
|
129 |
+ settings.getString(Consts.APP_MAIL_ADMIN_URL), new ObjectRepresentation<Mail>(mailToUser)); |
|
130 |
|
|
131 |
sendMailResponse = getContext().getClientDispatcher().handle(request); |
|
132 |
} |
|
133 |
catch (Exception e) { |
|
134 |
getLogger().warning("SERVER ERROR SENDING EMAIL TO USER"); |
|
135 |
throw new ResourceException(Status.SERVER_ERROR_INTERNAL, e); |
|
136 |
} |
|
137 |
if (sendMailResponse.getStatus().isError()) { |
|
138 |
throw new SitoolsException("SERVER ERROR SENDING EMAIL TO USER"); |
|
139 |
} |
|
140 |
|
|
141 |
// OK |
|
142 |
} |
|
143 |
else { |
|
144 |
throw new SitoolsException("NO EMAIL ADDRESS DEFINED"); |
|
145 |
} |
|
146 |
} |
|
147 |
else{ |
|
148 |
ResourceModel resourceModel = getModel(); |
|
149 |
ResourceParameter email = resourceModel.getParameterByName("Email"); |
|
150 |
String userAdd = this.getRequest().getResourceRef().getQueryAsForm().getFirstValue("Email"); |
|
151 |
//String userAdd = email.getValue(); |
|
152 |
getContext().getLogger().info("******************* UserEmail : "+userAdd); |
|
153 |
if (userAdd != null && !userAdd.equals("")) { |
|
154 |
toList.add(userAdd); |
|
155 |
Mail mailToPublic = new Mail(); |
|
156 |
mailToPublic.setToList(toList); |
|
157 |
mailToPublic.setSubject(getMailSubject()); |
|
158 |
mailToPublic.setBody(getMailBodyPublic(mailToPublic)); |
|
159 |
org.restlet.Response sendMailResponse = null; |
|
160 |
try { |
|
161 |
Request request = new Request(Method.POST, RIAPUtils.getRiapBase() |
|
162 |
+ settings.getString(Consts.APP_MAIL_ADMIN_URL), new ObjectRepresentation<Mail>(mailToPublic)); |
|
163 |
|
|
164 |
sendMailResponse = getContext().getClientDispatcher().handle(request); |
|
165 |
} |
|
166 |
catch (Exception e) { |
|
167 |
getLogger().warning("SERVER ERROR SENDING EMAIL TO PUBLIC DOWNLOADER"); |
|
168 |
throw new ResourceException(Status.SERVER_ERROR_INTERNAL, e); |
|
169 |
} |
|
170 |
if (sendMailResponse.getStatus().isError()) { |
|
171 |
throw new SitoolsException("SERVER ERROR SENDING EMAIL TO PUBLIC DOWNLOADER"); |
|
172 |
} |
|
173 |
} |
|
174 |
else{ |
|
175 |
throw new SitoolsException("NO EMAIL ADDRESS DEFINED"); |
|
176 |
} |
|
177 |
} |
|
178 |
|
|
179 |
} |
|
180 |
|
|
181 |
|
|
182 |
protected String getMailBodyPublic(Mail mailToPublic) { |
|
183 |
// default body |
|
184 |
String orderNameEncoded = order.getDescription(); |
|
185 |
String fileNameEncoded = order.getDescription(); |
|
186 |
|
|
187 |
try{ |
|
188 |
orderNameEncoded = URLEncoder.encode(order.getDescription(),"UTF-8"); |
|
189 |
} catch (UnsupportedEncodingException e){ |
|
190 |
e.printStackTrace(); |
|
191 |
} |
|
192 |
try{ |
|
193 |
fileNameEncoded = URLEncoder.encode(orderNameEncoded,"UTF-8"); |
|
194 |
} catch (UnsupportedEncodingException e){ |
|
195 |
e.printStackTrace(); |
|
196 |
} |
|
197 |
String mailBody = "Dear visiter"+":<br/><br/>Your command is complete. <br/>" + "File Name : " |
|
198 |
+ order.getDescription() + "<br/>" |
|
199 |
+"Now you can click the link below to download it:<br/><a href='http://idoc-picard.ias.u-psud.fr:8182/sitools/userstorage/public/files/resources_orders/" |
|
200 |
+orderNameEncoded+"/"+fileNameEncoded+".zip" |
|
201 |
+"'>http://idoc-picard.ias.u-psud.fr:8182/sitools/userstorage/public/files/resources_orders/" |
|
202 |
+orderNameEncoded+"/"+fileNameEncoded+".zip</a>" |
|
203 |
+"<br/><br/>Admin<br/><a href='http://idoc-picard.ias.u-psud.fr'>PICARD ARCHIVE</a>"; |
|
204 |
|
|
205 |
// use a freemarker template for email body with Mail object |
|
206 |
String templatePath = settings.getRootDirectory() + settings.getString(Consts.TEMPLATE_DIR) |
|
207 |
+ "mail.order.complete.ftl"; |
|
208 |
|
|
209 |
Map<String, Object> root = new HashMap<String, Object>(); |
|
210 |
root.put("mail", mailToPublic); |
|
211 |
root.put("order", order); |
|
212 |
String adminmail = settings.getString("Starter.StatusService.CONTACT_MAIL"); |
|
213 |
root.put("adminmail", adminmail); |
|
214 |
|
|
215 |
TemplateUtils.describeObjectClassesForTemplate(templatePath, root); |
|
216 |
|
|
217 |
root.put("context", getContext()); |
|
218 |
|
|
219 |
String body = TemplateUtils.toString(templatePath, root); |
|
220 |
if (Util.isNotEmpty(body)) { |
|
221 |
return body; |
|
222 |
} |
|
223 |
else { |
|
224 |
return mailBody; |
|
225 |
} |
|
226 |
} |
|
227 |
|
|
228 |
|
|
229 |
|
|
230 |
@Override |
|
231 |
public ListReferencesAPI listFilesToOrder(DatabaseRequest dbRequest) throws SitoolsException { |
|
232 |
task.setCustomStatus("Creating list of files to order"); |
|
233 |
ResourceModel resourceModel = getModel(); |
|
234 |
ResourceParameter nbMaxDownloadParam = resourceModel.getParameterByName("too_many_selected_threshold"); |
|
235 |
if (nbMaxDownloadParam != null && !"".equals(nbMaxDownloadParam)) { |
|
236 |
try { |
|
237 |
nbMaxDownload = Integer.parseInt(nbMaxDownloadParam.getValue()); |
|
238 |
} |
|
239 |
catch (NumberFormatException e) { |
|
240 |
nbMaxDownload = -1; |
|
241 |
} |
|
242 |
} |
|
243 |
|
|
244 |
if (nbMaxDownload != -1 && nbMaxDownload < dbRequest.getCount()) { |
|
245 |
ResourceParameter errorTextParam = resourceModel.getParameterByName("too_many_selected_threshold_text"); |
|
246 |
String errorText = (errorTextParam != null && !"".equals(errorTextParam.getValue())) ? errorTextParam.getValue() |
|
247 |
: "Too many file selected"; |
|
248 |
throw new ResourceException(Status.CLIENT_ERROR_BAD_REQUEST, errorText); |
|
249 |
} |
|
250 |
|
|
251 |
ResourceParameter colUrl = resourceModel.getParameterByName("colUrl"); |
|
252 |
if (colUrl.getValue() == null || colUrl.getValue().equals("")) { |
|
253 |
throw new SitoolsException("NO COLUMN DEFINED FOR ORDER"); |
|
254 |
} |
|
255 |
|
|
256 |
ListReferencesAPI list = new ListReferencesAPI(settings.getPublicHostDomain() + settings.getString(Consts.APP_URL)); |
|
257 |
while (dbRequest.nextResult()) { |
|
258 |
Record rec = dbRequest.getRecord(); |
|
259 |
AttributeValue attributeValue = OrderResourceUtils.getInParam(colUrl, rec); |
|
260 |
|
|
261 |
if (attributeValue != null && attributeValue.getValue() != null) { |
|
262 |
// get the file path |
|
263 |
String filePath = (String) attributeValue.getValue(); |
|
264 |
String urlAttach = settings.getString(Consts.APP_DATASTORAGE_URL); |
|
265 |
// if it contains "/datastorage" get rid of everything before |
|
266 |
if (filePath.contains(urlAttach)) { |
|
267 |
filePath = filePath.substring(filePath.lastIndexOf(urlAttach)); |
|
268 |
} |
|
269 |
if (filePath.startsWith("http://")) { |
|
270 |
list.addReferenceSource(new Reference(filePath)); |
|
271 |
} |
|
272 |
else { |
|
273 |
list.addReferenceSource(new Reference(RIAPUtils.getRiapBase() + filePath)); |
|
274 |
} |
|
275 |
|
|
276 |
} |
|
277 |
} |
|
278 |
return list; |
|
279 |
} |
|
280 |
|
|
281 |
@Override |
|
282 |
public Representation processOrder(ListReferencesAPI listReferences) throws SitoolsException { |
|
283 |
task.setCustomStatus("Order processing"); |
|
284 |
OrderAPI.createEvent(order, getContext(), "PROCESSING ORDER"); |
|
285 |
|
|
286 |
List<Reference> listOfFilesToOrder = listReferences.getReferencesSource(); |
|
287 |
|
|
288 |
getContext().getLogger().info("******************* User : "+task.getUser()); |
|
289 |
getContext().getLogger().info("******************* folder : "+settings.getString(Consts.USERSTORAGE_RESOURCE_ORDER_DIR) + folderName); |
|
290 |
Reference destRef = OrderResourceUtils.getUserAvailableFolderPath(task.getUser(), |
|
291 |
settings.getString(Consts.USERSTORAGE_RESOURCE_ORDER_DIR) + folderName, getContext()); |
|
292 |
|
|
293 |
ResourceModel resourceModel = getModel(); |
|
294 |
ResourceParameter zipParam = resourceModel.getParameterByName("zip"); |
|
295 |
|
|
296 |
// zip is a USER_INPUT parameter, let's get it from the request |
|
297 |
// parameters |
|
298 |
String zipValue = this.getRequest().getResourceRef().getQueryAsForm().getFirstValue("zip"); |
|
299 |
if (zipValue == null || zipValue.equals("") || (!"false".equals(zipValue) && !"true".equals(zipValue))) { |
|
300 |
zipValue = zipParam.getValue(); |
|
301 |
} |
|
302 |
|
|
303 |
Boolean zip = Boolean.parseBoolean(zipValue); |
|
304 |
if (zip) { |
|
305 |
task.getLogger().log(Level.INFO, zipParam.getName().toUpperCase() + " in progress for user : " |
|
306 |
+ task.getUser().getIdentifier() + " -> ip :" + getClientInfo().getUpstreamAddress()); |
|
307 |
|
|
308 |
task.getLogger().info("List of files ordered :"); |
|
309 |
for (Reference r : listReferences.getReferencesSource()) { |
|
310 |
task.getLogger().info(" - " + r.getIdentifier().substring(16)); |
|
311 |
r.getPath(); |
|
312 |
} |
|
313 |
zip(listOfFilesToOrder, listReferences, destRef); |
|
314 |
} |
|
315 |
else { |
|
316 |
task.getLogger().log(Level.INFO, "FILE in progress for user : " |
|
317 |
+ task.getUser().getIdentifier() + " -> ip :" + getClientInfo().getUpstreamAddress()); |
|
318 |
task.getLogger().info("List of files ordered :"); |
|
319 |
for (Reference r : listReferences.getReferencesSource()) { |
|
320 |
task.getLogger().info(" - " + r.getIdentifier().substring(16)); |
|
321 |
r.getPath(); |
|
322 |
} |
|
323 |
|
|
324 |
Reference ref; |
|
325 |
for (Iterator<Reference> iterator = listOfFilesToOrder.iterator(); iterator.hasNext();) { |
|
326 |
Reference sourceRef = iterator.next(); |
|
327 |
task.getLogger().log(Level.WARNING, "{0}", sourceRef); |
|
328 |
try { |
|
329 |
ref = new Reference(destRef); |
|
330 |
ref.addSegment(sourceRef.getLastSegment()); |
|
331 |
OrderResourceUtils.copyFile(sourceRef, ref, getRequest().getClientInfo(), getContext()); |
|
332 |
listReferences.addReferenceDest(ref); |
|
333 |
} |
|
334 |
catch (SitoolsException e) { |
|
335 |
task.getLogger().log(Level.WARNING, "File not copied : " + sourceRef, e); |
|
336 |
} |
|
337 |
} |
|
338 |
} |
|
339 |
|
|
340 |
task.getLogger().log(Level.INFO, "Number of downloaded files : " + listOfFilesToOrder.size()); |
|
341 |
|
|
342 |
// set the result in the task |
|
343 |
task.setUrlResult(settings.getString(Consts.APP_URL) + settings.getString(Consts.APP_ORDERS_USER_URL) + "/" |
|
344 |
+ order.getId()); |
|
345 |
|
|
346 |
try { |
|
347 |
// copy the indexFile to the destination reference |
|
348 |
String orderFileListName = fileName; |
|
349 |
if (orderFileListName == null || "".equals(orderFileListName)) { |
|
350 |
orderFileListName = OrderResourceUtils.FILE_LIST_PATTERN.replace("{orderName}", ds.getName()); |
|
351 |
orderFileListName = orderFileListName.replace("{timestamp}", formatedDate); |
|
352 |
} |
|
353 |
else { |
|
354 |
orderFileListName += "_fileList"; |
|
355 |
} |
|
356 |
destRef.addSegment(orderFileListName); |
|
357 |
destRef.setExtensions("txt"); |
|
358 |
Reference urlUserIndex = listReferences.copyToUserStorage(destRef, getContext(), getClientInfo()); |
|
359 |
|
|
360 |
// add it the order |
|
361 |
ArrayList<String> orderedResource = new ArrayList<String>(); |
|
362 |
orderedResource.add(urlUserIndex.toString()); |
|
363 |
order.setResourceCollection(orderedResource); |
|
364 |
order = OrderAPI.updateOrder(order, getContext()); |
|
365 |
|
|
366 |
} |
|
367 |
catch (IOException e) { |
|
368 |
throw new SitoolsException("Error while creating the file index in the userstorage", e); |
|
369 |
} |
|
370 |
return null; |
|
371 |
|
|
372 |
} |
|
373 |
|
|
374 |
/** |
|
375 |
* Create the Zip from the listOfFilesToOrder |
|
376 |
* |
|
377 |
* @param listOfFilesToOrder |
|
378 |
* the list of files to order |
|
379 |
* @param listReferences |
|
380 |
* the ListReferenceAPI to add some reference |
|
381 |
* @param destRef |
|
382 |
* the destination reference |
|
383 |
* @throws SitoolsException |
|
384 |
* if there is an error |
|
385 |
*/ |
|
386 |
private void zip(List<Reference> listOfFilesToOrder, ListReferencesAPI listReferences, Reference destRef) |
|
387 |
throws SitoolsException { |
|
388 |
|
|
389 |
String zipFileName = fileName; |
|
390 |
if (zipFileName == null || "".equals(zipFileName)) { |
|
391 |
zipFileName = OrderResourceUtils.ZIP_FILE_PATTERN.replace("{orderName}", ds.getName()); |
|
392 |
zipFileName = zipFileName.replace("{timestamp}", formatedDate); |
|
393 |
} |
|
394 |
|
|
395 |
Reference zipRef = new Reference(RIAPUtils.getRiapBase() + settings.getString(Consts.APP_TMP_FOLDER_URL)); |
|
396 |
zipRef.addSegment(zipFileName); |
|
397 |
zipRef.setExtensions("zip"); |
|
398 |
|
|
399 |
// create an index and add it to the zip files |
|
400 |
Reference ref; |
|
401 |
Reference sourceRef; |
|
402 |
for (Iterator<Reference> iterator = listOfFilesToOrder.iterator(); iterator.hasNext();) { |
|
403 |
sourceRef = iterator.next(); |
|
404 |
ref = new Reference(destRef); |
|
405 |
ref.addSegment(sourceRef.getLastSegment()); |
|
406 |
listReferences.addReferenceDest(ref); |
|
407 |
} |
|
408 |
|
|
409 |
// copy the indexFile to the destination reference |
|
410 |
Reference destRefListFileInZip = new Reference(destRef); |
|
411 |
|
|
412 |
String orderFileListName = fileName; |
|
413 |
if (orderFileListName == null || "".equals(orderFileListName)) { |
|
414 |
orderFileListName = OrderResourceUtils.FILE_LIST_PATTERN.replace("{orderName}", ds.getName()); |
|
415 |
orderFileListName = orderFileListName.replace("{timestamp}", formatedDate); |
|
416 |
} |
|
417 |
else { |
|
418 |
orderFileListName += "_fileList"; |
|
419 |
} |
|
420 |
destRefListFileInZip.addSegment(orderFileListName); |
|
421 |
destRefListFileInZip.setExtensions("txt"); |
|
422 |
try { |
|
423 |
listReferences.copyToUserStorage(destRefListFileInZip, getContext(), getClientInfo()); |
|
424 |
listReferences.clearReferencesDest(); |
|
425 |
listReferences.addReferenceSource(destRefListFileInZip); |
|
426 |
} |
|
427 |
catch (IOException e) { |
|
428 |
e.printStackTrace(); |
|
429 |
} |
|
430 |
|
|
431 |
OrderResourceUtils.zipFiles(listOfFilesToOrder, settings.getTmpFolderUrl() + "/" + zipFileName + ".zip", |
|
432 |
getRequest().getClientInfo(), getContext()); |
|
433 |
destRef.addSegment(zipRef.getLastSegment()); |
|
434 |
OrderResourceUtils.copyFile(zipRef, destRef, getRequest().getClientInfo(), getContext()); |
|
435 |
OrderResourceUtils.deleteFile(zipRef, getRequest().getClientInfo(), getContext()); |
|
436 |
|
|
437 |
Reference destZipRef = new Reference(destRef); |
|
438 |
listReferences.addReferenceDest(destZipRef); |
|
439 |
|
|
440 |
destRef.setLastSegment(""); |
|
441 |
} |
|
442 |
} |
Asynchronous_Download_java_sitools2/PublicOrderResourceFacade.java | ||
---|---|---|
1 |
/******************************************************************************* |
|
2 |
* Copyright 2010-2014 CNES - CENTRE NATIONAL d'ETUDES SPATIALES |
|
3 |
* |
|
4 |
* This file is part of SITools2. |
|
5 |
* |
|
6 |
* SITools2 is free software: you can redistribute it and/or modify |
|
7 |
* it under the terms of the GNU 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 |
* SITools2 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 General Public License |
|
17 |
* along with SITools2. If not, see <http://www.gnu.org/licenses/>. |
|
18 |
******************************************************************************/ |
|
19 |
package fr.cnes.sitools.resources.order; |
|
20 |
|
|
21 |
import org.restlet.data.Form; |
|
22 |
import org.restlet.ext.wadl.MethodInfo; |
|
23 |
import org.restlet.representation.Representation; |
|
24 |
import org.restlet.representation.Variant; |
|
25 |
|
|
26 |
import fr.cnes.sitools.common.resource.SitoolsParameterizedResource; |
|
27 |
import fr.cnes.sitools.dataset.DataSetApplication; |
|
28 |
import fr.cnes.sitools.dataset.database.common.DataSetExplorerUtil; |
|
29 |
import fr.cnes.sitools.tasks.TaskUtils; |
|
30 |
|
|
31 |
/** |
|
32 |
* Facade for PublicOrderResource |
|
33 |
* |
|
34 |
* |
|
35 |
* @author m.gond |
|
36 |
*/ |
|
37 |
public class PublicOrderResourceFacade extends SitoolsParameterizedResource implements IOrderResource { |
|
38 |
/** |
|
39 |
* Description de la ressource |
|
40 |
*/ |
|
41 |
@Override |
|
42 |
public void sitoolsDescribe() { |
|
43 |
setName("PublicOrderResourceFacade"); |
|
44 |
setDescription("Resource to order data"); |
|
45 |
} |
|
46 |
|
|
47 |
/** |
|
48 |
* Description WADL de la methode POST |
|
49 |
* |
|
50 |
* @param info |
|
51 |
* The method description to update. |
|
52 |
*/ |
|
53 |
@Override |
|
54 |
public void describePost(MethodInfo info) { |
|
55 |
info.setDocumentation("Method to order data from a dataset"); |
|
56 |
info.setIdentifier("order"); |
|
57 |
addStandardPostOrPutRequestInfo(info); |
|
58 |
DataSetExplorerUtil.addDatasetExplorerGetRequestInfo(info); |
|
59 |
DataSetApplication application = (DataSetApplication) getApplication(); |
|
60 |
DataSetExplorerUtil.addDatasetExplorerGetFilterInfo(info, application.getFilterChained()); |
|
61 |
addStandardResponseInfo(info); |
|
62 |
addStandardInternalServerErrorInfo(info); |
|
63 |
this.addInfo(info); |
|
64 |
} |
|
65 |
|
|
66 |
/** |
|
67 |
* Create the order |
|
68 |
* |
|
69 |
* @param represent |
|
70 |
* the {@link Representation} entity |
|
71 |
* @param variant |
|
72 |
* The {@link Variant} needed |
|
73 |
* @return a representation |
|
74 |
*/ |
|
75 |
public Representation orderPost(Representation represent, Variant variant) { |
|
76 |
processBody(); |
|
77 |
return TaskUtils.execute(this, variant); |
|
78 |
} |
|
79 |
|
|
80 |
/** |
|
81 |
* Create the order |
|
82 |
* |
|
83 |
* @param variant |
|
84 |
* The {@link Variant} needed |
|
85 |
* @return a representation |
|
86 |
*/ |
|
87 |
public Representation orderGet(Variant variant) { |
|
88 |
return TaskUtils.execute(this, variant); |
|
89 |
} |
|
90 |
|
|
91 |
/** |
|
92 |
* process the body and save the request entity {@link Representation} |
|
93 |
*/ |
|
94 |
public void processBody() { |
|
95 |
Representation body = this.getRequest().getEntity(); |
|
96 |
if (body != null && body.isAvailable() && body.getSize() > 0) { |
|
97 |
Form bodyForm = new Form(body); |
|
98 |
getContext().getAttributes().put(TaskUtils.BODY_CONTENT, bodyForm); |
|
99 |
} |
|
100 |
else { |
|
101 |
getContext().getAttributes().remove(TaskUtils.BODY_CONTENT); |
|
102 |
} |
|
103 |
} |
|
104 |
|
|
105 |
} |
Asynchronous_Download_java_sitools2/PublicOrderResourceModel.java | ||
---|---|---|
1 |
/******************************************************************************* |
|
2 |
* Copyright 2010-2014 CNES - CENTRE NATIONAL d'ETUDES SPATIALES |
|
3 |
* |
|
4 |
* This file is part of SITools2. |
|
5 |
* |
|
6 |
* SITools2 is free software: you can redistribute it and/or modify |
|
7 |
* it under the terms of the GNU 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 |
* SITools2 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 General Public License |
|
17 |
* along with SITools2. If not, see <http://www.gnu.org/licenses/>. |
|
18 |
******************************************************************************/ |
|
19 |
package fr.cnes.sitools.resources.order; |
|
20 |
|
|
21 |
import java.util.HashSet; |
|
22 |
import java.util.Map; |
|
23 |
import java.util.Set; |
|
24 |
|
|
25 |
import fr.cnes.sitools.common.validator.ConstraintViolation; |
|
26 |
import fr.cnes.sitools.common.validator.ConstraintViolationLevel; |
|
27 |
import fr.cnes.sitools.common.validator.Validator; |
|
28 |
import fr.cnes.sitools.dataset.DataSetApplication; |
|
29 |
import fr.cnes.sitools.plugins.resources.model.DataSetSelectionType; |
|
30 |
import fr.cnes.sitools.plugins.resources.model.ResourceModel; |
|
31 |
import fr.cnes.sitools.plugins.resources.model.ResourceParameter; |
|
32 |
import fr.cnes.sitools.plugins.resources.model.ResourceParameterType; |
|
33 |
import fr.cnes.sitools.tasks.model.TaskResourceModel; |
|
34 |
import fr.cnes.sitools.tasks.model.TaskRunTypeAdministration; |
|
35 |
|
|
36 |
/** |
|
37 |
* Model for OrderResource |
|
38 |
* |
|
39 |
* |
|
40 |
* @author m.gond |
|
41 |
*/ |
|
42 |
public class PublicOrderResourceModel extends TaskResourceModel { |
|
43 |
|
|
44 |
/** |
|
45 |
* Constructor |
|
46 |
*/ |
|
47 |
public PublicOrderResourceModel() { |
|
48 |
|
|
49 |
super(); |
|
50 |
setClassAuthor("Shuo"); |
|
51 |
setClassOwner("IAS"); |
|
52 |
setClassVersion("0.1"); |
|
53 |
setName("PublicOrderResourceModel"); |
|
54 |
setDescription("Order resources associated to metadata for public user and save it in public storage. (Can also create a ZIP, TAR or TAR.GZ 'on the fly')"); |
|
55 |
/** Resource facade */ |
|
56 |
setResourceClassName("fr.cnes.sitools.resources.order.PublicOrderResourceFacade"); |
|
57 |
/** Resource d'implémentation */ |
|
58 |
setResourceImplClassName("fr.cnes.sitools.resources.order.PublicOrderResource"); |
|
59 |
|
|
60 |
setRunTypeAdministration(TaskRunTypeAdministration.TASK_DEFAULT_RUN_ASYNC); |
|
61 |
|
|
62 |
ResourceParameter paramColUrl = new ResourceParameter("colUrl", "Colum containing data url for order", |
|
63 |
ResourceParameterType.PARAMETER_INTERN); |
|
64 |
/** Type de paramètre pour lister les colonnes du dataset */ |
|
65 |
paramColUrl.setValueType("xs:dataset.columnAlias"); |
|
66 |
ResourceParameter param2 = new ResourceParameter("zip", |
|
67 |
"(true or false) If the data needs to be zipped at the end", ResourceParameterType.PARAMETER_USER_INPUT); |
|
68 |
param2.setValue("false"); |
|
69 |
/** Type de colonne booléen */ |
|
70 |
param2.setValueType("xs:boolean"); |
|
71 |
ResourceParameter email= new ResourceParameter("Email","Send alert email when download ready",ResourceParameterType.PARAMETER_USER_INPUT); |
|
72 |
email.setValue(""); |
|
73 |
email.setValueType("xs:string"); |
|
74 |
this.addParam(paramColUrl); |
|
75 |
this.addParam(param2); |
|
76 |
this.addParam(email); |
|
77 |
|
|
78 |
this.setApplicationClassName(DataSetApplication.class.getName()); |
|
79 |
this.getParameterByName("methods").setValue("POST"); |
|
80 |
this.setDataSetSelection(DataSetSelectionType.MULTIPLE); |
|
81 |
|
|
82 |
// paramètres pour la limitation du nombre de fichiers |
|
83 |
ResourceParameter paramMaxWarningThreshold = new ResourceParameter("max_warning_threshold", |
|
84 |
"Maximum number of files allowed to be downloaded before client warning, download is still allowed", |
|
85 |
ResourceParameterType.PARAMETER_USER_GUI); |
|
86 |
paramMaxWarningThreshold.setValueType("xs:integer"); |
|
87 |
|
|
88 |
ResourceParameter paramTooManySelectedThreshold = new ResourceParameter("too_many_selected_threshold", |
|
89 |
"Maximum number of files allowed to be downloaded (-1 to set no limit)", ResourceParameterType.PARAMETER_INTERN); |
|
90 |
paramTooManySelectedThreshold.setValueType("xs:integer"); |
|
91 |
paramTooManySelectedThreshold.setValue("-1"); |
|
92 |
|
|
93 |
ResourceParameter paramMaxWarningThresholdText = new ResourceParameter("max_warning_threshold_text", |
|
94 |
"Text to display to the user when Warning threshold is reached", ResourceParameterType.PARAMETER_USER_GUI); |
|
95 |
paramMaxWarningThresholdText.setValueType("xs:string"); |
|
96 |
|
|
97 |
ResourceParameter paramTooManySelectedThresholdText = new ResourceParameter("too_many_selected_threshold_text", |
|
98 |
"Text to display to the user when TooMaxySelected threshold is reached", |
|
99 |
ResourceParameterType.PARAMETER_USER_GUI); |
|
100 |
paramTooManySelectedThresholdText.setValueType("xs:string"); |
|
101 |
|
|
102 |
this.addParam(paramMaxWarningThreshold); |
|
103 |
this.addParam(paramTooManySelectedThreshold); |
|
104 |
this.addParam(paramMaxWarningThresholdText); |
|
105 |
this.addParam(paramTooManySelectedThresholdText); |
|
106 |
|
|
107 |
this.getParameterByName("fileName").setValue("dataset_order_" + "${date:yyyy-MM-dd HH_mm_ss}"); |
|
108 |
|
|
109 |
} |
|
110 |
|
|
111 |
@Override |
|
112 |
public Validator<ResourceModel> getValidator() { |
|
113 |
return new Validator<ResourceModel>() { |
|
114 |
|
|
115 |
@Override |
|
116 |
public Set<ConstraintViolation> validate(ResourceModel item) { |
|
117 |
Set<ConstraintViolation> constraints = new HashSet<ConstraintViolation>(); |
|
118 |
Map<String, ResourceParameter> params = item.getParametersMap(); |
|
119 |
ResourceParameter param = params.get("colUrl"); |
|
120 |
String value = param.getValue(); |
|
121 |
if (value == null || value.equals("")) { |
|
122 |
ConstraintViolation constraint = new ConstraintViolation(); |
|
123 |
constraint.setMessage("An attribute of the dataset must be choosen"); |
|
124 |
constraint.setLevel(ConstraintViolationLevel.CRITICAL); |
|
125 |
constraint.setValueName(param.getName()); |
|
126 |
constraints.add(constraint); |
|
127 |
} |
|
128 |
param = params.get("zip"); |
|
129 |
if (param != null) { |
|
130 |
value = param.getValue(); |
|
131 |
if (value == null || (!"false".equals(value) && !"true".equals(value))) { |
|
132 |
ConstraintViolation constraint = new ConstraintViolation(); |
|
133 |
constraint.setMessage("Must be a boolean"); |
|
134 |
constraint.setLevel(ConstraintViolationLevel.CRITICAL); |
|
135 |
constraint.setInvalidValue(value); |
|
136 |
constraint.setValueName(param.getName()); |
|
137 |
constraints.add(constraint); |
|
138 |
} |
|
139 |
} |
|
140 |
param = params.get("too_many_selected_threshold"); |
|
141 |
value = param.getValue(); |
|
142 |
if (value == null || "".equals(value)) { |
|
143 |
ConstraintViolation constraint = new ConstraintViolation(); |
|
144 |
constraint.setMessage("Cannot be null"); |
|
145 |
constraint.setLevel(ConstraintViolationLevel.CRITICAL); |
|
146 |
constraint.setInvalidValue(value); |
|
147 |
constraint.setValueName(param.getName()); |
|
148 |
constraints.add(constraint); |
|
149 |
} |
|
150 |
else { |
|
151 |
try { |
|
152 |
Integer.parseInt(value); |
|
153 |
} |
|
154 |
catch (NumberFormatException e) { |
|
155 |
ConstraintViolation constraint = new ConstraintViolation(); |
|
156 |
constraint.setMessage("Must be an integer value"); |
|
157 |
constraint.setLevel(ConstraintViolationLevel.CRITICAL); |
|
158 |
constraint.setInvalidValue(value); |
|
159 |
constraint.setValueName(param.getName()); |
|
160 |
constraints.add(constraint); |
|
161 |
} |
|
162 |
} |
|
163 |
return constraints; |
|
164 |
} |
|
165 |
}; |
|
166 |
} |
|
167 |
|
|
168 |
} |
Asynchronous_Download_userInterface_sitools2/goToTaskPanel.js | ||
---|---|---|
1 |
/******************************************************************************* |
|
2 |
* Copyright 2010-2014 CNES - CENTRE NATIONAL d'ETUDES SPATIALES |
|
3 |
* |
|
4 |
* This file is part of SITools2. |
|
5 |
* |
|
6 |
* SITools2 is free software: you can redistribute it and/or modify it under the |
|
7 |
* terms of the GNU General Public License as published by the Free Software |
|
8 |
* Foundation, either version 3 of the License, or (at your option) any later |
|
9 |
* version. |
|
10 |
* |
|
11 |
* SITools2 is distributed in the hope that it will be useful, but WITHOUT ANY |
|
12 |
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR |
|
13 |
* A PARTICULAR PURPOSE. See the GNU General Public License for more details. |
|
14 |
* |
|
15 |
* You should have received a copy of the GNU General Public License along with |
|
16 |
* SITools2. If not, see <http://www.gnu.org/licenses/>. |
|
17 |
******************************************************************************/ |
|
18 |
/*global Ext, sitools, i18n, SitoolsDesk, alertFailure, window, loadUrl */ |
|
19 |
|
|
20 |
Ext.namespace('sitools.user.component.dataviews'); |
|
21 |
|
|
22 |
/** |
|
23 |
* A simple window that displays result of Resource Tasks. |
|
24 |
* @class sitools.user.component.dataviews.goToTaskPanel |
|
25 |
* @extends Ext.Panel |
|
26 |
*/ |
|
27 |
sitools.user.component.dataviews.goToTaskPanel = Ext.extend(Ext.Panel, { |
|
28 |
//sitools.user.component.livegrid.goToTaskPanel = Ext.extend(Ext.Window, { |
|
29 |
// modal : true, |
|
30 |
width : "500", |
|
31 |
buttonAlign : 'left', |
|
32 |
layout : 'fit', |
|
33 |
initComponent : function () { |
|
34 |
|
|
35 |
|
|
36 |
|
|
37 |
this.mainPanel = this.createNewFormComponent(this.task); |
|
38 |
|
|
39 |
this.buttons = ["->",/* { |
|
40 |
text : i18n.get('label.goToTask'), |
|
41 |
scope : this, |
|
42 |
handler : this.goToTask |
|
43 |
},*/ { |
|
44 |
text : i18n.get('label.close'), |
|
45 |
scope : this, |
|
46 |
handler : function () { |
|
47 |
this.ownerCt.close(); |
|
48 |
} |
|
49 |
} ]; |
|
50 |
|
|
51 |
|
|
52 |
this.items = [this.mainPanel]; |
|
53 |
|
|
54 |
sitools.user.component.dataviews.goToTaskPanel.superclass.initComponent.call(this); |
|
55 |
|
|
56 |
}, |
|
57 |
|
|
58 |
refreshTask : function () { |
|
59 |
// var form = this.mainPanel; |
|
60 |
var url = this.task.statusUrl; |
|
61 |
Ext.Ajax.request({ |
|
62 |
url : url, |
|
63 |
method : "GET", |
|
64 |
scope : this, |
|
65 |
success : function (ret) { |
|
66 |
var data = Ext.decode(ret.responseText); |
|
67 |
if (!data.success) { |
|
68 |
Ext.Msg.alert(i18n.get('label.warning'), data.message); |
|
69 |
return false; |
|
70 |
} |
|
71 |
this.task = data.TaskModel; |
|
72 |
this.mainPanel = this.createNewFormComponent(this.task); |
|
73 |
this.removeAll(); |
|
74 |
this.add(this.mainPanel); |
|
75 |
this.doLayout(); |
|
76 |
}, |
|
77 |
failure : alertFailure |
|
78 |
}); |
|
79 |
}, |
|
80 |
|
|
81 |
createNewFormComponent : function (task) { |
|
82 |
var html = String.format("<p>Hi, your download task is being processed, we will inform you by email when it is done.</p>"); |
|
83 |
html += String.format("<p>For public users, we will send you a link for download in the email.</p>"); |
|
84 |
//html += String.format("<p>You can check the progress by clicking the button <b>Go to the task</b> below.</p>"); |
|
85 |
html += String.format("<p>For registered users, you can find and manage(delete or download) all your historical download tasks by clicking the <b>Tasks</b> button which located in your user menu.</p>"); |
|
86 |
|
|
87 |
/* var html = String.format(i18n.get("label.taskLaunched"), task.status); |
|
88 |
html += String.format("<a href='#'>{0}</a><br>", i18n.get("label.detail")); |
|
89 |
|
|
90 |
if (!Ext.isEmpty(task.urlResult)) { |
|
91 |
html += "<br>" + String.format(i18n.get("label.taskResult"), task.urlResult); |
|
92 |
html += String.format("<a href='#'>{0}</a><br>", i18n.get("label.result")); |
|
93 |
} |
|
94 |
else { |
|
95 |
html += "<br>" + i18n.get("label.refreshTaskWindow"); |
|
96 |
html += String.format("<a href='#'>{0}</a><br>", i18n.get("label.refresh")); |
|
97 |
}*/ |
|
98 |
|
|
99 |
var panel = new Ext.Panel({ |
|
100 |
padding: 5, |
|
101 |
layout : "fit", |
|
102 |
html : html, |
|
103 |
listeners : { |
|
104 |
scope : this, |
|
105 |
afterrender : function (panel) { |
|
106 |
/*panel.getEl().child('a').on("click", function () { |
|
107 |
this.showTaskDetail(task); |
|
108 |
}, this); |
|
109 |
var resultOrRefreshLink = panel.getEl().child('a').next('a'); |
|
110 |
if (!Ext.isEmpty(task.urlResult)) { |
|
111 |
resultOrRefreshLink.on("click", function () { |
|
112 |
this.showTaskResults(task); |
|
113 |
}, this); |
|
114 |
} |
|
115 |
else { |
|
116 |
resultOrRefreshLink.on("click", function () { |
|
117 |
this.refreshTask(); |
|
118 |
}, this); |
|
119 |
}*/ |
|
120 |
} |
|
121 |
} |
|
122 |
}); |
|
123 |
return panel; |
|
124 |
|
|
125 |
// var formPanel = new Ext.form.FormPanel({ |
|
126 |
// title : i18n.get("label.taskDetails"), |
|
127 |
// padding: 5, |
|
128 |
// items : [ { |
|
129 |
// name : 'statusUrl', |
|
130 |
// xtype : 'textfield', |
|
131 |
// value : task.statusUrl, |
|
132 |
// hidden : true |
|
133 |
// }, { |
|
134 |
// name : 'status', |
|
135 |
// fieldLabel : i18n.get('label.status'), |
|
136 |
// anchor : "100%", |
|
137 |
// xtype : 'textfield', |
|
138 |
// value : task.status |
|
139 |
// }, { |
|
140 |
// name : 'id', |
|
141 |
// fieldLabel : i18n.get('label.id'), |
|
142 |
// anchor : "100%", |
|
143 |
// xtype : 'textfield', |
|
144 |
// value : task.id |
|
145 |
// }, { |
|
146 |
// itemValue : task.statusUrl, |
|
147 |
// fieldLabel : i18n.get('label.url'), |
|
148 |
// xtype : 'box', |
|
149 |
// html : "<a href='#'> " + task.statusUrl + "</a>" |
|
150 |
// , |
|
151 |
// listeners : { |
|
152 |
// scope : this, |
|
153 |
// render : function (cmp) { |
|
154 |
// cmp.getEl().on('click', function () { |
|
155 |
// var jsObj = sitools.user.modules.userSpaceDependencies.svaTasksDetails; |
|
156 |
// var componentCfg = { |
|
157 |
// sva : task |
|
158 |
// }; |
|
159 |
// var windowConfig = { |
|
160 |
// id : "taskStatusDetails", |
|
161 |
// title : i18n.get("label.taskDetails") + ":" + task.id |
|
162 |
// }; |
|
163 |
// SitoolsDesk.addDesktopWindow(windowConfig, componentCfg, jsObj); |
|
164 |
// }); |
|
165 |
// } |
|
166 |
// } |
|
167 |
// } |
|
168 |
// ] |
|
169 |
// }); |
|
170 |
// |
|
171 |
// if (!Ext.isEmpty(task.urlResult)) { |
|
172 |
// var item = new Ext.BoxComponent({ |
|
173 |
// itemValue : task.urlResult, |
|
174 |
// fieldLabel : i18n.get('label.result'), |
|
175 |
// html : "<a href='#'> " + task.urlResult + "</a>", |
|
176 |
// listeners : { |
|
177 |
// scope : this, |
|
178 |
// render : function (cmp) { |
|
179 |
// cmp.getEl().on('click', function () { |
|
180 |
// var orderUrl = loadUrl.get('APP_URL') + loadUrl.get('APP_ORDERS_USER_URL'); |
|
181 |
// if (cmp.itemValue.indexOf(orderUrl) != -1) { |
|
182 |
// this._showOrderDetails(cmp.itemValue); |
|
183 |
// } else if (cmp.itemValue.indexOf("/records") != -1) { |
|
184 |
// this._showDatasetDetails(cmp.itemValue); |
|
185 |
// } |
|
186 |
// else { |
|
187 |
// window.open(cmp.itemValue); |
|
188 |
// } |
|
189 |
// }, this); |
|
190 |
// } |
|
191 |
// } |
|
192 |
// }); |
|
193 |
// formPanel.add(item); |
|
194 |
// } |
|
195 |
// |
|
196 |
// return formPanel; |
|
197 |
|
|
198 |
}, |
|
199 |
|
|
200 |
/** |
|
201 |
* Handler of the button goToTask. |
|
202 |
* Open the home Module Window with the taskPanel opened. |
|
203 |
*/ |
|
204 |
goToTask : function () { |
|
205 |
this.ownerCt.close(); |
|
206 |
var jsObj = sitools.user.component.entete.userProfile.tasks; |
|
207 |
var windowConfig = { |
|
208 |
title : i18n.get('label.Tasks'), |
|
209 |
saveToolbar : false, |
|
210 |
iconCls : "tasks" |
|
211 |
}; |
|
212 |
SitoolsDesk.addDesktopWindow(windowConfig, {}, jsObj, true); |
|
213 |
|
|
214 |
}, |
|
215 |
/** |
|
216 |
* Open a sitools.user.component.entete.userProfile.orderProp window. |
|
217 |
* @param {String} url the Url to request the task. |
|
218 |
*/ |
|
219 |
_showOrderDetails : function (url) { |
|
220 |
Ext.Ajax.request({ |
|
221 |
url : url, |
|
222 |
method : 'GET', |
|
223 |
scope : this, |
|
224 |
success : function (ret) { |
|
225 |
var data = Ext.decode(ret.responseText); |
|
226 |
if (!data.success) { |
|
227 |
Ext.Msg.alert(i18n.get('label.warning'), data.message); |
|
228 |
return false; |
|
229 |
} |
|
230 |
var rec = new Ext.data.Record(data.order); |
|
231 |
var jsObj = sitools.user.component.entete.userProfile.orderProp; |
|
232 |
var componentCfg = { |
|
233 |
action : 'detail', |
|
234 |
orderRec : rec |
|
235 |
}; |
|
236 |
var title = i18n.get('label.details') + " : "; |
|
237 |
title += rec.data.userId; |
|
238 |
title += " " + i18n.get('label.the'); |
|
239 |
title += " " + rec.data.dateOrder; |
|
240 |
|
|
241 |
var windowConfig = { |
|
242 |
id : "showDataDetailId", |
|
243 |
title : title, |
|
244 |
specificType : "dataDetail", |
|
245 |
iconCls : "dataDetail" |
|
246 |
}; |
|
247 |
SitoolsDesk.addDesktopWindow(windowConfig, componentCfg, jsObj); |
|
248 |
}, |
|
249 |
failure : alertFailure |
|
250 |
}); |
|
251 |
|
|
252 |
}, |
|
253 |
/** |
|
254 |
* Only in NoSql, open a dataset view |
|
255 |
* @param {} url |
|
256 |
*/ |
|
257 |
_showDatasetDetails : function (url) { |
|
258 |
var urlDataset = url.substring(0, url.indexOf("/records")); |
|
259 |
Ext.Ajax.request({ |
|
260 |
url : urlDataset, |
|
261 |
method : 'GET', |
|
262 |
scope : this, |
|
263 |
success : function (ret) { |
|
264 |
var data = Ext.decode(ret.responseText); |
|
265 |
if (!data.success) { |
|
266 |
Ext.Msg.alert(i18n.get('label.warning'), data.message); |
|
267 |
return false; |
|
268 |
} |
|
269 |
var dataset = new Ext.data.Record(data.dataset).data; |
|
270 |
|
|
271 |
var windowConfig = { |
|
272 |
title : i18n.get('label.dataTitle') + " : " + dataset.name, |
|
273 |
datasetName : dataset.name, |
|
274 |
datasetDescription : dataset.description, |
|
275 |
type : "data", |
|
276 |
saveToolbar : true, |
|
277 |
toolbarItems : [], |
|
278 |
iconCls : "dataDetail" |
|
279 |
}; |
|
280 |
|
|
281 |
//open the dataView according to the dataset Configuration. |
|
282 |
var javascriptObject = eval(dataset.datasetView.jsObject); |
|
283 |
//add the toolbarItems configuration |
|
284 |
Ext.apply(windowConfig, { |
|
285 |
id : "data" + dataset.datasetId |
|
286 |
}); |
|
287 |
var componentCfg = { |
|
288 |
dataUrl : dataset.sitoolsAttachementForUsers, |
|
289 |
datasetId : dataset.id, |
|
290 |
datasetCm : dataset.columnModel, |
|
291 |
datasetName : dataset.name, |
|
292 |
dictionaryMappings : dataset.dictionaryMappings, |
|
293 |
datasetViewConfig : dataset.datasetViewConfig, |
|
294 |
preferencesPath : "/" + dataset.name, |
|
295 |
preferencesFileName : "datasetView" |
|
296 |
}; |
|
297 |
|
|
298 |
SitoolsDesk.addDesktopWindow(windowConfig, componentCfg, javascriptObject); |
|
299 |
|
|
300 |
}, |
|
301 |
failure : alertFailure |
|
302 |
}); |
|
303 |
|
|
304 |
}, |
|
305 |
/** |
|
306 |
* Opens a sitools.user.modules.userSpaceDependencies.svaTasksDetails window to see the task Details. |
|
307 |
* @param {} task |
|
308 |
*/ |
|
309 |
showTaskDetail : function (task) { |
|
310 |
var jsObj = sitools.user.component.entete.userProfile.tasksDetails; |
|
311 |
var componentCfg = { |
|
312 |
sva : task |
|
313 |
}; |
|
314 |
var windowConfig = { |
|
315 |
id : "taskStatusDetails", |
|
316 |
title : i18n.get("label.taskDetails") + ":" + task.id, |
|
317 |
iconCls : "dataDetail" |
|
318 |
}; |
|
319 |
SitoolsDesk.addDesktopWindow(windowConfig, componentCfg, jsObj); |
|
320 |
}, |
|
321 |
/** |
|
322 |
* parse the task.urlResult to see if this is an Specialized resource (noSQl or Order). |
|
323 |
* If not, open a new Window to get the result of the resource. |
|
324 |
* @param {} task |
|
325 |
*/ |
|
326 |
showTaskResults : function (task) { |
|
327 |
var orderUrl = loadUrl.get('APP_URL') + loadUrl.get('APP_ORDERS_USER_URL'); |
|
328 |
if (task.urlResult.indexOf(orderUrl) != -1) { |
|
329 |
this._showOrderDetails(task.urlResult); |
|
330 |
} else if (task.urlResult.indexOf("/records") != -1) { |
|
331 |
this._showDatasetDetails(task.urlResult); |
|
332 |
} |
|
333 |
else { |
|
334 |
window.open(task.urlResult); |
|
335 |
} |
|
336 |
}, |
|
337 |
/** |
|
338 |
* Method called when trying to show this component with fixed navigation |
|
339 |
* |
|
340 |
* @param {sitools.user.component.viewDataDetail} me the dataDetail view |
|
341 |
* @param {} config config options |
|
342 |
* @returns |
|
343 |
*/ |
|
344 |
showMeInFixedNav : function (me, config) { |
|
345 |
Ext.apply(config.windowSettings, { |
|
346 |
width : config.windowSettings.winWidth || DEFAULT_WIN_WIDTH, |
|
347 |
height : config.windowSettings.winHeight || DEFAULT_WIN_HEIGHT |
|
348 |
}); |
|
349 |
SitoolsDesk.openModalWindow(me, config); |
|
350 |
}, |
|
351 |
/** |
|
352 |
* Method called when trying to show this component with Desktop navigation |
|
353 |
* |
|
354 |
* @param {sitools.user.component.viewDataDetail} me the dataDetail view |
|
355 |
* @param {} config config options |
|
356 |
* @returns |
|
357 |
*/ |
|
358 |
showMeInDesktopNav : function (me, config) { |
|
359 |
Ext.apply(config.windowSettings, { |
|
360 |
width : config.windowSettings.winWidth || DEFAULT_WIN_WIDTH, |
|
361 |
height : config.windowSettings.winHeight || DEFAULT_WIN_HEIGHT |
|
362 |
}); |
|
363 |
SitoolsDesk.openModalWindow(me, config); |
|
364 |
} |
|
365 |
|
|
366 |
|
|
367 |
}); |
|
368 |
|
Asynchronous_Download_userInterface_sitools2/resourcePluginParamsPanel.js | ||
---|---|---|
1 |
/******************************************************************************* |
|
2 |
* Copyright 2010-2014 CNES - CENTRE NATIONAL d'ETUDES SPATIALES |
|
3 |
* |
|
4 |
* This file is part of SITools2. |
|
5 |
* |
|
6 |
* SITools2 is free software: you can redistribute it and/or modify it under the |
|
7 |
* terms of the GNU General Public License as published by the Free Software |
|
8 |
* Foundation, either version 3 of the License, or (at your option) any later |
|
9 |
* version. |
|
10 |
* |
|
11 |
* SITools2 is distributed in the hope that it will be useful, but WITHOUT ANY |
|
12 |
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR |
|
13 |
* A PARTICULAR PURPOSE. See the GNU General Public License for more details. |
|
14 |
* |
|
15 |
* You should have received a copy of the GNU General Public License along with |
|
16 |
* SITools2. If not, see <http://www.gnu.org/licenses/>. |
|
17 |
******************************************************************************/ |
|
18 |
/*global Ext, sitools, i18n, SitoolsDesk */ |
|
19 |
|
|
20 |
Ext.namespace('sitools.user.component.dataviews'); |
|
21 |
/** |
|
22 |
* @cfg {Ext.menu.menu} contextMenu the contextMenu that call the plugin and will execute onResourceCallClick method |
|
23 |
* @cfg {Ext.data.Record} resource the resource record |
|
24 |
* @cfg {string} url the base url of the resource |
|
25 |
* @cfg {string} methods the methods allowed with the format method1|method2|...|methodN |
|
26 |
* @cfg {string} runType the runTypeUserInput defined in the resource |
|
27 |
* @cfg {boolean} withSelection true if there was a selection, false otherwise |
|
28 |
* @cfg {Array} parameters the parameters |
|
29 |
* @class sitools.user.component.dataviews.resourcePluginParamsPanel |
|
30 |
* @extends Ext.Window |
|
31 |
*/ |
|
32 |
sitools.user.component.dataviews.resourcePluginParamsPanel = Ext.extend(Ext.Panel, { |
|
33 |
//sitools.user.component.livegrid.resourcePluginParamsWindow = Ext.extend(Ext.Window, { |
|
34 |
width : "450", |
|
35 |
|
|
36 |
showMethod : false, |
|
37 |
defaultMethod : "", |
|
38 |
showRunType : false, |
|
39 |
initComponent : function () { |
|
40 |
var methodsArray = this.methods.split("|"); |
|
41 |
this.showMethod = methodsArray.length > 1; |
|
42 |
this.defaultMethod = methodsArray[0]; |
|
43 |
|
|
44 |
this.methodsStore = new Ext.data.ArrayStore({ |
|
45 |
fields: ["method"], |
|
46 |
idIndex: 0 |
|
47 |
}); |
|
48 |
|
|
49 |
Ext.each(methodsArray, function (item, index) { |
|
50 |
this.methodsStore.add(new Ext.data.Record({ |
|
51 |
method : item |
|
52 |
})); |
|
53 |
}, this); |
|
54 |
|
|
55 |
var formCommonParametersFields = []; |
|
56 |
var comboMethod = new Ext.form.ComboBox({ |
|
57 |
xtype : 'combo', |
|
58 |
mode : 'local', |
|
59 |
triggerAction : 'all', |
|
60 |
editable : false, |
|
61 |
name : 'method', |
|
62 |
fieldLabel : i18n.get('label.method'), |
|
63 |
width : 100, |
|
64 |
store : this.methodsStore, |
|
65 |
valueField : 'method', |
|
66 |
displayField : 'method', |
|
67 |
anchor : "100%", |
|
68 |
value : this.defaultMethod, |
|
69 |
forceSelection : true |
|
70 |
}); |
|
71 |
this.items = []; |
|
72 |
if (this.showMethod) { |
|
73 |
formCommonParametersFields.push(comboMethod); |
|
74 |
this.formParams = new Ext.form.FormPanel({ |
|
75 |
padding: 5, |
|
76 |
// title : "Request parameters", |
|
77 |
items : [{ |
|
78 |
xtype : 'fieldset', |
|
79 |
title : i18n.get("label.commonParameters"), |
|
80 |
items : formCommonParametersFields |
|
81 |
}] |
|
82 |
}); |
|
83 |
|
|
84 |
this.items.push(this.formParams); |
|
85 |
} |
|
86 |
|
|
87 |
var userInputParams = []; |
|
88 |
this.user = projectGlobal.user || { |
|
89 |
firstName : "public", |
|
90 |
identifier : "public", |
|
91 |
email : " " |
|
92 |
}; |
|
93 |
|
|
94 |
Ext.each(this.resource.parameters, function (value, index) { |
|
95 |
if (value.type == "PARAMETER_USER_INPUT" && value.userUpdatable) { |
|
96 |
if(value.name == "Email" && this.user.identifier != "public"){ |
|
97 |
//if user is not public donnot show email input field |
|
98 |
}else{ |
|
99 |
var item = this.buildFormItemFromParam(value); |
|
100 |
userInputParams.push(item); |
|
101 |
if (value.name == "runTypeUserInput") { |
|
102 |
this.showRunType = true; |
|
103 |
} |
|
104 |
|
|
105 |
} |
|
106 |
} |
|
107 |
}, this); |
|
108 |
|
|
109 |
if (!Ext.isEmpty(userInputParams)) { |
|
110 |
this.formParamsUserInput = new Ext.form.FormPanel({ |
|
111 |
padding: 5, |
|
112 |
labelWidth : 150, |
|
113 |
items : { |
|
114 |
xtype : 'fieldset', |
|
115 |
title : i18n.get("label.specificParameter"), |
|
116 |
items : userInputParams |
|
117 |
} |
|
118 |
}); |
|
119 |
this.items.push(this.formParamsUserInput); |
|
120 |
} |
|
121 |
|
|
122 |
this.buttons = [{ |
|
123 |
text : i18n.get('label.submit'), |
|
124 |
scope : this, |
|
125 |
handler : this.onCall |
|
126 |
}, { |
|
127 |
text : i18n.get('label.cancel'), |
|
128 |
scope : this, |
|
129 |
handler : function () { |
|
130 |
this.ownerCt.close(); |
|
131 |
this.callback.call(undefined, false); |
|
132 |
} |
|
133 |
}]; |
|
134 |
sitools.user.component.dataviews.resourcePluginParamsPanel.superclass.initComponent.call(this); |
|
135 |
}, |
|
136 |
|
|
137 |
onCall : function () { |
|
138 |
var method; |
|
139 |
if (this.showMethod) { |
|
140 |
var form = this.formParams.getForm(); |
|
141 |
method = form.findField("method").getValue(); |
|
142 |
} |
|
143 |
else { |
|
144 |
method = this.defaultMethod; |
|
145 |
} |
|
146 |
|
|
147 |
var runTypeUserInput; |
|
148 |
if (this.showRunType) { |
|
149 |
runTypeUserInput = this.formParamsUserInput.getForm().findField("runTypeUserInput").getValue(); |
|
150 |
} |
|
151 |
else { |
|
152 |
runTypeUserInput = this.runType; |
|
153 |
} |
|
154 |
var limit; |
|
155 |
|
|
156 |
var userParameters = {}; |
|
157 |
if (!Ext.isEmpty(this.formParamsUserInput)) { |
|
158 |
var formParams = this.formParamsUserInput.getForm(); |
|
159 |
Ext.iterate(formParams.getValues(), function (key, value) { |
|
160 |
userParameters[key] = value; |
|
161 |
}); |
|
162 |
} |
|
163 |
if(userParameters["Email"] == ""){ |
|
164 |
Ext.Msg.alert("Email error","Please insert an email address which will be used to inform you with the download link."); |
|
165 |
return false; |
|
166 |
} |
|
167 |
Ext.each(this.parameters, function (param) { |
|
168 |
if (param.type == "PARAMETER_IN_QUERY") { |
|
169 |
userParameters[param.name] = param.value; |
|
170 |
} |
|
171 |
}); |
|
172 |
|
|
173 |
this.contextMenu.onResourceCallClick(this.resource, this.url, method, runTypeUserInput, limit, userParameters, this.postParameter, this.callback); |
|
174 |
this.ownerCt.close(); |
|
175 |
}, |
|
176 |
buildFormItemFromParam : function (value, userInputParams) { |
|
177 |
var valueType = value.valueType; |
|
178 |
var item = {}; |
|
179 |
//specific case for boolean |
|
180 |
if (valueType.indexOf("xs:boolean") != -1) { |
|
181 |
valueType = "xs:enum[true,false]"; |
|
182 |
} |
|
183 |
if (valueType.indexOf("xs:enum") != -1) { |
|
184 |
var enumeration = valueType.split("["); |
|
185 |
enumeration = enumeration[1].split("]"); |
|
186 |
enumeration = enumeration[0].split(","); |
|
187 |
|
|
188 |
var multiple = false; |
|
189 |
if (valueType.indexOf("xs:enum-multiple") >= 0 || valueType.indexOf("xs:enum-editable-multiple") >= 0) { |
|
190 |
multiple = true; |
|
191 |
} |
|
192 |
|
|
193 |
var storeItems = []; |
|
194 |
for (var i = 0; i < enumeration.length; i++) { |
|
195 |
var tmp = enumeration[i].trim(); |
|
196 |
storeItems.push([ tmp, tmp]); |
|
197 |
} |
|
198 |
var store = new Ext.data.ArrayStore({ |
|
199 |
fields : ['value', 'text'], |
|
200 |
data : storeItems, |
|
201 |
valueField : 'value', |
|
202 |
displayField : 'text' |
|
203 |
}); |
|
204 |
|
|
205 |
if (multiple) { |
|
206 |
item = { |
|
207 |
store : store, |
|
208 |
name : value.name, |
|
209 |
xtype : "multiselect", |
|
210 |
values : value.value, |
|
211 |
delimiter : '|', |
|
212 |
fieldLabel : value.name, |
|
213 |
width : 235, |
|
214 |
tooltip : value.description |
|
215 |
}; |
|
216 |
} |
|
217 |
else { |
|
218 |
item = { |
|
219 |
store : store, |
|
220 |
name : value.name, |
|
221 |
xtype : "combo", |
|
222 |
value : value.value, |
|
223 |
valueField : "value", |
|
224 |
displayField : "text", |
|
225 |
mode: 'local', |
|
226 |
fieldLabel : value.name, |
|
227 |
triggerAction : 'all', |
|
228 |
selectOnFocus : true, |
|
229 |
editable : false, |
|
230 |
anchor : "100%", |
|
231 |
tooltip : value.description |
|
232 |
}; |
|
233 |
} |
|
234 |
} |
|
235 |
else { |
|
236 |
item = { |
|
237 |
name : value.name, |
|
238 |
xtype : 'textfield', |
|
239 |
value : value.value, |
|
240 |
fieldLabel : value.name, |
|
241 |
anchor : "100%", |
|
242 |
tooltip : value.description |
|
243 |
}; |
|
244 |
} |
|
245 |
return item; |
|
246 |
}, |
|
247 |
/** |
|
248 |
* Method called when trying to show this component with fixed navigation |
|
249 |
* |
|
250 |
* @param {sitools.user.component.viewDataDetail} me the dataDetail view |
|
251 |
* @param {} config config options |
|
252 |
* @returns |
|
253 |
*/ |
|
254 |
showMeInFixedNav : function (me, config) { |
|
255 |
Ext.apply(config.windowSettings, { |
|
256 |
width : config.windowSettings.winWidth || DEFAULT_WIN_WIDTH, |
|
257 |
height : config.windowSettings.winHeight || DEFAULT_WIN_HEIGHT |
|
258 |
}); |
|
259 |
SitoolsDesk.openModalWindow(me, config); |
|
260 |
}, |
|
261 |
/** |
|
262 |
* Method called when trying to show this component with Desktop navigation |
|
263 |
* |
|
264 |
* @param {sitools.user.component.viewDataDetail} me the dataDetail view |
|
265 |
* @param {} config config options |
|
266 |
* @returns |
|
267 |
*/ |
|
268 |
showMeInDesktopNav : function (me, config) { |
|
269 |
Ext.apply(config.windowSettings, { |
|
270 |
width : config.windowSettings.winWidth || DEFAULT_WIN_WIDTH, |
|
271 |
height : config.windowSettings.winHeight || DEFAULT_WIN_HEIGHT |
|
272 |
}); |
|
273 |
SitoolsDesk.openModalWindow(me, config); |
|
274 |
} |
|
275 |
|
|
276 |
}); |
Module_DatasetExplorerOchart_sitools2/ExtJSOrgChart.css | ||
---|---|---|
1 |
/* Basic styling */ |
|
2 |
/* Draw the lines */ |
|
3 |
.ExtJSOrgChart tr,td,table{ |
|
4 |
border:none; |
|
5 |
} |
|
6 |
.ExtJSOrgChart .line { |
|
7 |
height : 20px; |
|
8 |
width : 2px; |
|
9 |
} |
|
10 |
|
|
11 |
.ExtJSOrgChart .down { |
|
12 |
background-color : gray; |
|
13 |
margin : 0px auto; |
|
14 |
} |
|
15 |
|
|
16 |
.ExtJSOrgChart .top { |
|
17 |
border-top : 2px solid gray; |
|
18 |
} |
|
19 |
|
|
20 |
.ExtJSOrgChart .left { |
|
21 |
border-right : 1px solid gray; |
|
22 |
} |
|
23 |
|
|
24 |
.ExtJSOrgChart .right { |
|
25 |
border-left : 1px solid gray; |
|
26 |
} |
|
27 |
|
|
28 |
/* node cell */ |
|
29 |
.ExtJSOrgChart td { |
|
30 |
text-align : center; |
|
31 |
vertical-align : top; |
|
32 |
padding : 0; |
|
33 |
} |
|
34 |
|
|
35 |
/* The node */ |
|
36 |
.ExtJSOrgChart .node { |
|
37 |
background-color : #D8D8D8; |
|
38 |
box-shadow: 5px 5px 4px #888888; |
|
39 |
display : inline-block; |
|
40 |
padding : 5px 5px 5px 5px; |
|
41 |
width : auto; |
|
42 |
height : auto; |
|
43 |
z-index : 10; |
|
44 |
margin : 0 2px; |
|
45 |
margin-left: 4px; |
|
46 |
margin-right: 4px; |
|
47 |
} |
|
48 |
.ExtJSOrgChart .notdataset { |
|
49 |
padding : 8px 8px 8px 8px; |
|
50 |
font-size: 15px; |
|
51 |
font-weight: bold; |
|
52 |
min-width: 144px; |
|
53 |
} |
|
54 |
.ExtJSOrgChart .notdatasettop { |
|
55 |
padding : 8px 8px 8px 8px; |
|
56 |
font-size:25px; |
|
57 |
font-weight: bold; |
|
58 |
} |
|
59 |
.ExtJSOrgChart .leaf { |
|
60 |
height: 186px; |
|
61 |
border-radius: 8px; |
|
62 |
min-width: 80px; |
|
63 |
font-size: 11px; |
|
64 |
font-weight: bold; |
|
65 |
} |
|
66 |
.ExtJSOrgChart .pictitle{ |
|
67 |
height:100px; |
|
68 |
} |
|
69 |
|
|
70 |
/* jQuery drag 'n drop */ |
|
71 |
|
|
72 |
.drag-active { |
|
73 |
border-style : dotted !important; |
|
74 |
} |
|
75 |
|
|
76 |
.drop-hover { |
|
77 |
border-style : solid !important; |
|
78 |
border-color : #E05E00 !important; |
|
79 |
} |
Module_DatasetExplorerOchart_sitools2/ExtJSOrgChart.js | ||
---|---|---|
1 |
/** |
|
2 |
* Converted into Ext JS by : Shariq Shaikh |
|
3 |
* |
|
4 |
* http://twitter.com/shaikhmshariq |
|
5 |
* Adopted from jQuery org-chart/tree plugin (https://github.com/wesnolte/ExtJSOrgChart). |
|
6 |
* |
|
7 |
* Author: Wes Nolte |
|
8 |
* http://twitter.com/wesnolte |
|
9 |
* |
|
10 |
* Based on the work of Mark Lee |
|
11 |
* http://www.capricasoftware.co.uk |
|
12 |
* |
|
13 |
* Copyright (c) 2011 Wesley Nolte |
|
14 |
* Dual licensed under the MIT and GPL licenses. |
|
15 |
* |
Also available in: Unified diff
module sitools2 plus asynchronous download