Skip to content

Commit 9c6d300

Browse files
author
Pascal Robert
committed
First caching implementation
1 parent 7d0698c commit 9c6d300

File tree

8 files changed

+182
-49
lines changed

8 files changed

+182
-49
lines changed

SimpleBlog/Sources/com/wowodc/app/Application.java

+65
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,31 @@
44
import java.util.Locale;
55

66
import com.webobjects.directtoweb.D2W;
7+
import com.webobjects.eocontrol.EOEditingContext;
8+
import com.webobjects.eocontrol.EOKeyGlobalID;
9+
import com.webobjects.eocontrol.EOObjectStoreCoordinator;
10+
import com.webobjects.eocontrol.EOQualifierEvaluation;
11+
import com.webobjects.foundation.NSArray;
12+
import com.webobjects.foundation.NSDictionary;
13+
import com.webobjects.foundation.NSLog;
14+
import com.webobjects.foundation.NSNotification;
15+
import com.webobjects.foundation.NSNotificationCenter;
16+
import com.webobjects.foundation.NSSelector;
17+
import com.webobjects.foundation.NSTimestamp;
718
import com.wowodc.model.BlogCategory;
819
import com.wowodc.model.BlogEntry;
920
import com.wowodc.model.Person;
21+
import com.wowodc.model.SyncInfo;
22+
import com.wowodc.model.enums.SyncInfoStatus;
1023
import com.wowodc.rest.controllers.OtherRoutesController;
1124
import com.wowodc.rest.controllers.RssController;
1225

1326
import er.extensions.appserver.ERXApplication;
1427
import er.extensions.appserver.navigation.ERXNavigationManager;
28+
import er.extensions.eof.ERXEC;
29+
import er.extensions.eof.ERXEnterpriseObject;
30+
import er.extensions.foundation.ERXArrayUtilities;
31+
import er.extensions.foundation.ERXRandomGUID;
1532
import er.rest.ERXRestNameRegistry;
1633
import er.rest.routes.ERXRoute;
1734
import er.rest.routes.ERXRouteRequestHandler;
@@ -60,4 +77,52 @@ public String _rewriteURL(String url) {
6077
}
6178
return processedURL;
6279
}
80+
81+
@Override
82+
public void didFinishLaunching() {
83+
super.didFinishLaunching();
84+
NSSelector selector = new NSSelector("coordinateChanges", new Class[] { NSNotification.class } );
85+
NSNotificationCenter.defaultCenter().addObserver( this, selector, EOObjectStoreCoordinator.ObjectsChangedInStoreNotification, EOObjectStoreCoordinator.defaultCoordinator());
86+
}
87+
88+
@SuppressWarnings("unchecked")
89+
public void coordinateChanges(NSNotification notification) {
90+
NSDictionary userInfo = (NSDictionary)notification.userInfo();
91+
EOEditingContext ec = ERXEC.newEditingContext(new EOObjectStoreCoordinator());
92+
ec.lock();
93+
94+
log.debug("Change Notification " + userInfo);
95+
try {
96+
NSLog.out.appendln("deleted" + (NSArray)userInfo.objectForKey("deleted"));
97+
NSLog.out.appendln("inserted: " + (NSArray)userInfo.objectForKey("inserted"));
98+
NSLog.out.appendln("updated: " + (NSArray)userInfo.objectForKey("updated"));
99+
100+
NSArray result = ERXArrayUtilities.filteredArrayWithQualifierEvaluation((NSArray)userInfo.objectForKey("inserted"), new EOSyncEntityFilter() );
101+
for ( Object id : result ) {
102+
EOKeyGlobalID gid = (EOKeyGlobalID)id;
103+
ERXEnterpriseObject eo = (ERXEnterpriseObject)ec.faultForGlobalID( gid, ec);
104+
105+
SyncInfo.createSyncInfo(ec, ERXRandomGUID.newGid(), new NSTimestamp(), SyncInfoStatus.INSERTED, eo.entityName() + ":" + eo.primaryKey());
106+
}
107+
108+
ec.saveChanges();
109+
}
110+
finally {
111+
ec.unlock();
112+
}
113+
}
114+
115+
public class EOSyncEntityFilter implements EOQualifierEvaluation
116+
{
117+
public boolean evaluateWithObject(Object object)
118+
{
119+
EOKeyGlobalID eokgid = (EOKeyGlobalID)object;
120+
return syncEntityNames().containsObject(eokgid.entityName());
121+
}
122+
}
123+
124+
public NSArray<String> syncEntityNames() {
125+
return new NSArray<String>( BlogEntry.ENTITY_NAME );
126+
}
127+
63128
}

SimpleBlog/Sources/com/wowodc/rest/controllers/BaseRestController.java

+22-9
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,13 @@
11
package com.wowodc.rest.controllers;
22

3-
import java.io.IOException;
4-
import java.util.NoSuchElementException;
5-
6-
import sun.misc.BASE64Decoder;
7-
83
import com.webobjects.appserver.WOActionResults;
94
import com.webobjects.appserver.WORequest;
10-
import com.webobjects.appserver.WOResponse;
11-
import com.wowodc.model.Person;
125

136
import er.extensions.appserver.ERXHttpStatusCodes;
147
import er.rest.format.ERXRestFormat;
15-
import er.rest.routes.ERXRouteController;
8+
import er.rest.routes.ERXDefaultRouteController;
169

17-
public class BaseRestController extends ERXRouteController {
10+
public class BaseRestController extends ERXDefaultRouteController {
1811

1912
public BaseRestController(WORequest request) {
2013
super(request);
@@ -42,4 +35,24 @@ protected boolean isHTMlFormat() {
4235
return (ERXRestFormat.html().name().equals(this.format().name())) ? true: false;
4336
}
4437

38+
@Override
39+
public WOActionResults newAction() throws Throwable {
40+
return errorResponse(ERXHttpStatusCodes.METHOD_NOT_ALLOWED);
41+
}
42+
43+
@Override
44+
public WOActionResults destroyAction() throws Throwable {
45+
return errorResponse(ERXHttpStatusCodes.METHOD_NOT_ALLOWED);
46+
}
47+
48+
@Override
49+
public WOActionResults showAction() throws Throwable {
50+
return errorResponse(ERXHttpStatusCodes.METHOD_NOT_ALLOWED);
51+
}
52+
53+
@Override
54+
public WOActionResults indexAction() throws Throwable {
55+
return errorResponse(ERXHttpStatusCodes.METHOD_NOT_ALLOWED);
56+
}
57+
4558
}

SimpleBlog/Sources/com/wowodc/rest/controllers/BlogEntryController.java

+54-8
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,27 @@
11
package com.wowodc.rest.controllers;
22

3+
import java.text.ParseException;
4+
import java.text.SimpleDateFormat;
5+
import java.util.Locale;
6+
37
import com.webobjects.appserver.WOActionResults;
48
import com.webobjects.appserver.WORequest;
59
import com.webobjects.foundation.NSArray;
610
import com.wowodc.model.BlogCategory;
711
import com.wowodc.model.BlogEntry;
812
import com.wowodc.model.Person;
9-
import com.wowodc.ui.components.BlogEntryShowPage;
13+
import com.wowodc.model.SyncInfo;
14+
import com.wowodc.ui.components.BlogEntryDetailPage;
1015

16+
import er.extensions.appserver.ERXHttpStatusCodes;
17+
import er.extensions.appserver.ERXResponse;
1118
import er.extensions.eof.ERXKeyFilter;
1219
import er.rest.ERXRestContext;
1320

1421
public class BlogEntryController extends BaseRestController {
1522

23+
public static final SimpleDateFormat formatter = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss z", Locale.ENGLISH); // Last-Modified: Wed, 15 Nov 1995 04:58:08 GMT
24+
1625
public BlogEntryController(WORequest request) {
1726
super(request);
1827
}
@@ -55,18 +64,55 @@ protected ERXKeyFilter filter() {
5564
return filter;
5665
}
5766

67+
@Override
5868
public WOActionResults showAction() throws Throwable {
59-
String title = routeObjectForKey("title");
60-
if (title == null) {
61-
return errorResponse(404);
69+
String ifModifiedSinceHeader = this.request().headerForKey("If-Modified-Since");
70+
String ifNoneMatch = this.request().headerForKey("If-None-Match");
71+
SyncInfo syncDetails = null;
72+
BlogEntry post = null;
73+
74+
if (ifNoneMatch != null) {
75+
syncDetails = SyncInfo.fetchSyncInfo(editingContext(), SyncInfo.ETAG.eq(ifNoneMatch));
76+
if (syncDetails != null) {
77+
return errorResponse(ERXHttpStatusCodes.NOT_MODIFIED);
78+
} else {
79+
post = routeObjectForKey("blogEntry");
80+
}
81+
} else {
82+
post = routeObjectForKey("blogEntry");
83+
syncDetails = SyncInfo.fetchSyncInfo(editingContext(), SyncInfo.TOKEN.eq(post.entityName() + ":" + post.primaryKey()));
84+
}
85+
86+
if (syncDetails != null) {
87+
if (ifModifiedSinceHeader != null) {
88+
java.util.Date clientDateHeader;
89+
try {
90+
clientDateHeader = (java.util.Date)formatter.parseObject(ifModifiedSinceHeader);
91+
if ((clientDateHeader.equals(syncDetails.lastModified())) || (clientDateHeader.after(syncDetails.lastModified()))) {
92+
return errorResponse(ERXHttpStatusCodes.NOT_MODIFIED);
93+
}
94+
} catch (ParseException e) {
95+
}
96+
}
6297
}
63-
BlogEntry post = BlogEntry.fetchRequiredBlogEntry(editingContext(), BlogEntry.TITLE_KEY, title);
98+
99+
ERXResponse response = null;
100+
64101
if (isHTMlFormat()) {
65-
BlogEntryShowPage nextPage = (BlogEntryShowPage)pageWithName(BlogEntryShowPage.class);
102+
BlogEntryDetailPage nextPage = (BlogEntryDetailPage)pageWithName(BlogEntryDetailPage.class);
66103
nextPage.setBlogEntry(post);
67-
return nextPage;
104+
nextPage.syncDetails = syncDetails;
105+
response = (ERXResponse)nextPage.generateResponse();
106+
} else {
107+
response = (ERXResponse) response(post, filter());
68108
}
69-
return response(post, filter());
109+
110+
if (syncDetails != null) {
111+
response.setHeader(formatter.format(syncDetails.lastModified()), "Last-Modified");
112+
response.setHeader(syncDetails.etag(), "Etag");
113+
}
114+
115+
return response;
70116
}
71117

72118
public WOActionResults indexAction() throws Throwable {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package com.wowodc.ui.components;
2+
3+
import java.text.SimpleDateFormat;
4+
import java.util.Locale;
5+
6+
import com.webobjects.appserver.WOContext;
7+
import com.webobjects.appserver.WOResponse;
8+
import com.wowodc.model.BlogEntry;
9+
import com.wowodc.model.SyncInfo;
10+
11+
import er.rest.routes.ERXRouteParameter;
12+
13+
public class BlogEntryDetailPage extends RestComponent {
14+
15+
private BlogEntry entryItem;
16+
SimpleDateFormat formatter = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss z", Locale.ENGLISH); // Last-Modified: Wed, 15 Nov 1995 04:58:08 GMT
17+
public SyncInfo syncDetails = null;
18+
19+
public BlogEntryDetailPage(WOContext context) {
20+
super(context);
21+
}
22+
23+
public BlogEntry blogEntry() {
24+
return entryItem;
25+
}
26+
27+
@ERXRouteParameter
28+
public void setBlogEntry(BlogEntry _entryItem) {
29+
this.entryItem = _entryItem;
30+
}
31+
32+
@Override
33+
public void appendToResponse(WOResponse response, WOContext context) {
34+
if (syncDetails != null) {
35+
response.setHeader(formatter.format(syncDetails.lastModified()), "Last-Modified");
36+
response.setHeader(syncDetails.etag(), "Etag");
37+
}
38+
39+
super.appendToResponse(response, context);
40+
}
41+
}

SimpleBlog/Sources/com/wowodc/ui/components/BlogEntryShowPage.java

-32
This file was deleted.

0 commit comments

Comments
 (0)