Skip to content
This repository was archived by the owner on Apr 22, 2022. It is now read-only.

Commit 433de73

Browse files
committed
working version of dashboard
1 parent 2d29608 commit 433de73

File tree

35 files changed

+432
-262
lines changed

35 files changed

+432
-262
lines changed

deb-package/debian/changelog

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
geoknow-generator-ui (1.0.2) ldstack-nightly; urgency=low
22

3-
* Initial Release.
3+
* Intermediate release of GeoKnow Generatro Workbench
4+
* Includes user authentication and users and role management
5+
* Implements graph level access control
6+
* Requires spring batch admin generator for running batch processes
47

5-
-- Vadim Zaslawski <vadim.zaslawski@ontos.com> Wed, 21 Aug 2013 15:01:15 +0200
8+
-- Alejandra Garcia Rojas <alejandra.garciarojas@ontos.com> Tue, 25 Nov 2014 17:11:12 +0200

src/main/java/authentication/web/GraphManagerServlet.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,7 @@ protected void doPost(HttpServletRequest req, HttpServletResponse resp)
150150
// and
151151
// write
152152
// graph
153+
log.info(permissions);
153154
setGraphPermissions(graph, permissions);
154155
}
155156

@@ -368,6 +369,7 @@ private void setGraphPermissions(String graph, String permissionsString) throws
368369
if (permissionsString == null || permissionsString.isEmpty())
369370
return;
370371
// set public graph permissions
372+
log.info(permissionsString);
371373
GraphPermissions graphPermissions = parsePermissions(permissionsString);
372374
virtuosoUserManager.setDefaultGraphPermissions(graph, graphPermissions
373375
.getDefaultPermissions());

src/main/java/rest/AuthorizedSessions.java

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@
2626
import javax.ws.rs.core.Context;
2727
import javax.ws.rs.core.Cookie;
2828
import javax.ws.rs.core.MediaType;
29+
import javax.ws.rs.core.MultivaluedHashMap;
30+
import javax.ws.rs.core.MultivaluedMap;
2931
import javax.ws.rs.core.Response;
3032
import javax.ws.rs.core.StreamingOutput;
3133
import javax.ws.rs.core.UriInfo;
@@ -139,15 +141,15 @@ public Response create(@CookieParam(value = "user") Cookie userc,
139141
@Path("{sessionToken}")
140142
public Response get(@PathParam("sessionToken") String sessionToken, @Context UriInfo uriInfo)
141143
throws Exception {
142-
return post(sessionToken, uriInfo);
144+
MultivaluedMap<String, String> formParams = new MultivaluedHashMap<String, String>();
145+
return post(sessionToken, uriInfo, formParams);
143146
}
144147

145148
@POST
146149
@Path("{sessionToken}")
147-
public Response post(@PathParam("sessionToken") String sessionToken, @Context UriInfo uriInfo)
148-
throws Exception {
150+
public Response post(@PathParam("sessionToken") String sessionToken, @Context UriInfo uriInfo,
151+
MultivaluedMap<String, String> formParams) throws Exception {
149152

150-
log.info(sessionToken);
151153
String username = "";
152154
/*
153155
* retrieves form user that created that session and the rdfUser and
@@ -156,10 +158,9 @@ public Response post(@PathParam("sessionToken") String sessionToken, @Context Ur
156158
try {
157159
String query = "SELECT ?user FROM <" + sessionsGraph + "> WHERE { ?user " + " <"
158160
+ LDIWO.sessionToken + "> \"" + sessionToken + "\"^^xsd:string .}";
159-
log.debug(query);
160161

161162
String result = frameworkRdfStoreManager.execute(query, "json");
162-
log.debug(result);
163+
163164
ObjectMapper mapper = new ObjectMapper();
164165
JsonNode rootNode = mapper.readTree(result);
165166
Iterator<JsonNode> bindingsIter = rootNode.path("results").path("bindings")
@@ -192,10 +193,13 @@ public Response post(@PathParam("sessionToken") String sessionToken, @Context Ur
192193
// create post method and set parameters
193194
HttpPost proxyMethod = new HttpPost(endpoint);
194195
ArrayList<NameValuePair> postParameters = new ArrayList<NameValuePair>();
195-
for (Entry<String, List<String>> entity : uriInfo.getQueryParameters().entrySet()) {
196+
// when is GET we extract query params using uriInfo
197+
for (Entry<String, List<String>> entity : uriInfo.getQueryParameters().entrySet())
196198
postParameters.add(new BasicNameValuePair(entity.getKey(), entity.getValue().get(0)));
199+
// when is POST we extract using formParams
200+
for (String key : formParams.keySet())
201+
postParameters.add(new BasicNameValuePair(key, formParams.getFirst(key)));
197202

198-
}
199203
proxyMethod.setEntity(new UrlEncodedFormEntity(postParameters));
200204
// create the httpclient and reads/wirtes repsponse
201205
CloseableHttpClient httpClient = HttpClients.createDefault();
@@ -240,7 +244,7 @@ public Response delete(@PathParam("sessionToken") String sessionToken,
240244
.build();
241245
}
242246

243-
String query = "DELETE FROM <http://generator.geoknow.eu/resource/sessionsGraph> {?s ?p ?o} "
247+
String query = "DELETE FROM <" + sessionsGraph + "> {?s ?p ?o} "
244248
+ "WHERE { ?s ?p ?o . FILTER(str(?o) = \"" + sessionToken + "\") } ";
245249
log.debug(query);
246250

@@ -251,6 +255,6 @@ public Response delete(@PathParam("sessionToken") String sessionToken,
251255
.build();
252256
}
253257

254-
return Response.ok().build();
258+
return Response.status(Response.Status.NO_CONTENT).build();
255259
}
256260
}

src/main/java/workflow/BeanFactory.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ public static Bean createServiceTaskletBean(ObjectFactory factory, String id, St
4747

4848
Bean bean = factory.createBean();
4949
bean.setId(id);
50-
bean.setClazz("org.geoknow.batch.ServiceTasklet");
50+
bean.setClazz("eu.geoknow.batch.ServiceTasklet");
5151
QName.valueOf("property");
5252

5353
PropertyType pservice = factory.createPropertyType();

src/main/java/workflow/rest/Jobs.java

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import javax.servlet.ServletException;
1212
import javax.ws.rs.Consumes;
1313
import javax.ws.rs.CookieParam;
14+
import javax.ws.rs.DELETE;
1415
import javax.ws.rs.GET;
1516
import javax.ws.rs.POST;
1617
import javax.ws.rs.PUT;
@@ -88,6 +89,71 @@ public Jobs(@Context ServletContext context) throws ServletException {
8889
}
8990
}
9091

92+
@DELETE
93+
@Path("/{jobName}")
94+
@Produces(MediaType.APPLICATION_JSON)
95+
public Response deleteJob(@CookieParam(value = "user") Cookie userc,
96+
@CookieParam(value = "token") String token, @PathParam("jobName") String jobName) {
97+
UserProfile user;
98+
try {
99+
user = frameworkUserManager.validate(userc, token);
100+
if (user == null)
101+
return Response.status(Response.Status.UNAUTHORIZED).entity("Invalid credentials")
102+
.build();
103+
} catch (Exception e) {
104+
log.error(e);
105+
e.printStackTrace();
106+
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(e.getMessage())
107+
.build();
108+
}
109+
try {
110+
// ask if ther resource exists
111+
String query = "ASK { GRAPH <" + jobsGraph + "> {<" + uriBase + jobName + "> <"
112+
+ DC.creator.getURI() + "> <" + user.getAccountURI() + "> }}";
113+
log.debug(query);
114+
String result = frameworkRdfStoreManager.execute(query, "json");
115+
ObjectMapper mapper = new ObjectMapper();
116+
JsonNode rootNode = mapper.readTree(result);
117+
if (rootNode.path("boolean").getBooleanValue()) {
118+
119+
// stop the execution if running
120+
JobExecutions executions = BatchAdminClient.getAllExecutions();
121+
JobExecution lastExec = executions.getJobExecutions().get(0);
122+
if (lastExec.getStatus().contains("START")) {
123+
log.info("stopping " + lastExec.getId());
124+
BatchAdminClient.stopExecution(lastExec.getId());
125+
}
126+
127+
query = "DELETE FROM <" + jobsGraph + "> { <" + uriBase + jobName + "> ?p ?o} "
128+
+ " WHERE { <" + uriBase + jobName + "> ?p ?o ; <" + DC.creator.getURI()
129+
+ "> <" + user.getAccountURI() + "> } ";
130+
log.debug(query);
131+
132+
result = frameworkRdfStoreManager.execute(query, "json");
133+
log.debug(result);
134+
mapper = new ObjectMapper();
135+
rootNode = mapper.readTree(result);
136+
Iterator<JsonNode> bindingsIter = rootNode.path("results").path("bindings")
137+
.getElements();
138+
if (bindingsIter.hasNext()) {
139+
JsonNode bindingNode = bindingsIter.next();
140+
if (bindingNode.get("callret-0").path("value").getTextValue().contains("done"))
141+
return Response.status(Response.Status.NO_CONTENT).build();
142+
}
143+
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(
144+
"For some reason, the record was not deleted").build();
145+
146+
} else
147+
return Response.status(Response.Status.NOT_FOUND).build();
148+
149+
} catch (Exception e) {
150+
e.printStackTrace();
151+
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(e.getMessage())
152+
.build();
153+
}
154+
155+
}
156+
91157
/**
92158
* Executes job method: Authenticates the user and call the BatchAdminClient
93159
* to run the job of jobName

src/main/resources/framework-components.ttl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -118,11 +118,11 @@
118118
a lds:StackComponent ;
119119
rdfs:label "Dashboard"^^xsd:string ;
120120
lds:providesService :SpringBatchAdminService ;
121-
lds:version "0.1.0"^^xsd:string ;
121+
lds:version "0.0.1"^^xsd:string ;
122122
foaf:homepage <https://github.com/GeoKnow/spring-batch-admin> .
123123
:SpringBatchAdminService
124124
a lds:BatchProcessingService ;
125-
lds:serviceUrl <http://localhost:9999/spring-batch-admin-sample/> .
125+
lds:serviceUrl <http://localhost:9999/spring-batch-admin-geoknow/> .
126126

127127
:UserManager
128128
a lds:StackComponent ;

src/main/resources/log4j.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,6 @@ log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
88
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
99

1010
#log4j.logger.rdf=DEBUG
11-
log4j.logger.rest=DEBUG
11+
#log4j.logger.rest=DEBUG
1212
log4j.logger.workflow=DEBUG
1313
#log4j.logger.authentication.web=DEBUG

src/main/webapp/js/account/account.html

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,14 @@ <h2>User Account</h2>
2626
<td>E-mail address:</td>
2727
<td>{{account.getEmail()}}</td>
2828
</tr>
29-
<tr>
30-
<td>Role:</td>
31-
<td>{{account.getRole().name}}</td>
32-
</tr>
29+
<tr>
30+
<td>Role:</td>
31+
<td>{{account.getRole().name}}</td>
32+
</tr>
33+
<tr>
34+
<td>Settings Graph:</td>
35+
<td>{{account.getSettingsGraph()}}</td>
36+
</tr>
3337
</table>
3438

3539
<button type="button" class="btn-sm btn-success" data-toggle="modal" data-target="#modalChangePassword" ng-click="clearChangePasswordForm()">Change password</button>
@@ -39,7 +43,7 @@ <h2>User Account</h2>
3943
<div class="modal-content">
4044
<form name="changePasswordForm" class="form-horizontal InputForm" role="form">
4145
<div class="modal-header">
42-
<button type="button" class="close" ng-click="close('#modalLogin')" aria-hidden="true">&times;</button>
46+
<button type="button" class="close" ng-click="close('#modalChangePassword')" aria-hidden="true">&times;</button>
4347
<h5 class="modal-title green bold">Change password</h5>
4448
</div>
4549
<div class="modal-body">
@@ -82,7 +86,7 @@ <h5 class="modal-title green bold">Change password</h5>
8286
</div>
8387
<div class="modal-footer">
8488
<button type="submit" class="btn-sm btn-success" ng-click="changePassword();" ng-disabled="changePasswordForm.$invalid">Change</button>
85-
<button type="button" class="btn-sm btn-default" ng-click="close('#modalLogin')">Cancel</button>
89+
<button type="button" class="btn-sm btn-default" ng-click="close('#modalChangePassword')">Cancel</button>
8690
</div>
8791
</form>
8892
</div>

src/main/webapp/js/admin/users/users.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ <h3 class="green bold">Users Management</h3>
66
<div class="modal fade" id="modalUser">
77
<form name="userForm" class="form-horizontal InputForm" role="form">
88
<div class="modal-header">
9-
<button type="button" class="close" ng-click="close('#modalLogin')" aria-hidden="true">&times;</button>
9+
<button type="button" class="close" ng-click="close('#modalUser')" aria-hidden="true">&times;</button>
1010
<h5 class="modal-title green bold">{{modaltitle}}</h5>
1111
</div>
1212
<div class="modal-body">
@@ -55,7 +55,7 @@ <h5 class="modal-title green bold">{{modaltitle}}</h5>
5555
</div>
5656
<div class="modal-footer">
5757
<button type="submit" class="btn-sm btn-success" ng-click="save();" ng-disabled="userForm.$invalid">Save</button>
58-
<button type="button" class="btn-sm btn-default" ng-click="close('#modalLogin')">Cancel</button>
58+
<button type="button" class="btn-sm btn-default" ng-click="close('#modalUser')">Cancel</button>
5959
</div>
6060
</form>
6161
</div>

src/main/webapp/js/app.js

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -124,8 +124,7 @@ app.config(function($routeSegmentProvider, $routeProvider)
124124
.up()
125125

126126
.segment('settings',{
127-
templateUrl: 'js/settings/settings.html'
128-
})
127+
templateUrl: 'js/settings/settings.html'})
129128
.within()
130129
.segment('datasets', {
131130
templateUrl: 'js/settings/datasets/graphs.html'})
@@ -166,13 +165,7 @@ app.config(function($routeSegmentProvider, $routeProvider)
166165
})
167166
.up()
168167
.segment('system-setup', {
169-
templateUrl: 'system-setup.html',
170-
// resolve: {
171-
// settings: function (ConfigurationService) {
172-
// return ConfigurationService.getSettings();
173-
// }
174-
// }
175-
})
168+
templateUrl: 'system-setup.html'})
176169
.segment('default', {
177170
templateUrl: 'default.html',
178171
// resolve: {
@@ -214,7 +207,7 @@ app.config(function($routeSegmentProvider, $routeProvider)
214207
//redirect to system-setup page if system is not set up
215208
//redirect to access-denied page if user has no access to page
216209
$rootScope.$on("$routeChangeStart", function(event, next, current) {
217-
var account = angular.copy(AccountService.getAccount());
210+
var account = AccountService.getAccount();
218211
if ($rootScope.isSystemSetUp==undefined) {
219212
$http.get("rest/setup").then(function(response) {
220213
$rootScope.isSystemSetUp = response.data == "true";

0 commit comments

Comments
 (0)