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 Modules 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