Add KnowledgeGraph page and recommendationSummary page. Update backend models 
and create new APIs to support new features. Add KnowledgCard in Dataset search 
result page.


Project: http://git-wip-us.apache.org/repos/asf/incubator-cmda/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-cmda/commit/aa50efa2
Tree: http://git-wip-us.apache.org/repos/asf/incubator-cmda/tree/aa50efa2
Diff: http://git-wip-us.apache.org/repos/asf/incubator-cmda/diff/aa50efa2

Branch: refs/heads/master
Commit: aa50efa2b8ef25fb4abf3ada96bda0aa54ffaf87
Parents: a9a8367
Author: mingqi830 <m...@andrew.cmu.edu>
Authored: Thu Oct 29 15:45:45 2015 -0700
Committer: mingqi830 <m...@andrew.cmu.edu>
Committed: Thu Oct 29 15:45:45 2015 -0700

----------------------------------------------------------------------
 ApacheCMDA_Backend_1.0/DBDump/Dump20150414.sql  |    32 +
 .../app/controllers/AnalyticsController.java    |   128 +
 .../controllers/ClimateServiceController.java   |    19 +-
 .../app/controllers/DatasetController.java      |     2 -
 .../app/controllers/DatasetLogController.java   |     1 -
 .../ServiceExecutionLogController.java          |     4 +-
 .../app/models/ClimateServiceRepository.java    |     4 +-
 ApacheCMDA_Backend_1.0/app/models/Dataset.java  |     9 +
 .../app/models/DatasetAndUser.java              |    69 +
 .../app/models/DatasetAndUserRepository.java    |    12 +
 .../app/models/DatasetLogRepository.java        |     2 +-
 .../app/models/Instrument.java                  |     9 +
 .../app/models/ServiceExecutionLog.java         |    13 +-
 ApacheCMDA_Backend_1.0/conf/routes              |     4 +
 .../app/controllers/AnalyticsController.java    |    32 +-
 .../controllers/ClimateServiceController.java   |   482 +-
 .../app/controllers/DatasetController.java      |    68 +-
 .../app/controllers/DatasetLogController.java   |     4 +-
 .../ServiceExecutionLogController.java          |    14 +-
 ApacheCMDA_Frontend_1.0/app/models/Dataset.java |    32 +-
 .../app/models/Instrument.java                  |     9 +
 .../app/models/ServiceExecutionLog.java         |    13 +-
 .../app/utils/Constants.java                    |     5 +
 .../app/views/aboutUs.scala.html                |     6 +-
 .../app/views/allClimateServices.scala.html     |    17 +-
 .../app/views/allDatasets.scala.html            |     2 +-
 .../app/views/climateServiceList.scala.html     |    62 +
 .../app/views/dataSetList.scala.html            |    18 +-
 .../app/views/dataSetListPopular.scala.html     |    68 +
 .../app/views/header.scala.html                 |    18 +-
 .../app/views/knowledgeGraph.scala.html         |   320 +
 .../app/views/main.scala.html                   |     2 -
 .../app/views/recommendationSummary.scala.html  |   171 +
 .../app/views/searchClimateService.scala.html   |   117 +
 .../app/views/serviceLog.scala.html             |    19 +-
 ApacheCMDA_Frontend_1.0/conf/routes             |     8 +
 .../public/html/js2/.DS_Store                   |   Bin 0 -> 6148 bytes
 .../public/html/js2/common.css                  |    29 +
 .../public/html/js2/common.js                   |   548 +
 .../public/html/js2/dataList2.js                |    42 +
 .../public/html/js2/varList.js                  |    40 +
 .../public/html/serviceScatterPlot2Vars.html    |   672 +
 ApacheCMDA_Frontend_1.0/public/images/giphy.gif |   Bin 0 -> 998904 bytes
 .../public/javascripts/exampleUtil.js           |   126 +
 .../public/javascripts/googleAnalytics.js       |    12 +
 .../public/javascripts/vis.js                   | 43387 +++++++++++++++++
 .../public/stylesheets/vis.css                  |  1295 +
 47 files changed, 47686 insertions(+), 260 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-cmda/blob/aa50efa2/ApacheCMDA_Backend_1.0/DBDump/Dump20150414.sql
----------------------------------------------------------------------
diff --git a/ApacheCMDA_Backend_1.0/DBDump/Dump20150414.sql 
b/ApacheCMDA_Backend_1.0/DBDump/Dump20150414.sql
index 48130c2..169081f 100644
--- a/ApacheCMDA_Backend_1.0/DBDump/Dump20150414.sql
+++ b/ApacheCMDA_Backend_1.0/DBDump/Dump20150414.sql
@@ -186,6 +186,7 @@ CREATE TABLE `Dataset` (
   `dataSourceNameinWebInterface` varchar(255) DEFAULT NULL,
   `startTime` datetime DEFAULT NULL,
   `endTime` datetime DEFAULT NULL,
+  `agencyURL` varchar(255) DEFAULT NULL,
   PRIMARY KEY (`id`),
   KEY `FK_9x29nf004vryd28iummv5l5r0` (`instrumentId`),
   CONSTRAINT `FK_9x29nf004vryd28iummv5l5r0` FOREIGN KEY (`instrumentId`) 
REFERENCES `Instrument` (`id`)
@@ -203,6 +204,35 @@ INSERT INTO `Dataset` VALUES 
(1,'ot','NOAA','NOAA_ARGO','3D','ARGO Ocean Tempera
 UNLOCK TABLES;
 
 --
+-- Table structure for table `DatasetAndUser`
+--
+
+DROP TABLE IF EXISTS `DatasetAndUser`;
+/*!40101 SET @saved_cs_client     = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `DatasetAndUser` (
+  `id` bigint(20) NOT NULL AUTO_INCREMENT,
+  `userId` bigint(20) NOT NULL,
+  `datasetId` bigint(20) NOT NULL,
+  `count` int(11) DEFAULT NULL,
+  PRIMARY KEY (`id`),
+  KEY `FK_User_DatasetAndUser` (`userId`),
+  KEY `FK_Dataset_DatasetAndUser` (`datasetId`),
+  CONSTRAINT `FK_User_DatasetAndUser` FOREIGN KEY (`userId`) REFERENCES `User` 
(`id`),
+  CONSTRAINT `FK_Dataset_DatasetAndUser` FOREIGN KEY (`datasetId`) REFERENCES 
`Dataset` (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `DatasetAndUser`
+--
+
+LOCK TABLES `DatasetAndUser` WRITE;
+/*!40000 ALTER TABLE `DatasetAndUser` DISABLE KEYS */;
+/*!40000 ALTER TABLE `DatasetAndUser` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
 -- Table structure for table `DatasetAndService`
 --
 
@@ -285,6 +315,7 @@ CREATE TABLE `Instrument` (
   `description` varchar(255) DEFAULT NULL,
   `launchDate` datetime DEFAULT NULL,
   `name` varchar(255) DEFAULT NULL,
+  `instrumentURL` varchar(255) DEFAULT NULL,
   PRIMARY KEY (`id`)
 ) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=latin1;
 /*!40101 SET character_set_client = @saved_cs_client */;
@@ -464,6 +495,7 @@ CREATE TABLE `ServiceExecutionLog` (
   `userId` bigint(20) NOT NULL,
   `datasetStudyStartTime` datetime DEFAULT NULL,
   `datasetStudyEndTime` datetime DEFAULT NULL,
+  `url` text DEFAULT NULL,
   PRIMARY KEY (`id`),
   KEY `FK_ly45hkuqs8yyw00iiuyx5hoj4` (`serviceId`),
   KEY `FK_g2n3b4rs0xys2r4r967uvi4jr` (`serviceConfigurationId`),

http://git-wip-us.apache.org/repos/asf/incubator-cmda/blob/aa50efa2/ApacheCMDA_Backend_1.0/app/controllers/AnalyticsController.java
----------------------------------------------------------------------
diff --git a/ApacheCMDA_Backend_1.0/app/controllers/AnalyticsController.java 
b/ApacheCMDA_Backend_1.0/app/controllers/AnalyticsController.java
new file mode 100644
index 0000000..feed694
--- /dev/null
+++ b/ApacheCMDA_Backend_1.0/app/controllers/AnalyticsController.java
@@ -0,0 +1,128 @@
+package controllers;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.inject.Inject;
+import javax.inject.Named;
+import javax.inject.Singleton;
+
+import models.DatasetAndUser;
+import models.DatasetAndUserRepository;
+import play.mvc.Controller;
+import play.mvc.Result;
+
+import com.google.gson.Gson;
+
+@Named
+@Singleton
+public class AnalyticsController extends Controller{
+       private final DatasetAndUserRepository datasetAndUserRepository;
+       @Inject
+       public AnalyticsController(DatasetAndUserRepository 
datasetAndUserRepository) {
+               this.datasetAndUserRepository = datasetAndUserRepository;
+       }
+       
+       public Result getAllDatasetAndUserWithCount(String format) {
+
+               try {
+                       Iterable<DatasetAndUser> datasetAndUsers = 
datasetAndUserRepository.findAll();
+
+                       if (datasetAndUsers == null) {
+                               System.out.println("User and Dataset: cannot be 
found!");
+                               return notFound("User and Dataset: cannot be 
found!");
+                       }  
+
+                       Map<String, Object> map = jsonFormat(datasetAndUsers);
+
+                       String result = new String();
+                       if (format.equals("json")) {
+                               result = new Gson().toJson(map);
+                       }
+
+                       return ok(result);
+               } catch (Exception e) {
+                       return badRequest("DatasetLog not found");
+               }
+       }
+
+       private Map<String, Object> jsonFormat(Iterable<DatasetAndUser> 
userDatasets) {
+
+               List<Map<String, Object>> nodes = new ArrayList<Map<String, 
Object>>();
+               List<Map<String, Object>> rels = new ArrayList<Map<String, 
Object>>();
+
+               int i = 1;
+               for (DatasetAndUser userDataset : userDatasets) {
+                       int source = 0;
+                       int target = 0;
+                       // Check whether the current user has already existed
+                       for (int j = 0; j < nodes.size(); j++) {
+                               if (nodes.get(j).get("title")
+                                               
.equals(userDataset.getUser().getUserName())) {
+                                       source = (int) nodes.get(j).get("id");
+                                       break;
+                               }
+                       }
+                       if (source == 0) {
+                               nodes.add(map6("id", i, "title", 
userDataset.getUser()
+                                               .getUserName(), "label", 
"user", "cluster", "1",
+                                               "value", 1, "group", "user"));
+                               source = i;
+                               i++;
+                       }
+                       // Check whether the current dataset has already existed
+                       for (int j = 0; j < nodes.size(); j++) {
+                               if (nodes.get(j).get("title")
+                                               
.equals(userDataset.getDataset().getName())) {
+                                       target = (int) nodes.get(j).get("id");
+                                       break;
+                               }
+                       }
+                       if (target == 0) {
+                               nodes.add(map6("id", i, "title", 
userDataset.getDataset()
+                                               .getName(), "label", "dataset", 
"cluster", "2",
+                                               "value", 2, "group", 
"dataset"));
+                               target = i;
+                               i++;
+                       }
+
+                       rels.add(map3("from", source, "to", target, "title", 
"USE"));
+
+               }
+
+               return map("nodes", nodes, "edges", rels);
+       }
+
+       private Map<String, Object> map(String key1, Object value1, String key2,
+                       Object value2) {
+               Map<String, Object> result = new HashMap<String, Object>(2);
+               result.put(key1, value1);
+               result.put(key2, value2);
+               return result;
+       }
+
+       private Map<String, Object> map3(String key1, Object value1, String 
key2,
+                       Object value2, String key3, Object value3) {
+               Map<String, Object> result = new HashMap<String, Object>(3);
+               result.put(key1, value1);
+               result.put(key2, value2);
+               result.put(key3, value3);
+               return result;
+       }
+
+       private Map<String, Object> map6(String key1, Object value1, String 
key2,
+                       Object value2, String key3, Object value3, String key4,
+                       Object value4, String key5, Object value5, String key6,
+                       Object value6) {
+               Map<String, Object> result = new HashMap<String, Object>(6);
+               result.put(key1, value1);
+               result.put(key2, value2);
+               result.put(key3, value3);
+               result.put(key4, value4);
+               result.put(key5, value5);
+               result.put(key6, value6);
+               return result;
+       }
+}

http://git-wip-us.apache.org/repos/asf/incubator-cmda/blob/aa50efa2/ApacheCMDA_Backend_1.0/app/controllers/ClimateServiceController.java
----------------------------------------------------------------------
diff --git 
a/ApacheCMDA_Backend_1.0/app/controllers/ClimateServiceController.java 
b/ApacheCMDA_Backend_1.0/app/controllers/ClimateServiceController.java
index 73722b3..700ad68 100644
--- a/ApacheCMDA_Backend_1.0/app/controllers/ClimateServiceController.java
+++ b/ApacheCMDA_Backend_1.0/app/controllers/ClimateServiceController.java
@@ -472,5 +472,22 @@ public class ClimateServiceController extends Controller {
         return ok(result);
 
     }
-
+    
+    public Result getTopKUsedClimateServicesByDatasetId(long id, String 
format) {
+       if (id < 0) {
+                       System.out.println("id is negative!");
+                       return badRequest("id is negative!");
+               }
+       String result = new String();
+       try {
+               //Parse JSON file
+               List<ClimateService> climateService;
+               climateService = 
climateServiceRepository.getClimateServiceByDatasetId(5, id);
+               result = new Gson().toJson(climateService);
+       } catch (Exception e) {
+               System.out.println("ServiceExecutionLog cannot be queried, 
query is corrupt");
+               return badRequest("ServiceExecutionLog cannot be queried, query 
is corrupt");
+       }
+       return ok(result);
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-cmda/blob/aa50efa2/ApacheCMDA_Backend_1.0/app/controllers/DatasetController.java
----------------------------------------------------------------------
diff --git a/ApacheCMDA_Backend_1.0/app/controllers/DatasetController.java 
b/ApacheCMDA_Backend_1.0/app/controllers/DatasetController.java
index 295c0a2..23822b4 100644
--- a/ApacheCMDA_Backend_1.0/app/controllers/DatasetController.java
+++ b/ApacheCMDA_Backend_1.0/app/controllers/DatasetController.java
@@ -366,8 +366,6 @@ public class DatasetController extends Controller {
                System.out.println("ServiceExecutionLog cannot be queried, 
query is corrupt");
                return badRequest("ServiceExecutionLog cannot be queried, query 
is corrupt");
        }
-       System.out.println("************" + result);
-
        return ok(result);
     }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-cmda/blob/aa50efa2/ApacheCMDA_Backend_1.0/app/controllers/DatasetLogController.java
----------------------------------------------------------------------
diff --git a/ApacheCMDA_Backend_1.0/app/controllers/DatasetLogController.java 
b/ApacheCMDA_Backend_1.0/app/controllers/DatasetLogController.java
index 432cf16..f92b68e 100644
--- a/ApacheCMDA_Backend_1.0/app/controllers/DatasetLogController.java
+++ b/ApacheCMDA_Backend_1.0/app/controllers/DatasetLogController.java
@@ -3,7 +3,6 @@ package controllers;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.Date;
-
 import javax.inject.Inject;
 import javax.inject.Named;
 import javax.inject.Singleton;

http://git-wip-us.apache.org/repos/asf/incubator-cmda/blob/aa50efa2/ApacheCMDA_Backend_1.0/app/controllers/ServiceExecutionLogController.java
----------------------------------------------------------------------
diff --git 
a/ApacheCMDA_Backend_1.0/app/controllers/ServiceExecutionLogController.java 
b/ApacheCMDA_Backend_1.0/app/controllers/ServiceExecutionLogController.java
index 507d549..e4594a8 100644
--- a/ApacheCMDA_Backend_1.0/app/controllers/ServiceExecutionLogController.java
+++ b/ApacheCMDA_Backend_1.0/app/controllers/ServiceExecutionLogController.java
@@ -342,8 +342,8 @@ public class ServiceExecutionLogController extends 
Controller {
                String purpose = json.findPath("purpose").asText();
                String plotUrl = json.findPath("url").asText();
                String dataUrl = json.findPath("dataUrl").asText();
+               String url = json.findPath("urlLink").asText();
                JsonNode datasetArray = json.get("datasets");
-               System.out.println(datasetArray);
 
                SimpleDateFormat formatter = new 
SimpleDateFormat(util.Common.DATE_PATTERN);
                
formatter.setTimeZone(TimeZone.getTimeZone("America/Los_Angeles"));
@@ -415,7 +415,7 @@ public class ServiceExecutionLogController extends 
Controller {
                        ServiceExecutionLog serviceExecutionLog = new 
ServiceExecutionLog(
                                        climateService, user, 
serviceConfiguration, purpose,
                                        executionStartTime, executionEndTime, 
dataUrl, plotUrl,
-                                       datasetStudyStartTime, 
datasetStudyEndTime);
+                                       datasetStudyStartTime, 
datasetStudyEndTime, url);
                        ServiceExecutionLog savedServiceExecutionLog = 
serviceExecutionLogRepository
                                        .save(serviceExecutionLog);
                        ServiceConfiguration savedServiceConfiguration = 
savedServiceExecutionLog

http://git-wip-us.apache.org/repos/asf/incubator-cmda/blob/aa50efa2/ApacheCMDA_Backend_1.0/app/models/ClimateServiceRepository.java
----------------------------------------------------------------------
diff --git a/ApacheCMDA_Backend_1.0/app/models/ClimateServiceRepository.java 
b/ApacheCMDA_Backend_1.0/app/models/ClimateServiceRepository.java
index 53a303f..2f70c53 100644
--- a/ApacheCMDA_Backend_1.0/app/models/ClimateServiceRepository.java
+++ b/ApacheCMDA_Backend_1.0/app/models/ClimateServiceRepository.java
@@ -21,5 +21,7 @@ public interface ClimateServiceRepository extends 
CrudRepository<ClimateService,
 
        @Query(value = "select c.* from ClimateService c, ServiceEntry s where 
c.id=s.serviceId group by s.serviceId order by s.latestAccessTimeStamp desc", 
nativeQuery = true)
        List<ClimateService> getClimateServiceOrderByLatestAccessTime();
-
+       
+       @Query(value = "select * from ClimateService where id in (select 
serviceId from ServiceEntry s where serviceId in (select climateServiceId from 
DatasetAndService where datasetId=?2) group by s.serviceId order by 
s.latestAccessTimeStamp desc) limit ?1", nativeQuery = true)
+       List<ClimateService> getClimateServiceByDatasetId(int k, long id);
 }

http://git-wip-us.apache.org/repos/asf/incubator-cmda/blob/aa50efa2/ApacheCMDA_Backend_1.0/app/models/Dataset.java
----------------------------------------------------------------------
diff --git a/ApacheCMDA_Backend_1.0/app/models/Dataset.java 
b/ApacheCMDA_Backend_1.0/app/models/Dataset.java
index 884a957..0d4fc3c 100644
--- a/ApacheCMDA_Backend_1.0/app/models/Dataset.java
+++ b/ApacheCMDA_Backend_1.0/app/models/Dataset.java
@@ -45,6 +45,7 @@ public class Dataset {
        private String comment;
        private Date startTime;
        private Date endTime;
+       private String agencyURL;
        
 
        public Dataset() {
@@ -82,6 +83,14 @@ public class Dataset {
                this.endTime = endTime;
        }
 
+       public String getAgencyURL() {
+               return agencyURL;
+       }
+
+       public void setAgencyURL(String agencyURL) {
+               this.agencyURL = agencyURL;
+       }
+
        public long getId() {
                return id;
        }

http://git-wip-us.apache.org/repos/asf/incubator-cmda/blob/aa50efa2/ApacheCMDA_Backend_1.0/app/models/DatasetAndUser.java
----------------------------------------------------------------------
diff --git a/ApacheCMDA_Backend_1.0/app/models/DatasetAndUser.java 
b/ApacheCMDA_Backend_1.0/app/models/DatasetAndUser.java
new file mode 100644
index 0000000..53665b3
--- /dev/null
+++ b/ApacheCMDA_Backend_1.0/app/models/DatasetAndUser.java
@@ -0,0 +1,69 @@
+package models;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+
+@Entity
+public class DatasetAndUser {
+
+       @Id
+       @GeneratedValue(strategy = GenerationType.AUTO)
+       private long id;
+       @ManyToOne(optional = false)
+       @JoinColumn(name = "userId", referencedColumnName = "id")
+       private User user;
+       @ManyToOne(optional = false)
+       @JoinColumn(name = "datasetId", referencedColumnName = "id")
+       private Dataset dataset;
+       private long count;
+       
+       public DatasetAndUser() {
+       }
+       
+       public DatasetAndUser(User user, Dataset dataset, long count) {
+               this.user = user;
+               this.dataset = dataset;
+               this.count = count;
+       }
+
+       public long getId() {
+               return id;
+       }
+
+       public void setId(long id) {
+               this.id = id;
+       }
+
+       public User getUser() {
+               return user;
+       }
+
+       public void setUser(User user) {
+               this.user = user;
+       }
+
+       public Dataset getDataset() {
+               return dataset;
+       }
+
+       public void setDataset(Dataset dataset) {
+               this.dataset = dataset;
+       }
+
+       public long getCount() {
+               return count;
+       }
+       public void setCount(long count) {
+               this.count = count;
+       }
+       
+       @Override
+       public String toString() {
+               return "DatasetAndUser[id=" + id + ", user=" + user.toString()
+                               + ", dataset=" + dataset.toString() + ", 
count=" + count + "]";
+       }
+}

http://git-wip-us.apache.org/repos/asf/incubator-cmda/blob/aa50efa2/ApacheCMDA_Backend_1.0/app/models/DatasetAndUserRepository.java
----------------------------------------------------------------------
diff --git a/ApacheCMDA_Backend_1.0/app/models/DatasetAndUserRepository.java 
b/ApacheCMDA_Backend_1.0/app/models/DatasetAndUserRepository.java
new file mode 100644
index 0000000..ce6b046
--- /dev/null
+++ b/ApacheCMDA_Backend_1.0/app/models/DatasetAndUserRepository.java
@@ -0,0 +1,12 @@
+package models;
+
+import org.springframework.data.repository.CrudRepository;
+
+import javax.inject.Named;
+import javax.inject.Singleton;
+
+@Named
+@Singleton
+public interface DatasetAndUserRepository extends 
CrudRepository<DatasetAndUser, Long> {
+               
+}

http://git-wip-us.apache.org/repos/asf/incubator-cmda/blob/aa50efa2/ApacheCMDA_Backend_1.0/app/models/DatasetLogRepository.java
----------------------------------------------------------------------
diff --git a/ApacheCMDA_Backend_1.0/app/models/DatasetLogRepository.java 
b/ApacheCMDA_Backend_1.0/app/models/DatasetLogRepository.java
index 3381b4e..de4ce6c 100644
--- a/ApacheCMDA_Backend_1.0/app/models/DatasetLogRepository.java
+++ b/ApacheCMDA_Backend_1.0/app/models/DatasetLogRepository.java
@@ -8,5 +8,5 @@ import javax.inject.Singleton;
 @Named
 @Singleton
 public interface DatasetLogRepository extends CrudRepository<DatasetLog, Long> 
{
-
+       
 }

http://git-wip-us.apache.org/repos/asf/incubator-cmda/blob/aa50efa2/ApacheCMDA_Backend_1.0/app/models/Instrument.java
----------------------------------------------------------------------
diff --git a/ApacheCMDA_Backend_1.0/app/models/Instrument.java 
b/ApacheCMDA_Backend_1.0/app/models/Instrument.java
index 71a0094..45aed25 100644
--- a/ApacheCMDA_Backend_1.0/app/models/Instrument.java
+++ b/ApacheCMDA_Backend_1.0/app/models/Instrument.java
@@ -15,6 +15,7 @@ public class Instrument {
        private String name;
        private String description;
        private Date launchDate;
+       private String instrumentURL;
        
        public Instrument() {
        }
@@ -26,6 +27,14 @@ public class Instrument {
                this.launchDate = launchDate;
        }
 
+       public String getInstrumentURL() {
+               return instrumentURL;
+       }
+
+       public void setInstrumentURL(String instrumentURL) {
+               this.instrumentURL = instrumentURL;
+       }
+
        public long getId() {
                return id;
        }

http://git-wip-us.apache.org/repos/asf/incubator-cmda/blob/aa50efa2/ApacheCMDA_Backend_1.0/app/models/ServiceExecutionLog.java
----------------------------------------------------------------------
diff --git a/ApacheCMDA_Backend_1.0/app/models/ServiceExecutionLog.java 
b/ApacheCMDA_Backend_1.0/app/models/ServiceExecutionLog.java
index c35c6c4..86351dc 100644
--- a/ApacheCMDA_Backend_1.0/app/models/ServiceExecutionLog.java
+++ b/ApacheCMDA_Backend_1.0/app/models/ServiceExecutionLog.java
@@ -40,6 +40,7 @@ public class ServiceExecutionLog {
        private String dataUrl;
        private Date datasetStudyStartTime;
        private Date datasetStudyEndTime;
+       private String url;
        
 
        public ServiceExecutionLog(
@@ -47,7 +48,7 @@ public class ServiceExecutionLog {
                        ServiceConfiguration serviceConfiguration, // 
DatasetLog datasetLog,
                        String purpose, Date executionStartTime, Date 
executionEndTime,
                        String dataUrl, String plotUrl,
-                       Date datasetStudyStartTime, Date datasetStudyEndTime) {
+                       Date datasetStudyStartTime, Date datasetStudyEndTime, 
String url) {
        this.climateService = climateService;
                this.user = user;
                this.serviceConfiguration = serviceConfiguration;
@@ -59,6 +60,7 @@ public class ServiceExecutionLog {
                this.dataUrl = dataUrl;
                this.datasetStudyStartTime = datasetStudyStartTime;
                this.datasetStudyEndTime = datasetStudyEndTime;
+               this.url = url;
        }
        
        public ServiceExecutionLog() {
@@ -111,6 +113,10 @@ public class ServiceExecutionLog {
        
        public Date getDatasetStudyEndTime() {
                return datasetStudyEndTime;
+       }       
+
+       public String getUrl() {
+               return url;
        }
        
        public void setId(long id) {
@@ -161,6 +167,10 @@ public class ServiceExecutionLog {
                this.datasetStudyEndTime  = datasetStudyEndTime;
        }
 
+       public void setUrl(String url) {
+               this.url = url;
+       }
+
        @Override
        public String toString() {
                return "ServiceExecutionLog [id=" + id + ", climateService="
@@ -171,6 +181,7 @@ public class ServiceExecutionLog {
                                + plotUrl + ", dataUrl=" + dataUrl 
                                + ", datasetStudyStartTime=" + 
datasetStudyStartTime
                                + ", datasetStudyEndTime=" + datasetStudyEndTime
+                               + ", url=" + url
                                + "]";
        }
 

http://git-wip-us.apache.org/repos/asf/incubator-cmda/blob/aa50efa2/ApacheCMDA_Backend_1.0/conf/routes
----------------------------------------------------------------------
diff --git a/ApacheCMDA_Backend_1.0/conf/routes 
b/ApacheCMDA_Backend_1.0/conf/routes
index ff3d46c..b59bff7 100644
--- a/ApacheCMDA_Backend_1.0/conf/routes
+++ b/ApacheCMDA_Backend_1.0/conf/routes
@@ -13,6 +13,7 @@ GET           /climateService/getAllClimateServices/json
 GET           /climateService/getAllMostRecentClimateServicesByCreateTime/json 
                         
@controllers.ClimateServiceController.getAllClimateServicesOrderByCreateTime(format:
 String="json")
 GET           
/climateService/getAllMostRecentClimateServicesByLatestAccessTime/json          
          
@controllers.ClimateServiceController.getAllClimateServicesOrderByLatestAccessTime(format:
 String="json")
 GET           /climateService/getAllMostUsedClimateServices/json               
                         
@controllers.ClimateServiceController.getAllClimateServicesOrderByCount(format: 
String="json")
+GET                      
/climateService/getTopKUsedClimateServicesByDatasetId/:id                       
                                              
@controllers.ClimateServiceController.getTopKUsedClimateServicesByDatasetId(id: 
Long, format: String="json")
 POST          /climateService/addClimateService                                
                         @controllers.ClimateServiceController.addClimateService
 GET           /climateService/getAllServiceEntries/json                        
                         
@controllers.ClimateServiceController.getAllServiceEntries(format: 
String="json")
 POST          /climateService/addServiceEntry                                  
                         @controllers.ClimateServiceController.addServiceEntry
@@ -136,5 +137,8 @@ POST                  /users/isUserValid                    
                                                                                
                                        @controllers.UserController.isUserVa
 POST             /users/isEmailExisted                                         
                                                                                
                @controllers.UserController.isEmailExisted
 DELETE           /users/delete/userName/:userName/password/:password           
                                                                
@controllers.UserController.deleteUserByUserNameandPassword(userName: String, 
password: String)
 
+# Analytics
+GET                      /analytics/getAllDatasetAndUserWithCount/json         
                                                                        
@controllers.AnalyticsController.getAllDatasetAndUserWithCount(format: 
String="json")
+
 # Map static resources from the /public folder to the /assets URL path
 GET           /assets/*file                                                    
                         controllers.Assets.at(path="/public", file)

http://git-wip-us.apache.org/repos/asf/incubator-cmda/blob/aa50efa2/ApacheCMDA_Frontend_1.0/app/controllers/AnalyticsController.java
----------------------------------------------------------------------
diff --git a/ApacheCMDA_Frontend_1.0/app/controllers/AnalyticsController.java 
b/ApacheCMDA_Frontend_1.0/app/controllers/AnalyticsController.java
index 873ecfa..75d7881 100644
--- a/ApacheCMDA_Frontend_1.0/app/controllers/AnalyticsController.java
+++ b/ApacheCMDA_Frontend_1.0/app/controllers/AnalyticsController.java
@@ -1,39 +1,14 @@
 package controllers;
 
-import java.io.BufferedWriter;
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.io.UnsupportedEncodingException;
-import java.text.DateFormat;
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map.Entry;
-
-import org.apache.commons.lang3.StringEscapeUtils;
-
-import models.ClimateService;
 import models.ServiceExecutionLog;
-import play.Logger;
-import play.data.DynamicForm;
 import play.data.Form;
-import play.libs.Json;
 import play.mvc.Controller;
 import play.mvc.Result;
 import utils.Constants;
 import utils.RESTfulCalls;
-import utils.RESTfulCalls.ResponseType;
 import views.html.*;
-import models.*;
-import views.*;
 
 import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.node.ObjectNode;
 
 public class AnalyticsController extends Controller{
 
@@ -41,6 +16,13 @@ public class AnalyticsController extends Controller{
                        .form(ServiceExecutionLog.class);
        
        
+       public static Result getKnowledgeGraph() {
+               JsonNode response = RESTfulCalls.getAPI(Constants.URL_HOST
+                               + Constants.CMU_BACKEND_PORT + 
Constants.GET_DATASET_AND_USER);
+               String resStr = response.toString();
+               return ok(knowledgeGraph.render(resStr));
+       }
+       
        public static Result getRecommend() {
                JsonNode response = 
RESTfulCalls.getAPI("http://einstein.sv.cmu.edu:9026/api/sgraph";);
                String resStr = response.toString();

http://git-wip-us.apache.org/repos/asf/incubator-cmda/blob/aa50efa2/ApacheCMDA_Frontend_1.0/app/controllers/ClimateServiceController.java
----------------------------------------------------------------------
diff --git 
a/ApacheCMDA_Frontend_1.0/app/controllers/ClimateServiceController.java 
b/ApacheCMDA_Frontend_1.0/app/controllers/ClimateServiceController.java
index f103643..e0c0739 100644
--- a/ApacheCMDA_Frontend_1.0/app/controllers/ClimateServiceController.java
+++ b/ApacheCMDA_Frontend_1.0/app/controllers/ClimateServiceController.java
@@ -12,6 +12,7 @@ import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.text.DateFormat;
+import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Date;
@@ -24,6 +25,7 @@ import static 
java.nio.file.StandardCopyOption.REPLACE_EXISTING;
 import org.apache.commons.lang3.StringEscapeUtils;
 
 import models.ClimateService;
+import models.Dataset;
 import models.ServiceConfigurationItem;
 import models.User;
 import play.Logger;
@@ -38,13 +40,14 @@ import utils.RESTfulCalls.ResponseType;
 import views.html.*;
 
 import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ObjectNode;
 
 public class ClimateServiceController extends Controller {
 
        final static Form<ClimateService> climateServiceForm = Form
-                       .form(ClimateService.class); 
-       
+                       .form(ClimateService.class);
+
        public static Result addAClimateService() {
                return ok(registerAClimateService.render(climateServiceForm));
        }
@@ -54,32 +57,17 @@ public class ClimateServiceController extends Controller {
                JsonNode climateServicesNode = 
RESTfulCalls.getAPI(Constants.URL_HOST
                                + Constants.CMU_BACKEND_PORT
                                + Constants.GET_ALL_CLIMATE_SERVICES);
-               System.out.println("GET API: " + Constants.URL_HOST
-                               + Constants.CMU_BACKEND_PORT
-                               + Constants.GET_ALL_CLIMATE_SERVICES);
                // if no value is returned or error or is not json array
                if (climateServicesNode == null || 
climateServicesNode.has("error")
                                || !climateServicesNode.isArray()) {
                        return ok(allClimateServices.render(climateServicesList,
-                               climateServiceForm));
+                                       climateServiceForm));
                }
-       
+
                // parse the json string into object
                for (int i = 0; i < climateServicesNode.size(); i++) {
                        JsonNode json = climateServicesNode.path(i);
-                       ClimateService oneService = new ClimateService();
-                       oneService.setName(json.path("name").asText());
-                       
System.out.println("****************"+json.path("name").asText());
-                       oneService.setPurpose(json.path("purpose").asText());
-                       // URL here is the dynamic page url
-                       String name = json.path("name").asText();
-                       String pageUrl = Constants.URL_SERVER + 
Constants.LOCAL_HOST_PORT + "/assets/html/service" + 
-                                       name.substring(0, 1).toUpperCase() + 
name.substring(1) + ".html";
-                       oneService.setUrl(pageUrl);
-                       // 
newService.setCreateTime(json.path("createTime").asText());
-                       oneService.setScenario(json.path("scenario").asText());
-                       
oneService.setVersionNo(json.path("versionNo").asText());
-                       
oneService.setRootServiceId(json.path("rootServiceId").asLong());
+                       ClimateService oneService = 
deserializeJsonToClimateService(json);
                        climateServicesList.add(oneService);
                }
 
@@ -88,7 +76,7 @@ public class ClimateServiceController extends Controller {
        }
 
        public static Result addClimateService() {
-//             Form<ClimateService> cs = climateServiceForm.bindFromRequest();
+               // Form<ClimateService> cs = 
climateServiceForm.bindFromRequest();
                JsonNode json = request().body().asJson();
                String name = json.path("name").asText();
                String purpose = json.path("purpose").asText();
@@ -96,7 +84,7 @@ public class ClimateServiceController extends Controller {
                String scenario = json.path("scenario").asText();
                String versionNo = json.path("version").asText();
                String rootServiceId = json.path("rootServiceId").asText();
-               
+
                JsonNode response = null;
                ObjectNode jsonData = Json.newObject();
                try {
@@ -115,21 +103,22 @@ public class ClimateServiceController extends Controller {
                                                                                
        // default val
                        jsonData.put("purpose", purpose);
                        jsonData.put("url", url);
-                       DateFormat dateFormat = new 
SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssz");
+                       DateFormat dateFormat = new SimpleDateFormat(
+                                       "yyyy-MM-dd'T'HH:mm:ssz");
                        // get current date time with Date()
                        Date date = new Date();
                        jsonData.put("createTime", dateFormat.format(date));
                        jsonData.put("scenario", scenario);
                        jsonData.put("versionNo", versionNo);
                        jsonData.put("rootServiceId", rootServiceId);
-                       
 
                        // POST Climate Service JSON data
-                       response = RESTfulCalls.postAPI(Constants.URL_HOST + 
Constants.CMU_BACKEND_PORT 
+                       response = RESTfulCalls.postAPI(Constants.URL_HOST
+                                       + Constants.CMU_BACKEND_PORT
                                        + Constants.ADD_CLIMATE_SERVICE, 
jsonData);
 
                        // flash the response message
-                       System.out.println("***************"+response);
+                       System.out.println("***************" + response);
                        Application.flashMsg(response);
                } catch (IllegalStateException e) {
                        e.printStackTrace();
@@ -148,7 +137,7 @@ public class ClimateServiceController extends Controller {
                System.out.println("JSON data: " + jsonData);
                String url = jsonData.get("climateServiceCallUrl").toString();
                System.out.println("JPL climate service model call url: " + 
url);
-               
+
                // transfer JsonNode to Object
                ObjectNode object = (ObjectNode) jsonData;
                object.remove("climateServiceCallUrl");
@@ -162,7 +151,8 @@ public class ClimateServiceController extends Controller {
 
                // flash the response message
                Application.flashMsg(response);
-               System.out      .println(ok("Climate Service model has been 
called successfully!"));
+               System.out
+                               .println(ok("Climate Service model has been 
called successfully!"));
                // return jsonData
                return ok(response);
        }
@@ -173,9 +163,11 @@ public class ClimateServiceController extends Controller {
                String name = request().body().asJson().get("name").toString();
                String purpose = 
request().body().asJson().get("purpose").toString();
                String url = request().body().asJson().get("url").toString();
-               String outputButton = 
request().body().asJson().get("pageOutput").toString();
-               String dataListContent = 
request().body().asJson().get("dataListContent").toString();
-               
+               String outputButton = 
request().body().asJson().get("pageOutput")
+                               .toString();
+               String dataListContent = request().body().asJson()
+                               .get("dataListContent").toString();
+
                System.out.println("page string: " + str);
                System.out.println("climate service name: " + name);
 
@@ -187,8 +179,7 @@ public class ClimateServiceController extends Controller {
                JsonNode response = RESTfulCalls.postAPI(Constants.URL_HOST
                                + Constants.CMU_BACKEND_PORT
                                + Constants.SAVE_CLIMATE_SERVICE_PAGE, 
jsonData);
-               
-               
+
                System.out.println("WARNING!!!!!!");
                // save page in front-end
                savePage(str, name, purpose, url, outputButton, 
dataListContent);
@@ -200,32 +191,31 @@ public class ClimateServiceController extends Controller {
 
        public static Result ruleEngineData() {
                JsonNode result = request().body().asJson();
-               //System.out.println("ticking!");  
-               System.out.println(result);             
-               
-               return ok("good");      
+               // System.out.println("ticking!");
+               System.out.println(result);
+
+               return ok("good");
        }
-       
-       
+
        public static Result addAllParameters() {
                JsonNode result = request().body().asJson();
                System.out.println(result);
                System.out.println("--------------------------");
                Iterator<JsonNode> ite = result.iterator();
-               
-               while(ite.hasNext()) {
-                       
+
+               while (ite.hasNext()) {
+
                        JsonNode tmp = ite.next();
                        System.out.println(tmp);
-                       JsonNode response = 
RESTfulCalls.postAPI(Constants.URL_HOST
-                                       + Constants.CMU_BACKEND_PORT
-                                       + Constants.ADD_ALL_PARAMETERS, tmp);
+                       JsonNode response = RESTfulCalls.postAPI(
+                                       Constants.URL_HOST + 
Constants.CMU_BACKEND_PORT
+                                                       + 
Constants.ADD_ALL_PARAMETERS, tmp);
                        System.out.println("=========" + response);
                }
-               
-               return ok("good");      
+
+               return ok("good");
        }
-       
+
        public static void savePage(String str, String name, String purpose,
                        String url, String outputButton, String 
dataListContent) {
                System.out.println("output button test: " + outputButton);
@@ -234,24 +224,25 @@ public class ClimateServiceController extends Controller {
                                .replaceAll(
                                                "<td><button 
type=\\\\\"button\\\\\" class=\\\\\"btn btn-danger\\\\\" 
onclick=\\\\\"Javascript:deleteRow\\(this,\\d+\\)\\\\\">delete</button></td>",
                                                "");
-               
+
                dataListContent = 
StringEscapeUtils.unescapeJava(dataListContent);
                result = StringEscapeUtils.unescapeJava(result);
                outputButton = StringEscapeUtils.unescapeJava(outputButton);
                System.out.println("output button test: " + outputButton);
-               
+
                // remove the first char " and the last char " of result, name 
and
                // purpose
-               dataListContent = dataListContent.substring(1, 
dataListContent.length() - 1);
+               dataListContent = dataListContent.substring(1,
+                               dataListContent.length() - 1);
                result = result.substring(1, result.length() - 1);
                outputButton = outputButton.substring(1, outputButton.length() 
- 1);
-               
+
                name = name.substring(1, name.length() - 1);
                purpose = purpose.substring(1, purpose.length() - 1);
-               
+
                String putVarAndDataList = Constants.putVar + dataListContent;
                System.out.println("putVarAndDataList: " + putVarAndDataList);
-               
+
                String str11 = Constants.htmlHead1;
                // System.out.println("head1: " + str11);
                String str12 = Constants.htmlHead2;
@@ -264,8 +255,9 @@ public class ClimateServiceController extends Controller {
                String str22 = Constants.htmlTail2;
                String str23 = Constants.htmlTail3;
 
-               result = str11 +putVarAndDataList+ str12 + name + str13 + 
purpose + str14 + result + str21
-                               + url.substring(1, url.length() - 1) + str22 + 
outputButton + str23;
+               result = str11 + putVarAndDataList + str12 + name + str13 + 
purpose
+                               + str14 + result + str21 + url.substring(1, 
url.length() - 1)
+                               + str22 + outputButton + str23;
 
                name = name.replace(" ", "");
 
@@ -275,7 +267,7 @@ public class ClimateServiceController extends Controller {
                                + ".html";
 
                File theDir = new File("public/html");
-               
+
                // if the directory does not exist, create it
                if (!theDir.exists()) {
                        System.out.println("creating directory: public/html");
@@ -305,6 +297,7 @@ public class ClimateServiceController extends Controller {
                        e.printStackTrace();
                }
        }
+
        public static void flashMsg(JsonNode jsonNode) {
                Iterator<Entry<String, JsonNode>> it = jsonNode.fields();
                while (it.hasNext()) {
@@ -312,15 +305,14 @@ public class ClimateServiceController extends Controller {
                        flash(field.getKey(), field.getValue().asText());
                }
        }
-       
+
        public static Result mostRecentlyAddedClimateServices() {
-               
+
                List<ClimateService> climateServices = new 
ArrayList<ClimateService>();
 
-               JsonNode climateServicesNode = RESTfulCalls
-                               .getAPI(Constants.URL_HOST
-                                               + Constants.CMU_BACKEND_PORT
-                                               + 
Constants.GET_MOST_RECENTLY_ADDED_CLIMATE_SERVICES_CALL);
+               JsonNode climateServicesNode = 
RESTfulCalls.getAPI(Constants.URL_HOST
+                               + Constants.CMU_BACKEND_PORT
+                               + 
Constants.GET_MOST_RECENTLY_ADDED_CLIMATE_SERVICES_CALL);
 
                // if no value is returned or error or is not json array
                if (climateServicesNode == null || 
climateServicesNode.has("error")
@@ -331,33 +323,19 @@ public class ClimateServiceController extends Controller {
                // parse the json string into object
                for (int i = 0; i < climateServicesNode.size(); i++) {
                        JsonNode json = climateServicesNode.path(i);
-                       ClimateService newService = new ClimateService();
-                       newService.setId(json.get("id").asLong());
-                       newService.setName(json.get("name").asText());
-                       
newService.setPurpose(json.findPath("purpose").asText());
-                       //newService.setUrl(json.findPath("url").asText());
-                       String name = json.path("name").asText();
-                       String pageUrl = Constants.URL_SERVER + 
Constants.LOCAL_HOST_PORT + "/assets/html/service" + 
-                                       name.substring(0, 1).toUpperCase() + 
name.substring(1) + ".html";
-                       newService.setUrl(pageUrl);
-                       
//newService.setCreateTime(json.findPath("createTime").asText());
-                       
newService.setScenario(json.findPath("scenario").asText());
-                       
newService.setVersionNo(json.findPath("versionNo").asText());
-                       
newService.setRootServiceId(json.findPath("rootServiceId").asLong());
+                       ClimateService newService = 
deserializeJsonToClimateService(json);
                        climateServices.add(newService);
                }
-               
+
                return ok(mostRecentlyAddedServices.render(climateServices));
        }
-       
-       
-       
-       
+
        public static Result mostPopularServices() {
                List<ClimateService> climateServices = new 
ArrayList<ClimateService>();
 
-               JsonNode climateServicesNode = RESTfulCalls
-                               .getAPI(Constants.URL_HOST + 
Constants.CMU_BACKEND_PORT + Constants.GET_MOST_POPULAR_CLIMATE_SERVICES_CALL);
+               JsonNode climateServicesNode = 
RESTfulCalls.getAPI(Constants.URL_HOST
+                               + Constants.CMU_BACKEND_PORT
+                               + 
Constants.GET_MOST_POPULAR_CLIMATE_SERVICES_CALL);
 
                // if no value is returned or error or is not json array
                if (climateServicesNode == null || 
climateServicesNode.has("error")
@@ -368,33 +346,101 @@ public class ClimateServiceController extends Controller 
{
                // parse the json string into object
                for (int i = 0; i < climateServicesNode.size(); i++) {
                        JsonNode json = climateServicesNode.path(i);
-                       ClimateService newService = new ClimateService();
-                       newService.setId(json.get("id").asLong());
-                       newService.setName(json.get("name").asText());
-                       
newService.setPurpose(json.findPath("purpose").asText());
-                       //newService.setUrl(json.findPath("url").asText());
-                       String name = json.path("name").asText();
-                       String pageUrl = Constants.URL_SERVER + 
Constants.LOCAL_HOST_PORT + "/assets/html/service" + 
-                                       name.substring(0, 1).toUpperCase() + 
name.substring(1) + ".html";
-                       newService.setUrl(pageUrl);
-                       
//newService.setCreateTime(json.findPath("createTime").asText());
-                       
newService.setScenario(json.findPath("scenario").asText());
-                       
newService.setVersionNo(json.findPath("versionNo").asText());
-                       
newService.setRootServiceId(json.findPath("rootServiceId").asLong());
+                       ClimateService newService = 
deserializeJsonToClimateService(json);
                        climateServices.add(newService);
                }
-               
+
                return ok(mostPopularServices.render(climateServices));
        }
        
-       public static Result mostRecentlyUsedClimateServices() {
+       public static Result recommendationSummary() {
+               List<ClimateService> climateServices = new 
ArrayList<ClimateService>();
                
+               List<Dataset> dataSetsList = new ArrayList<Dataset>();
+               
+               List<User> usersList = new ArrayList<User>();
+               
+               JsonNode usersNode = RESTfulCalls.getAPI(Constants.URL_HOST
+                               + Constants.CMU_BACKEND_PORT
+                               + Constants.GET_ALL_USERS);
+               
+               // if no value is returned or error or is not json array
+               if (usersNode == null || usersNode.has("error")
+                               || !usersNode.isArray()) {
+                       return ok(recommendationSummary.render(climateServices, 
dataSetsList, usersList));
+               }
+
+               
+//             JsonNode dataSetsNode = RESTfulCalls.getAPI(Constants.URL_HOST
+//                             + Constants.CMU_BACKEND_PORT
+//                             + Constants.GET_ALL_DATASETS);
+//             
+//             System.out.println("GET API: " + Constants.URL_HOST
+//                             + Constants.CMU_BACKEND_PORT
+//                             + Constants.GET_ALL_DATASETS);
+
+               JsonNode climateServicesNode = 
RESTfulCalls.getAPI(Constants.URL_HOST
+                               + Constants.CMU_BACKEND_PORT
+                               + 
Constants.GET_MOST_POPULAR_CLIMATE_SERVICES_CALL);
+
+               // if no value is returned or error or is not json array
+               if (climateServicesNode == null || 
climateServicesNode.has("error")
+                               || !climateServicesNode.isArray()) {
+                       return ok(recommendationSummary.render(climateServices, 
dataSetsList, usersList));
+               }
+               
+//             // if no value is returned or error or is not json array
+//             if (dataSetsNode == null || dataSetsNode.has("error")
+//                             || !dataSetsNode.isArray()) {
+//                     System.out.println("All oneDatasets format has error!");
+//                     return ok(recommendationSummary.render(climateServices, 
dataSetsList));
+//             }
+
+               // parse the json string into object
+               for (int i = 0; i < climateServicesNode.size(); i++) {
+                       JsonNode json = climateServicesNode.path(i);
+                       ClimateService newService = 
deserializeJsonToClimateService(json);
+                       climateServices.add(newService);
+               }               
+
+//             // parse the json string into object
+//             for (int i = 0; i < dataSetsNode.size(); i++) {
+//                     JsonNode json = dataSetsNode.path(i);
+//                     Dataset oneDataset = 
DatasetController.deserializeJsonToDataSet(json);
+//                     dataSetsList.add(oneDataset);
+//             }
+               
+               
+               // parse the json string into object
+               for (int i = 0; i < usersNode.size(); i++) {
+                       JsonNode json = usersNode.path(i);
+                       User oneUser = new User();
+                       oneUser.setId(json.findPath("id").asLong());
+                       oneUser.setUserName(json.findPath("userName").asText());
+                       oneUser.setPassword(json.findPath("password").asText());
+                       
oneUser.setFirstName(json.findPath("firstName").asText());
+                       
oneUser.setMiddleInitial(json.findPath("middleInitial").asText());
+                       oneUser.setLastName(json.findPath("lastName").asText());
+                       
oneUser.setAffiliation(json.findPath("affiliation").asText());
+                       oneUser.setEmail(json.findPath("email").asText());
+                       
oneUser.setResearchFields(json.findPath("researchFields").asText());
+                       
+                       usersList.add(oneUser);
+               }
+
+               int k = Integer.MAX_VALUE; // Set the first popular K datasets
+               dataSetsList = 
DatasetController.queryFirstKDatasetsWithoutClimateService("", "", "", "", "", 
new Date(0), new Date(), k);
+               return ok(recommendationSummary.render(climateServices, 
dataSetsList, usersList));
+       }
+
+       public static Result mostRecentlyUsedClimateServices() {
+
                List<ClimateService> climateServices = new 
ArrayList<ClimateService>();
 
                JsonNode climateServicesNode = 
RESTfulCalls.getAPI(Constants.URL_HOST
                                + Constants.CMU_BACKEND_PORT
                                + 
Constants.GET_MOST_RECENTLY_USED_CLIMATE_SERVICES_CALL);
-               
+
                // if no value is returned or error or is not json array
                if (climateServicesNode == null || 
climateServicesNode.has("error")
                                || !climateServicesNode.isArray()) {
@@ -404,110 +450,182 @@ public class ClimateServiceController extends 
Controller {
                // parse the json string into object
                for (int i = 0; i < climateServicesNode.size(); i++) {
                        JsonNode json = climateServicesNode.path(i);
-                       ClimateService newService = new ClimateService();
-                       newService.setId(json.get("id").asLong());
-                       newService.setName(json.get("name").asText());
-                       
newService.setPurpose(json.findPath("purpose").asText());
-                       
-                       String name = json.path("name").asText();
-                       String pageUrl = Constants.URL_SERVER + 
Constants.LOCAL_HOST_PORT + "/assets/html/service" + 
-                                       name.substring(0, 1).toUpperCase() + 
name.substring(1) + ".html";
-                       newService.setUrl(pageUrl);
-                       
-                       
newService.setScenario(json.findPath("scenario").asText());
-                       
newService.setVersionNo(json.findPath("versionNo").asText());
-                       
newService.setRootServiceId(json.findPath("rootServiceId").asLong());
+                       ClimateService newService = 
deserializeJsonToClimateService(json);
                        climateServices.add(newService);
                }
-               
+
                return ok(mostRecentlyUsedServices.render(climateServices));
        }
-       
+
        public static Result replaceFile() {
-               File result =  request().body().asRaw().asFile();
-               System.out.println("result: " + 
request().body().asRaw().asFile());
-               
-//             String content = readFile(result.getName(), 
StandardCharsets.UTF_8);
-               System.out.println("result body: "+result.toString());
-               
-               String line = "";
-           try {
-               BufferedReader br = new BufferedReader(new 
FileReader(result.getAbsolutePath()));
-               StringBuilder sb = new StringBuilder();
-               line = br.readLine();
-               int count = 0;
-               while (line != null && count < 22) {
-                   sb.append(line);
-                   sb.append("\n");
-                   line = br.readLine();                 
-                   count++;
-               }
-               br.close();
-           } catch (FileNotFoundException e) {
+               File result = request().body().asRaw().asFile();
+               System.out.println("result: " + 
request().body().asRaw().asFile());
+
+               // String content = readFile(result.getName(), 
StandardCharsets.UTF_8);
+               System.out.println("result body: " + result.toString());
+
+               String line = "";
+               try {
+                       BufferedReader br = new BufferedReader(new FileReader(
+                                       result.getAbsolutePath()));
+                       StringBuilder sb = new StringBuilder();
+                       line = br.readLine();
+                       int count = 0;
+                       while (line != null && count < 22) {
+                               sb.append(line);
+                               sb.append("\n");
+                               line = br.readLine();
+                               count++;
+                       }
+                       br.close();
+               } catch (FileNotFoundException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
-               } 
-           
-           //TEMPOARY SOLUTION : get the fileName from the html page
-           String tempName = line.substring(24, line.length()-5);              
  
-           String fileName = "public/html/service" + tempName.substring(0, 
1).toUpperCase() + tempName.substring(1)+ ".html";
-           System.out.println("fileName: " + fileName);
-               
-               //replace the page in the frontend Server
-               try {                           
-                       Path newPath = Paths.get(fileName);
-                       Files.move(result.toPath(), newPath, REPLACE_EXISTING);
-               } catch (FileNotFoundException e) {
+               }
+
+               // TEMPOARY SOLUTION : get the fileName from the html page
+               String tempName = line.substring(24, line.length() - 5);
+               String fileName = "public/html/service"
+                               + tempName.substring(0, 1).toUpperCase()
+                               + tempName.substring(1) + ".html";
+               System.out.println("fileName: " + fileName);
+
+               // replace the page in the frontend Server
+               try {
+                       Path newPath = Paths.get(fileName);
+                       Files.move(result.toPath(), newPath, REPLACE_EXISTING);
+               } catch (FileNotFoundException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
-               } 
-               //executeReplace(result);               
-               
-               
-               return ok("File uploaded");
+               }
+               // executeReplace(result);
+
+               return ok("File uploaded");
        }
 
-public static void executeReplace(String result) {
-       
-       try {
-               String path = "public/html/se.html";                    
-               File theDir = new File("public/html");          
-               
-               // if the directory does not exist, create it
-               if (!theDir.exists()) {
-                       System.out.println("creating directory: public/html");
-                       boolean create = false;
+       public static void executeReplace(String result) {
 
-                       try {
-                               theDir.mkdir();
-                               create = true;
-                       } catch (SecurityException se) {
-                               // handle it
-                       }
-                       if (create) {
-                               System.out.println("DIR created");
+               try {
+                       String path = "public/html/se.html";
+                       File theDir = new File("public/html");
+
+                       // if the directory does not exist, create it
+                       if (!theDir.exists()) {
+                               System.out.println("creating directory: 
public/html");
+                               boolean create = false;
+
+                               try {
+                                       theDir.mkdir();
+                                       create = true;
+                               } catch (SecurityException se) {
+                                       // handle it
+                               }
+                               if (create) {
+                                       System.out.println("DIR created");
+                               }
                        }
+
+                       File file = new File(path);
+                       BufferedWriter output = new BufferedWriter(new 
FileWriter(file));
+                       output.write(result);
+                       output.close();
+                       
System.out.println("Beeping!!!!!!!!!!!!!!!!!!!!!!!!!!!");
+               } catch (FileNotFoundException e) {
+                       // TODO Auto-generated catch block
+                       e.printStackTrace();
+               } catch (IOException e) {
+                       // TODO Auto-generated catch block
+                       e.printStackTrace();
                }
+       }
+       
+       public static ClimateService deserializeJsonToClimateService(JsonNode 
json) {
                
+               ClimateService oneService = new ClimateService();
+               oneService.setName(json.path("name").asText());
+               oneService.setPurpose(json.path("purpose").asText());
+               // URL here is the dynamic page url
+               String name = json.path("name").asText();
+               String url = json.path("url").asText();
+               // Parse NASA URL
+               if (url.contains("/cmac/web")) {
+                       oneService.setUrl(url);
+               } else {
+                       String pageUrl = Constants.URL_SERVER
+                                       + Constants.LOCAL_HOST_PORT + 
"/assets/html/service"
+                                       + name.substring(0, 1).toUpperCase()
+                                       + name.substring(1) + ".html";
+                       oneService.setUrl(pageUrl);
+               }
+               // newService.setCreateTime(json.path("createTime").asText());
+               oneService.setScenario(json.path("scenario").asText());
+               oneService.setVersionNo(json.path("versionNo").asText());
+               
oneService.setRootServiceId(json.path("rootServiceId").asLong());
                
-               File file = new File(path);
-               BufferedWriter output = new BufferedWriter(new 
FileWriter(file));                       
-               output.write(result);                   
-               output.close();
-               System.out.println("Beeping!!!!!!!!!!!!!!!!!!!!!!!!!!!");
-       } catch (FileNotFoundException e) {
-               // TODO Auto-generated catch block
-               e.printStackTrace();
-       } catch (IOException e) {
-               // TODO Auto-generated catch block
-               e.printStackTrace();
-       } 
-}
+               return oneService;
+       }
        
+       // Get all climate Services
+       public static Result searchClimateServices() {
+               return ok(searchClimateService.render(climateServiceForm));
+       }
+
+
+       public static Result getSearchResult(){
+               Form<ClimateService> cs = climateServiceForm.bindFromRequest();
+               ObjectNode jsonData = Json.newObject();
+               
+               String name = "";
+               String purpose = "";
+               String scenario = "";
+               String url = "";
+               String versionNo = "";
+               
+               try {
+                       name = cs.field("Climate Service Name").value();
+                       purpose = cs.field("Purpose").value();
+                       url = cs.field("Url").value();
+                       scenario = cs.field("Scenario").value();
+                       versionNo = cs.field("Version Number").value();
+               
+               } catch (IllegalStateException e) {
+                       e.printStackTrace();
+                       Application.flashMsg(RESTfulCalls
+                                       
.createResponse(ResponseType.CONVERSIONERROR));
+               } catch (Exception e) {
+                       e.printStackTrace();
+                       
Application.flashMsg(RESTfulCalls.createResponse(ResponseType.UNKNOWN));
+               }
+
+               List<ClimateService> response = queryClimateService(name, 
purpose, url, scenario, versionNo);
+               return ok(climateServiceList.render(response));
+       }
+       
+public static List<ClimateService> queryClimateService(String name, String 
purpose, String url, String scenario, String versionNo) {
+               
+               List<ClimateService> climateService = new 
ArrayList<ClimateService>();
+               ObjectMapper mapper = new ObjectMapper();
+               ObjectNode queryJson = mapper.createObjectNode();
+               queryJson.put("name", name);
+               queryJson.put("purpose", purpose);
+               queryJson.put("url", url);
+               queryJson.put("scenario", scenario);
+               queryJson.put("versionNo", versionNo);
+               
+               JsonNode climateServiceNode = 
RESTfulCalls.postAPI(Constants.URL_HOST
+                               + Constants.CMU_BACKEND_PORT + 
Constants.QUERY_CLIMATE_SERVICE, queryJson);
+               // parse the json string into object
+               for (int i = 0; i < climateServiceNode.size(); i++) {
+                       JsonNode json = climateServiceNode.path(i);
+                       ClimateService newClimateService = 
deserializeJsonToClimateService(json);
+                       climateService.add(newClimateService);
+               }
+               return climateService;
+       }
 }

http://git-wip-us.apache.org/repos/asf/incubator-cmda/blob/aa50efa2/ApacheCMDA_Frontend_1.0/app/controllers/DatasetController.java
----------------------------------------------------------------------
diff --git a/ApacheCMDA_Frontend_1.0/app/controllers/DatasetController.java 
b/ApacheCMDA_Frontend_1.0/app/controllers/DatasetController.java
index 6f9d711..9a0d6dd 100644
--- a/ApacheCMDA_Frontend_1.0/app/controllers/DatasetController.java
+++ b/ApacheCMDA_Frontend_1.0/app/controllers/DatasetController.java
@@ -7,6 +7,7 @@ import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 
+import models.ClimateService;
 import models.Dataset;
 
 import org.joda.time.DateTime;
@@ -36,14 +37,16 @@ public class DatasetController extends Controller {
                return ok(searchDataSet.render(dataSetForm));
        }
        
+       public static Result mostPopularDatasets() {
+               List<Dataset> datasets = 
queryFirstKDatasetsWithoutClimateService("", "", "", "", "", new Date(0), new 
Date(), Integer.MAX_VALUE);
+               return ok(dataSetListPopular.render(dataSetForm, datasets));
+       }
+       
        public static Result showAllDatasets() {
                List<Dataset> dataSetsList = new ArrayList<Dataset>();
                JsonNode dataSetsNode = RESTfulCalls.getAPI(Constants.URL_HOST
                                + Constants.CMU_BACKEND_PORT
                                + Constants.GET_ALL_DATASETS);
-               System.out.println("GET API: " + Constants.URL_HOST
-                               + Constants.CMU_BACKEND_PORT
-                               + Constants.GET_ALL_DATASETS);
                // if no value is returned or error or is not json array
                if (dataSetsNode == null || dataSetsNode.has("error")
                                || !dataSetsNode.isArray()) {
@@ -129,7 +132,7 @@ public class DatasetController extends Controller {
                }
 
                List<Dataset> response = queryDataSet(dataSetName, agency, 
instrument, physicalVariable, gridDimension, dataSetStartTime, dataSetEndTime);
-               int k = 5;
+               int k = 5; // Set the first popular K datasets
                List<Dataset> datasetsTopK = queryFirstKDatasets(dataSetName, 
agency, instrument, physicalVariable, gridDimension, dataSetStartTime, 
dataSetEndTime, k);
                return ok(dataSetList.render(response, dataSetForm, 
datasetsTopK));
        }
@@ -194,12 +197,55 @@ public static List<Dataset> queryFirstKDatasets(String 
dataSetName, String agenc
        for (int i = 0; i < dataSetNode.size(); i++) {
                JsonNode json = dataSetNode.path(i);
                Dataset newDataSet = deserializeJsonToDataSet(json);
+               long id = newDataSet.getId();
+               JsonNode climateSetNode = RESTfulCalls.getAPI(Constants.URL_HOST
+                               + Constants.CMU_BACKEND_PORT + 
Constants.GET_TOP_K_USED_CLIMATE_SERVICES_BY_DATASET_ID + "/" + id);
+               List<ClimateService> climateServices = new 
ArrayList<ClimateService>();
+               for (int j = 0; j < climateSetNode.size(); j++) {
+                       JsonNode json1 = climateSetNode.path(j);
+                       ClimateService oneService = 
ClimateServiceController.deserializeJsonToClimateService(json1);
+                       climateServices.add(oneService);
+               }
+               newDataSet.setClimateServices(climateServices);
                dataset.add(newDataSet);
        }
        return dataset;
 }
+       
+       public static List<Dataset> 
queryFirstKDatasetsWithoutClimateService(String dataSetName, String agency, 
String instrument, String physicalVariable, String gridDimension, Date 
dataSetStartTime, Date dataSetEndTime, int k) {
+               
+               List<Dataset> dataset = new ArrayList<Dataset>();
+               ObjectMapper mapper = new ObjectMapper();
+               ObjectNode queryJson = mapper.createObjectNode();
+               queryJson.put("name", dataSetName);
+               queryJson.put("agencyId", agency);
+               queryJson.put("instrument", instrument);
+               queryJson.put("physicalVariable", physicalVariable);
+               queryJson.put("gridDimension", gridDimension);
+               queryJson.put("k", k);
+               if (dataSetEndTime != null) {
+                       queryJson.put("dataSetEndTime", 
dataSetEndTime.getTime());
+               }
+               if (dataSetStartTime != null) {
+                       queryJson.put("dataSetStartTime", 
dataSetStartTime.getTime());
+               }
+               JsonNode dataSetNode = RESTfulCalls.postAPI(Constants.URL_HOST
+                               + Constants.CMU_BACKEND_PORT + 
Constants.GET_MOST_K_POPULAR_DATASETS_CALL, queryJson);
+               if (dataSetNode == null || dataSetNode.has("error")
+                               || !dataSetNode.isArray()) {
+                       return dataset;
+               }
+       
+               // parse the json string into object
+               for (int i = 0; i < dataSetNode.size(); i++) {
+                       JsonNode json = dataSetNode.path(i);
+                       Dataset newDataSet = deserializeJsonToDataSet(json);
+                       dataset.add(newDataSet);
+               }
+               return dataset;
+       }
 
-       private static Dataset deserializeJsonToDataSet(JsonNode json) {
+       public static Dataset deserializeJsonToDataSet(JsonNode json) {
                Dataset newDataSet = new Dataset();
                newDataSet.setId(json.get("id").asLong());
                newDataSet.setName(json.get("name").asText());
@@ -212,14 +258,14 @@ public static List<Dataset> queryFirstKDatasets(String 
dataSetName, String agenc
                newDataSet.setSource(json.get("source").asText());
                newDataSet.setStatus(json.get("status").asText());
                
newDataSet.setResponsiblePerson(json.get("responsiblePerson").asText());
-       //      dataset.setComments(json.get(""));
                
newDataSet.setDataSourceNameinWebInterface(json.get("dataSourceNameinWebInterface").asText());
-       //      Console.print("aaa"+dataset.getDataSourceName());
                
newDataSet.setVariableNameInWebInterface(json.get("variableNameInWebInterface").asText());
                
newDataSet.setDataSourceInputParameterToCallScienceApplicationCode(json.get("dataSourceInputParameterToCallScienceApplicationCode").asText());
                
newDataSet.setVariableNameInputParameterToCallScienceApplicationCode(json.get("variableNameInputParameterToCallScienceApplicationCode").asText());
-               String startTime = json.findPath("startTime").asText();
-               String endTime = json.findPath("endTime").asText();
+               newDataSet.setAgencyURL(json.findPath("agencyURL").asText());
+               
newDataSet.setInstrumentURL(json.findPath("instrument").findPath("instrumentURL").asText());
+               String startTime = json.get("startTime").asText();
+               String endTime = json.get("endTime").asText();
                Date tmpStartTime = null;
                Date tmpEndTime = null;
                
@@ -230,6 +276,7 @@ public static List<Dataset> queryFirstKDatasets(String 
dataSetName, String agenc
                                newDataSet.setStartTime(new 
SimpleDateFormat("YYYY-MM").format(tmpStartTime));
                        }
            } catch (ParseException e){     
+               System.out.println(e);
            }
                
                try {
@@ -239,7 +286,7 @@ public static List<Dataset> queryFirstKDatasets(String 
dataSetName, String agenc
                                newDataSet.setEndTime(new 
SimpleDateFormat("YYYY-MM").format(tmpEndTime));
                        }
            } catch (ParseException e){     
-               
+               System.out.println(e);
            }
                
                DateTime dateTimeFrom = new DateTime(tmpStartTime);  
@@ -255,4 +302,5 @@ public static List<Dataset> queryFirstKDatasets(String 
dataSetName, String agenc
                
                return newDataSet;
        }
+       
 }

http://git-wip-us.apache.org/repos/asf/incubator-cmda/blob/aa50efa2/ApacheCMDA_Frontend_1.0/app/controllers/DatasetLogController.java
----------------------------------------------------------------------
diff --git a/ApacheCMDA_Frontend_1.0/app/controllers/DatasetLogController.java 
b/ApacheCMDA_Frontend_1.0/app/controllers/DatasetLogController.java
index 7906d85..4839883 100644
--- a/ApacheCMDA_Frontend_1.0/app/controllers/DatasetLogController.java
+++ b/ApacheCMDA_Frontend_1.0/app/controllers/DatasetLogController.java
@@ -59,7 +59,7 @@ public class DatasetLogController extends Controller {
                        tmpTime = (new SimpleDateFormat("MMM dd, yyyy hh:mm:ss 
a")).parse(datasetStudyStartTime);
                        
                        if (tmpTime != null) {
-                               newDatasetLog.setDatasetStudyStartTime(new 
SimpleDateFormat("YYYYMM").format(tmpTime));
+                               newDatasetLog.setDatasetStudyStartTime(new 
SimpleDateFormat("YYYY-MM").format(tmpTime));
                        }
            } catch (ParseException e){     
 //             e.printStackTrace();
@@ -69,7 +69,7 @@ public class DatasetLogController extends Controller {
                        tmpTime = (new SimpleDateFormat("MMM dd, yyyy hh:mm:ss 
a")).parse(datasetStudyEndTime);
                        
                        if (tmpTime != null) {
-                               newDatasetLog.setDatasetStudyEndTime(new 
SimpleDateFormat("YYYYMM").format(tmpTime));
+                               newDatasetLog.setDatasetStudyEndTime(new 
SimpleDateFormat("YYYY-MM").format(tmpTime));
                        }
            } catch (ParseException e){     
 //             e.printStackTrace();

http://git-wip-us.apache.org/repos/asf/incubator-cmda/blob/aa50efa2/ApacheCMDA_Frontend_1.0/app/controllers/ServiceExecutionLogController.java
----------------------------------------------------------------------
diff --git 
a/ApacheCMDA_Frontend_1.0/app/controllers/ServiceExecutionLogController.java 
b/ApacheCMDA_Frontend_1.0/app/controllers/ServiceExecutionLogController.java
index 847b0f9..163146f 100644
--- a/ApacheCMDA_Frontend_1.0/app/controllers/ServiceExecutionLogController.java
+++ b/ApacheCMDA_Frontend_1.0/app/controllers/ServiceExecutionLogController.java
@@ -374,7 +374,8 @@ public class ServiceExecutionLogController extends 
Controller {
                ServiceExecutionLog newServiceLog = new ServiceExecutionLog();
                newServiceLog.setId(json.get("id").asLong());
                
newServiceLog.setServiceId(json.get("climateService").get("id").asLong());
-               
newServiceLog.setServiceName(json.get("climateService").get("name").asText());
+               String serviceName = 
json.get("climateService").get("name").asText();
+               newServiceLog.setServiceName(serviceName);
                newServiceLog.setPurpose(json.get("purpose").asText());
                
newServiceLog.setUserName(json.get("user").get("firstName").asText()
                                + " " + 
json.get("user").get("lastName").asText());
@@ -407,7 +408,7 @@ public class ServiceExecutionLogController extends 
Controller {
                        tmpTime = (new SimpleDateFormat("MMM dd, yyyy hh:mm:ss 
a")).parse(datasetStudyStartTime);
                        
                        if (tmpTime != null) {
-                               newServiceLog.setDataSetStartTime(new 
SimpleDateFormat("YYYYMM").format(tmpTime));
+                               newServiceLog.setDataSetStartTime(new 
SimpleDateFormat("YYYY-MM").format(tmpTime));
                        }
            } catch (ParseException e){     
 //             e.printStackTrace();
@@ -417,13 +418,20 @@ public class ServiceExecutionLogController extends 
Controller {
                        tmpTime = (new SimpleDateFormat("MMM dd, yyyy hh:mm:ss 
a")).parse(datasetStudyEndTime);
                        
                        if (tmpTime != null) {
-                               newServiceLog.setDataSetEndTime(new 
SimpleDateFormat("YYYYMM").format(tmpTime));
+                               newServiceLog.setDataSetEndTime(new 
SimpleDateFormat("YYYY-MM").format(tmpTime));
                        }
            } catch (ParseException e){     
 //             e.printStackTrace();
            }
                
                
newServiceLog.setDatasetLogId(json.findPath("datasetLogId").asText());
+               if(json.get("url") != null) {
+                       String pageUrl = Constants.URL_SERVER
+                                       + Constants.LOCAL_HOST_PORT + 
"/assets/html/service"
+                                       + serviceName.substring(0, 
1).toUpperCase()
+                                       + serviceName.substring(1) + ".html" + 
json.get("url").asText();
+                       newServiceLog.setUrl(pageUrl);
+               }
                
                return newServiceLog;
        }

http://git-wip-us.apache.org/repos/asf/incubator-cmda/blob/aa50efa2/ApacheCMDA_Frontend_1.0/app/models/Dataset.java
----------------------------------------------------------------------
diff --git a/ApacheCMDA_Frontend_1.0/app/models/Dataset.java 
b/ApacheCMDA_Frontend_1.0/app/models/Dataset.java
index f8f4482..d72cfc3 100644
--- a/ApacheCMDA_Frontend_1.0/app/models/Dataset.java
+++ b/ApacheCMDA_Frontend_1.0/app/models/Dataset.java
@@ -44,6 +44,9 @@ public class Dataset {
        private String startTime;
        private String endTime;
        private String duration;
+       private String agencyURL;
+       private String instrumentURL;
+       private List<ClimateService> climateServices;
 
        public Dataset() {
        }
@@ -56,7 +59,7 @@ public class Dataset {
                        String responsiblePerson, String 
variableNameInWebInterface,
                        String 
dataSourceInputParameterToCallScienceApplicationCode,
                        String 
variableNameInputParameterToCallScienceApplicationCode,
-                       String comment, String duration) {
+                       String comment, String duration, String agencyURL, 
String instrumentURL, List<ClimateService> climateServices) {
                super();
                this.name = name;
                this.dataSourceNameinWebInterface = 
dataSourceNameinWebInterface;
@@ -77,6 +80,33 @@ public class Dataset {
                this.variableNameInputParameterToCallScienceApplicationCode = 
variableNameInputParameterToCallScienceApplicationCode;
                this.comment = comment;
                this.duration = duration;
+               this.agencyURL = agencyURL;
+               this.instrumentURL = instrumentURL;
+               this.climateServices = climateServices;
+       }
+
+       public List<ClimateService> getClimateServices() {
+               return climateServices;
+       }
+
+       public void setClimateServices(List<ClimateService> climateServices) {
+               this.climateServices = climateServices;
+       }
+
+       public String getInstrumentURL() {
+               return instrumentURL;
+       }
+
+       public void setInstrumentURL(String instrumentURL) {
+               this.instrumentURL = instrumentURL;
+       }
+
+       public String getAgencyURL() {
+               return agencyURL;
+       }
+
+       public void setAgencyURL(String agencyURL) {
+               this.agencyURL = agencyURL;
        }
 
        public String getDuration() {

http://git-wip-us.apache.org/repos/asf/incubator-cmda/blob/aa50efa2/ApacheCMDA_Frontend_1.0/app/models/Instrument.java
----------------------------------------------------------------------
diff --git a/ApacheCMDA_Frontend_1.0/app/models/Instrument.java 
b/ApacheCMDA_Frontend_1.0/app/models/Instrument.java
index 71a0094..90ac4c1 100644
--- a/ApacheCMDA_Frontend_1.0/app/models/Instrument.java
+++ b/ApacheCMDA_Frontend_1.0/app/models/Instrument.java
@@ -15,6 +15,7 @@ public class Instrument {
        private String name;
        private String description;
        private Date launchDate;
+       private String instrumentURL;
        
        public Instrument() {
        }
@@ -25,6 +26,14 @@ public class Instrument {
                this.description = description;
                this.launchDate = launchDate;
        }
+       
+       public String getInstrumentURL() {
+               return instrumentURL;
+       }
+
+       public void setInstrumentURL(String instrumentURL) {
+               this.instrumentURL = instrumentURL;
+       }
 
        public long getId() {
                return id;

http://git-wip-us.apache.org/repos/asf/incubator-cmda/blob/aa50efa2/ApacheCMDA_Frontend_1.0/app/models/ServiceExecutionLog.java
----------------------------------------------------------------------
diff --git a/ApacheCMDA_Frontend_1.0/app/models/ServiceExecutionLog.java 
b/ApacheCMDA_Frontend_1.0/app/models/ServiceExecutionLog.java
index aff9e87..fa08477 100644
--- a/ApacheCMDA_Frontend_1.0/app/models/ServiceExecutionLog.java
+++ b/ApacheCMDA_Frontend_1.0/app/models/ServiceExecutionLog.java
@@ -15,6 +15,8 @@ public class ServiceExecutionLog {
        private String serviceName;
        private String dataSetStartTime;
        private String dataSetEndTime;
+       private String url;
+
 
        public long getId() {
                return id;
@@ -55,6 +57,10 @@ public class ServiceExecutionLog {
        public String getDataUrl() {
                return dataUrl;
        }
+       
+       public String getUrl() {
+               return url;
+       }
 
        public void setId(long id) {
                this.id = id;
@@ -120,6 +126,10 @@ public class ServiceExecutionLog {
                this.dataSetEndTime = dataSetEndTime;
        }
        
+       public void setUrl(String url) {
+               this.url = url;
+       }
+       
        @Override
        public String toString() {
                return "ServiceExecutionLog [id=" + id + ", serviceId="
@@ -127,6 +137,7 @@ public class ServiceExecutionLog {
                                + serviceConfigurationId + ", purpose=" + 
purpose
                                + ", executionStartTime=" + executionStartTime
                                + ", executionEndTime=" + executionEndTime + ", 
plotUrl="
-                               + plotUrl + ", dataUrl=" + dataUrl + "]";
+                               + plotUrl + ", dataUrl=" + dataUrl + ", url=" + 
url 
+                               + "]";
        }
 }

http://git-wip-us.apache.org/repos/asf/incubator-cmda/blob/aa50efa2/ApacheCMDA_Frontend_1.0/app/utils/Constants.java
----------------------------------------------------------------------
diff --git a/ApacheCMDA_Frontend_1.0/app/utils/Constants.java 
b/ApacheCMDA_Frontend_1.0/app/utils/Constants.java
index 2ed9d92..2a36d81 100644
--- a/ApacheCMDA_Frontend_1.0/app/utils/Constants.java
+++ b/ApacheCMDA_Frontend_1.0/app/utils/Constants.java
@@ -25,9 +25,11 @@ public class Constants {
        
        public static final String GET_MOST_RECENTLY_USED_CLIMATE_SERVICES_CALL 
= "/climateService/getAllMostRecentClimateServicesByLatestAccessTime/json";
        public static final String GET_CLIMATE_SERVICES_CALL = 
"/climateService/getAllClimateServices/json";
+       public static final String 
GET_TOP_K_USED_CLIMATE_SERVICES_BY_DATASET_ID = 
"/climateService/getTopKUsedClimateServicesByDatasetId";
        
        // climate service page
        public static final String SAVE_CLIMATE_SERVICE_PAGE = 
"/climateService/savePage";
+       public static final String QUERY_CLIMATE_SERVICE = 
"/climateService/queryClimateService";
        
        // user
        public static final String IS_USER_VALID = "/users/isUserValid";
@@ -79,5 +81,8 @@ public class Constants {
        public static final String CONFIG_ITEM =        
"/serviceConfigurationItem";
        public static final String GET_CONFIG_ITEMS_BY_CONFIG= 
"/serviceConfigurationItemByServiceConfig";
        
+       //Analytics
+       public static final String GET_DATASET_AND_USER = 
"/analytics/getAllDatasetAndUserWithCount/json";
+       
        
 }

http://git-wip-us.apache.org/repos/asf/incubator-cmda/blob/aa50efa2/ApacheCMDA_Frontend_1.0/app/views/aboutUs.scala.html
----------------------------------------------------------------------
diff --git a/ApacheCMDA_Frontend_1.0/app/views/aboutUs.scala.html 
b/ApacheCMDA_Frontend_1.0/app/views/aboutUs.scala.html
index ba88ee2..320844a 100644
--- a/ApacheCMDA_Frontend_1.0/app/views/aboutUs.scala.html
+++ b/ApacheCMDA_Frontend_1.0/app/views/aboutUs.scala.html
@@ -11,8 +11,11 @@
    <p>Seungwon Lee</p>
    <p>Lei Pan</p>
    <h3><strong>Current Contributors</strong></h3>
-   <p>Xing Wei</p>
    <p>Wei Wang</p>
+   <p>Qihao Bao</p>
+   <p>Ruoxiao Wang</p>
+   <p>Ming Qi</p>
+   <p>Xing Wei</p>
    <p>Chris Lee</p>
    <p>Rao Li</p>
    <p>Chenran Gong</p>
@@ -21,7 +24,6 @@
    <p>Yichen Liu</p>
    <p>Edward Huang</p>
    <p>Zhiyu Lin</p>
-   <p>Ming Qi</p>
    <p>Jian Jiao</p>
    <p>Juanchen Li</p>
    <h3><strong>Former Contributors</strong></h3>

http://git-wip-us.apache.org/repos/asf/incubator-cmda/blob/aa50efa2/ApacheCMDA_Frontend_1.0/app/views/allClimateServices.scala.html
----------------------------------------------------------------------
diff --git a/ApacheCMDA_Frontend_1.0/app/views/allClimateServices.scala.html 
b/ApacheCMDA_Frontend_1.0/app/views/allClimateServices.scala.html
index 547e8d1..6dabf7f 100644
--- a/ApacheCMDA_Frontend_1.0/app/views/allClimateServices.scala.html
+++ b/ApacheCMDA_Frontend_1.0/app/views/allClimateServices.scala.html
@@ -11,10 +11,10 @@
                <th style = "vertical-align: middle;" 
class="col-md-4">Purpose</th>
                <th style = "vertical-align: middle;" class="col-md-4">URL</th>
                <th style = "vertical-align: middle;" 
class="col-md-3">Scenario</th>
-               <th style = "vertical-align: middle;" 
class="col-md-3">Version_No</th>
+               <th style = "vertical-align: middle;" class="col-md-3">Version 
No</th>
                <th style = "vertical-align: middle;" class="col-md-3">Root 
Service_Id</th>
                 @if(true){
-                       <th style = "vertical-align: middle;" 
class="col-md-3">Operation</th> 
+                       <th style = "vertical-align: middle;" 
class="col-md-2">Operation</th> 
             } 
             <th style = "vertical-align: middle;" 
class="col-md-2">Operation</th>
        </tr>
@@ -27,14 +27,21 @@
                <td><span class="@climateService.getName() editable" 
data-name='purpose'>
                                @{
                                        if (climateService.getPurpose().length 
> 5 ) {
-                                               
climateService.getPurpose().substring(0,5);
+                                               
climateService.getPurpose().substring(0,5) + "...";
                                        }else {
                                                climateService.getPurpose();
                                        }
-                               } ... </span></td>
+                               }  </span></td>
                
                <td><span class="@climateService.getName() editable" id = "url" 
data-name='url'>
-                               <a href = 
"@climateService.getUrl()">@climateService.getUrl()</a></span></td>
+                               <a href = "@climateService.getUrl()">
+                               @{
+                                       if (climateService.getUrl().length > 5 
) {
+                                               "..." + 
climateService.getUrl().substring(31);
+                                       }else {
+                                               climateService.getUrl();
+                                       }
+                               }</a></span></td>
                                
                <td><span class="@climateService.getName() editable" 
data-name='scenario'>
                                @climateService.getScenario() </span></td>

http://git-wip-us.apache.org/repos/asf/incubator-cmda/blob/aa50efa2/ApacheCMDA_Frontend_1.0/app/views/allDatasets.scala.html
----------------------------------------------------------------------
diff --git a/ApacheCMDA_Frontend_1.0/app/views/allDatasets.scala.html 
b/ApacheCMDA_Frontend_1.0/app/views/allDatasets.scala.html
index 8976c6b..50649d4 100644
--- a/ApacheCMDA_Frontend_1.0/app/views/allDatasets.scala.html
+++ b/ApacheCMDA_Frontend_1.0/app/views/allDatasets.scala.html
@@ -12,7 +12,7 @@
                -->
                <th style = "vertical-align: top;" class="col-md-2">Dataset 
Name</th>
                <th style = "vertical-align: top;" class="col-md-1">Agency</th>
-               <th style = "vertical-align: top;" 
class="col-md-1">Instrument</th>
+               <th style = "vertical-align: top;" 
class="col-md-1">Instrument/Model Experiment</th>
                <th style = "vertical-align: top;" class="col-md-2">Physical 
variable</th>
                <th style = "vertical-align: top;" class="col-md-1">Variable 
short name</th>
                <th style = "vertical-align: top;" class="col-md-1">Units</th>

http://git-wip-us.apache.org/repos/asf/incubator-cmda/blob/aa50efa2/ApacheCMDA_Frontend_1.0/app/views/climateServiceList.scala.html
----------------------------------------------------------------------
diff --git a/ApacheCMDA_Frontend_1.0/app/views/climateServiceList.scala.html 
b/ApacheCMDA_Frontend_1.0/app/views/climateServiceList.scala.html
new file mode 100644
index 0000000..f871090
--- /dev/null
+++ b/ApacheCMDA_Frontend_1.0/app/views/climateServiceList.scala.html
@@ -0,0 +1,62 @@
+@(climateServices: List[ClimateService])
+@import helper._
+
+@main("All Climate Services") {
+
+    <h1>@climateServices.size() Climate Services</h1>
+               <table class="table table-striped table-bordered 
table-condensed ex2 tablesorter" id = "csTable">
+       <thead>
+       <tr class="text-center">
+               <th style = "vertical-align: middle;" class="col-md-2">Climate 
Service Name</th>
+               <th style = "vertical-align: middle;" 
class="col-md-4">Purpose</th>
+               <th style = "vertical-align: middle;" class="col-md-4">URL</th>
+               <th style = "vertical-align: middle;" 
class="col-md-3">Scenario</th>
+               <th style = "vertical-align: middle;" class="col-md-3">Version 
No</th>
+               <th style = "vertical-align: middle;" class="col-md-3">Root 
Service_Id</th>
+                @if(true){
+                       <th style = "vertical-align: middle;" 
class="col-md-2">Operation</th> 
+            } 
+            <th style = "vertical-align: middle;" 
class="col-md-2">Operation</th>
+       </tr>
+       </thead>
+       <tbody>
+       @for(climateService <- climateServices) {
+       <tr>
+               <td><a href = 
"@climateService.getUrl()">@climateService.getName()</a></td>
+
+               <td><span class="@climateService.getName() editable" 
data-name='purpose'>
+                               @{
+                                       if (climateService.getPurpose().length 
> 5 ) {
+                                               
climateService.getPurpose().substring(0,5) + "...";
+                                       }else {
+                                               climateService.getPurpose();
+                                       }
+                               }  </span></td>
+               
+               <td><span class="@climateService.getName() editable" id = "url" 
data-name='url'>
+                               <a href = "@climateService.getUrl()">
+                               @{
+                                       if (climateService.getUrl().length > 5 
) {
+                                               "..." + 
climateService.getUrl().substring(31);
+                                       }else {
+                                               climateService.getUrl();
+                                       }
+                               }</a></span></td>
+                               
+               <td><span class="@climateService.getName() editable" 
data-name='scenario'>
+                               @climateService.getScenario() </span></td>
+                               
+               <td><span class="@climateService.getName() editable" 
data-name='versionNo'>
+                               @climateService.getVersionNo() </span></td>
+                               
+               <td><span class="@climateService.getName() editable" 
data-name='rootServiceId'>
+                               @climateService.getRootServiceId() </span></td>
+                               
+               <td><input type="file" class="btn btn-info" id ="upload 
@climateService.getName()" ></button></td>
+               <td><button type="button" class="btn btn-danger" id 
="doReplace"  onclick="Javascript:replaceFile('upload 
'+'@climateService.getName()')" >Execute</button></td>
+       
+       </tr>
+       }
+       </tbody>
+    </table>
+}

http://git-wip-us.apache.org/repos/asf/incubator-cmda/blob/aa50efa2/ApacheCMDA_Frontend_1.0/app/views/dataSetList.scala.html
----------------------------------------------------------------------
diff --git a/ApacheCMDA_Frontend_1.0/app/views/dataSetList.scala.html 
b/ApacheCMDA_Frontend_1.0/app/views/dataSetList.scala.html
index 83aeb18..078c6c8 100644
--- a/ApacheCMDA_Frontend_1.0/app/views/dataSetList.scala.html
+++ b/ApacheCMDA_Frontend_1.0/app/views/dataSetList.scala.html
@@ -72,15 +72,15 @@
                                                                <div 
class="well col-lg-offset-4 col-lg-4 col-sm-offset-3 col-sm-6">
                                                                        <div 
class="text-center">
                                                                                
<img class="card-img-top" style=" width:60%;"
-                                                                               
        src='@routes.Assets.at("images/data.png")' >
+                                                                               
        src='@routes.Assets.at("images/giphy.gif")' >
                                                                        </div>
                                                                        <div 
class="card-block text-center">
                                                                                
<h4 class="card-title">@dataSet.getName()</h4>
                                                                                
<p class="card-text text-muted">A data set (or dataset) is a collection of 
data.</p>
                                                                        </div>
                                                                        <ul 
class="list-group list-group-flush">
-                                                                               
<li class="list-group-item"><strong>Agency:</strong> 
<code>@dataSet.getAgencyId()</code></li>
-                                                                               
<li class="list-group-item"><strong>Instrument:</strong> 
<code>@dataSet.getInstrument()</code></li>
+                                                                               
<li class="list-group-item"><strong>Agency:</strong> <a 
href="@dataSet.getAgencyURL()" 
target="_blank"><code><u>@dataSet.getAgencyId()</u></code></a></li>
+                                                                               
<li class="list-group-item"><strong>Instrument/Model Experiment:</strong> <a 
href="@dataSet.getInstrumentURL()" 
target="_blank"><code><u>@dataSet.getInstrument()</u></code></a></li>
                                                                                
<li class="list-group-item"><strong>Units:</strong> 
<code>@dataSet.getUnits()</code></li>
                                                                                
<li class="list-group-item"><strong>Start Time:</strong> 
<code>@dataSet.getStartTime()</code></li>
                                                                                
<li class="list-group-item"><strong>End Time:</strong> 
<code>@dataSet.getEndTime()</code></li>
@@ -102,15 +102,20 @@
                                                                        </div>
                                                                        
                                                                        <div 
class="row">
+                                                                       
@for(climateService <- dataSet.getClimateServices()) {
                                                                          <div 
class="col-md-6">
                                                                            
<div class="thumbnail">
+                                                                           <a 
href="@climateService.getUrl()">
                                                                              
<img src='@routes.Assets.at("images/github.png")' >
+                                                                       </a>
                                                                              
<div class="caption">
-                                                                               
<h5>NASA</h5>                                   
-                                                                               
<p><a href="#" class="btn btn-primary" role="button">Go</a> <a href="#" 
class="btn btn-default" role="button">Ignore</a></p>
+                                                                               
<h5>@climateService.getName()</h5>                                      
+                                                                               
                                                                              
</div>                                  
                                                                            
</div>
                                                                          </div>
+                                                                         }
+                                                                         <!--  
                                                                          <div 
class="col-md-6">
                                                                            
<div class="thumbnail">
                                                                              
<img src='@routes.Assets.at("images/bug.png")' >
@@ -120,6 +125,7 @@
                                                                              
</div>                                  
                                                                            
</div>
                                                                          </div>
+                                                                         -->
                                                                        </div>
                                                                        
                                                                </div>
@@ -162,7 +168,7 @@
                -->
                <th style = "vertical-align: top;" class="col-md-2">Dataset 
Name</th>
                <th style = "vertical-align: top;" class="col-md-1">Agency</th>
-               <th style = "vertical-align: top;" 
class="col-md-1">Instrument</th>
+               <th style = "vertical-align: top;" 
class="col-md-1">Instrument/Model Experiment</th>
                <th style = "vertical-align: top;" class="col-md-2">Physical 
variable</th>
                <th style = "vertical-align: top;" class="col-md-1">Variable 
short name</th>
                <th style = "vertical-align: top;" class="col-md-1">Units</th>

http://git-wip-us.apache.org/repos/asf/incubator-cmda/blob/aa50efa2/ApacheCMDA_Frontend_1.0/app/views/dataSetListPopular.scala.html
----------------------------------------------------------------------
diff --git a/ApacheCMDA_Frontend_1.0/app/views/dataSetListPopular.scala.html 
b/ApacheCMDA_Frontend_1.0/app/views/dataSetListPopular.scala.html
new file mode 100644
index 0000000..9df2a3d
--- /dev/null
+++ b/ApacheCMDA_Frontend_1.0/app/views/dataSetListPopular.scala.html
@@ -0,0 +1,68 @@
+@(dataSetForm: play.data.Form[Dataset], dataSets: List[Dataset])
+
+@import helper._
+@import java.math.BigInteger;var k=1;var n = 0;
+
+@scripts = {
+       <script src='@routes.Assets.at("javascripts/edit_button.js")'></script>
+       <script type="text/javascript">
+       $(document).ready(function(){
+               //alert($("#url").text());
+       });
+       </script>
+}
+
+@main("Dataset List", scripts) { 
+        
+    <h1>Datasets List</h1>
+    <h2>@dataSets.size() Datasets Found</h2>
+<div style="overflow-y:scroll">
+               <table class="table table-striped table-bordered 
table-condensed tablesorter" id ="myTable">
+               <thead>
+       <tr >
+               <!-- 
+               <th style = "vertical-align: top;" class="col-md-1 
header">Id</th>
+               -->
+               <th style = "vertical-align: top;" class="col-md-2">Dataset 
Name</th>
+               <th style = "vertical-align: top;" class="col-md-1">Agency</th>
+               <th style = "vertical-align: top;" 
class="col-md-1">Instrument/Model Experiment</th>
+               <th style = "vertical-align: top;" class="col-md-2">Physical 
variable</th>
+               <th style = "vertical-align: top;" class="col-md-1">Variable 
short name</th>
+               <th style = "vertical-align: top;" class="col-md-1">Units</th>
+               <th style = "vertical-align: top;" class="col-md-1">Grid 
Dimension</th>
+               
+               <th style = "vertical-align: top;" class="col-md-2">Variable 
Name in Web Interface</th>
+               <th style = "vertical-align: top;" class="col-md-1">Data Source 
Input Parameter</th>
+               
+               <th style = "vertical-align: top;" class="col-md-1">Dataset 
Start Time</th>
+               <th style = "vertical-align: top;"class="col-md-1">Dataset End 
Time</th>
+               <th style = "vertical-align: top;"class="col-md-1">Duration</th>
+
+       </tr>
+       </thead>
+       <tbody>
+@for(dataSet <- dataSets){
+                                                       <tr>
+                                                               <!-- 
+                                                               <td><font 
size="2">@dataSet.getId()</font></td>
+                                                               -->
+                                                               <td><font 
size="2">@dataSet.getName()</font></td>
+                                                               <td><font 
size="2">@dataSet.getAgencyId()</font></td>
+                                                               <td><font 
size="2">@dataSet.getInstrument()</font></td>
+                                                               <td><font 
size="2">@dataSet.getPhysicalVariable()</font></td>
+                                                               <td><font 
size="2">@dataSet.getCMIP5VarName()</font></td>
+                                                               <td><font 
size="2">@dataSet.getUnits()</font></td>
+                                                               <td><font 
size="2">@dataSet.getGridDimension()</font></td>
+                                                               <td><font 
size="2">@dataSet.getVariableNameInWebInterface()</font></td>
+                                                               <td><font 
size="2">@dataSet.getDataSourceInputParameterToCallScienceApplicationCode()</font></td>
+                                                               <td><font 
size="2">@dataSet.getStartTime()</font></td>
+                                                               <td><font 
size="2">@dataSet.getEndTime()</font></td>
+                                                               <td><font 
size="2">@dataSet.getDuration()</font></td>
+                                                       </tr>
+                                                       }
+
+       
+       </tbody>
+    </table>
+    </div>
+}

http://git-wip-us.apache.org/repos/asf/incubator-cmda/blob/aa50efa2/ApacheCMDA_Frontend_1.0/app/views/header.scala.html
----------------------------------------------------------------------
diff --git a/ApacheCMDA_Frontend_1.0/app/views/header.scala.html 
b/ApacheCMDA_Frontend_1.0/app/views/header.scala.html
index c67371d..3446fdd 100644
--- a/ApacheCMDA_Frontend_1.0/app/views/header.scala.html
+++ b/ApacheCMDA_Frontend_1.0/app/views/header.scala.html
@@ -10,8 +10,8 @@
                                </button>
                                <a class="navbar-brand" style="padding-bottom: 
0;" href="/">
                                        <div>
-                                       <img 
src='@routes.Assets.at("images/NASA_JPL_logo.png")' style="height: 30px; width: 
180px;">&nbsp&nbsp
-                                       <img 
src='@routes.Assets.at("images/logo.png")' style="height: 15px; width: 200px;">
+                                       <img 
src='@routes.Assets.at("images/NASA_JPL_logo.png")' style="height: 24px; width: 
144px;">
+                                       <img 
src='@routes.Assets.at("images/logo.png")' style="height: 12px; width: 160px;">
                                        </div>
                                </a>
                        </div>
@@ -19,6 +19,14 @@
                                <ul class="nav navbar-nav navbar-right">
                                        
                                        <li class="dropdown">
+                                               <a href="#" 
class="dropdown-toggle" data-toggle="dropdown"><span 
class="text-danger">Recommendation</span><b class="caret"></b></a>
+                                               <ul class="dropdown-menu">
+                                                       <li><a 
href="@routes.ClimateServiceController.recommendationSummary()">Summary</a></li>
+                                                       
+                                               </ul>                           
+                                       </li>
+                                       
+                                       <li class="dropdown">
                                                <a href="#" 
class="dropdown-toggle" data-toggle="dropdown">Web Service<b 
class="caret"></b></a>
                                                <ul class="dropdown-menu">
                                                        <li><a 
href="@routes.ClimateServiceController.mostRecentlyAddedClimateServices()">Most 
Recently Added</a></li>
@@ -28,14 +36,14 @@
                                                        @if(true) {
                                                                <li><a 
href="@routes.ClimateServiceController.addAClimateService()">Register A 
Service</a></li>
                                                        }
-                                                       <li><a>Search 
Service</a></li>
+                                                       <li><a 
href="@routes.ClimateServiceController.searchClimateServices()">Search 
Service</a></li>
                                                </ul>                           
                                        </li>
                                        
                                        <li class="dropdown">
                                                <a href="#" 
class="dropdown-toggle" data-toggle="dropdown">Dataset<b class="caret"></b></a>
                                                <ul class="dropdown-menu">
-                                                       <li><a>Most 
Popular</a></li>
+                                                       <li><a 
href="@routes.DatasetController.mostPopularDatasets()">Most Popular</a></li>
                                                        <li><a 
href="@routes.DatasetController.showAllDatasets()">Dataset List</a></li>
                                                        @if(true) {
                                                                <li><a 
href="#">Register A Dataset</a></li>
@@ -50,7 +58,7 @@
                                                        <li><a 
href="@routes.ServiceExecutionLogController.getServiceLog">Service Execution 
Log</a></li>
                                                        <li><a 
href="@routes.ServiceExecutionLogController.searchServiceLog">Search Service 
Log</a></li>
                                                        <li><a 
href="@routes.DatasetLogController.getAllDatasetLogs">Dataset Log</a></li>
-                                                       <li><a 
href="@routes.AnalyticsController.getRecommend">Semantic Service 
Analytics</a></li>
+                                                       <li><a 
href="@routes.AnalyticsController.getKnowledgeGraph">Knowledge Graph</a></li>
                                                        <li><a 
href="@routes.AnalyticsController.getDatasetRecommend">Semantic Dataset 
Analytics</a></li>
                                                        <li><a 
href="@routes.AnalyticsController.getScientistRecommend">User Analytics</a></li>
                                                        <li><a 
href="@routes.AnalyticsController.getLogGraph">Service Execution Log 
Analytics</a></li>


Reply via email to