Hi,
The changes look good to me. One minor thing that we can clean up further:
We still use the ComponentManager.registerJavaObject() to register a set of
system services and I think we should replace them with
ExtensionPointRegistry.addExtensionPoint().
Thanks,
Raymond
----- Original Message -----
From: "Luciano Resende" <luckbr1975@gmail.com>
To: "tuscany-dev" <tuscany-dev@ws.apache.org>
Sent: Saturday, April 14, 2007 10:58 PM
Subject: Please review changes to bring support to nonBlockingInterceptor
Fwd: svn commit: r528930 - in
/incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/core:
bootstrap/ deployer/ runtime/ work/
> Hey
>
> I tried to bring up the code to make nonBlockInerceptor working again.
> Could someone please review my changes.
>
> Thanks
>
> ---------- Forwarded message ----------
> From: lresende@apache.org <lresende@apache.org>
> Date: Apr 14, 2007 10:53 PM
> Subject: svn commit: r528930 - in
> /incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/core:
> bootstrap/ deployer/ runtime/ work/
> To: tuscany-commits@ws.apache.org
>
> Author: lresende
> Date: Sat Apr 14 22:53:09 2007
> New Revision: 528930
>
> URL: http://svn.apache.org/viewvc?view=rev&rev=528930
> Log:
> Adding support for nonBlockingInterceptor
>
> Added:
>
> incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/core/work/
>
> incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/core/work/DefaultWorkEvent.java
> (with props)
>
> incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/core/work/DefaultWorkItem.java
> (with props)
>
> incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/core/work/Jsr237Work.java
> (with props)
>
> incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/core/work/Jsr237WorkScheduler.java
> (with props)
>
> incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/core/work/ThreadPoolWorkManager.java
> (with props)
> Modified:
>
> incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/core/bootstrap/DefaultBootstrapper.java
>
> incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/core/deployer/DeployerImpl.java
>
> incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/core/runtime/AbstractRuntime.java
>
> Modified:
> incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/core/bootstrap/DefaultBootstrapper.java
> URL:
> http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/core/bootstrap/DefaultBootstrapper.java?view=diff&rev=528930&r1=528929&r2=528930
> ==============================================================================
> ---
> incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/core/bootstrap/DefaultBootstrapper.java
> (original)
> +++
> incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/core/bootstrap/DefaultBootstrapper.java
> Sat Apr 14 22:53:09 2007
> @@ -23,6 +23,7 @@
> import org.apache.tuscany.core.builder.BuilderRegistryImpl;
> import org.apache.tuscany.core.builder.WirePostProcessorRegistryImpl;
> import org.apache.tuscany.core.component.ComponentManagerImpl;
> +import org.apache.tuscany.core.component.WorkContextImpl;
> import org.apache.tuscany.core.component.scope.AbstractScopeContainer;
> import org.apache.tuscany.core.component.scope.CompositeScopeContainer;
> import org.apache.tuscany.core.component.scope.RequestScopeContainer;
> @@ -30,15 +31,21 @@
> import org.apache.tuscany.core.component.scope.StatelessScopeContainer;
> import org.apache.tuscany.core.deployer.DeployerImpl;
> import org.apache.tuscany.core.implementation.composite.CompositeBuilder;
> +import org.apache.tuscany.core.work.Jsr237WorkScheduler;
> +import org.apache.tuscany.core.work.ThreadPoolWorkManager;
> import org.apache.tuscany.host.MonitorFactory;
> import org.apache.tuscany.spi.bootstrap.ExtensionPointRegistry;
> import org.apache.tuscany.spi.builder.BuilderRegistry;
> import org.apache.tuscany.spi.component.ComponentManager;
> import org.apache.tuscany.spi.component.ScopeContainerMonitor;
> import org.apache.tuscany.spi.component.ScopeRegistry;
> +import org.apache.tuscany.spi.component.WorkContext;
> import org.apache.tuscany.spi.deployer.Deployer;
> +import org.apache.tuscany.spi.services.work.WorkScheduler;
> import org.apache.tuscany.spi.wire.WirePostProcessorRegistry;
>
> +import commonj.work.WorkManager;
> +
> /**
> * A default implementation of a Bootstrapper. Please see the
> documentation
> on
> * the individual methods for how the primordial components are created.
> @@ -95,7 +102,10 @@
> public Deployer createDeployer(ExtensionPointRegistry
> extensionRegistry) {
> ScopeRegistry scopeRegistry = getScopeRegistry();
> BuilderRegistry builder = createBuilder(scopeRegistry);
> - DeployerImpl deployer = new DeployerImpl(xmlFactory, builder,
> componentManager);
> + WorkContext workContext = new WorkContextImpl();
> + WorkManager workManager = new ThreadPoolWorkManager(10);
> + WorkScheduler workScheduler = new
> Jsr237WorkScheduler(workManager);
> + DeployerImpl deployer = new DeployerImpl(xmlFactory, builder,
> componentManager, workScheduler, workContext);
> deployer.setScopeRegistry(getScopeRegistry());
> WirePostProcessorRegistry wirePostProcessorRegistry = new
> WirePostProcessorRegistryImpl();
> deployer.setWirePostProcessorRegistry(wirePostProcessorRegistry);
>
> Modified:
> incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/core/deployer/DeployerImpl.java
> URL:
> http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/core/deployer/DeployerImpl.java?view=diff&rev=528930&r1=528929&r2=528930
> ==============================================================================
> ---
> incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/core/deployer/DeployerImpl.java
> (original)
> +++
> incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/core/deployer/DeployerImpl.java
> Sat Apr 14 22:53:09 2007
> @@ -31,7 +31,6 @@
> import org.apache.tuscany.assembly.Composite;
> import org.apache.tuscany.assembly.CompositeReference;
> import org.apache.tuscany.assembly.CompositeService;
> -import org.apache.tuscany.assembly.Implementation;
> import org.apache.tuscany.assembly.Multiplicity;
> import org.apache.tuscany.assembly.SCABinding;
> import org.apache.tuscany.assembly.impl.DefaultAssemblyFactory;
> @@ -40,6 +39,7 @@
> import org.apache.tuscany.core.builder.WireCreationException;
> import org.apache.tuscany.core.wire.InvocationChainImpl;
> import org.apache.tuscany.core.wire.InvokerInterceptor;
> +import org.apache.tuscany.core.wire.NonBlockingInterceptor;
> import org.apache.tuscany.core.wire.WireImpl;
> import org.apache.tuscany.core.wire.WireUtils;
> import
> org.apache.tuscany.interfacedef.IncompatibleInterfaceContractException;
> @@ -66,10 +66,11 @@
> import org.apache.tuscany.spi.component.Service;
> import org.apache.tuscany.spi.component.ServiceBinding;
> import org.apache.tuscany.spi.component.TargetInvokerCreationException;
> +import org.apache.tuscany.spi.component.WorkContext;
> import org.apache.tuscany.spi.deployer.Deployer;
> import org.apache.tuscany.spi.deployer.DeploymentContext;
> import org.apache.tuscany.spi.resolver.ResolutionException;
> -import org.apache.tuscany.spi.util.UriHelper;
> +import org.apache.tuscany.spi.services.work.WorkScheduler;
> import org.apache.tuscany.spi.wire.InvocationChain;
> import org.apache.tuscany.spi.wire.Wire;
> import org.apache.tuscany.spi.wire.WirePostProcessorRegistry;
> @@ -86,11 +87,15 @@
> private ScopeRegistry scopeRegistry;
> private InterfaceContractMapper mapper = new
> DefaultInterfaceContractMapper();
> private WirePostProcessorRegistry postProcessorRegistry;
> + private WorkScheduler workScheduler;
> + private WorkContext workContext;
>
> - public DeployerImpl(XMLInputFactory xmlFactory, Builder builder,
> ComponentManager componentManager) {
> + public DeployerImpl(XMLInputFactory xmlFactory, Builder builder,
> ComponentManager componentManager, WorkScheduler workScheduler,
> WorkContext
> workContext) {
> this.xmlFactory = xmlFactory;
> this.builder = builder;
> this.componentManager = componentManager;
> + this.workScheduler = workScheduler;
> + this.workContext = workContext;
> }
>
> public DeployerImpl() {
> @@ -343,10 +348,10 @@
> for (Operation operation :
> sourceContract.getInterface().getOperations())
> {
> Operation targetOperation = mapper.map(
> targetContract.getInterface(), operation);
> InvocationChain chain = new InvocationChainImpl(operation,
> targetOperation);
> - /*
> - * if (operation.isNonBlocking()) { chain.addInterceptor(new
> - * NonBlockingInterceptor(scheduler, workContext)); }
> - */
> + /* lresende */
> + if (operation.isNonBlocking()) {
> + chain.addInterceptor(new
> NonBlockingInterceptor(workScheduler, workContext)); }
> + /* lresende */
> chain.addInterceptor(new InvokerInterceptor());
> wire.addInvocationChain(chain);
>
> @@ -355,10 +360,10 @@
> for (Operation operation :
> sourceContract.getCallbackInterface().getOperations())
> {
> Operation targetOperation = mapper.map(
> targetContract.getCallbackInterface(), operation);
> InvocationChain chain = new InvocationChainImpl(operation,
> targetOperation);
> - /*
> - * if (operation.isNonBlocking()) { chain.addInterceptor
> (new
> - * NonBlockingInterceptor(scheduler, workContext)); }
> - */
> + /* lresende */
> + if (operation.isNonBlocking()) {
> + chain.addInterceptor(new
> NonBlockingInterceptor(workScheduler, workContext)); }
> + /* lresende */
> chain.addInterceptor(new InvokerInterceptor());
> wire.addCallbackInvocationChain(chain);
> }
>
> Modified:
> incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/core/runtime/AbstractRuntime.java
> URL:
> http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/core/runtime/AbstractRuntime.java?view=diff&rev=528930&r1=528929&r2=528930
> ==============================================================================
> ---
> incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/core/runtime/AbstractRuntime.java
> (original)
> +++
> incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/core/runtime/AbstractRuntime.java
> Sat Apr 14 22:53:09 2007
> @@ -45,10 +45,12 @@
> import org.apache.tuscany.core.bootstrap.Bootstrapper;
> import org.apache.tuscany.core.bootstrap.DefaultBootstrapper;
> import org.apache.tuscany.core.component.ComponentManagerImpl;
> -import org.apache.tuscany.core.component.SimpleWorkContext;
> +import org.apache.tuscany.core.component.WorkContextImpl;
> import org.apache.tuscany.core.monitor.NullMonitorFactory;
> import
> org.apache.tuscany.core.services.classloading.ClassLoaderRegistryImpl
> ;
> import org.apache.tuscany.core.util.IOHelper;
> +import org.apache.tuscany.core.work.Jsr237WorkScheduler;
> +import org.apache.tuscany.core.work.ThreadPoolWorkManager;
> import org.apache.tuscany.host.MonitorFactory;
> import org.apache.tuscany.host.RuntimeInfo;
> import org.apache.tuscany.host.management.ManagementService;
> @@ -70,8 +72,11 @@
> import org.apache.tuscany.spi.deployer.Deployer;
> import org.apache.tuscany.spi.services.classloading.ClassLoaderRegistry;
> import
> org.apache.tuscany.spi.services.management.TuscanyManagementService;
> +import org.apache.tuscany.spi.services.work.WorkScheduler;
> import org.osoa.sca.ComponentContext;
>
> +import commonj.work.WorkManager;
> +
> /**
> * @version $Rev$ $Date$
> */
> @@ -83,6 +88,8 @@
> private static final URI SCOPE_REGISTRY_URI =
> TUSCANY_SYSTEM_ROOT.resolve("ScopeRegistry");
>
> private static final URI WORK_CONTEXT_URI =
> TUSCANY_SYSTEM.resolve("WorkContext");
> +
> + private static final URI WORK_SCHEDULER_URI =
> TUSCANY_SYSTEM.resolve("WorkScheduler");
>
> private static final URI RUNTIME_INFO_URI =
> TUSCANY_SYSTEM_ROOT.resolve("RuntimeInfo");
>
> @@ -211,7 +218,9 @@
> extensionRegistry.addExtensionPoint(ContributionService.class,
> contributionService);
>
> registerSystemComponent(TUSCANY_DEPLOYER, Deployer.class,
> deployer);
> - registerSystemComponent(WORK_CONTEXT_URI, WorkContext.class, new
> SimpleWorkContext());
> + registerSystemComponent(WORK_CONTEXT_URI, WorkContext.class, new
> WorkContextImpl());
> + WorkManager workManager = new ThreadPoolWorkManager(10);
> + registerSystemComponent(WORK_SCHEDULER_URI, WorkScheduler.class,
> new Jsr237WorkScheduler(workManager)); //lresende
>
> this.scopeRegistry = bootstrapper.getScopeRegistry();
>
>
> Added:
> incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/core/work/DefaultWorkEvent.java
> URL:
> http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/core/work/DefaultWorkEvent.java?view=auto&rev=528930
> ==============================================================================
> ---
> incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/core/work/DefaultWorkEvent.java
> (added)
> +++
> incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/core/work/DefaultWorkEvent.java
> Sat Apr 14 22:53:09 2007
> @@ -0,0 +1,74 @@
> +/*
> + * 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.tuscany.core.work;
> +
> +
> +import commonj.work.WorkEvent;
> +import commonj.work.WorkException;
> +import commonj.work.WorkItem;
> +
> +/**
> + * Default immutable implementation of the <code>WorkEvent</code> class.
> + */
> +class DefaultWorkEvent implements WorkEvent {
> +
> + // Work item for this event
> + private WorkItem workItem;
> +
> + // Exception if something has gone wrong
> + private WorkException exception;
> +
> + /**
> + * Instantiates the event.
> + *
> + * @param workItem Work item for this event.
> + */
> + public DefaultWorkEvent(final DefaultWorkItem workItem) {
> + this.workItem = workItem;
> + this.exception = workItem.getException();
> + }
> +
> + /**
> + * Returns the work type based on whether the work was accepted,
> started,
> + * rejected or completed.
> + *
> + * @return Work type.
> + */
> + public int getType() {
> + return workItem.getStatus();
> + }
> +
> + /**
> + * Returns the work item associated with this work type.
> + *
> + * @return Work item.
> + */
> + public WorkItem getWorkItem() {
> + return workItem;
> + }
> +
> + /**
> + * Returns the exception if the work completed with an exception.
> + *
> + * @return Work exception.
> + */
> + public WorkException getException() {
> + return exception;
> + }
> +}
>
> Propchange:
> incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/core/work/DefaultWorkEvent.java
> ------------------------------------------------------------------------------
> svn:eol-style = native
>
> Added:
> incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/core/work/DefaultWorkItem.java
> URL:
> http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/core/work/DefaultWorkItem.java?view=auto&rev=528930
> ==============================================================================
> ---
> incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/core/work/DefaultWorkItem.java
> (added)
> +++
> incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/core/work/DefaultWorkItem.java
> Sat Apr 14 22:53:09 2007
> @@ -0,0 +1,166 @@
> +/*
> + * 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.tuscany.core.work;
> +
> +import commonj.work.Work;
> +import commonj.work.WorkException;
> +import commonj.work.WorkItem;
> +
> +/**
> + * An identity based immutable implementation of the
> <code>WorkItem</code>
> + * interface.
> + *
> + */
> +class DefaultWorkItem implements WorkItem {
> +
> + // Id scoped for the VM
> + private String id;
> +
> + // Status
> + private int status = -1;
> +
> + // Result
> + private Work result;
> +
> + // Original work
> + private Work originalWork;
> +
> + // Exception
> + private WorkException exception;
> +
> + /**
> + * Instantiates an id for this item.
> + *
> + * @param id of this work event.
> + */
> + protected DefaultWorkItem(final String id, final Work orginalWork) {
> + this.id = id;
> + this.originalWork = orginalWork;
> + }
> +
> + /**
> + * Returns the id.
> + *
> + * @return Id of this item.
> + */
> + public String getId() {
> + return id;
> + }
> +
> + /**
> + * Returns the original work.
> + *
> + * @return Original work.
> + */
> + public Work getOriginalWork() {
> + return originalWork;
> + }
> +
> + /**
> + * Returns the work result if the work completed.
> + *
> + * @return Work.
> + * @throws WorkException If the work completed with an exception.
> + */
> + public Work getResult() throws WorkException {
> + return result;
> + }
> +
> + /**
> + * Sets the result.
> + *
> + * @param result Result.
> + */
> + protected void setResult(final Work result) {
> + this.result = result;
> + }
> +
> + /**
> + * Returns the exception if work completed with an exception.
> + *
> + * @return Work exception.
> + */
> + protected WorkException getException() {
> + return exception;
> + }
> +
> + /**
> + * Sets the exception.
> + *
> + * @param exception Exception.
> + */
> + protected void setException(final WorkException exception) {
> + this.exception = exception;
> + }
> +
> + /**
> + * Returns the work type based on whether the work was accepted,
> started,
> + * rejected or completed.
> + *
> + * @return Work status.
> + */
> + public int getStatus() {
> + return status;
> + }
> +
> + /**
> + * Sets the status.
> + *
> + * @param status Status.
> + */
> + protected void setStatus(final int status) {
> + this.status = status;
> + }
> +
> + /**
> + * @see Object#hashCode()
> + */
> + public int hashCode() {
> + return id.hashCode();
> + }
> +
> + /**
> + * Indicates whether some other object is "equal to" this one.
> + *
> + * @param obj Object to be compared.
> + * @return true if this object is the same as the obj argument; false
> + * otherwise..
> + */
> + public boolean equals(final Object obj) {
> + return (obj != null) && (obj.getClass() == DefaultWorkItem.class)
> && ((DefaultWorkItem) obj).id.equals(id);
> + }
> +
> + /**
> + * Compares this object with the specified object for order. Returns
> a
> + * negative integer, zero, or a positive integer as this object is
> less
> + * than, equal to, or greater than the specified object.
> + *
> + * @param o Object to be compared.
> + * @return A negative integer, zero, or a positive integer as this
> object
> + * is less than, equal to, or greater than the specified
> object.
> + * @throws ClassCastException needs better documentation.
> + */
> + public int compareTo(final Object o) {
> + if (o.getClass() != DefaultWorkItem.class) {
> + throw new ClassCastException(o.getClass().getName());
> + } else {
> + return ((DefaultWorkItem) o).getId().compareTo(getId());
> + }
> + }
> +}
>
> Propchange:
> incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/core/work/DefaultWorkItem.java
> ------------------------------------------------------------------------------
> svn:eol-style = native
>
> Added:
> incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/core/work/Jsr237Work.java
> URL:
> http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/core/work/Jsr237Work.java?view=auto&rev=528930
> ==============================================================================
> ---
> incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/core/work/Jsr237Work.java
> (added)
> +++
> incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/core/work/Jsr237Work.java
> Sat Apr 14 22:53:09 2007
> @@ -0,0 +1,63 @@
> +/*
> + * 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.tuscany.core.work;
> +
> +/*
> + * JCA work wrapper.
> + */
> +public class Jsr237Work<T extends Runnable> implements commonj.work.Work
> {
> +
> + // Work that is being executed.
> + private T work;
> +
> + /*
> + * Initializes the work instance.
> + */
> + public Jsr237Work(T work) {
> + this.work = work;
> + }
> +
> + /*
> + * Returns the completed work.
> + */
> + public T getWork() {
> + return work;
> + }
> +
> + /*
> + * Release the work.
> + */
> + public void release() {
> + }
> +
> + /*
> + * Work attributes are not daemon.
> + */
> + public boolean isDaemon() {
> + return false;
> + }
> +
> + /*
> + * Runs the work.
> + */
> + public void run() {
> + work.run();
> + }
> +}
> \ No newline at end of file
>
> Propchange:
> incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/core/work/Jsr237Work.java
> ------------------------------------------------------------------------------
> svn:eol-style = native
>
> Added:
> incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/core/work/Jsr237WorkScheduler.java
> URL:
> http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/core/work/Jsr237WorkScheduler.java?view=auto&rev=528930
> ==============================================================================
> ---
> incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/core/work/Jsr237WorkScheduler.java
> (added)
> +++
> incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/core/work/Jsr237WorkScheduler.java
> Sat Apr 14 22:53:09 2007
> @@ -0,0 +1,167 @@
> +/*
> + * 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.tuscany.core.work;
> +
> +import org.apache.tuscany.spi.services.work.NotificationListener;
> +import org.apache.tuscany.spi.services.work.WorkScheduler;
> +import org.apache.tuscany.spi.services.work.WorkSchedulerException;
> +
> +import commonj.work.WorkEvent;
> +import commonj.work.WorkException;
> +import commonj.work.WorkListener;
> +import commonj.work.WorkManager;
> +import commonj.work.WorkRejectedException;
> +
> +/**
> + * A work scheduler implementation based on a JSR 237 work manager.
> + * <p/>
> + * <p/>
> + * This needs a JSR 237 work manager implementation available for
> scheduling work. Instances can be configured with a
> + * work manager implementation that is injected in. It is the
> responsibility of the runtime environment to make a work
> + * manager implementaion available. For example, if the managed
> environment
> supports work manager the runtime can use
> + * the appropriate lookup mechanism to inject the work manager
> implementation. </p>
> + */
> +public class Jsr237WorkScheduler implements WorkScheduler {
> +
> + /**
> + * Underlying JSR-237 work manager
> + */
> + private WorkManager jsr237WorkManager;
> +
> + /**
> + * Initializes the JSR 237 work manager.
> + *
> + * @param jsr237WorkManager JSR 237 work manager.
> + */
> + public Jsr237WorkScheduler(WorkManager jsr237WorkManager) {
> + if (jsr237WorkManager == null) {
> + throw new IllegalArgumentException("Work manager cannot be
> null");
> + }
> + this.jsr237WorkManager = jsr237WorkManager;
> + }
> +
> + /**
> + * Schedules a unit of work for future execution. The notification
> listener is used to register interest in
> + * callbacks regarding the status of the work.
> + *
> + * @param work The unit of work that needs to be asynchronously
> executed.
> + */
> + public <T extends Runnable> void scheduleWork(T work) {
> + scheduleWork(work, null);
> + }
> +
> + /**
> + * Schedules a unit of work for future execution. The notification
> listener is used to register interest in
> + * callbacks regarding the status of the work.
> + *
> + * @param work The unit of work that needs to be asynchronously
> executed.
> + * @param listener Notification listener for callbacks.
> + */
> + public <T extends Runnable> void scheduleWork(T work,
> NotificationListener<T> listener) {
> +
> + if (work == null) {
> + throw new IllegalArgumentException("Work cannot be null");
> + }
> +
> + Jsr237Work<T> jsr237Work = new Jsr237Work<T>(work);
> + try {
> + if (listener == null) {
> + jsr237WorkManager.schedule(jsr237Work);
> + } else {
> + Jsr237WorkListener<T> jsr237WorkListener = new
> Jsr237WorkListener<T>(listener, work);
> + jsr237WorkManager.schedule(jsr237Work,
> jsr237WorkListener);
> + }
> + } catch (WorkRejectedException ex) {
> + if (listener != null) {
> + listener.workRejected(work);
> + } else {
> + throw new WorkSchedulerException(ex);
> + }
> + } catch (WorkException ex) {
> + throw new WorkSchedulerException(ex);
> + }
> +
> + }
> +
> + /*
> + * Worklistener for keeping track of work status callbacks.
> + *
> + */
> + private class Jsr237WorkListener<T extends Runnable> implements
> WorkListener {
> +
> + // Notification listener
> + private NotificationListener<T> listener;
> +
> + // Work
> + private T work;
> +
> + /*
> + * Initializes the notification listener.
> + */
> + public Jsr237WorkListener(NotificationListener<T> listener, T
> work)
> {
> + this.listener = listener;
> + this.work = work;
> + }
> +
> + /*
> + * Callback when the work is accepted.
> + */
> + public void workAccepted(WorkEvent workEvent) {
> + T work = getWork();
> + listener.workAccepted(work);
> + }
> +
> + /*
> + * Callback when the work is rejected.
> + */
> + public void workRejected(WorkEvent workEvent) {
> + T work = getWork();
> + listener.workRejected(work);
> + }
> +
> + /*
> + * Callback when the work is started.
> + */
> + public void workStarted(WorkEvent workEvent) {
> + T work = getWork();
> + listener.workStarted(work);
> + }
> +
> + /*
> + * Callback when the work is completed.
> + */
> + public void workCompleted(WorkEvent workEvent) {
> + T work = getWork();
> + Exception exception = workEvent.getException();
> + if (exception != null) {
> + listener.workFailed(work, exception);
> + } else {
> + listener.workCompleted(work);
> + }
> + }
> +
> + /*
> + * Gets the underlying work from the work event.
> + */
> + private T getWork() {
> + return work;
> + }
> +
> + }
> +}
>
> Propchange:
> incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/core/work/Jsr237WorkScheduler.java
> ------------------------------------------------------------------------------
> svn:eol-style = native
>
> Added:
> incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/core/work/ThreadPoolWorkManager.java
> URL:
> http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/core/work/ThreadPoolWorkManager.java?view=auto&rev=528930
> ==============================================================================
> ---
> incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/core/work/ThreadPoolWorkManager.java
> (added)
> +++
> incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/core/work/ThreadPoolWorkManager.java
> Sat Apr 14 22:53:09 2007
> @@ -0,0 +1,220 @@
> +/*
> + * 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.tuscany.core.work;
> +
> +import java.rmi.server.UID;
> +import java.util.Collection;
> +import java.util.Map;
> +import java.util.concurrent.ConcurrentHashMap;
> +import java.util.concurrent.ExecutorService;
> +import java.util.concurrent.Executors;
> +import java.util.concurrent.RejectedExecutionException;
> +
> +import org.osoa.sca.annotations.Destroy;
> +import org.osoa.sca.annotations.Property;
> +
> +import commonj.work.Work;
> +import commonj.work.WorkEvent;
> +import commonj.work.WorkException;
> +import commonj.work.WorkItem;
> +import commonj.work.WorkListener;
> +import commonj.work.WorkManager;
> +import commonj.work.WorkRejectedException;
> +
> +/**
> + * A thread-pool based implementation for the JSR-237 work manager.
> + * <p/>
> + * <p/>
> + * This implementation supports only local work.
> + * <p/>
> + * TODO Elaborate the implementation. </p>
> + */
> +public class ThreadPoolWorkManager implements WorkManager {
> +
> + // Map of work items currently handled by the work manager
> + private Map<DefaultWorkItem, WorkListener> workItems = new
> ConcurrentHashMap<DefaultWorkItem, WorkListener>();
> +
> + // Thread-pool
> + private ExecutorService executor;
> +
> + /**
> + * Initializes the thread-pool.
> + *
> + * @param threadPoolSize Thread-pool size.
> + */
> + public ThreadPoolWorkManager(@Property(name = "poolSize") int
> threadPoolSize) {
> + executor = Executors.newFixedThreadPool(threadPoolSize);
> + }
> +
> + /**
> + * Schedules a unit of work asynchronously.
> + *
> + * @param work Work that needs to be scheduled.
> + * @return Work Work item representing the asynchronous work
> + */
> + public WorkItem schedule(Work work) throws WorkException {
> + return schedule(work, null);
> + }
> +
> + /**
> + * Schedules a unit of work asynchronously.
> + *
> + * @param work Work that needs to be scheduled.
> + * @param workListener Work listener for callbacks.
> + * @return Work Work item representing the asynchronous work
> + */
> + public WorkItem schedule(Work work, WorkListener workListener) throws
> WorkRejectedException {
> +
> + DefaultWorkItem workItem = new DefaultWorkItem(new
> UID().toString(), work);
> + if (workListener != null) {
> + workItems.put(workItem, workListener);
> + }
> + workAccepted(workItem, work);
> + if (scheduleWork(work, workItem)) {
> + return workItem;
> + } else {
> + workItem.setStatus(WorkEvent.WORK_REJECTED);
> + if (workListener != null) {
> + workListener.workRejected(new
> DefaultWorkEvent(workItem));
> + }
> + throw new WorkRejectedException("Unable to schedule work");
> + }
> + }
> +
> + /**
> + * Wait for all the specified units of work to finish.
> + *
> + * @param works Units of the work that need to finish.
> + * @param timeout Timeout for waiting for the units of work to
> finish.
> + */
> + public boolean waitForAll(Collection works, long timeout) {
> + throw new UnsupportedOperationException("waitForAll not
> supported");
> + }
> +
> + /**
> + * Wait for any of the specified units of work to finish.
> + *
> + * @param works Units of the work that need to finish.
> + * @param timeout Timeout for waiting for the units of work to
> finish.
> + */
> + public Collection waitForAny(Collection works, long timeout) {
> + throw new UnsupportedOperationException("waitForAny not
> supported");
> + }
> +
> + /**
> + * Method provided for subclasses to indicate a work accptance.
> + *
> + * @param workItem Work item representing the work that was accepted.
> + * @param work Work that was accepted.
> + */
> + private void workAccepted(final DefaultWorkItem workItem, final Work
> work) {
> + WorkListener listener = workItems.get(workItem);
> + if (listener != null) {
> + workItem.setStatus(WorkEvent.WORK_ACCEPTED);
> + WorkEvent event = new DefaultWorkEvent(workItem);
> + listener.workAccepted(event);
> + }
> + }
> +
> + /*
> + * Method to indicate a work start.
> + */
> + private void workStarted(final DefaultWorkItem workItem, final Work
> work) {
> + WorkListener listener = workItems.get(workItem);
> + if (listener != null) {
> + workItem.setStatus(WorkEvent.WORK_STARTED);
> + WorkEvent event = new DefaultWorkEvent(workItem);
> + listener.workStarted(event);
> + }
> + }
> +
> + /*
> + * Method to indicate a work completion.
> + */
> + private void workCompleted(final DefaultWorkItem workItem, final Work
> work) {
> + workCompleted(workItem, work, null);
> + }
> +
> + /*
> + * Method to indicate a work completion.
> + */
> + private void workCompleted(final DefaultWorkItem workItem, final Work
> work, final WorkException exception) {
> + WorkListener listener = workItems.get(workItem);
> + if (listener != null) {
> + workItem.setStatus(WorkEvent.WORK_COMPLETED);
> + workItem.setResult(work);
> + workItem.setException(exception);
> + WorkEvent event = new DefaultWorkEvent(workItem);
> + listener.workCompleted(event);
> + workItems.remove(workItem);
> + }
> + }
> +
> + /*
> + * Schedules the work using the threadpool.
> + */
> + private boolean scheduleWork(final Work work, final DefaultWorkItem
> workItem) {
> + try {
> + executor.execute(new DecoratingWork(workItem, work));
> + return true;
> + } catch (RejectedExecutionException ex) {
> + return false;
> + }
> + }
> +
> + /*
> + * Class that decorates the original worker so that it can get
> callbacks when work is done.
> + */
> + private final class DecoratingWork implements Runnable {
> +
> + // Work item for this work.
> + private DefaultWorkItem workItem;
> +
> + // The original work.
> + private Work decoratedWork;
> +
> + /*
> + * Initializes the work item and underlying work.
> + */
> + private DecoratingWork(final DefaultWorkItem workItem, final Work
> decoratedWork) {
> + this.workItem = workItem;
> + this.decoratedWork = decoratedWork;
> + }
> +
> + /*
> + * Overrides the run method.
> + */
> + public void run() {
> + workStarted(workItem, decoratedWork);
> + try {
> + decoratedWork.run();
> + workCompleted(workItem, decoratedWork);
> + } catch (Throwable th) {
> + workCompleted(workItem, decoratedWork, new WorkException(
> th.getMessage(), th));
> + }
> + }
> +
> + }
> +
> + @Destroy
> + public void destroy() {
> + executor.shutdown();
> + }
> +
> +}
>
> Propchange:
> incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/core/work/ThreadPoolWorkManager.java
> ------------------------------------------------------------------------------
> svn:eol-style = native
>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: tuscany-commits-unsubscribe@ws.apache.org
> For additional commands, e-mail: tuscany-commits-help@ws.apache.org
>
>
>
> --
> Luciano Resende
> http://people.apache.org/~lresende
>
---------------------------------------------------------------------
To unsubscribe, e-mail: tuscany-dev-unsubscribe@ws.apache.org
For additional commands, e-mail: tuscany-dev-help@ws.apache.org
|