Skip to content

Commit e2865ee

Browse files
committed
work in progress - adding datastore
1 parent 40380c5 commit e2865ee

12 files changed

Lines changed: 565 additions & 120 deletions
Lines changed: 3 additions & 100 deletions
Original file line numberDiff line numberDiff line change
@@ -1,101 +1,4 @@
1+
=\=\=\=\=\=\=
2+
<<<<<<<=HEAD
3+
>>>>>>>=ef72daa81c73f99e2156f5bfe8127591fc6358e9
14
eclipse.preferences.version=1
2-
org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled
3-
org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
4-
org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull
5-
org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault
6-
org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable
7-
org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
8-
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
9-
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7
10-
org.eclipse.jdt.core.compiler.compliance=1.7
11-
<<<<<<< HEAD
12-
=======
13-
org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
14-
>>>>>>> ef72daa81c73f99e2156f5bfe8127591fc6358e9
15-
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
16-
org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
17-
org.eclipse.jdt.core.compiler.problem.comparingIdentical=error
18-
org.eclipse.jdt.core.compiler.problem.deadCode=warning
19-
org.eclipse.jdt.core.compiler.problem.deprecation=warning
20-
org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
21-
org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
22-
org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
23-
org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
24-
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
25-
<<<<<<< HEAD
26-
=======
27-
org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=warning
28-
org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
29-
org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled
30-
org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
31-
org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
32-
org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
33-
org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
34-
org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
35-
org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled
36-
org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
37-
org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning
38-
org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning
39-
org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning
40-
org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
41-
org.eclipse.jdt.core.compiler.problem.missingDefaultCase=warning
42-
org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=warning
43-
org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled
44-
org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=warning
45-
org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning
46-
org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
47-
org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
48-
org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=warning
49-
org.eclipse.jdt.core.compiler.problem.noEffectAssignment=error
50-
org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=error
51-
org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
52-
org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning
53-
org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error
54-
org.eclipse.jdt.core.compiler.problem.nullReference=warning
55-
org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error
56-
org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning
57-
org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
58-
org.eclipse.jdt.core.compiler.problem.parameterAssignment=warning
59-
org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=error
60-
org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
61-
org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore
62-
org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
63-
org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
64-
org.eclipse.jdt.core.compiler.problem.redundantNullCheck=warning
65-
org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=warning
66-
org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning
67-
org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
68-
org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
69-
org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
70-
org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
71-
org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
72-
org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
73-
org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled
74-
org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
75-
org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
76-
org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled
77-
org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
78-
org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning
79-
org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
80-
org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
81-
org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning
82-
org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
83-
org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
84-
org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning
85-
org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
86-
org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
87-
org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
88-
org.eclipse.jdt.core.compiler.problem.unusedImport=warning
89-
org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
90-
org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
91-
org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=warning
92-
org.eclipse.jdt.core.compiler.problem.unusedParameter=warning
93-
org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
94-
org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
95-
org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
96-
org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
97-
org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=warning
98-
org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
99-
org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
100-
>>>>>>> ef72daa81c73f99e2156f5bfe8127591fc6358e9
101-
org.eclipse.jdt.core.compiler.source=1.7
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
eclipse.preferences.version=1
2+
org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=false

src/main/java/com/google/gcloud/ServiceOptions.java

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
package com.google.gcloud;
22

33

4+
import static com.google.common.base.MoreObjects.firstNonNull;
5+
46
import com.google.api.client.extensions.appengine.http.UrlFetchTransport;
57
import com.google.api.client.googleapis.compute.ComputeCredential;
68
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
79
import com.google.api.client.http.HttpRequestInitializer;
810
import com.google.api.client.http.HttpTransport;
911
import com.google.api.client.http.javanet.NetHttpTransport;
1012
import com.google.api.client.json.jackson.JacksonFactory;
11-
import com.google.common.base.MoreObjects;
1213

1314
import java.io.IOException;
1415
import java.security.GeneralSecurityException;
@@ -23,14 +24,14 @@ public abstract class ServiceOptions {
2324
private final AuthConfig authConfig;
2425

2526
protected ServiceOptions(Builder builder) {
26-
host = MoreObjects.firstNonNull(builder.host, DEFAULT_HOST);
27-
httpTransport = MoreObjects.firstNonNull(builder.httpTransport, getDefaultHttpTransport());
28-
authConfig = MoreObjects.firstNonNull(builder.authConfig, getDefaultAuthConfig());
27+
host = firstNonNull(builder.host, DEFAULT_HOST);
28+
httpTransport = firstNonNull(builder.httpTransport, getDefaultHttpTransport());
29+
authConfig = firstNonNull(builder.authConfig, getDefaultAuthConfig());
2930
}
3031

3132
private static HttpTransport getDefaultHttpTransport() {
3233
// Consider App Engine
33-
if (System.getProperty("com.google.appengine.application.id") != null) {
34+
if (getAppEngineAppId() != null) {
3435
try {
3536
return new UrlFetchTransport();
3637
} catch (Exception ignore) {
@@ -40,14 +41,15 @@ private static HttpTransport getDefaultHttpTransport() {
4041
// Consider Compute
4142
try {
4243
return getComputeCredential().getTransport();
43-
} catch (IOException | GeneralSecurityException e) {
44-
return new NetHttpTransport();
44+
} catch (Exception e) {
45+
// Maybe not on GCE
4546
}
47+
return new NetHttpTransport();
4648
}
4749

4850
private static AuthConfig getDefaultAuthConfig() {
4951
// Consider App Engine
50-
if (System.getProperty("com.google.appengine.application.id") != null) {
52+
if (getAppEngineAppId() != null) {
5153
try {
5254
return AuthConfig.createForAppEngine();
5355
} catch (Exception ignore) {
@@ -63,9 +65,14 @@ private static AuthConfig getDefaultAuthConfig() {
6365
return cred;
6466
}
6567
};
66-
} catch (IOException | GeneralSecurityException e) {
67-
return AuthConfig.createForAccount(null, null);
68+
} catch (Exception ignore) {
69+
// Maybe not on GCE
6870
}
71+
return AuthConfig.createForAccount(null, null);
72+
}
73+
74+
protected static String getAppEngineAppId() {
75+
return System.getProperty("com.google.appengine.application.id");
6976
}
7077

7178
private static ComputeCredential getComputeCredential()
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
package com.google.gcloud.datastore;
2+
3+
import static com.google.common.base.Preconditions.checkNotNull;
4+
5+
import com.google.gcloud.datastore.Key.PathEntry;
6+
7+
import java.util.List;
8+
9+
/**
10+
* A key that is guaranteed to be complete.
11+
*/
12+
public final class CompleteKey {
13+
14+
private final Key key;
15+
16+
public static class Builder {
17+
18+
private final Key.Builder keyBuilder = new Key.Builder();
19+
20+
public Builder(String dataset) {
21+
this(dataset, "");
22+
}
23+
24+
public Builder(String dataset, String namespace) {
25+
keyBuilder.setDataset(checkNotNull(dataset));
26+
keyBuilder.setNamespace(checkNotNull(namespace));
27+
}
28+
29+
public Builder addChild(String kind, long id) {
30+
keyBuilder.addChild(kind, id);
31+
return this;
32+
}
33+
34+
public Builder addChild(String kind, String name) {
35+
keyBuilder.addChild(kind, name);
36+
return this;
37+
}
38+
39+
public CompleteKey build() {
40+
return new CompleteKey(keyBuilder.build());
41+
}
42+
}
43+
44+
private CompleteKey(Key key) {
45+
this.key = key;
46+
}
47+
48+
public String getDataset() {
49+
return key.getDataset();
50+
}
51+
52+
public String getNamespace() {
53+
return key.getNamespace();
54+
}
55+
56+
public List<PathEntry> getPath() {
57+
return key.getPath();
58+
}
59+
60+
public String getKind() {
61+
return key.getKind();
62+
}
63+
64+
public Long getId() {
65+
return key.getLeaf().getId();
66+
}
67+
68+
public String getName() {
69+
return key.getLeaf().getName();
70+
}
71+
72+
public Object getNameOrId() {
73+
PathEntry leaf = key.getLeaf();
74+
return leaf.hasId() ? leaf.getId() : leaf.getName();
75+
}
76+
77+
@Override
78+
public String toString() {
79+
return key.toString();
80+
}
81+
82+
@Override
83+
public int hashCode() {
84+
return key.hashCode();
85+
}
86+
87+
@Override
88+
public boolean equals(Object other) {
89+
if (!(other instanceof CompleteKey)) {
90+
return false;
91+
}
92+
return key.equals(((CompleteKey) other).key);
93+
}
94+
}
Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,20 @@
11
package com.google.gcloud.datastore;
22

3+
import java.util.Map;
4+
35
public interface DatastoreService {
46

5-
String get(String key);
7+
DatastoreServiceOptions getOptions();
8+
9+
CompleteKey put(Key key, Map<String, Value> values);
10+
11+
Map<String, Value> get(CompleteKey key);
12+
13+
void delete(CompleteKey... key);
14+
15+
void allocateIds(Key... key);
16+
17+
// query result item is a tuple of (key, value...) where values may be empty
18+
//QueryResult runQuery(Query query);
619

720
}

src/main/java/com/google/gcloud/datastore/DatastoreServiceImpl.java

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,4 @@ final class DatastoreServiceImpl implements DatastoreService {
88
this.options = options;
99
}
1010

11-
@Override
12-
public String get(String key) {
13-
// TODO Auto-generated method stub
14-
return null;
15-
}
16-
1711
}

src/main/java/com/google/gcloud/datastore/DatastoreServiceOptions.java

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,28 @@
11
package com.google.gcloud.datastore;
22

3+
import static com.google.common.base.MoreObjects.firstNonNull;
4+
import static com.google.common.base.Preconditions.checkArgument;
5+
6+
import com.google.common.base.Strings;
37
import com.google.common.collect.ImmutableSet;
48
import com.google.gcloud.ServiceOptions;
59

610
import java.util.Set;
11+
import java.util.regex.Pattern;
712

813
public class DatastoreServiceOptions extends ServiceOptions {
914

1015
private static final String DATASTORE_SCOPE = "https://www.googleapis.com/auth/datastore";
1116
private static final String USERINFO_SCOPE = "https://www.googleapis.com/auth/userinfo.email";
1217
private static final Set<String> SCOPES = ImmutableSet.of(DATASTORE_SCOPE, USERINFO_SCOPE);
13-
18+
private static final Pattern PATTERN = Pattern.compile(
19+
"([a-z\\d\\-]{1,100}~)?([a-z\\d][a-z\\d\\-\\.]{0,99}\\:)?([a-z\\d][a-z\\d\\-]{0,99})");
1420
private final String dataset;
1521

1622
DatastoreServiceOptions(Builder builder) {
1723
super(builder);
18-
dataset = builder.dataset;
24+
dataset = firstNonNull(builder.dataset, getAppEngineAppId());
25+
checkArgument(dataset != null, "missing dataset");
1926
}
2027

2128
public static class Builder extends ServiceOptions.Builder {
@@ -35,11 +42,22 @@ public DatastoreServiceOptions build() {
3542
}
3643

3744
public Builder setDataset(String dataset) {
38-
this.dataset = dataset;
45+
this.dataset = validateDataset(dataset);
3946
return this;
4047
}
4148
}
4249

50+
static String validateDataset(String dataset) {
51+
if (Strings.isNullOrEmpty(dataset)) {
52+
throw new IllegalArgumentException("dataset can't be empty or null");
53+
}
54+
if (!PATTERN.matcher(dataset).matches()) {
55+
throw new IllegalArgumentException(
56+
"dataset must match the following pattern: " + PATTERN.pattern());
57+
}
58+
return dataset;
59+
}
60+
4361
public String getDataset() {
4462
return dataset;
4563
}

0 commit comments

Comments
 (0)