diff --git a/gogrid/.svnignore b/gogrid/.svnignore
new file mode 100644
index 0000000000..68ece06ea0
--- /dev/null
+++ b/gogrid/.svnignore
@@ -0,0 +1,7 @@
+target
+.settings
+.classpath
+.project
+jclouds-gogrid.iml
+jclouds-gogrid.ipr
+jclouds-gogrid.iws
\ No newline at end of file
diff --git a/gogrid/pom.xml b/gogrid/pom.xml
new file mode 100644
index 0000000000..18685b396e
--- /dev/null
+++ b/gogrid/pom.xml
@@ -0,0 +1,76 @@
+
+
+
+ org.jclouds
+ jclouds-multi
+ 1.0-SNAPSHOT
+ ../pom.xml
+
+ 4.0.0
+ org.jclouds
+ jclouds-gogrid
+ jclouds GoGrid core
+ jar
+ jclouds components to access GoGrid
+
+
+ scm:svn:http://jclouds.googlecode.com/svn/trunk/gogrid
+ scm:svn:https://jclouds.googlecode.com/svn/trunk/gogrid
+ http://jclouds.googlecode.com/svn/trunk/gogrid
+
+
+ apiKey
+ secret
+
+
+
+ ${project.groupId}
+ jclouds-core
+ ${project.version}
+
+
+ ${project.groupId}
+ jclouds-core
+ ${project.version}
+ test-jar
+ test
+
+
+ log4j
+ log4j
+ 1.2.14
+ test
+
+
+ ${project.groupId}
+ jclouds-log4j
+ ${project.version}
+ test
+
+
+
diff --git a/gogrid/src/main/java/org/jclouds/GoGrid.java b/gogrid/src/main/java/org/jclouds/GoGrid.java
new file mode 100644
index 0000000000..6adb66e1de
--- /dev/null
+++ b/gogrid/src/main/java/org/jclouds/GoGrid.java
@@ -0,0 +1,62 @@
+/**
+ *
+ * Copyright (C) 2009 Cloud Conscious, LLC.
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+/**
+ *
+ * Copyright (C) 2009 Cloud Conscious, LLC.
+ *
+ * ====================================================================
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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 org.jclouds;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+import javax.inject.Qualifier;
+
+/**
+ * Related to a GoGrid resource.
+ *
+ * @author Adrian Cole
+ *
+ */
+@Retention(value = RetentionPolicy.RUNTIME)
+@Target(value = { ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD })
+@Qualifier
+public @interface GoGrid {
+
+}
\ No newline at end of file
diff --git a/gogrid/src/main/java/org/jclouds/GoGridAsyncClient.java b/gogrid/src/main/java/org/jclouds/GoGridAsyncClient.java
new file mode 100644
index 0000000000..8d394f1c2f
--- /dev/null
+++ b/gogrid/src/main/java/org/jclouds/GoGridAsyncClient.java
@@ -0,0 +1,74 @@
+/**
+ *
+ * Copyright (C) 2009 Cloud Conscious, LLC.
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+/**
+ *
+ * Copyright (C) 2009 Cloud Conscious, LLC.
+ *
+ * ====================================================================
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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 org.jclouds;
+
+import java.util.SortedSet;
+import com.google.common.util.concurrent.ListenableFuture;
+
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+
+import org.jclouds.http.filters.BasicAuthentication;
+import org.jclouds.rest.annotations.Endpoint;
+import org.jclouds.rest.annotations.RequestFilters;
+import org.jclouds.rest.annotations.ResponseParser;
+import org.jclouds.domain.Status;
+import org.jclouds.functions.ParseStatusesFromJsonResponse;
+
+/**
+ * Provides asynchronous access to GoGrid via their REST API.
+ *
+ *
+ * @see GoGridClient
+ * @see
+ * @author Adrian Cole
+ */
+@Endpoint(GoGrid.class)
+@RequestFilters(BasicAuthentication.class)
+public interface GoGridAsyncClient {
+
+ @GET
+ @ResponseParser(ParseStatusesFromJsonResponse.class)
+ @Path("/statuses/mentions.json")
+ ListenableFuture> getMyMentions();
+
+}
diff --git a/gogrid/src/main/java/org/jclouds/GoGridClient.java b/gogrid/src/main/java/org/jclouds/GoGridClient.java
new file mode 100644
index 0000000000..5bf2a6ba32
--- /dev/null
+++ b/gogrid/src/main/java/org/jclouds/GoGridClient.java
@@ -0,0 +1,63 @@
+/**
+ *
+ * Copyright (C) 2009 Cloud Conscious, LLC.
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+/**
+ *
+ * Copyright (C) 2009 Cloud Conscious, LLC.
+ *
+ * ====================================================================
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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 org.jclouds;
+
+import java.util.SortedSet;
+import java.util.concurrent.TimeUnit;
+
+import org.jclouds.concurrent.Timeout;
+import org.jclouds.domain.Status;
+
+/**
+ * Provides synchronous access to GoGrid.
+ *
+ *
+ * @see GoGridAsyncClient
+ * @see
+ * @author Adrian Cole
+ */
+@Timeout(duration = 4, timeUnit = TimeUnit.SECONDS)
+public interface GoGridClient {
+
+ SortedSet getMyMentions();
+
+}
diff --git a/gogrid/src/main/java/org/jclouds/GoGridContextBuilder.java b/gogrid/src/main/java/org/jclouds/GoGridContextBuilder.java
new file mode 100644
index 0000000000..130b709ca4
--- /dev/null
+++ b/gogrid/src/main/java/org/jclouds/GoGridContextBuilder.java
@@ -0,0 +1,80 @@
+/**
+ *
+ * Copyright (C) 2009 Cloud Conscious, LLC.
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+/**
+ *
+ * Copyright (C) 2009 Cloud Conscious, LLC.
+ *
+ * ====================================================================
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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 org.jclouds;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.util.List;
+import java.util.Properties;
+
+import org.jclouds.rest.RestContextBuilder;
+import org.jclouds.config.GoGridContextModule;
+import org.jclouds.config.GoGridRestClientModule;
+import org.jclouds.reference.GoGridConstants;
+
+import com.google.inject.Module;
+import com.google.inject.TypeLiteral;
+
+/**
+ *
+ * @author Adrian Cole
+ */
+public class GoGridContextBuilder extends RestContextBuilder {
+
+ public GoGridContextBuilder(Properties props) {
+ super(new TypeLiteral() {
+ }, new TypeLiteral() {
+ }, props);
+ checkNotNull(properties.getProperty(GoGridConstants.PROPERTY_GOGRID_USER));
+ checkNotNull(properties.getProperty(GoGridConstants.PROPERTY_GOGRID_PASSWORD));
+ }
+
+ protected void addClientModule(List modules) {
+ modules.add(new GoGridRestClientModule());
+ }
+
+ @Override
+ protected void addContextModule(List modules) {
+ modules.add(new GoGridContextModule());
+ }
+
+}
diff --git a/gogrid/src/main/java/org/jclouds/GoGridContextFactory.java b/gogrid/src/main/java/org/jclouds/GoGridContextFactory.java
new file mode 100644
index 0000000000..bf63f3db99
--- /dev/null
+++ b/gogrid/src/main/java/org/jclouds/GoGridContextFactory.java
@@ -0,0 +1,80 @@
+/**
+ *
+ * Copyright (C) 2009 Cloud Conscious, LLC.
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+/**
+ *
+ * Copyright (C) 2009 Cloud Conscious, LLC.
+ *
+ * ====================================================================
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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 org.jclouds;
+
+import java.util.Properties;
+
+import org.jclouds.http.config.JavaUrlHttpCommandExecutorServiceModule;
+import org.jclouds.logging.jdk.config.JDKLoggingModule;
+import org.jclouds.rest.RestContext;
+
+import com.google.inject.Module;
+
+/**
+ * Creates {@link RestContext} for {@link GoGridClient} instances based on the most commonly
+ * requested arguments.
+ *
+ * Note that Threadsafe objects will be bound as singletons to the Injector or Context provided.
+ *
+ *
+ * If no Module
s are specified, the default {@link JDKLoggingModule logging} and
+ * {@link JavaUrlHttpCommandExecutorServiceModule http transports} will be installed.
+ *
+ * @author Adrian Cole
+ * @see RestContext
+ * @see GoGridClient
+ * @see GoGridAsyncClient
+ */
+public class GoGridContextFactory {
+
+ public static RestContext createContext(String user, String password,
+ Module... modules) {
+ return new GoGridContextBuilder(new GoGridPropertiesBuilder(user, password).build())
+ .withModules(modules).buildContext();
+ }
+
+ public static RestContext createContext(Properties properties, Module... modules) {
+ return new GoGridContextBuilder(new GoGridPropertiesBuilder(properties).build())
+ .withModules(modules).buildContext();
+ }
+
+}
diff --git a/gogrid/src/main/java/org/jclouds/GoGridPropertiesBuilder.java b/gogrid/src/main/java/org/jclouds/GoGridPropertiesBuilder.java
new file mode 100644
index 0000000000..14ee65cd47
--- /dev/null
+++ b/gogrid/src/main/java/org/jclouds/GoGridPropertiesBuilder.java
@@ -0,0 +1,85 @@
+/**
+ *
+ * Copyright (C) 2009 Cloud Conscious, LLC.
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+/**
+ *
+ * Copyright (C) 2009 Cloud Conscious, LLC.
+ *
+ * ====================================================================
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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 org.jclouds;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static org.jclouds.reference.GoGridConstants.PROPERTY_GOGRID_ENDPOINT;
+import static org.jclouds.reference.GoGridConstants.PROPERTY_GOGRID_PASSWORD;
+import static org.jclouds.reference.GoGridConstants.PROPERTY_GOGRID_USER;
+
+import java.net.URI;
+import java.util.Properties;
+
+/**
+ * Builds properties used in GoGrid Clients
+ *
+ * @author Adrian Cole
+ */
+public class GoGridPropertiesBuilder extends PropertiesBuilder {
+ @Override
+ protected Properties defaultProperties() {
+ Properties properties = super.defaultProperties();
+ properties.setProperty(PROPERTY_GOGRID_ENDPOINT, "https://api.gogrid.com/api");
+ return properties;
+ }
+
+ public GoGridPropertiesBuilder(Properties properties) {
+ super(properties);
+ }
+
+ public GoGridPropertiesBuilder(String id, String secret) {
+ super();
+ withCredentials(id, secret);
+ }
+
+ public GoGridPropertiesBuilder withCredentials(String id, String secret) {
+ properties.setProperty(PROPERTY_GOGRID_USER, checkNotNull(id, "user"));
+ properties.setProperty(PROPERTY_GOGRID_PASSWORD, checkNotNull(secret, "password"));
+ return this;
+ }
+
+ public GoGridPropertiesBuilder withEndpoint(URI endpoint) {
+ properties.setProperty(PROPERTY_GOGRID_ENDPOINT, checkNotNull(endpoint, "endpoint")
+ .toString());
+ return this;
+ }
+}
diff --git a/gogrid/src/main/java/org/jclouds/config/GoGridContextModule.java b/gogrid/src/main/java/org/jclouds/config/GoGridContextModule.java
new file mode 100644
index 0000000000..ed8464c9b8
--- /dev/null
+++ b/gogrid/src/main/java/org/jclouds/config/GoGridContextModule.java
@@ -0,0 +1,81 @@
+/**
+ *
+ * Copyright (C) 2009 Cloud Conscious, LLC.
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+/**
+ *
+ * Copyright (C) 2009 Cloud Conscious, LLC.
+ *
+ * ====================================================================
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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 org.jclouds.config;
+
+import java.net.URI;
+
+import javax.inject.Named;
+import javax.inject.Singleton;
+
+import org.jclouds.http.functions.config.ParserModule.CDateAdapter;
+import org.jclouds.http.functions.config.ParserModule.DateAdapter;
+import org.jclouds.http.functions.config.ParserModule;
+import org.jclouds.lifecycle.Closer;
+import org.jclouds.rest.RestContext;
+import org.jclouds.rest.internal.RestContextImpl;
+import org.jclouds.GoGrid;
+import org.jclouds.GoGridAsyncClient;
+import org.jclouds.GoGridClient;
+import org.jclouds.reference.GoGridConstants;
+
+import com.google.inject.AbstractModule;
+import com.google.inject.Provides;
+
+/**
+ * Configures the GoGrid connection, including logging and http transport.
+ *
+ * @author Adrian Cole
+ */
+public class GoGridContextModule extends AbstractModule {
+ @Override
+ protected void configure() {
+ bind(DateAdapter.class).to(CDateAdapter.class);
+ }
+
+ @Provides
+ @Singleton
+ RestContext provideContext(Closer closer, GoGridAsyncClient asyncApi,
+ GoGridClient syncApi, @GoGrid URI endPoint, @Named(GoGridConstants.PROPERTY_GOGRID_USER) String account) {
+ return new RestContextImpl(closer, asyncApi, syncApi, endPoint, account);
+ }
+
+}
\ No newline at end of file
diff --git a/gogrid/src/main/java/org/jclouds/config/GoGridRestClientModule.java b/gogrid/src/main/java/org/jclouds/config/GoGridRestClientModule.java
new file mode 100644
index 0000000000..c4ee8cdd06
--- /dev/null
+++ b/gogrid/src/main/java/org/jclouds/config/GoGridRestClientModule.java
@@ -0,0 +1,118 @@
+/**
+ *
+ * Copyright (C) 2009 Cloud Conscious, LLC.
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+/**
+ *
+ * Copyright (C) 2009 Cloud Conscious, LLC.
+ *
+ * ====================================================================
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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 org.jclouds.config;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URI;
+
+import javax.inject.Named;
+import javax.inject.Singleton;
+
+import org.jclouds.concurrent.internal.SyncProxy;
+import org.jclouds.http.RequiresHttp;
+import org.jclouds.http.filters.BasicAuthentication;
+import org.jclouds.rest.ConfiguresRestClient;
+import org.jclouds.rest.RestClientFactory;
+import org.jclouds.encryption.EncryptionService;
+
+import org.jclouds.GoGrid;
+import org.jclouds.GoGridClient;
+import org.jclouds.GoGridAsyncClient;
+import org.jclouds.reference.GoGridConstants;
+
+import com.google.inject.AbstractModule;
+import com.google.inject.Provides;
+
+/**
+ * Configures the GoGrid connection.
+ *
+ * @author Adrian Cole
+ */
+@RequiresHttp
+@ConfiguresRestClient
+public class GoGridRestClientModule extends AbstractModule {
+
+ @Override
+ protected void configure() {
+ bindErrorHandlers();
+ bindRetryHandlers();
+ }
+
+ @Provides
+ @Singleton
+ public BasicAuthentication provideBasicAuthentication(
+ @Named(GoGridConstants.PROPERTY_GOGRID_USER) String user,
+ @Named(GoGridConstants.PROPERTY_GOGRID_PASSWORD) String password,
+ EncryptionService encryptionService)
+ throws UnsupportedEncodingException {
+ return new BasicAuthentication(user, password, encryptionService);
+ }
+
+ @Provides
+ @Singleton
+ protected GoGridAsyncClient provideClient(RestClientFactory factory) {
+ return factory.create(GoGridAsyncClient.class);
+ }
+
+ @Provides
+ @Singleton
+ public GoGridClient provideClient(GoGridAsyncClient client) throws IllegalArgumentException,
+ SecurityException, NoSuchMethodException {
+ return SyncProxy.create(GoGridClient.class, client);
+ }
+
+ @Provides
+ @Singleton
+ @GoGrid
+ protected URI provideURI(@Named(GoGridConstants.PROPERTY_GOGRID_ENDPOINT) String endpoint) {
+ return URI.create(endpoint);
+ }
+
+ protected void bindErrorHandlers() {
+ // TODO
+ }
+
+ protected void bindRetryHandlers() {
+ // TODO
+ }
+
+}
\ No newline at end of file
diff --git a/gogrid/src/main/java/org/jclouds/domain/Status.java b/gogrid/src/main/java/org/jclouds/domain/Status.java
new file mode 100644
index 0000000000..2ec515fbbb
--- /dev/null
+++ b/gogrid/src/main/java/org/jclouds/domain/Status.java
@@ -0,0 +1,220 @@
+/**
+ *
+ * Copyright (C) 2009 Cloud Conscious, LLC.
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+/**
+ *Date
+ * Copyright (C) 2009 Cloud Conscious, LLC.
+ *
+ * ====================================================================
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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 org.jclouds.domain;
+
+import java.util.Date;
+
+import com.google.gson.annotations.SerializedName;
+
+/**
+ *
+ * @author Adrian Cole
+ *
+ */
+public class Status implements Comparable {
+ @SerializedName("created_at")
+ private Date createdAt;
+ private boolean favorited;
+ private String geo;
+ private long id;
+ @SerializedName("in_reply_to_screen_name")
+ private String inReplyToScreenName;
+ @SerializedName("in_reply_to_status_id")
+ private Integer inReplyToStatusId;
+ @SerializedName("in_reply_to_user_id")
+ private Integer inReplyToUserId;
+ private String source;
+ private String text;
+ private boolean truncated;
+ private User user;
+
+ public Status() {
+ }
+
+ public Status(Date createdAt, boolean favorited, String geo, long id,
+ String inReplyToScreenName, Integer inReplyToStatusId, Integer inReplyToUserId,
+ String source, String text, boolean truncated, User user) {
+ this.createdAt = createdAt;
+ this.favorited = favorited;
+ this.geo = geo;
+ this.id = id;
+ this.inReplyToScreenName = inReplyToScreenName;
+ this.inReplyToStatusId = inReplyToStatusId;
+ this.inReplyToUserId = inReplyToUserId;
+ this.source = source;
+ this.text = text;
+ this.truncated = truncated;
+ this.user = user;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((createdAt == null) ? 0 : createdAt.hashCode());
+ result = prime * result + (int) (id ^ (id >>> 32));
+ result = prime * result + ((text == null) ? 0 : text.hashCode());
+ result = prime * result + ((user == null) ? 0 : user.hashCode());
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ Status other = (Status) obj;
+ if (createdAt == null) {
+ if (other.createdAt != null)
+ return false;
+ } else if (!createdAt.equals(other.createdAt))
+ return false;
+ if (id != other.id)
+ return false;
+ if (text == null) {
+ if (other.text != null)
+ return false;
+ } else if (!text.equals(other.text))
+ return false;
+ if (user == null) {
+ if (other.user != null)
+ return false;
+ } else if (!user.equals(other.user))
+ return false;
+ return true;
+ }
+
+ public Date getCreatedAt() {
+ return createdAt;
+ }
+
+ public void setCreatedAt(Date createdAt) {
+ this.createdAt = createdAt;
+ }
+
+ public long getId() {
+ return id;
+ }
+
+ public void setId(long id) {
+ this.id = id;
+ }
+
+ public String getText() {
+ return text;
+ }
+
+ public void setText(String text) {
+ this.text = text;
+ }
+
+ public String getSource() {
+ return source;
+ }
+
+ public void setSource(String source) {
+ this.source = source;
+ }
+
+ public boolean isTruncated() {
+ return truncated;
+ }
+
+ public void setTruncated(boolean truncated) {
+ this.truncated = truncated;
+ }
+
+ public Integer getInReplyToStatusId() {
+ return inReplyToStatusId;
+ }
+
+ public void setInReplyToStatusId(Integer inReplyToStatusId) {
+ this.inReplyToStatusId = inReplyToStatusId;
+ }
+
+ public Integer getInReplyToUserId() {
+ return inReplyToUserId;
+ }
+
+ public void setInReplyToUserId(Integer inReplyToUserId) {
+ this.inReplyToUserId = inReplyToUserId;
+ }
+
+ public boolean isFavorited() {
+ return favorited;
+ }
+
+ public void setFavorited(boolean favorited) {
+ this.favorited = favorited;
+ }
+
+ public String getInReplyToScreenName() {
+ return inReplyToScreenName;
+ }
+
+ public void setInReplyToScreenName(String inReplyToScreenName) {
+ this.inReplyToScreenName = inReplyToScreenName;
+ }
+
+ public User getUser() {
+ return user;
+ }
+
+ public void setUser(User user) {
+ this.user = user;
+ }
+
+ public int compareTo(Status o) {
+ return (int) ((this == o) ? 0 : id + "".compareTo(o.id + ""));
+ }
+
+ public void setGeo(String geo) {
+ this.geo = geo;
+ }
+
+ public String getGeo() {
+ return geo;
+ }
+}
\ No newline at end of file
diff --git a/gogrid/src/main/java/org/jclouds/domain/User.java b/gogrid/src/main/java/org/jclouds/domain/User.java
new file mode 100644
index 0000000000..46be23b532
--- /dev/null
+++ b/gogrid/src/main/java/org/jclouds/domain/User.java
@@ -0,0 +1,387 @@
+/**
+ *
+ * Copyright (C) 2009 Cloud Conscious, LLC.
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+/**
+ *
+ * Copyright (C) 2009 Cloud Conscious, LLC.
+ *
+ * ====================================================================
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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 org.jclouds.domain;
+
+import java.net.URI;
+
+import java.util.Date;
+
+import com.google.gson.annotations.SerializedName;
+
+/**
+ *
+ * @author Adrian Cole
+ */
+public class User implements Comparable {
+ @SerializedName("created_at")
+ private Date createdAt;
+ private String description;
+ @SerializedName("favourites_count")
+ private int favouritesCount;
+ @SerializedName("followers_count")
+ private int followersCount;
+ private boolean following;
+ @SerializedName("friends_count")
+ private int friendsCount;
+ @SerializedName("geo_enabled")
+ private boolean geoEnabled;
+ private long id;
+ private String location;
+ private String name;
+ private boolean notifications;
+ @SerializedName("profile_background_color")
+ private String profileBackgroundColor;
+ @SerializedName("profile_background_image_url")
+ private URI profileBackgroundImageUrl;
+ @SerializedName("profile_background_tile")
+ private boolean profileBackgroundTile;
+ @SerializedName("profile_image_url")
+ private URI profileImageUrl;
+ @SerializedName("profile_link_color")
+ private String profileLinkColor;
+ @SerializedName("profile_sidebar_border_color")
+ private String profileSidebarBorderColor;
+ @SerializedName("profile_sidebar_fill_color")
+ private String profileSidebarFillColor;
+ @SerializedName("profile_text_color")
+ private String profileTextColor;
+ @SerializedName("protected")
+ private boolean isProtected;
+ @SerializedName("screen_name")
+ private String screenName;
+ @SerializedName("statuses_count")
+ private int statusesCount;
+ @SerializedName("time_zone")
+ private String timeZone;
+ private URI url;
+ @SerializedName("utc_offset")
+ private int utcOffset;
+ private boolean verified;
+
+ public User() {
+
+ }
+
+ public User(Date createdAt, String description, int favouritesCount, int followersCount,
+ boolean following, int friendsCount, boolean geoEnabled, long id, String location,
+ String name, boolean notifications, String profileBackgroundColor,
+ URI profileBackgroundImageUrl, boolean profileBackgroundTile, URI profileImageUrl,
+ String profileLinkColor, String profileSidebarBorderColor,
+ String profileSidebarFillColor, String profileTextColor, boolean isProtected,
+ String screenName, int statusesCount, String timeZone, URI url, int utcOffset,
+ boolean verified) {
+ this.createdAt = createdAt;
+ this.description = description;
+ this.favouritesCount = favouritesCount;
+ this.followersCount = followersCount;
+ this.following = following;
+ this.friendsCount = friendsCount;
+ this.setGeoEnabled(geoEnabled);
+ this.id = id;
+ this.location = location;
+ this.name = name;
+ this.notifications = notifications;
+ this.profileBackgroundColor = profileBackgroundColor;
+ this.profileBackgroundImageUrl = profileBackgroundImageUrl;
+ this.profileBackgroundTile = profileBackgroundTile;
+ this.profileImageUrl = profileImageUrl;
+ this.profileLinkColor = profileLinkColor;
+ this.profileSidebarBorderColor = profileSidebarBorderColor;
+ this.profileSidebarFillColor = profileSidebarFillColor;
+ this.profileTextColor = profileTextColor;
+ this.isProtected = isProtected;
+ this.screenName = screenName;
+ this.statusesCount = statusesCount;
+ this.timeZone = timeZone;
+ this.url = url;
+ this.utcOffset = utcOffset;
+ this.verified = verified;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + (int) (id ^ (id >>> 32));
+ result = prime * result + ((name == null) ? 0 : name.hashCode());
+ result = prime * result + ((screenName == null) ? 0 : screenName.hashCode());
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ User other = (User) obj;
+ if (id != other.id)
+ return false;
+ if (name == null) {
+ if (other.name != null)
+ return false;
+ } else if (!name.equals(other.name))
+ return false;
+ if (screenName == null) {
+ if (other.screenName != null)
+ return false;
+ } else if (!screenName.equals(other.screenName))
+ return false;
+ return true;
+ }
+
+ public long getId() {
+ return id;
+ }
+
+ public void setId(long id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getScreenName() {
+ return screenName;
+ }
+
+ public void setScreenName(String screenName) {
+ this.screenName = screenName;
+ }
+
+ public String getLocation() {
+ return location;
+ }
+
+ public void setLocation(String location) {
+ this.location = location;
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
+ public URI getProfileImageUrl() {
+ return profileImageUrl;
+ }
+
+ public void setProfileImageUrl(URI profileImageUrl) {
+ this.profileImageUrl = profileImageUrl;
+ }
+
+ public URI getUrl() {
+ return url;
+ }
+
+ public void setUrl(URI url) {
+ this.url = url;
+ }
+
+ public boolean isProtected() {
+ return isProtected;
+ }
+
+ public void setProtected(boolean isProtected) {
+ this.isProtected = isProtected;
+ }
+
+ public int getFollowersCount() {
+ return followersCount;
+ }
+
+ public void setFollowersCount(int followersCount) {
+ this.followersCount = followersCount;
+ }
+
+ public String getProfileBackgroundColor() {
+ return profileBackgroundColor;
+ }
+
+ public void setProfileBackgroundColor(String profileBackgroundColor) {
+ this.profileBackgroundColor = profileBackgroundColor;
+ }
+
+ public String getProfileTextColor() {
+ return profileTextColor;
+ }
+
+ public void setProfileTextColor(String profileTextColor) {
+ this.profileTextColor = profileTextColor;
+ }
+
+ public String getProfileLinkColor() {
+ return profileLinkColor;
+ }
+
+ public void setProfileLinkColor(String profileLinkColor) {
+ this.profileLinkColor = profileLinkColor;
+ }
+
+ public String getProfileSidebarFillColor() {
+ return profileSidebarFillColor;
+ }
+
+ public void setProfileSidebarFillColor(String profileSidebarFillColor) {
+ this.profileSidebarFillColor = profileSidebarFillColor;
+ }
+
+ public String getProfileSidebarBorderColor() {
+ return profileSidebarBorderColor;
+ }
+
+ public void setProfileSidebarBorderColor(String profileSidebarBorderColor) {
+ this.profileSidebarBorderColor = profileSidebarBorderColor;
+ }
+
+ public int getFriendsCount() {
+ return friendsCount;
+ }
+
+ public void setFriendsCount(int friendsCount) {
+ this.friendsCount = friendsCount;
+ }
+
+ public Date getCreatedAt() {
+ return createdAt;
+ }
+
+ public void setCreatedAt(Date createdAt) {
+ this.createdAt = createdAt;
+ }
+
+ public int getFavouritesCount() {
+ return favouritesCount;
+ }
+
+ public void setFavouritesCount(int favouritesCount) {
+ this.favouritesCount = favouritesCount;
+ }
+
+ public int getUtcOffset() {
+ return utcOffset;
+ }
+
+ public void setUtcOffset(int utcOffset) {
+ this.utcOffset = utcOffset;
+ }
+
+ public String getTimeZone() {
+ return timeZone;
+ }
+
+ public void setTimeZone(String timeZone) {
+ this.timeZone = timeZone;
+ }
+
+ public URI getProfileBackgroundImageUrl() {
+ return profileBackgroundImageUrl;
+ }
+
+ public void setProfileBackgroundImageUrl(URI profileBackgroundImageUrl) {
+ this.profileBackgroundImageUrl = profileBackgroundImageUrl;
+ }
+
+ public boolean isProfileBackgroundTile() {
+ return profileBackgroundTile;
+ }
+
+ public void setProfileBackgroundTile(boolean profileBackgroundTile) {
+ this.profileBackgroundTile = profileBackgroundTile;
+ }
+
+ public int getStatusesCount() {
+ return statusesCount;
+ }
+
+ public void setStatusesCount(int statusesCount) {
+ this.statusesCount = statusesCount;
+ }
+
+ public boolean isNotifications() {
+ return notifications;
+ }
+
+ public void setNotifications(boolean notifications) {
+ this.notifications = notifications;
+ }
+
+ public boolean isFollowing() {
+ return following;
+ }
+
+ public void setFollowing(boolean following) {
+ this.following = following;
+ }
+
+ public boolean isVerified() {
+ return verified;
+ }
+
+ public void setVerified(boolean verified) {
+ this.verified = verified;
+ }
+
+ public int compareTo(User o) {
+ if (screenName == null)
+ return -1;
+ return (this == o) ? 0 : screenName.compareTo(o.screenName);
+ }
+
+ public void setGeoEnabled(boolean geoEnabled) {
+ this.geoEnabled = geoEnabled;
+ }
+
+ public boolean isGeoEnabled() {
+ return geoEnabled;
+ }
+}
\ No newline at end of file
diff --git a/gogrid/src/main/java/org/jclouds/functions/ParseStatusesFromJsonResponse.java b/gogrid/src/main/java/org/jclouds/functions/ParseStatusesFromJsonResponse.java
new file mode 100644
index 0000000000..994ef95760
--- /dev/null
+++ b/gogrid/src/main/java/org/jclouds/functions/ParseStatusesFromJsonResponse.java
@@ -0,0 +1,81 @@
+/**
+ *
+ * Copyright (C) 2009 Cloud Conscious, LLC.
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+/**
+ *
+ * Copyright (C) 2009 Cloud Conscious, LLC.
+ *
+ * ====================================================================
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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 org.jclouds.functions;
+
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.UnsupportedEncodingException;
+import java.lang.reflect.Type;
+import java.util.SortedSet;
+
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
+import org.jclouds.http.functions.ParseJson;
+import org.jclouds.domain.Status;
+
+import com.google.gson.Gson;
+import com.google.gson.reflect.TypeToken;
+
+/**
+ * This parses {@link Status} from a json string.
+ *
+ * @author Adrian Cole
+ */
+@Singleton
+public class ParseStatusesFromJsonResponse extends ParseJson> {
+
+ @Inject
+ public ParseStatusesFromJsonResponse(Gson gson) {
+ super(gson);
+ }
+
+ public SortedSet apply(InputStream stream) {
+ Type setType = new TypeToken>() {
+ }.getType();
+ try {
+ return gson.fromJson(new InputStreamReader(stream, "UTF-8"), setType);
+ } catch (UnsupportedEncodingException e) {
+ throw new RuntimeException("jclouds requires UTF-8 encoding", e);
+ }
+ }
+}
\ No newline at end of file
diff --git a/gogrid/src/main/java/org/jclouds/reference/GoGridConstants.java b/gogrid/src/main/java/org/jclouds/reference/GoGridConstants.java
new file mode 100644
index 0000000000..f239a18d4f
--- /dev/null
+++ b/gogrid/src/main/java/org/jclouds/reference/GoGridConstants.java
@@ -0,0 +1,53 @@
+/**
+ *
+ * Copyright (C) 2009 Cloud Conscious, LLC.
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+/**
+ *
+ * Copyright (C) 2009 Cloud Conscious, LLC.
+ *
+ * ====================================================================
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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 org.jclouds.reference;
+
+/**
+ * Configuration properties and constants used in GoGrid connections.
+ *
+ * @author Adrian Cole
+ */
+public interface GoGridConstants {
+ public static final String PROPERTY_GOGRID_ENDPOINT = "jclouds.gogrid.endpoint";
+ public static final String PROPERTY_GOGRID_USER = "jclouds.gogrid.user";
+ public static final String PROPERTY_GOGRID_PASSWORD = "jclouds.gogrid.password";
+}
diff --git a/gogrid/src/test/java/org/jclouds/GoGridAsyncClientTest.java b/gogrid/src/test/java/org/jclouds/GoGridAsyncClientTest.java
new file mode 100644
index 0000000000..040293825d
--- /dev/null
+++ b/gogrid/src/test/java/org/jclouds/GoGridAsyncClientTest.java
@@ -0,0 +1,127 @@
+/**
+ *
+ * Copyright (C) 2009 Cloud Conscious, LLC.
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+/**
+ *
+ * Copyright (C) 2009 Cloud Conscious, LLC.
+ *
+ * ====================================================================
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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 org.jclouds;
+
+import static org.testng.Assert.assertEquals;
+
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.lang.reflect.Method;
+import java.net.URI;
+
+import javax.inject.Singleton;
+
+import org.jclouds.http.filters.BasicAuthentication;
+import org.jclouds.logging.Logger;
+import org.jclouds.logging.Logger.LoggerFactory;
+import org.jclouds.rest.RestClientTest;
+import org.jclouds.rest.internal.GeneratedHttpRequest;
+import org.jclouds.rest.internal.RestAnnotationProcessor;
+import org.jclouds.functions.ParseStatusesFromJsonResponse;
+import org.jclouds.encryption.EncryptionService;
+import org.testng.annotations.Test;
+
+import com.google.inject.AbstractModule;
+import com.google.inject.Module;
+import com.google.inject.Provides;
+import com.google.inject.TypeLiteral;
+
+/**
+ * Tests annotation parsing of {@code GoGridAsyncClient}
+ *
+ * @author Adrian Cole
+ */
+@Test(groups = "unit", testName = "gogrid.GoGridAsyncClientTest")
+public class GoGridAsyncClientTest extends RestClientTest {
+
+ public void testGetMyMentions() throws SecurityException, NoSuchMethodException, IOException {
+ Method method = GoGridAsyncClient.class.getMethod("TODO: insert test method name");
+ GeneratedHttpRequest httpMethod = processor.createRequest(method);
+
+ assertRequestLineEquals(httpMethod, "TODO: insert expected request");
+ assertHeadersEqual(httpMethod, "");
+ assertPayloadEquals(httpMethod, null);
+
+ assertResponseParserClassEquals(method, httpMethod, ParseStatusesFromJsonResponse.class);
+ assertSaxResponseParserClassEquals(method, null);
+ assertExceptionParserClassEquals(method, null);
+
+ checkFilters(httpMethod);
+ }
+
+ @Override
+ protected void checkFilters(GeneratedHttpRequest httpMethod) {
+ assertEquals(httpMethod.getFilters().size(), 1);
+ assertEquals(httpMethod.getFilters().get(0).getClass(), BasicAuthentication.class);
+ }
+
+ @Override
+ protected TypeLiteral> createTypeLiteral() {
+ return new TypeLiteral>() {
+ };
+ }
+
+ @Override
+ protected Module createModule() {
+ return new AbstractModule() {
+ @Override
+ protected void configure() {
+ bind(URI.class).annotatedWith(GoGrid.class).toInstance(
+ URI.create("https://api.gogrid.com/api"));
+ bind(Logger.LoggerFactory.class).toInstance(new LoggerFactory() {
+ public Logger getLogger(String category) {
+ return Logger.NULL;
+ }
+ });
+ }
+
+ @SuppressWarnings("unused")
+ @Provides
+ @Singleton
+ public BasicAuthentication provideBasicAuthentication(EncryptionService encryptionService)
+ throws UnsupportedEncodingException {
+ return new BasicAuthentication("foo", "bar", encryptionService);
+ }
+
+ };
+ }
+}
diff --git a/gogrid/src/test/java/org/jclouds/GoGridClientLiveTest.java b/gogrid/src/test/java/org/jclouds/GoGridClientLiveTest.java
new file mode 100644
index 0000000000..8d41f00818
--- /dev/null
+++ b/gogrid/src/test/java/org/jclouds/GoGridClientLiveTest.java
@@ -0,0 +1,78 @@
+/**
+ *
+ * Copyright (C) 2009 Cloud Conscious, LLC.
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+/**
+ *
+ * Copyright (C) 2009 Cloud Conscious, LLC.
+ *
+ * ====================================================================
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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 org.jclouds;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.util.SortedSet;
+
+import org.jclouds.logging.log4j.config.Log4JLoggingModule;
+import org.jclouds.domain.Status;
+import org.testng.annotations.BeforeGroups;
+import org.testng.annotations.Test;
+
+/**
+ * Tests behavior of {@code GoGridClient}
+ *
+ * @author Adrian Cole
+ */
+@Test(groups = "live", testName = "gogrid.GoGridClientLiveTest")
+public class GoGridClientLiveTest {
+
+ private GoGridClient connection;
+
+ @BeforeGroups(groups = { "live" })
+ public void setupClient() {
+ String user = checkNotNull(System.getProperty("jclouds.test.user"), "jclouds.test.user");
+ String password = checkNotNull(System.getProperty("jclouds.test.key"), "jclouds.test.key");
+
+ connection = GoGridContextFactory.createContext(user, password, new Log4JLoggingModule())
+ .getApi();
+ }
+
+ @Test
+ public void testGetMyMentions() {
+ SortedSet response = connection.getMyMentions();
+ assert (response.size() > 0);
+ }
+
+}
diff --git a/gogrid/src/test/java/org/jclouds/GoGridContextBuilderTest.java b/gogrid/src/test/java/org/jclouds/GoGridContextBuilderTest.java
new file mode 100644
index 0000000000..630aa8e821
--- /dev/null
+++ b/gogrid/src/test/java/org/jclouds/GoGridContextBuilderTest.java
@@ -0,0 +1,116 @@
+/**
+ *
+ * Copyright (C) 2009 Cloud Conscious, LLC.
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+/**
+ *
+ * Copyright (C) 2009 Cloud Conscious, LLC.
+ *
+ * ====================================================================
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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 org.jclouds;
+
+import static org.testng.Assert.assertEquals;
+
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.jclouds.http.filters.BasicAuthentication;
+import org.jclouds.rest.RestContext;
+import org.jclouds.rest.internal.RestContextImpl;
+import org.jclouds.config.GoGridRestClientModule;
+import org.jclouds.reference.GoGridConstants;
+import org.testng.annotations.Test;
+
+import com.google.inject.Injector;
+import com.google.inject.Key;
+import com.google.inject.Module;
+import com.google.inject.TypeLiteral;
+
+/**
+ * Tests behavior of modules configured in GoGridContextBuilder
+ *
+ * @author Adrian Cole
+ */
+@Test(groups = "unit", testName = "gogrid.GoGridContextBuilderTest")
+public class GoGridContextBuilderTest {
+
+ public void testNewBuilder() {
+ GoGridContextBuilder builder = newBuilder();
+ assertEquals(builder.getProperties().getProperty(GoGridConstants.PROPERTY_GOGRID_ENDPOINT),
+ "https://api.gogrid.com/api");
+ assertEquals(builder.getProperties().getProperty(GoGridConstants.PROPERTY_GOGRID_USER),
+ "user");
+ assertEquals(builder.getProperties().getProperty(GoGridConstants.PROPERTY_GOGRID_PASSWORD),
+ "password");
+ }
+
+ public void testBuildContext() {
+ RestContext context = newBuilder().buildContext();
+ assertEquals(context.getClass(), RestContextImpl.class);
+ assertEquals(context.getAccount(), "user");
+ assertEquals(context.getEndPoint(), URI.create("https://api.gogrid.com/api"));
+ }
+
+ public void testBuildInjector() {
+ Injector i = newBuilder().buildInjector();
+ assert i.getInstance(Key.get(new TypeLiteral>() {
+ })) != null; // TODO: test all things taken from context
+ assert i.getInstance(BasicAuthentication.class) != null;
+ }
+
+ protected void testAddContextModule() {
+ List modules = new ArrayList();
+ GoGridContextBuilder builder = newBuilder();
+ builder.addContextModule(modules);
+ assertEquals(modules.size(), 1);
+ assertEquals(modules.get(0).getClass(), GoGridRestClientModule.class);
+ }
+
+ private GoGridContextBuilder newBuilder() {
+ GoGridContextBuilder builder = new GoGridContextBuilder(new GoGridPropertiesBuilder(
+ "user", "password").build());
+ return builder;
+ }
+
+ protected void addClientModule() {
+ List modules = new ArrayList();
+ GoGridContextBuilder builder = newBuilder();
+ builder.addClientModule(modules);
+ assertEquals(modules.size(), 1);
+ assertEquals(modules.get(0).getClass(), GoGridRestClientModule.class);
+ }
+
+}
diff --git a/gogrid/src/test/java/org/jclouds/config/GoGridContextModuleTest.java b/gogrid/src/test/java/org/jclouds/config/GoGridContextModuleTest.java
new file mode 100644
index 0000000000..bf04515f81
--- /dev/null
+++ b/gogrid/src/test/java/org/jclouds/config/GoGridContextModuleTest.java
@@ -0,0 +1,134 @@
+/**
+ *
+ * Copyright (C) 2009 Cloud Conscious, LLC.
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+/**
+ *
+ * Copyright (C) 2009 Cloud Conscious, LLC.
+ *
+ * ====================================================================
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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 org.jclouds.config;
+
+import static org.testng.Assert.assertEquals;
+import static com.google.common.util.concurrent.Executors.sameThreadExecutor;
+
+import org.jclouds.concurrent.config.ExecutorServiceModule;
+import org.jclouds.http.HttpRetryHandler;
+import org.jclouds.http.config.JavaUrlHttpCommandExecutorServiceModule;
+import org.jclouds.http.functions.config.ParserModule;
+import org.jclouds.http.functions.config.ParserModule.CDateAdapter;
+import org.jclouds.http.functions.config.ParserModule.DateAdapter;
+import org.jclouds.http.handlers.CloseContentAndSetExceptionErrorHandler;
+import org.jclouds.http.handlers.DelegatingErrorHandler;
+import org.jclouds.http.handlers.DelegatingRetryHandler;
+import org.jclouds.http.handlers.RedirectionRetryHandler;
+import org.jclouds.logging.Logger;
+import org.jclouds.logging.Logger.LoggerFactory;
+import org.jclouds.reference.GoGridConstants;
+import org.jclouds.util.Jsr330;
+import org.jclouds.Constants;
+import org.testng.annotations.Test;
+
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+
+/**
+ * @author Adrian Cole
+ */
+@Test(groups = "unit", testName = "gogrid.GoGridContextModule")
+public class GoGridContextModuleTest {
+
+ Injector createInjector() {
+ return Guice.createInjector(new GoGridRestClientModule(), new GoGridContextModule() {
+ @Override
+ protected void configure() {
+ bindConstant().annotatedWith(Jsr330.named(GoGridConstants.PROPERTY_GOGRID_USER)).to(
+ "user");
+ bindConstant().annotatedWith(Jsr330.named(GoGridConstants.PROPERTY_GOGRID_PASSWORD))
+ .to("password");
+ bindConstant().annotatedWith(Jsr330.named(GoGridConstants.PROPERTY_GOGRID_ENDPOINT))
+ .to("http://localhost");
+ bindConstant().annotatedWith(Jsr330.named(Constants.PROPERTY_MAX_CONNECTIONS_PER_HOST))
+ .to("1");
+ bindConstant().annotatedWith(Jsr330.named(Constants.PROPERTY_MAX_CONNECTIONS_PER_CONTEXT))
+ .to("0");
+ bindConstant().annotatedWith(Jsr330.named(Constants.PROPERTY_IO_WORKER_THREADS))
+ .to("1");
+ bindConstant().annotatedWith(Jsr330.named(Constants.PROPERTY_USER_THREADS))
+ .to("1");
+ bind(Logger.LoggerFactory.class).toInstance(new LoggerFactory() {
+ public Logger getLogger(String category) {
+ return Logger.NULL;
+ }
+ });
+ super.configure();
+ }
+ }, new ParserModule(), new JavaUrlHttpCommandExecutorServiceModule(),
+ new ExecutorServiceModule(sameThreadExecutor(), sameThreadExecutor()));
+ }
+
+ @Test
+ void testServerErrorHandler() {
+ DelegatingErrorHandler handler = createInjector().getInstance(DelegatingErrorHandler.class);
+ assertEquals(handler.getServerErrorHandler().getClass(),
+ CloseContentAndSetExceptionErrorHandler.class);
+ }
+
+ @Test
+ void testDateTimeAdapter() {
+ assertEquals(this.createInjector().getInstance(DateAdapter.class).getClass(),
+ CDateAdapter.class);
+ }
+
+ @Test
+ void testClientErrorHandler() {
+ DelegatingErrorHandler handler = createInjector().getInstance(DelegatingErrorHandler.class);
+ assertEquals(handler.getClientErrorHandler().getClass(),
+ CloseContentAndSetExceptionErrorHandler.class);
+ }
+
+ @Test
+ void testClientRetryHandler() {
+ DelegatingRetryHandler handler = createInjector().getInstance(DelegatingRetryHandler.class);
+ assertEquals(handler.getClientErrorRetryHandler(), HttpRetryHandler.NEVER_RETRY);
+ }
+
+ @Test
+ void testRedirectionRetryHandler() {
+ DelegatingRetryHandler handler = createInjector().getInstance(DelegatingRetryHandler.class);
+ assertEquals(handler.getRedirectionRetryHandler().getClass(), RedirectionRetryHandler.class);
+ }
+
+}
\ No newline at end of file
diff --git a/gogrid/src/test/java/org/jclouds/functions/ParseStatusesFromJsonResponseTest.java b/gogrid/src/test/java/org/jclouds/functions/ParseStatusesFromJsonResponseTest.java
new file mode 100644
index 0000000000..eb65374518
--- /dev/null
+++ b/gogrid/src/test/java/org/jclouds/functions/ParseStatusesFromJsonResponseTest.java
@@ -0,0 +1,167 @@
+/**
+ *
+ * Copyright (C) 2009 Cloud Conscious, LLC.
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ */
+/**
+ *
+ * Copyright (C) 2009 Cloud Conscious, LLC.
+ *
+ * ====================================================================
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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 org.jclouds.functions;
+
+import static org.testng.Assert.assertEquals;
+
+import java.io.InputStream;
+import java.net.URI;
+import java.net.UnknownHostException;
+import java.util.SortedSet;
+
+import org.jclouds.http.functions.config.ParserModule;
+import org.jclouds.domain.Status;
+import org.jclouds.domain.User;
+import org.jclouds.date.DateService;
+import org.jclouds.date.internal.SimpleDateFormatDateService;
+import org.testng.annotations.Test;
+
+import com.google.common.collect.ImmutableSortedSet;
+import com.google.gson.Gson;
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+
+/**
+ * Tests behavior of {@code ParseStatusesFromJsonResponse}
+ *
+ * @author Adrian Cole
+ */
+@Test(groups = "unit", testName = "twitter.ParseStatusesFromJsonResponseTest")
+public class ParseStatusesFromJsonResponseTest {
+
+ Injector i = Guice.createInjector(new ParserModule() {
+ @Override
+ protected void configure() {
+ bind(DateAdapter.class).to(CDateAdapter.class);
+ super.configure();
+ }
+ });
+ DateService dateService = new SimpleDateFormatDateService();
+
+ public void testApplyInputStreamDetails() throws UnknownHostException {
+ InputStream is = getClass().getResourceAsStream("/test_mentions.json");
+
+ SortedSet expects = ImmutableSortedSet
+ .of(
+
+ new Status(
+ dateService.cDateParse("Sat Oct 31 01:45:14 +0000 2009"),
+ false,
+ null,
+ 5303839785l,
+ null,
+ null,
+ null,
+ "TweetDeck",
+ "RT @jclouds: come find out about #cloud storage and how to access it from #java in palo alto this Tuesday: http://is.gd/4IFA9",
+ false,
+ new User(
+ dateService.cDateParse("Sat Apr 26 06:13:08 +0000 2008"),
+ "Jack of All Trades: Dad to anZel and Arden, VMware, vCloud, Security, Compliance, Former Developer",
+ 0,
+ 474,
+ false,
+ 199,
+ false,
+ 14540593,
+ "Bay Area, CA",
+ "Jian Zhen",
+ false,
+ "C6E2EE",
+ URI
+ .create("http://s.twimg.com/a/1256778767/images/themes/theme2/bg.gif"),
+ false,
+ URI
+ .create("http://a3.twimg.com/profile_images/64445411/30b8b19_bigger_normal.jpg"),
+ "1F98C7", "C6E2EE", "DAECF4", "663B12", false, "zhenjl",
+ 1981, "Pacific Time (US & Canada)", URI
+ .create("http://zhen.org"), -28800, false)),
+
+ new Status(
+ dateService.cDateParse("Sat Oct 31 09:35:27 +0000 2009"),
+ false,
+ null,
+ 5310690603l,
+ null,
+ null,
+ null,
+ "TweetDeck",
+ "RT @jclouds: live multi #cloud demo of jclouds connecting to 3 storage clouds from google appengine http://is.gd/4IXMh",
+ false,
+ new User(
+ dateService.cDateParse("Tue Apr 28 15:29:42 +0000 2009"),
+ "Some random guy who seems to care about cloud collisions at siliconANGLE.com",
+ 245,
+ 572,
+ false,
+ 325,
+ false,
+ 36093693,
+ "San Francisco ",
+ "James Watters",
+ false,
+ "C6E2EE",
+ URI
+ .create("http://a1.twimg.com/profile_background_images/24067016/17361976.jpg"),
+ true,
+ URI
+ .create("http://a3.twimg.com/profile_images/445071063/tiktaalik-transitional-fossil_normal.png"),
+ "1F98C7",
+ "C6E2EE",
+ "DAECF4",
+ "663B12",
+ false,
+ "wattersjames",
+ 1964,
+ "Pacific Time (US & Canada)",
+ URI
+ .create("http://siliconangle.net/ver2/author/jwatters/"),
+ -28800, false))
+
+ );
+
+ ParseStatusesFromJsonResponse parser = new ParseStatusesFromJsonResponse(i
+ .getInstance(Gson.class));
+ SortedSet response = parser.apply(is);
+ assertEquals(response, expects);
+ }
+}
diff --git a/gogrid/src/test/resources/log4j.xml b/gogrid/src/test/resources/log4j.xml
new file mode 100644
index 0000000000..6e388b9373
--- /dev/null
+++ b/gogrid/src/test/resources/log4j.xml
@@ -0,0 +1,110 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/gogrid/src/test/resources/test_mentions.json b/gogrid/src/test/resources/test_mentions.json
new file mode 100644
index 0000000000..19e6deb04a
--- /dev/null
+++ b/gogrid/src/test/resources/test_mentions.json
@@ -0,0 +1,77 @@
+[ { "created_at" : "Sat Oct 31 09:35:27 +0000 2009",
+ "favorited" : false,
+ "geo" : null,
+ "id" : 5310690603,
+ "in_reply_to_screen_name" : null,
+ "in_reply_to_status_id" : null,
+ "in_reply_to_user_id" : null,
+ "source" : "TweetDeck",
+ "text" : "RT @jclouds: live multi #cloud demo of jclouds connecting to 3 storage clouds from google appengine http://is.gd/4IXMh",
+ "truncated" : false,
+ "user" : { "created_at" : "Tue Apr 28 15:29:42 +0000 2009",
+ "description" : "Some random guy who seems to care about cloud collisions at siliconANGLE.com",
+ "favourites_count" : 245,
+ "followers_count" : 572,
+ "following" : false,
+ "friends_count" : 325,
+ "geo_enabled" : false,
+ "id" : 36093693,
+ "location" : "San Francisco ",
+ "name" : "James Watters",
+ "notifications" : false,
+ "profile_background_color" : "C6E2EE",
+ "profile_background_image_url" : "http://a1.twimg.com/profile_background_images/24067016/17361976.jpg",
+ "profile_background_tile" : true,
+ "profile_image_url" : "http://a3.twimg.com/profile_images/445071063/tiktaalik-transitional-fossil_normal.png",
+ "profile_link_color" : "1F98C7",
+ "profile_sidebar_border_color" : "C6E2EE",
+ "profile_sidebar_fill_color" : "DAECF4",
+ "profile_text_color" : "663B12",
+ "protected" : false,
+ "screen_name" : "wattersjames",
+ "statuses_count" : 1964,
+ "time_zone" : "Pacific Time (US & Canada)",
+ "url" : "http://siliconangle.net/ver2/author/jwatters/",
+ "utc_offset" : -28800,
+ "verified" : false
+ }
+ },
+ { "created_at" : "Sat Oct 31 01:45:14 +0000 2009",
+ "favorited" : false,
+ "geo" : null,
+ "id" : 5303839785,
+ "in_reply_to_screen_name" : null,
+ "in_reply_to_status_id" : null,
+ "in_reply_to_user_id" : null,
+ "source" : "TweetDeck",
+ "text" : "RT @jclouds: come find out about #cloud storage and how to access it from #java in palo alto this Tuesday: http://is.gd/4IFA9",
+ "truncated" : false,
+ "user" : { "created_at" : "Sat Apr 26 06:13:08 +0000 2008",
+ "description" : "Jack of All Trades: Dad to anZel and Arden, VMware, vCloud, Security, Compliance, Former Developer",
+ "favourites_count" : 0,
+ "followers_count" : 474,
+ "following" : false,
+ "friends_count" : 199,
+ "geo_enabled" : false,
+ "id" : 14540593,
+ "location" : "Bay Area, CA",
+ "name" : "Jian Zhen",
+ "notifications" : false,
+ "profile_background_color" : "C6E2EE",
+ "profile_background_image_url" : "http://s.twimg.com/a/1256778767/images/themes/theme2/bg.gif",
+ "profile_background_tile" : false,
+ "profile_image_url" : "http://a3.twimg.com/profile_images/64445411/30b8b19_bigger_normal.jpg",
+ "profile_link_color" : "1F98C7",
+ "profile_sidebar_border_color" : "C6E2EE",
+ "profile_sidebar_fill_color" : "DAECF4",
+ "profile_text_color" : "663B12",
+ "protected" : false,
+ "screen_name" : "zhenjl",
+ "statuses_count" : 1981,
+ "time_zone" : "Pacific Time (US & Canada)",
+ "url" : "http://zhen.org",
+ "utc_offset" : -28800,
+ "verified" : false
+ }
+ }
+]
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 5244513952..10496d33ad 100644
--- a/pom.xml
+++ b/pom.xml
@@ -18,9 +18,7 @@
limitations under the License.
====================================================================
--->
-
-
+-->
4.0.0
jclouds-project
@@ -51,7 +49,8 @@
rimuhosting
twitter
vcloud
-
+ gogrid
+
@@ -141,4 +140,4 @@ pageTracker._trackPageview();
-
+
\ No newline at end of file