My favorites | Sign in
Project Home Downloads Wiki Issues Source
Checkout   Browse   Changes    
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
/*
* Copyright (c) 2009 Jens Scheffler (appenginefan.com)
*
* Licensed under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the
* License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in
* writing, software distributed under the License is
* distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
* CONDITIONS OF ANY KIND, either express or implied. See
* the License for the specific language governing
* permissions and limitations under the License.
*/

package com.appenginefan.toolkit.persistence;

import com.google.appengine.api.datastore.Blob;
import com.google.appengine.api.datastore.DatastoreService;
import com.google.appengine.api.datastore.Entity;

/**
* A datastore-based persistence for byte arrays. Wrap other
* persistences like StringPersistence or ObjectPersistence
* around this class to persist arbitrary data types in the
* store.
*/
public class DatastorePersistence extends
PersistenceAdapter<Entity, byte[]> {

private static final String PROPERTY = "blob";

private static final String CREATED = "created_at";

private static final String MODIFIED = "changed_at";

/**
* Constructor.
*
* @param serviceOrNull
* a DatastoreService to use. If left null, the
* constructor fetch its own service
* @param partition
* determines what &quot;partition&quot; to store
* the data in. Different stores must use
* different partitions, or unspecified behavior
* will occur.
*/
public DatastorePersistence(
DatastoreService serviceOrNull, String partition) {
super(new EntityBasedPersistence(serviceOrNull, partition));
}

/**
* Constructor.
*
* @param partition
* determines what &quot;partition&quot; to store
* the data in. Different stores must use
* different partitions, or unspecified behavior
* will occur.
*/
public DatastorePersistence(String partition) {
super(new EntityBasedPersistence(partition));
}

@Override
protected byte[] makeType(Entity entity) {
if (entity == null || !entity.hasProperty(PROPERTY)) {
return null;
}
return ((Blob) entity.getProperty(PROPERTY)).getBytes();
}

@Override
protected Entity makeMarshalledType(Entity entity, byte[] data) {
if (data == null) {
return null;
}
if (entity.hasProperty(CREATED)) {
entity.setProperty(CREATED, System.currentTimeMillis());
}
entity.setProperty(PROPERTY, new Blob(data));
entity.setProperty(MODIFIED, System.currentTimeMillis());
return entity;
}
}

Change log

r21 by schefflerjens on Feb 17, 2010   Diff
Created two more generic persistence
classes for mapping data between types
(PersistenceAdapter), and mapping data to
datastore entities
(EntityBasedPersistence).

Refactored the similar, more specialized
classes (MarshallingPersistence and
DatastorePersistence) to use the more
common persistences while being backwards
compatible.
Go to: 
Project members, sign in to write a code review

Older revisions

r15 by schefflerjens on Jul 4, 2009   Diff
New utility class:
ClientSocketSubstitute

r13 by schefflerjens on Jun 10, 2009   Diff
DatastorePersistence now stores
additional timestamps with each
entity. This will be useful for
cleanup
tasks, like find "outdated" blobs and
...
r9 by schefflerjens on Apr 23, 2009   Diff
added "scanReverse" method to
Persistence interface, making it more
useful for pagination
All revisions of this file

File info

Size: 2766 bytes, 90 lines
Powered by Google Project Hosting