From: James William Dumay Date: Fri, 12 Sep 2008 07:36:04 +0000 (+0000) Subject: Adding archiva-event module to database branch. X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=7fb302ef5447d9d91e11c4aebc80f9e766c2ff2e;p=archiva.git Adding archiva-event module to database branch. git-svn-id: https://svn.apache.org/repos/asf/archiva/branches/archiva-database-decoupling@694629 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/archiva-modules/archiva-base/archiva-event/pom.xml b/archiva-modules/archiva-base/archiva-event/pom.xml new file mode 100644 index 000000000..139cfc118 --- /dev/null +++ b/archiva-modules/archiva-base/archiva-event/pom.xml @@ -0,0 +1,34 @@ + + + + + + org.apache.archiva + archiva-base + 1.2-SNAPSHOT + + + 4.0.0 + org.apache.archiva + archiva-event + jar + 1.2-SNAPSHOT + Archiva Base :: Event + diff --git a/archiva-modules/archiva-base/archiva-event/src/main/java/org/apache/archiva/event/AsynchronousEventBus.java b/archiva-modules/archiva-base/archiva-event/src/main/java/org/apache/archiva/event/AsynchronousEventBus.java new file mode 100644 index 000000000..2087085dc --- /dev/null +++ b/archiva-modules/archiva-base/archiva-event/src/main/java/org/apache/archiva/event/AsynchronousEventBus.java @@ -0,0 +1,117 @@ +package org.apache.archiva.event; + +/* + * 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. + */ + +import java.util.Collections; +import java.util.HashSet; +import java.util.Set; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.LinkedBlockingQueue; + +/** + * Simple Async Event Bus implementation + * + * @author jdumay + */ +public class AsynchronousEventBus implements EventBus +{ + private final Set observers = Collections.synchronizedSet(new HashSet()); + + private final BlockingQueue events = new LinkedBlockingQueue(); + + private final Thread workerThread; + + private final int threads; + + public AsynchronousEventBus(int threads) + { + this.threads = threads; + workerThread = new Thread(new WorkerRunnable()); + workerThread.start(); + } + + public void emit(EventEmitter emitter, EventMessage message) + { + events.offer(new Event(emitter, message)); + } + + public void subscribe(EventObserver observer) + { + observers.add(observer); + } + + public void unsubscribe(EventObserver observer) + { + observers.remove(observer); + } + + public Set getObservers() { + return new HashSet(observers); + } + + class WorkerRunnable implements Runnable + { + private final ExecutorService service; + + public WorkerRunnable() + { + service = Executors.newFixedThreadPool(threads); + } + + public void run() + { + while (true) + { + dequeueAndExecute(); + } + } + + private void dequeueAndExecute() + { + try + { + final Event event = events.take(); + for (final EventObserver observer : observers) + { + service.execute(new Runnable() + { + public void run() + { + try + { + observer.observe(event); + } + finally + { + //log me + } + } + }); + } + } + catch (InterruptedException e) + { + //Do nothing + } + } + } +} diff --git a/archiva-modules/archiva-base/archiva-event/src/main/java/org/apache/archiva/event/Event.java b/archiva-modules/archiva-base/archiva-event/src/main/java/org/apache/archiva/event/Event.java new file mode 100644 index 000000000..e41d19e63 --- /dev/null +++ b/archiva-modules/archiva-base/archiva-event/src/main/java/org/apache/archiva/event/Event.java @@ -0,0 +1,55 @@ +package org.apache.archiva.event; + +/* + * 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. + */ + +/** + * Encaptulation of both the EventEmitter and the EventMessage + * to represent a single event + */ +public final class Event +{ + private final EventEmitter emitter; + + private final EventMessage message; + + public Event(EventEmitter emitter, EventMessage message) + { + this.emitter = emitter; + this.message = message; + } + + /** + * Get the Emitter who emitted the Event + * @return emitter + */ + public EventEmitter getEmitter() + { + return emitter; + } + + /** + * Get the EventMessage + * @return message + */ + public EventMessage getMessage() + { + return message; + } +} diff --git a/archiva-modules/archiva-base/archiva-event/src/main/java/org/apache/archiva/event/EventBus.java b/archiva-modules/archiva-base/archiva-event/src/main/java/org/apache/archiva/event/EventBus.java new file mode 100644 index 000000000..6445cb926 --- /dev/null +++ b/archiva-modules/archiva-base/archiva-event/src/main/java/org/apache/archiva/event/EventBus.java @@ -0,0 +1,53 @@ +package org.apache.archiva.event; + +/* + * 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. + */ + +import java.util.Set; + +/** + * Allows implementer to emit to, subscribe and unsubscribe EventObservers + */ +public interface EventBus +{ + /** + * Emit a event + * @param emitter + * @param message + */ + void emit(EventEmitter emitter, EventMessage message); + + /** + * Allows the subscriber to receive messages from this event bus + * @param observer + */ + void subscribe(EventObserver observer); + + /** + * Stops the observer from receiving any messages + * @param observer + */ + void unsubscribe(EventObserver observer); + + /** + * Get the set of registered EventObservers + * @return + */ + Set getObservers(); +} diff --git a/archiva-modules/archiva-base/archiva-event/src/main/java/org/apache/archiva/event/EventEmitter.java b/archiva-modules/archiva-base/archiva-event/src/main/java/org/apache/archiva/event/EventEmitter.java new file mode 100644 index 000000000..4cdab918d --- /dev/null +++ b/archiva-modules/archiva-base/archiva-event/src/main/java/org/apache/archiva/event/EventEmitter.java @@ -0,0 +1,24 @@ +package org.apache.archiva.event; + +/* + * 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. + */ + +public interface EventEmitter +{ +} diff --git a/archiva-modules/archiva-base/archiva-event/src/main/java/org/apache/archiva/event/EventMessage.java b/archiva-modules/archiva-base/archiva-event/src/main/java/org/apache/archiva/event/EventMessage.java new file mode 100644 index 000000000..8f39dec3e --- /dev/null +++ b/archiva-modules/archiva-base/archiva-event/src/main/java/org/apache/archiva/event/EventMessage.java @@ -0,0 +1,24 @@ +package org.apache.archiva.event; + +/* + * 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. + */ + +public interface EventMessage +{ +} diff --git a/archiva-modules/archiva-base/archiva-event/src/main/java/org/apache/archiva/event/EventObserver.java b/archiva-modules/archiva-base/archiva-event/src/main/java/org/apache/archiva/event/EventObserver.java new file mode 100644 index 000000000..bb5f07df7 --- /dev/null +++ b/archiva-modules/archiva-base/archiva-event/src/main/java/org/apache/archiva/event/EventObserver.java @@ -0,0 +1,25 @@ +package org.apache.archiva.event; + +/* + * 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. + */ + +public interface EventObserver +{ + void observe(Event event); +} diff --git a/archiva-modules/archiva-base/archiva-event/src/test/java/org/apache/archiva/event/AsynchronousEventBusTest.java b/archiva-modules/archiva-base/archiva-event/src/test/java/org/apache/archiva/event/AsynchronousEventBusTest.java new file mode 100644 index 000000000..b68838946 --- /dev/null +++ b/archiva-modules/archiva-base/archiva-event/src/test/java/org/apache/archiva/event/AsynchronousEventBusTest.java @@ -0,0 +1,70 @@ +package org.apache.archiva.event; + +/* + * 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. + */ + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import junit.framework.TestCase; + +public class AsynchronousEventBusTest extends TestCase +{ + public void testSubscribeUnsubscribe() throws Exception + { + AsynchronousEventBus bus = new AsynchronousEventBus(1); + MockObserver observer = new MockObserver(); + + assertEquals(0, bus.getObservers().size()); + + bus.subscribe(observer); + assertTrue(bus.getObservers().contains(observer)); + + bus.unsubscribe(observer); + assertFalse(bus.getObservers().contains(bus)); + } + + public void testAllEventsAreObserved() throws Exception + { + AsynchronousEventBus bus = new AsynchronousEventBus(1); + MockObserver observer = new MockObserver(); + bus.subscribe(observer); + + for (int i = 0; i < 10; i++) + { + bus.emit(new EventEmitter() {}, new EventMessage() {}); + } + + while (observer.observedEvents.size() != 10) + { + } + + assertEquals(10, observer.observedEvents.size()); + } + + class MockObserver implements EventObserver + { + final List observedEvents = Collections.synchronizedList(new ArrayList()); + + public void observe(Event event) + { + observedEvents.add(event); + } + } +} diff --git a/archiva-modules/archiva-base/archiva-event/src/test/java/org/apache/archiva/event/EventTest.java b/archiva-modules/archiva-base/archiva-event/src/test/java/org/apache/archiva/event/EventTest.java new file mode 100644 index 000000000..5710f07dc --- /dev/null +++ b/archiva-modules/archiva-base/archiva-event/src/test/java/org/apache/archiva/event/EventTest.java @@ -0,0 +1,35 @@ +package org.apache.archiva.event; + +/* + * 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. + */ + +import junit.framework.TestCase; + +public class EventTest extends TestCase +{ + public void testEvent() + { + EventEmitter emitter = new EventEmitter() {}; + EventMessage message = new EventMessage() {}; + Event event = new Event(emitter, message); + + assertEquals(emitter, event.getEmitter()); + assertEquals(message, event.getMessage()); + } +} diff --git a/archiva-modules/archiva-base/pom.xml b/archiva-modules/archiva-base/pom.xml index f95c75f13..c6b7de9e6 100644 --- a/archiva-modules/archiva-base/pom.xml +++ b/archiva-modules/archiva-base/pom.xml @@ -42,5 +42,6 @@ archiva-transaction archiva-artifact-converter archiva-converter + archiva-event