Project

General

Profile

Revision 20ff13ec

Added by shye0000 about 9 years ago

module sitools2 plus asynchronous download

View differences:

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 : "&nbsp;"
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
 *
... This diff was truncated because it exceeds the maximum size that can be displayed.

Also available in: Unified diff