This is an automated email from the ASF dual-hosted git repository. acosentino pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/camel.git
commit 021dfd40aa0531d3629cab2eafd1b093db700f9a Author: Andrea Cosentino <anco...@gmail.com> AuthorDate: Thu Sep 6 13:44:03 2018 +0200 CAMEL-12784 - Create a Camel-google-calendar-stream component --- .../stream/GoogleCalendarStreamComponent.java | 94 ++++++++++ .../stream/GoogleCalendarStreamConfiguration.java | 179 ++++++++++++++++++ .../stream/GoogleCalendarStreamConstants.java | 30 ++++ .../stream/GoogleCalendarStreamConsumer.java | 117 ++++++++++++ .../stream/GoogleCalendarStreamEndpoint.java | 96 ++++++++++ .../apache/camel/component/google-calendar-stream | 17 ++ .../AbstractGoogleCalendarStreamTestSupport.java | 72 ++++++++ ...oogleCalendarStreamConsumerIntegrationTest.java | 45 +++++ .../src/test/resources/test-options.properties | 2 +- ...leCalendarStreamComponentAutoConfiguration.java | 130 ++++++++++++++ ...GoogleCalendarStreamComponentConfiguration.java | 199 +++++++++++++++++++++ .../src/main/resources/META-INF/spring.factories | 4 +- 12 files changed, 983 insertions(+), 2 deletions(-) diff --git a/components/camel-google-calendar/src/main/java/org/apache/camel/component/google/calendar/stream/GoogleCalendarStreamComponent.java b/components/camel-google-calendar/src/main/java/org/apache/camel/component/google/calendar/stream/GoogleCalendarStreamComponent.java new file mode 100644 index 0000000..82c6d10 --- /dev/null +++ b/components/camel-google-calendar/src/main/java/org/apache/camel/component/google/calendar/stream/GoogleCalendarStreamComponent.java @@ -0,0 +1,94 @@ +/** + * 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.apache.camel.component.google.calendar.stream; + +import java.util.Map; + +import org.apache.camel.CamelContext; +import org.apache.camel.Endpoint; +import org.apache.camel.component.google.calendar.BatchGoogleCalendarClientFactory; +import org.apache.camel.component.google.calendar.GoogleCalendarClientFactory; +import org.apache.camel.impl.DefaultComponent; +import org.apache.camel.spi.Metadata; + +import com.google.api.services.calendar.Calendar; + +/** + * Represents the component that manages {@link GoogleCalendarStreamEndpoint}. + */ +public class GoogleCalendarStreamComponent extends DefaultComponent { + + @Metadata(label = "advanced") + private Calendar client; + @Metadata(label = "advanced") + private GoogleCalendarClientFactory clientFactory; + @Metadata(label = "advanced") + private GoogleCalendarStreamConfiguration configuration; + + public GoogleCalendarStreamComponent() { + this(null); + } + + public GoogleCalendarStreamComponent(CamelContext context) { + super(context); + + this.configuration = new GoogleCalendarStreamConfiguration(); + } + + public Calendar getClient(GoogleCalendarStreamConfiguration googleMailConfiguration) { + if (client == null) { + client = getClientFactory().makeClient(googleMailConfiguration.getClientId(), googleMailConfiguration.getClientSecret(), configuration.getScopes(), + googleMailConfiguration.getApplicationName(), googleMailConfiguration.getRefreshToken(), + googleMailConfiguration.getAccessToken(), null, null, "me"); + } + return client; + } + + /** + * The client Factory + */ + public GoogleCalendarClientFactory getClientFactory() { + if (clientFactory == null) { + clientFactory = new BatchGoogleCalendarClientFactory(); + } + return clientFactory; + } + + public GoogleCalendarStreamConfiguration getConfiguration() { + return configuration; + } + + /** + * The configuration + */ + public void setConfiguration(GoogleCalendarStreamConfiguration configuration) { + this.configuration = configuration; + } + + public void setClientFactory(GoogleCalendarClientFactory clientFactory) { + this.clientFactory = clientFactory; + } + + @Override + protected Endpoint createEndpoint(String uri, String remaining, Map<String, Object> parameters) throws Exception { + final GoogleCalendarStreamConfiguration configuration = this.configuration.copy(); + setProperties(configuration, parameters); + GoogleCalendarStreamEndpoint endpoint = new GoogleCalendarStreamEndpoint(uri, this, configuration); + setProperties(endpoint, parameters); + return endpoint; + } +} diff --git a/components/camel-google-calendar/src/main/java/org/apache/camel/component/google/calendar/stream/GoogleCalendarStreamConfiguration.java b/components/camel-google-calendar/src/main/java/org/apache/camel/component/google/calendar/stream/GoogleCalendarStreamConfiguration.java new file mode 100644 index 0000000..25396fb --- /dev/null +++ b/components/camel-google-calendar/src/main/java/org/apache/camel/component/google/calendar/stream/GoogleCalendarStreamConfiguration.java @@ -0,0 +1,179 @@ +/** + * 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.apache.camel.component.google.calendar.stream; + +import java.util.Arrays; +import java.util.List; + +import com.google.api.services.calendar.CalendarScopes; + +import org.apache.camel.RuntimeCamelException; +import org.apache.camel.spi.UriParam; +import org.apache.camel.spi.UriParams; +import org.apache.camel.spi.UriPath; + +/** + * Component configuration for GoogleCalendar stream component. + */ +@UriParams +public class GoogleCalendarStreamConfiguration implements Cloneable { + private static final List<String> DEFAULT_SCOPES = Arrays.asList(CalendarScopes.CALENDAR); + + @UriPath + private String index; + + @UriParam + private List<String> scopes = DEFAULT_SCOPES; + + @UriParam + private String clientId; + + @UriParam + private String clientSecret; + + @UriParam + private String accessToken; + + @UriParam + private String refreshToken; + + @UriParam + private String applicationName; + + @UriParam + private String query; + + @UriParam(defaultValue = "10") + private int maxResults = 10; + + public String getClientId() { + return clientId; + } + + /** + * Client ID of the mail application + */ + public void setClientId(String clientId) { + this.clientId = clientId; + } + + public String getClientSecret() { + return clientSecret; + } + + /** + * Client secret of the mail application + */ + public void setClientSecret(String clientSecret) { + this.clientSecret = clientSecret; + } + + public String getAccessToken() { + return accessToken; + } + + /** + * OAuth 2 access token. This typically expires after an hour so + * refreshToken is recommended for long term usage. + */ + public void setAccessToken(String accessToken) { + this.accessToken = accessToken; + } + + public String getRefreshToken() { + return refreshToken; + } + + /** + * OAuth 2 refresh token. Using this, the Google Calendar component can + * obtain a new accessToken whenever the current one expires - a necessity + * if the application is long-lived. + */ + public void setRefreshToken(String refreshToken) { + this.refreshToken = refreshToken; + } + + public String getApplicationName() { + return applicationName; + } + + /** + * Google mail application name. Example would be "camel-google-mail/1.0" + */ + public void setApplicationName(String applicationName) { + this.applicationName = applicationName; + } + + public List<String> getScopes() { + return scopes; + } + + /** + * Specifies the level of permissions you want a mail application to have to + * a user account. See https://developers.google.com/gmail/api/auth/scopes + * for more info. + */ + public void setScopes(List<String> scopes) { + this.scopes = scopes; + } + + public String getIndex() { + return index; + } + + /** + * Specifies an index for the endpoint + */ + public void setIndex(String index) { + this.index = index; + } + + public String getQuery() { + return query; + } + + /** + * The query to execute on gmail box + */ + public void setQuery(String query) { + this.query = query; + } + + public int getMaxResults() { + return maxResults; + } + + /** + * Max results to be returned + */ + public void setMaxResults(int maxResults) { + this.maxResults = maxResults; + } + + // ************************************************* + // + // ************************************************* + + public GoogleCalendarStreamConfiguration copy() { + try { + return (GoogleCalendarStreamConfiguration)super.clone(); + } catch (CloneNotSupportedException e) { + throw new RuntimeCamelException(e); + } + } + +} diff --git a/components/camel-google-calendar/src/main/java/org/apache/camel/component/google/calendar/stream/GoogleCalendarStreamConstants.java b/components/camel-google-calendar/src/main/java/org/apache/camel/component/google/calendar/stream/GoogleCalendarStreamConstants.java new file mode 100644 index 0000000..c671c54 --- /dev/null +++ b/components/camel-google-calendar/src/main/java/org/apache/camel/component/google/calendar/stream/GoogleCalendarStreamConstants.java @@ -0,0 +1,30 @@ +/** + * 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.apache.camel.component.google.calendar.stream; + +/** + * Constants used in Camel Google Calendar Stream + */ +public interface GoogleCalendarStreamConstants { + + String MAIL_TO = "CamelGoogleMailStreamTo"; + String MAIL_FROM = "CamelGoogleMailStreamFrom"; + String MAIL_CC = "CamelGoogleMailStreamCc"; + String MAIL_BCC = "CamelGoogleMailStreamBcc"; + String MAIL_SUBJECT = "CamelGoogleMailStreamSubject"; + String MAIL_ID = "CamelGoogleMailId"; +} diff --git a/components/camel-google-calendar/src/main/java/org/apache/camel/component/google/calendar/stream/GoogleCalendarStreamConsumer.java b/components/camel-google-calendar/src/main/java/org/apache/camel/component/google/calendar/stream/GoogleCalendarStreamConsumer.java new file mode 100644 index 0000000..25797b5 --- /dev/null +++ b/components/camel-google-calendar/src/main/java/org/apache/camel/component/google/calendar/stream/GoogleCalendarStreamConsumer.java @@ -0,0 +1,117 @@ +/** + * 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.apache.camel.component.google.calendar.stream; + +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.LinkedList; +import java.util.List; +import java.util.Queue; + +import org.apache.camel.AsyncCallback; +import org.apache.camel.Endpoint; +import org.apache.camel.Exchange; +import org.apache.camel.Processor; +import org.apache.camel.impl.ScheduledBatchPollingConsumer; +import org.apache.camel.util.CastUtils; +import org.apache.camel.util.ObjectHelper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.google.api.client.util.DateTime; +import com.google.api.services.calendar.Calendar; +import com.google.api.services.calendar.model.Event; +import com.google.api.services.calendar.model.Events; + +/** + * The GoogleCalendar consumer. + */ +public class GoogleCalendarStreamConsumer extends ScheduledBatchPollingConsumer { + + private static final Logger LOG = LoggerFactory.getLogger(GoogleCalendarStreamConsumer.class); + + public GoogleCalendarStreamConsumer(Endpoint endpoint, Processor processor) { + super(endpoint, processor); + } + + protected GoogleCalendarStreamConfiguration getConfiguration() { + return getEndpoint().getConfiguration(); + } + + protected Calendar getClient() { + return getEndpoint().getClient(); + } + + @Override + public GoogleCalendarStreamEndpoint getEndpoint() { + return (GoogleCalendarStreamEndpoint)super.getEndpoint(); + } + + @Override + protected int poll() throws Exception { + Date date = new Date(); + com.google.api.services.calendar.Calendar.Events.List request = getClient().events().list("primary").setOrderBy("updated").setTimeMin(new DateTime(date)); + if (ObjectHelper.isNotEmpty(getConfiguration().getQuery())) { + request.setQ(getConfiguration().getQuery()); + } + if (ObjectHelper.isNotEmpty(getConfiguration().getMaxResults())) { + request.setMaxResults(getConfiguration().getMaxResults()); + } + + Queue<Exchange> answer = new LinkedList<>(); + + Events c = request.execute(); + + if (c != null) { + List<Event> list = c.getItems(); + for (Event event : list) { + Exchange exchange = getEndpoint().createExchange(getEndpoint().getExchangePattern(), event); + answer.add(exchange); + } + } + + return processBatch(CastUtils.cast(answer)); + } + + @Override + public int processBatch(Queue<Object> exchanges) throws Exception { + int total = exchanges.size(); + + for (int index = 0; index < total && isBatchAllowed(); index++) { + // only loop if we are started (allowed to run) + final Exchange exchange = ObjectHelper.cast(Exchange.class, exchanges.poll()); + // add current index and total as properties + exchange.setProperty(Exchange.BATCH_INDEX, index); + exchange.setProperty(Exchange.BATCH_SIZE, total); + exchange.setProperty(Exchange.BATCH_COMPLETE, index == total - 1); + + // update pending number of exchanges + pendingExchanges = total - index - 1; + + getAsyncProcessor().process(exchange, new AsyncCallback() { + @Override + public void done(boolean doneSync) { + LOG.trace("Processing exchange done"); + } + }); + } + + return total; + } + +} diff --git a/components/camel-google-calendar/src/main/java/org/apache/camel/component/google/calendar/stream/GoogleCalendarStreamEndpoint.java b/components/camel-google-calendar/src/main/java/org/apache/camel/component/google/calendar/stream/GoogleCalendarStreamEndpoint.java new file mode 100644 index 0000000..952c476 --- /dev/null +++ b/components/camel-google-calendar/src/main/java/org/apache/camel/component/google/calendar/stream/GoogleCalendarStreamEndpoint.java @@ -0,0 +1,96 @@ +/** + * 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.apache.camel.component.google.calendar.stream; + +import java.io.UnsupportedEncodingException; + +import com.google.api.services.calendar.Calendar; +import com.google.api.services.calendar.model.Event; + +import org.apache.camel.Consumer; +import org.apache.camel.Exchange; +import org.apache.camel.ExchangePattern; +import org.apache.camel.Message; +import org.apache.camel.Processor; +import org.apache.camel.Producer; +import org.apache.camel.component.google.calendar.GoogleCalendarClientFactory; +import org.apache.camel.impl.ScheduledPollEndpoint; +import org.apache.camel.spi.UriEndpoint; +import org.apache.camel.spi.UriParam; + +/** + * The google-mail component provides access to Google Mail. + */ +@UriEndpoint(firstVersion = "2.23.0", + scheme = "google-calendar-stream", + title = "Google Calendar Stream", + syntax = "google-calendar-stream:index", + consumerClass = GoogleCalendarStreamConsumer.class, + consumerOnly = true, + label = "api,cloud") +public class GoogleCalendarStreamEndpoint extends ScheduledPollEndpoint { + + @UriParam + private GoogleCalendarStreamConfiguration configuration; + + public GoogleCalendarStreamEndpoint(String uri, GoogleCalendarStreamComponent component, GoogleCalendarStreamConfiguration endpointConfiguration) { + super(uri, component); + this.configuration = endpointConfiguration; + } + + @Override + public Producer createProducer() throws Exception { + throw new UnsupportedOperationException("The camel google mail stream component doesn't support producer"); + } + + @Override + public Consumer createConsumer(Processor processor) throws Exception { + final GoogleCalendarStreamConsumer consumer = new GoogleCalendarStreamConsumer(this, processor); + configureConsumer(consumer); + return consumer; + } + + public Calendar getClient() { + return ((GoogleCalendarStreamComponent)getComponent()).getClient(configuration); + } + + public GoogleCalendarClientFactory getClientFactory() { + return ((GoogleCalendarStreamComponent)getComponent()).getClientFactory(); + } + + public void setClientFactory(GoogleCalendarClientFactory clientFactory) { + ((GoogleCalendarStreamComponent)getComponent()).setClientFactory(clientFactory); + } + + public GoogleCalendarStreamConfiguration getConfiguration() { + return configuration; + } + + @Override + public boolean isSingleton() { + return true; + } + + public Exchange createExchange(ExchangePattern pattern, Event event) throws UnsupportedEncodingException { + + Exchange exchange = super.createExchange(); + Message message = exchange.getIn(); + message.setBody(event); + System.err.println("Ciao " + message.getBody().toString()); + return exchange; + } +} diff --git a/components/camel-google-calendar/src/main/resources/META-INF/services/org/apache/camel/component/google-calendar-stream b/components/camel-google-calendar/src/main/resources/META-INF/services/org/apache/camel/component/google-calendar-stream new file mode 100644 index 0000000..1e548d6 --- /dev/null +++ b/components/camel-google-calendar/src/main/resources/META-INF/services/org/apache/camel/component/google-calendar-stream @@ -0,0 +1,17 @@ +# +# 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. +# +class=org.apache.camel.component.google.calendar.stream.GoogleCalendarStreamComponent diff --git a/components/camel-google-calendar/src/test/java/org/apache/camel/component/google/calendar/stream/AbstractGoogleCalendarStreamTestSupport.java b/components/camel-google-calendar/src/test/java/org/apache/camel/component/google/calendar/stream/AbstractGoogleCalendarStreamTestSupport.java new file mode 100644 index 0000000..6cf4a25 --- /dev/null +++ b/components/camel-google-calendar/src/test/java/org/apache/camel/component/google/calendar/stream/AbstractGoogleCalendarStreamTestSupport.java @@ -0,0 +1,72 @@ +/** + * 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.apache.camel.component.google.calendar.stream; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; +import java.util.Properties; + +import org.apache.camel.CamelContext; +import org.apache.camel.test.junit4.CamelTestSupport; +import org.apache.camel.util.IntrospectionSupport; + +/** + * Abstract base class for GoogleMail Integration tests generated by Camel API + * component maven plugin. + */ +public class AbstractGoogleCalendarStreamTestSupport extends CamelTestSupport { + + // userid of the currently authenticated user + protected static final String CURRENT_USERID = "me"; + private static final String TEST_OPTIONS_PROPERTIES = "/test-options.properties"; + + @Override + protected CamelContext createCamelContext() throws Exception { + + final CamelContext context = super.createCamelContext(); + + // read GoogleMail component configuration from TEST_OPTIONS_PROPERTIES + final Properties properties = new Properties(); + try { + properties.load(getClass().getResourceAsStream(TEST_OPTIONS_PROPERTIES)); + } catch (Exception e) { + throw new IOException(String.format("%s could not be loaded: %s", TEST_OPTIONS_PROPERTIES, e.getMessage()), e); + } + + Map<String, Object> options = new HashMap<>(); + for (Map.Entry<Object, Object> entry : properties.entrySet()) { + options.put(entry.getKey().toString(), entry.getValue()); + } + + final GoogleCalendarStreamConfiguration configuration = new GoogleCalendarStreamConfiguration(); + IntrospectionSupport.setProperties(configuration, options); + + // add GoogleMailComponent to Camel context + final GoogleCalendarStreamComponent component = new GoogleCalendarStreamComponent(context); + component.setConfiguration(configuration); + context.addComponent("google-calendar-stream", component); + + return context; + } + + @Override + public boolean isCreateCamelContextPerClass() { + // only create the context once for this class + return true; + } +} diff --git a/components/camel-google-calendar/src/test/java/org/apache/camel/component/google/calendar/stream/GoogleCalendarStreamConsumerIntegrationTest.java b/components/camel-google-calendar/src/test/java/org/apache/camel/component/google/calendar/stream/GoogleCalendarStreamConsumerIntegrationTest.java new file mode 100644 index 0000000..c58ef0d --- /dev/null +++ b/components/camel-google-calendar/src/test/java/org/apache/camel/component/google/calendar/stream/GoogleCalendarStreamConsumerIntegrationTest.java @@ -0,0 +1,45 @@ +/** + * 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.apache.camel.component.google.calendar.stream; + +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.component.mock.MockEndpoint; +import org.junit.Test; + +public class GoogleCalendarStreamConsumerIntegrationTest extends AbstractGoogleCalendarStreamTestSupport { + + @Test + public void testConsumePrefixedMessages() throws Exception { + MockEndpoint mock = getMockEndpoint("mock:result"); + mock.expectedMinimumMessageCount(1); + Thread.sleep(10000); + + assertMockEndpointsSatisfied(); + } + + @Override + protected RouteBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + @Override + public void configure() { + + from("google-calendar-stream://test?delay=5000&maxResults=5").to("mock:result"); + + } + }; + } +} diff --git a/components/camel-google-calendar/src/test/resources/test-options.properties b/components/camel-google-calendar/src/test/resources/test-options.properties index 3d7125f..eb80178 100644 --- a/components/camel-google-calendar/src/test/resources/test-options.properties +++ b/components/camel-google-calendar/src/test/resources/test-options.properties @@ -22,7 +22,7 @@ clientId= clientSecret= applicationName=camel-google-calendar/1.0 -#accessToken= +accessToken= refreshToken= emailAddress= p12FileName= diff --git a/platforms/spring-boot/components-starter/camel-google-calendar-starter/src/main/java/org/apache/camel/component/google/calendar/stream/springboot/GoogleCalendarStreamComponentAutoConfiguration.java b/platforms/spring-boot/components-starter/camel-google-calendar-starter/src/main/java/org/apache/camel/component/google/calendar/stream/springboot/GoogleCalendarStreamComponentAutoConfiguration.java new file mode 100644 index 0000000..91bf169 --- /dev/null +++ b/platforms/spring-boot/components-starter/camel-google-calendar-starter/src/main/java/org/apache/camel/component/google/calendar/stream/springboot/GoogleCalendarStreamComponentAutoConfiguration.java @@ -0,0 +1,130 @@ +/** + * 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.apache.camel.component.google.calendar.stream.springboot; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import javax.annotation.Generated; +import org.apache.camel.CamelContext; +import org.apache.camel.component.google.calendar.stream.GoogleCalendarStreamComponent; +import org.apache.camel.spi.ComponentCustomizer; +import org.apache.camel.spi.HasId; +import org.apache.camel.spring.boot.CamelAutoConfiguration; +import org.apache.camel.spring.boot.ComponentConfigurationProperties; +import org.apache.camel.spring.boot.util.CamelPropertiesHelper; +import org.apache.camel.spring.boot.util.ConditionalOnCamelContextAndAutoConfigurationBeans; +import org.apache.camel.spring.boot.util.GroupCondition; +import org.apache.camel.spring.boot.util.HierarchicalPropertiesEvaluator; +import org.apache.camel.util.IntrospectionSupport; +import org.apache.camel.util.ObjectHelper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.AutoConfigureAfter; +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Conditional; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Lazy; + +/** + * Generated by camel-package-maven-plugin - do not edit this file! + */ +@Generated("org.apache.camel.maven.packaging.SpringBootAutoConfigurationMojo") +@Configuration +@Conditional({ConditionalOnCamelContextAndAutoConfigurationBeans.class, + GoogleCalendarStreamComponentAutoConfiguration.GroupConditions.class}) +@AutoConfigureAfter(CamelAutoConfiguration.class) +@EnableConfigurationProperties({ComponentConfigurationProperties.class, + GoogleCalendarStreamComponentConfiguration.class}) +public class GoogleCalendarStreamComponentAutoConfiguration { + + private static final Logger LOGGER = LoggerFactory + .getLogger(GoogleCalendarStreamComponentAutoConfiguration.class); + @Autowired + private ApplicationContext applicationContext; + @Autowired + private CamelContext camelContext; + @Autowired + private GoogleCalendarStreamComponentConfiguration configuration; + @Autowired(required = false) + private List<ComponentCustomizer<GoogleCalendarStreamComponent>> customizers; + + static class GroupConditions extends GroupCondition { + public GroupConditions() { + super("camel.component", "camel.component.google-calendar-stream"); + } + } + + @Lazy + @Bean(name = "google-calendar-stream-component") + @ConditionalOnMissingBean(GoogleCalendarStreamComponent.class) + public GoogleCalendarStreamComponent configureGoogleCalendarStreamComponent() + throws Exception { + GoogleCalendarStreamComponent component = new GoogleCalendarStreamComponent(); + component.setCamelContext(camelContext); + Map<String, Object> parameters = new HashMap<>(); + IntrospectionSupport.getProperties(configuration, parameters, null, + false); + for (Map.Entry<String, Object> entry : parameters.entrySet()) { + Object value = entry.getValue(); + Class<?> paramClass = value.getClass(); + if (paramClass.getName().endsWith("NestedConfiguration")) { + Class nestedClass = null; + try { + nestedClass = (Class) paramClass.getDeclaredField( + "CAMEL_NESTED_CLASS").get(null); + HashMap<String, Object> nestedParameters = new HashMap<>(); + IntrospectionSupport.getProperties(value, nestedParameters, + null, false); + Object nestedProperty = nestedClass.newInstance(); + CamelPropertiesHelper.setCamelProperties(camelContext, + nestedProperty, nestedParameters, false); + entry.setValue(nestedProperty); + } catch (NoSuchFieldException e) { + } + } + } + CamelPropertiesHelper.setCamelProperties(camelContext, component, + parameters, false); + if (ObjectHelper.isNotEmpty(customizers)) { + for (ComponentCustomizer<GoogleCalendarStreamComponent> customizer : customizers) { + boolean useCustomizer = (customizer instanceof HasId) + ? HierarchicalPropertiesEvaluator + .evaluate( + applicationContext.getEnvironment(), + "camel.component.customizer", + "camel.component.google-calendar-stream.customizer", + ((HasId) customizer).getId()) + : HierarchicalPropertiesEvaluator + .evaluate(applicationContext.getEnvironment(), + "camel.component.customizer", + "camel.component.google-calendar-stream.customizer"); + if (useCustomizer) { + LOGGER.debug("Configure component {}, with customizer {}", + component, customizer); + customizer.customize(component); + } + } + } + return component; + } +} \ No newline at end of file diff --git a/platforms/spring-boot/components-starter/camel-google-calendar-starter/src/main/java/org/apache/camel/component/google/calendar/stream/springboot/GoogleCalendarStreamComponentConfiguration.java b/platforms/spring-boot/components-starter/camel-google-calendar-starter/src/main/java/org/apache/camel/component/google/calendar/stream/springboot/GoogleCalendarStreamComponentConfiguration.java new file mode 100644 index 0000000..e1ed7ac --- /dev/null +++ b/platforms/spring-boot/components-starter/camel-google-calendar-starter/src/main/java/org/apache/camel/component/google/calendar/stream/springboot/GoogleCalendarStreamComponentConfiguration.java @@ -0,0 +1,199 @@ +/** + * 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.apache.camel.component.google.calendar.stream.springboot; + +import java.util.List; +import javax.annotation.Generated; +import org.apache.camel.spring.boot.ComponentConfigurationPropertiesCommon; +import org.springframework.boot.context.properties.ConfigurationProperties; + +/** + * The google-mail component provides access to Google Mail. + * + * Generated by camel-package-maven-plugin - do not edit this file! + */ +@Generated("org.apache.camel.maven.packaging.SpringBootAutoConfigurationMojo") +@ConfigurationProperties(prefix = "camel.component.google-calendar-stream") +public class GoogleCalendarStreamComponentConfiguration + extends + ComponentConfigurationPropertiesCommon { + + /** + * Whether to enable auto configuration of the google-calendar-stream + * component. This is enabled by default. + */ + private Boolean enabled; + /** + * The configuration + */ + private GoogleCalendarStreamConfigurationNestedConfiguration configuration; + /** + * The client Factory. The option is a + * org.apache.camel.component.google.calendar.GoogleCalendarClientFactory + * type. + */ + private String clientFactory; + /** + * Whether the component should resolve property placeholders on itself when + * starting. Only properties which are of String type can use property + * placeholders. + */ + private Boolean resolvePropertyPlaceholders = true; + + public GoogleCalendarStreamConfigurationNestedConfiguration getConfiguration() { + return configuration; + } + + public void setConfiguration( + GoogleCalendarStreamConfigurationNestedConfiguration configuration) { + this.configuration = configuration; + } + + public String getClientFactory() { + return clientFactory; + } + + public void setClientFactory(String clientFactory) { + this.clientFactory = clientFactory; + } + + public Boolean getResolvePropertyPlaceholders() { + return resolvePropertyPlaceholders; + } + + public void setResolvePropertyPlaceholders( + Boolean resolvePropertyPlaceholders) { + this.resolvePropertyPlaceholders = resolvePropertyPlaceholders; + } + + public static class GoogleCalendarStreamConfigurationNestedConfiguration { + public static final Class CAMEL_NESTED_CLASS = org.apache.camel.component.google.calendar.stream.GoogleCalendarStreamConfiguration.class; + /** + * Client ID of the mail application + */ + private String clientId; + /** + * Client secret of the mail application + */ + private String clientSecret; + /** + * OAuth 2 access token. This typically expires after an hour so + * refreshToken is recommended for long term usage. + */ + private String accessToken; + /** + * OAuth 2 refresh token. Using this, the Google Calendar component can + * obtain a new accessToken whenever the current one expires - a + * necessity if the application is long-lived. + */ + private String refreshToken; + /** + * Google mail application name. Example would be camel-google-mail/1.0 + */ + private String applicationName; + /** + * Specifies the level of permissions you want a mail application to + * have to a user account. See + * https://developers.google.com/gmail/api/auth/scopes for more info. + */ + private List scopes; + /** + * Specifies an index for the endpoint + */ + private String index; + /** + * The query to execute on gmail box + */ + private String query; + /** + * Max results to be returned + */ + private Integer maxResults = 10; + + public String getClientId() { + return clientId; + } + + public void setClientId(String clientId) { + this.clientId = clientId; + } + + public String getClientSecret() { + return clientSecret; + } + + public void setClientSecret(String clientSecret) { + this.clientSecret = clientSecret; + } + + public String getAccessToken() { + return accessToken; + } + + public void setAccessToken(String accessToken) { + this.accessToken = accessToken; + } + + public String getRefreshToken() { + return refreshToken; + } + + public void setRefreshToken(String refreshToken) { + this.refreshToken = refreshToken; + } + + public String getApplicationName() { + return applicationName; + } + + public void setApplicationName(String applicationName) { + this.applicationName = applicationName; + } + + public List getScopes() { + return scopes; + } + + public void setScopes(List scopes) { + this.scopes = scopes; + } + + public String getIndex() { + return index; + } + + public void setIndex(String index) { + this.index = index; + } + + public String getQuery() { + return query; + } + + public void setQuery(String query) { + this.query = query; + } + + public Integer getMaxResults() { + return maxResults; + } + + public void setMaxResults(Integer maxResults) { + this.maxResults = maxResults; + } + } +} \ No newline at end of file diff --git a/platforms/spring-boot/components-starter/camel-google-calendar-starter/src/main/resources/META-INF/spring.factories b/platforms/spring-boot/components-starter/camel-google-calendar-starter/src/main/resources/META-INF/spring.factories index b3e3850..91e8028 100644 --- a/platforms/spring-boot/components-starter/camel-google-calendar-starter/src/main/resources/META-INF/spring.factories +++ b/platforms/spring-boot/components-starter/camel-google-calendar-starter/src/main/resources/META-INF/spring.factories @@ -15,4 +15,6 @@ ## limitations under the License. ## --------------------------------------------------------------------------- org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ -org.apache.camel.component.google.calendar.springboot.GoogleCalendarComponentAutoConfiguration +org.apache.camel.component.google.calendar.springboot.GoogleCalendarComponentAutoConfiguration,\ +org.apache.camel.component.google.calendar.stream.springboot.GoogleCalendarStreamComponentAutoConfiguration +