diff --git a/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiBeanInfo.java b/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiBeanInfo.java index 0f22bd02b45..d43040994f2 100644 --- a/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiBeanInfo.java +++ b/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiBeanInfo.java @@ -28,6 +28,9 @@ import org.apache.openejb.jee.JndiConsumer; import org.apache.openejb.jee.KeyedCollection; import org.apache.openejb.jee.LifecycleCallback; +import org.apache.openejb.jee.ManagedExecutor; +import org.apache.openejb.jee.ManagedScheduledExecutor; +import org.apache.openejb.jee.ManagedThreadFactory; import org.apache.openejb.jee.MessageDestinationRef; import org.apache.openejb.jee.PersistenceContextRef; import org.apache.openejb.jee.PersistenceUnitRef; @@ -67,6 +70,9 @@ public class CdiBeanInfo implements JndiConsumer { private ClassLoader classLoader; private List injections; protected KeyedCollection contextService; + protected KeyedCollection managedExecutor; + protected KeyedCollection managedScheduledExecutor; + protected KeyedCollection managedThreadFactory; public String getBeanName() { return beanName; @@ -323,6 +329,7 @@ public String getJndiConsumerName() { public Class getBeanClass() { return this.beanClass; } + @Override public Map getContextServiceMap() { if (contextService == null) { @@ -330,4 +337,30 @@ public Map getContextServiceMap() { } return this.contextService.toMap(); } + + @Override + public Map getManagedExecutorMap() { + if (managedExecutor == null) { + managedExecutor = new KeyedCollection<>(); + } + return this.managedExecutor.toMap(); + } + + @Override + public Map getManagedScheduledExecutorMap() { + if (managedScheduledExecutor == null) { + managedScheduledExecutor = new KeyedCollection<>(); + } + + return this.managedScheduledExecutor.toMap(); + } + + @Override + public Map getManagedThreadFactoryMap() { + if (managedThreadFactory == null) { + managedThreadFactory = new KeyedCollection<>(); + } + + return this.managedThreadFactory.toMap(); + } } diff --git a/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiScanner.java b/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiScanner.java index b05d7b2cceb..51bd7cd0832 100644 --- a/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiScanner.java +++ b/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiScanner.java @@ -22,6 +22,7 @@ import org.apache.openejb.assembler.classic.AppInfo; import org.apache.openejb.assembler.classic.BeansInfo; import org.apache.openejb.assembler.classic.EjbJarInfo; +import org.apache.openejb.cdi.concurrency.AsynchronousInterceptor; import org.apache.openejb.cdi.transactional.MandatoryInterceptor; import org.apache.openejb.cdi.transactional.NeverInterceptor; import org.apache.openejb.cdi.transactional.NotSupportedInterceptor; @@ -64,9 +65,13 @@ public class CdiScanner implements BdaScannerService { private static final Logger logger = Logger.getInstance(LogCategory.OPENEJB_CDI, OpenEJBLifecycle.class); public static final String OPENEJB_CDI_FILTER_CLASSLOADER = "openejb.cdi.filter.classloader"; - private static final Class[] TRANSACTIONAL_INTERCEPTORS = new Class[]{ + private static final Class[] INTERNAL_INTERCEPTORS = new Class[]{ + // @Transactional MandatoryInterceptor.class, NeverInterceptor.class, NotSupportedInterceptor.class, - RequiredInterceptor.class, RequiredNewInterceptor.class, SupportsInterceptor.class + RequiredInterceptor.class, RequiredNewInterceptor.class, SupportsInterceptor.class, + + // @Asynchronous + AsynchronousInterceptor.class }; private final Set> startupClasses = new HashSet<>(); @@ -140,8 +145,8 @@ public void init(final Object object) { if (appInfo.webAppAlone || !ejbJar.webapp) { // "manual" extension to avoid to add it through SPI mecanism - classes.addAll(asList(TRANSACTIONAL_INTERCEPTORS)); - for (final Class interceptor : TRANSACTIONAL_INTERCEPTORS) { + classes.addAll(asList(INTERNAL_INTERCEPTORS)); + for (final Class interceptor : INTERNAL_INTERCEPTORS) { interceptorsManager.addEnabledInterceptorClass(interceptor); } } diff --git a/container/openejb-core/src/main/java/org/apache/openejb/cdi/ThreadSingletonServiceImpl.java b/container/openejb-core/src/main/java/org/apache/openejb/cdi/ThreadSingletonServiceImpl.java index e0906d90518..f0bcb881617 100644 --- a/container/openejb-core/src/main/java/org/apache/openejb/cdi/ThreadSingletonServiceImpl.java +++ b/container/openejb-core/src/main/java/org/apache/openejb/cdi/ThreadSingletonServiceImpl.java @@ -177,7 +177,7 @@ public void execute(final Runnable command) { executor = new ManagedExecutorServiceImpl( new ExecutorBuilder() .size(3) - .threadFactory(new ManagedThreadFactoryImpl(appContext.getId() + "-cdi-fireasync-")) + .threadFactory(new ManagedThreadFactoryImpl(appContext.getId() + "-cdi-fireasync-", null, ContextServiceImplFactory.newPropagateEverythingContextService())) .prefix("CDIAsyncPool") .build(appContext.getOptions()), ContextServiceImplFactory.newPropagateEverythingContextService()); delegate.compareAndSet(null, executor); diff --git a/container/openejb-core/src/main/java/org/apache/openejb/cdi/concurrency/AsynchronousInterceptor.java b/container/openejb-core/src/main/java/org/apache/openejb/cdi/concurrency/AsynchronousInterceptor.java new file mode 100644 index 00000000000..04f6c46773d --- /dev/null +++ b/container/openejb-core/src/main/java/org/apache/openejb/cdi/concurrency/AsynchronousInterceptor.java @@ -0,0 +1,115 @@ +/* + * 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.openejb.cdi.concurrency; + +import jakarta.annotation.Priority; +import jakarta.enterprise.concurrent.Asynchronous; +import jakarta.enterprise.concurrent.ManagedExecutorService; +import jakarta.interceptor.AroundInvoke; +import jakarta.interceptor.Interceptor; +import jakarta.interceptor.InvocationContext; +import org.apache.openejb.core.ivm.naming.NamingException; +import org.apache.openejb.resource.thread.ManagedExecutorServiceImplFactory; + +import java.lang.annotation.Annotation; +import java.lang.reflect.Method; +import java.util.Arrays; +import java.util.Map; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.CompletionStage; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.RejectedExecutionException; + +@Interceptor +@Asynchronous +@Priority(Interceptor.Priority.PLATFORM_BEFORE + 5) +public class AsynchronousInterceptor { + public static final String MP_ASYNC_ANNOTATION_NAME = "org.eclipse.microprofile.faulttolerance.Asynchronous"; + + // ensure validation logic required by the spec only runs once per invoked Method + private final Map validationCache = new ConcurrentHashMap<>(); + + @AroundInvoke + public Object aroundInvoke(final InvocationContext ctx) throws Exception { + Exception exception = validationCache.computeIfAbsent(ctx.getMethod(), this::validate); + if (exception != null) { + throw exception; + } + + Asynchronous asynchronous = ctx.getMethod().getAnnotation(Asynchronous.class); + ManagedExecutorService mes; + try { + mes = ManagedExecutorServiceImplFactory.lookup(asynchronous.executor()); + } catch (NamingException | IllegalArgumentException e) { + throw new RejectedExecutionException("Cannot lookup ManagedExecutorService", e); + } + + CompletableFuture future = mes.newIncompleteFuture(); + mes.execute(() -> { + try { + Asynchronous.Result.setFuture(future); + CompletionStage result = (CompletionStage) ctx.proceed(); + if (result == null || result == future) { + future.complete(result); + + Asynchronous.Result.setFuture(null); + return; + } + + result.whenComplete((resultInternal, err) -> { + if (resultInternal != null) { + future.complete(resultInternal); + } else if (err != null) { + future.completeExceptionally(err); + } + + Asynchronous.Result.setFuture(null); + }); + } catch (Exception e) { + future.completeExceptionally(e); + Asynchronous.Result.setFuture(null); + } + }); + + return ctx.getMethod().getReturnType() == Void.TYPE ? null : future; + } + + private Exception validate(final Method method) { + if (hasMpAsyncAnnotation(method.getAnnotations()) || hasMpAsyncAnnotation(method.getDeclaringClass().getAnnotations())) { + return new UnsupportedOperationException("Combining " + Asynchronous.class.getName() + + " and " + MP_ASYNC_ANNOTATION_NAME + " on the same method/class is not supported"); + } + + Asynchronous asynchronous = method.getAnnotation(Asynchronous.class); + if (asynchronous == null) { + return new UnsupportedOperationException("Asynchronous annotation must be placed on a method"); + } + + Class returnType = method.getReturnType(); + if (returnType != Void.TYPE && returnType != CompletableFuture.class && returnType != CompletionStage.class) { + return new UnsupportedOperationException("Asynchronous annotation must be placed on a method that returns either void, CompletableFuture or CompletionStage"); + } + + return null; + } + + private boolean hasMpAsyncAnnotation(Annotation[] declaredAnnotations) { + return Arrays.stream(declaredAnnotations) + .map(it -> it.annotationType().getName()) + .anyMatch(it -> it.equals(MP_ASYNC_ANNOTATION_NAME)); + } +} diff --git a/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java b/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java index 9865432f5fe..a2f193b8bb2 100644 --- a/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java +++ b/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java @@ -18,6 +18,9 @@ package org.apache.openejb.config; import jakarta.enterprise.concurrent.ContextServiceDefinition; +import jakarta.enterprise.concurrent.ManagedExecutorDefinition; +import jakarta.enterprise.concurrent.ManagedScheduledExecutorDefinition; +import jakarta.enterprise.concurrent.ManagedThreadFactoryDefinition; import jakarta.interceptor.AroundConstruct; import org.apache.openejb.BeanContext; import org.apache.openejb.OpenEJBException; @@ -78,6 +81,9 @@ import org.apache.openejb.jee.Lifecycle; import org.apache.openejb.jee.LifecycleCallback; import org.apache.openejb.jee.Listener; +import org.apache.openejb.jee.ManagedExecutor; +import org.apache.openejb.jee.ManagedScheduledExecutor; +import org.apache.openejb.jee.ManagedThreadFactory; import org.apache.openejb.jee.MessageAdapter; import org.apache.openejb.jee.MessageDrivenBean; import org.apache.openejb.jee.MessageListener; @@ -4081,6 +4087,53 @@ public void buildAnnotatedRefs(final JndiConsumer consumer, final IAnnotationFin buildContextServiceDefinition(consumer, definition); } + // + // @ManagedExecutorDefinition + // + + for (final Annotated> annotated : annotationFinder.findMetaAnnotatedClasses(ManagedExecutorDefinition.List.class)) { + final ManagedExecutorDefinition.List defs = annotated.getAnnotation(ManagedExecutorDefinition.List.class); + for (final ManagedExecutorDefinition definition : defs.value()) { + buildManagedExecutorDefinition(consumer, definition); + } + } + + for (final Annotated> annotated : annotationFinder.findMetaAnnotatedClasses(ManagedExecutorDefinition.class)) { + final ManagedExecutorDefinition definition = annotated.getAnnotation(ManagedExecutorDefinition.class); + buildManagedExecutorDefinition(consumer, definition); + } + + // + // @ManagedScheduledExecutorDefinition + // + + for (final Annotated> annotated : annotationFinder.findMetaAnnotatedClasses(ManagedScheduledExecutorDefinition.List.class)) { + final ManagedScheduledExecutorDefinition.List defs = annotated.getAnnotation(ManagedScheduledExecutorDefinition.List.class); + for (final ManagedScheduledExecutorDefinition definition : defs.value()) { + buildManagedScheduledExecutorDefinition(consumer, definition); + } + } + + for (final Annotated> annotated : annotationFinder.findMetaAnnotatedClasses(ManagedScheduledExecutorDefinition.class)) { + final ManagedScheduledExecutorDefinition definition = annotated.getAnnotation(ManagedScheduledExecutorDefinition.class); + buildManagedScheduledExecutorDefinition(consumer, definition); + } + + // + // @ManagedThreadFactoryDefinition + // + for (final Annotated> annotated : annotationFinder.findMetaAnnotatedClasses(ManagedThreadFactoryDefinition.List.class)) { + final ManagedThreadFactoryDefinition.List defs = annotated.getAnnotation(ManagedThreadFactoryDefinition.List.class); + for (final ManagedThreadFactoryDefinition definition : defs.value()) { + buildManagedThreadFactoryDefinition(consumer, definition); + } + } + + for (final Annotated> annotated : annotationFinder.findMetaAnnotatedClasses(ManagedThreadFactoryDefinition.class)) { + final ManagedThreadFactoryDefinition definition = annotated.getAnnotation(ManagedThreadFactoryDefinition.class); + buildManagedThreadFactoryDefinition(consumer, definition); + } + // // @JMSConnectionFactoryDefinition // @@ -4137,6 +4190,47 @@ private void buildContextServiceDefinition(final JndiConsumer consumer, final Co consumer.getContextServiceMap().put(definition.name(), contextService); } + private void buildManagedExecutorDefinition(final JndiConsumer consumer, final ManagedExecutorDefinition definition) { + ManagedExecutor existing = consumer.getManagedExecutorMap().get(definition.name()); + final ManagedExecutor managedExecutor = (existing != null) ? existing : new ManagedExecutor(); + + managedExecutor.setName(new JndiName()); + managedExecutor.getName().setvalue(definition.name()); + managedExecutor.setContextService(new JndiName()); + managedExecutor.getContextService().setvalue(definition.context()); + managedExecutor.setHungTaskThreshold(definition.hungTaskThreshold()); + managedExecutor.setMaxAsync(definition.maxAsync() == -1 ? null : definition.maxAsync()); + + consumer.getManagedExecutorMap().put(definition.name(), managedExecutor); + } + + private void buildManagedScheduledExecutorDefinition(final JndiConsumer consumer, final ManagedScheduledExecutorDefinition definition) { + ManagedScheduledExecutor existing = consumer.getManagedScheduledExecutorMap().get(definition.name()); + final ManagedScheduledExecutor managedScheduledExecutor = (existing != null) ? existing : new ManagedScheduledExecutor(); + + managedScheduledExecutor.setName(new JndiName()); + managedScheduledExecutor.getName().setvalue(definition.name()); + managedScheduledExecutor.setContextService(new JndiName()); + managedScheduledExecutor.getContextService().setvalue(definition.context()); + managedScheduledExecutor.setHungTaskThreshold(definition.hungTaskThreshold()); + managedScheduledExecutor.setMaxAsync(definition.maxAsync() == -1 ? null : definition.maxAsync()); + + consumer.getManagedScheduledExecutorMap().put(definition.name(), managedScheduledExecutor); + } + + private void buildManagedThreadFactoryDefinition(final JndiConsumer consumer, ManagedThreadFactoryDefinition definition) { + ManagedThreadFactory existing = consumer.getManagedThreadFactoryMap().get(definition.name()); + final ManagedThreadFactory managedThreadFactory = (existing != null) ? existing : new ManagedThreadFactory(); + + managedThreadFactory.setName(new JndiName()); + managedThreadFactory.getName().setvalue(definition.name()); + managedThreadFactory.setContextService(new JndiName()); + managedThreadFactory.getContextService().setvalue(definition.context()); + managedThreadFactory.setPriority(definition.priority()); + + consumer.getManagedThreadFactoryMap().put(definition.name(), managedThreadFactory); + } + private void buildContext(final JndiConsumer consumer, final Member member) { final ContextRef ref = new ContextRef(); ref.setName(member.getDeclaringClass().getName() + "/" + member.getName()); diff --git a/container/openejb-core/src/main/java/org/apache/openejb/config/ConfigurationFactory.java b/container/openejb-core/src/main/java/org/apache/openejb/config/ConfigurationFactory.java index 4ab02395a3c..0e0f8b6033f 100644 --- a/container/openejb-core/src/main/java/org/apache/openejb/config/ConfigurationFactory.java +++ b/container/openejb-core/src/main/java/org/apache/openejb/config/ConfigurationFactory.java @@ -288,6 +288,9 @@ public ConfigurationFactory(final boolean offline, final DynamicDeployer preAuto chain.add(new ConvertDataSourceDefinitions()); chain.add(new ConvertContextServiceDefinitions()); + chain.add(new ConvertManagedExecutorServiceDefinitions()); + chain.add(new ConvertManagedScheduledExecutorServiceDefinitions()); + chain.add(new ConvertManagedThreadFactoryDefinitions()); chain.add(new ConvertJMSConnectionFactoryDefinitions()); chain.add(new ConvertJMSDestinationDefinitions()); chain.add(new CleanEnvEntries()); diff --git a/container/openejb-core/src/main/java/org/apache/openejb/config/ConvertManagedExecutorServiceDefinitions.java b/container/openejb-core/src/main/java/org/apache/openejb/config/ConvertManagedExecutorServiceDefinitions.java new file mode 100644 index 00000000000..df131b30d9f --- /dev/null +++ b/container/openejb-core/src/main/java/org/apache/openejb/config/ConvertManagedExecutorServiceDefinitions.java @@ -0,0 +1,108 @@ +/* + * 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.openejb.config; + +import org.apache.openejb.OpenEJBException; +import org.apache.openejb.config.sys.Resource; +import org.apache.openejb.jee.JndiConsumer; +import org.apache.openejb.jee.KeyedCollection; +import org.apache.openejb.jee.ManagedExecutor; +import org.apache.openejb.util.PropertyPlaceHolderHelper; + +import java.util.List; +import java.util.Map; +import java.util.Properties; + +public class ConvertManagedExecutorServiceDefinitions extends BaseConvertDefinitions { + @Override + public AppModule deploy(AppModule appModule) throws OpenEJBException { + final List jndiConsumers = collectConsumers(appModule); + + final KeyedCollection managedExecutors = new KeyedCollection<>(); + final KeyedCollection managedExecutorsFromCompManagedBeans = new KeyedCollection<>(); + + for (final JndiConsumer consumer : jndiConsumers) { + if (consumer == null) { + continue; + } + + if (consumer instanceof CompManagedBean) { + /* + * TOMEE-2053: It may contain invalid context service definitions + * because it is never updated with content from the ejb-jar.xml + * Wait until all other consumers have been processed, to safely + * decide which context services to transfer; + */ + + managedExecutorsFromCompManagedBeans.addAll(consumer.getManagedExecutorMap().values()); + continue; + } + managedExecutors.addAll(consumer.getManagedExecutorMap().values()); + } + + final Map managedExecutorsMap = managedExecutors.toMap(); + for (ManagedExecutor managedExecutor : managedExecutorsFromCompManagedBeans) { + //Interested only in ManagedExecutorServices that come from non-JndiConsumers + if (!managedExecutorsMap.containsKey(managedExecutor.getName().getvalue())) { + managedExecutors.add(managedExecutor); + } + } + + for (final ManagedExecutor managedExecutor : managedExecutors) { + appModule.getResources().add(toResource(managedExecutor)); + } + + return appModule; + } + + private Resource toResource(final ManagedExecutor managedExecutor) { + final String name = cleanUpName(managedExecutor.getName().getvalue()); + + final Resource def = new Resource(name, jakarta.enterprise.concurrent.ManagedExecutorService.class.getName()); + + def.setJndi(managedExecutor.getName().getvalue().replaceFirst("java:", "")); + + final Properties p = def.getProperties(); + + String contextName = managedExecutor.getContextService().getvalue(); + // Translate JNDI name to TomEE Resource ID, otherwise AutoConfig will fail to resolve it + // and try to fix it by rewriting this to an unwanted ContextService + if ("java:comp/DefaultContextService".equals(contextName)) { + contextName = "Default Context Service"; + } + + put(p, "Context", contextName); + put(p, "HungTaskThreshold", managedExecutor.getHungTaskThreshold()); + put(p, "Max", managedExecutor.getMaxAsync()); + + // to force it to be bound in JndiEncBuilder + put(p, "JndiName", def.getJndi()); + + return def; + } + + private static void put(final Properties properties, final String key, final Object value) { + if (key == null) { + return; + } + if (value == null) { + return; + } + + properties.put(key, PropertyPlaceHolderHelper.value(String.valueOf(value))); + } +} diff --git a/container/openejb-core/src/main/java/org/apache/openejb/config/ConvertManagedScheduledExecutorServiceDefinitions.java b/container/openejb-core/src/main/java/org/apache/openejb/config/ConvertManagedScheduledExecutorServiceDefinitions.java new file mode 100644 index 00000000000..c06c0383e4c --- /dev/null +++ b/container/openejb-core/src/main/java/org/apache/openejb/config/ConvertManagedScheduledExecutorServiceDefinitions.java @@ -0,0 +1,108 @@ +/* + * 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.openejb.config; + +import org.apache.openejb.OpenEJBException; +import org.apache.openejb.config.sys.Resource; +import org.apache.openejb.jee.JndiConsumer; +import org.apache.openejb.jee.KeyedCollection; +import org.apache.openejb.jee.ManagedScheduledExecutor; +import org.apache.openejb.util.PropertyPlaceHolderHelper; + +import java.util.List; +import java.util.Map; +import java.util.Properties; + +public class ConvertManagedScheduledExecutorServiceDefinitions extends BaseConvertDefinitions { + @Override + public AppModule deploy(AppModule appModule) throws OpenEJBException { + final List jndiConsumers = collectConsumers(appModule); + + final KeyedCollection managedScheduledExecutors = new KeyedCollection<>(); + final KeyedCollection managedScheduledExecutorsFromCompManagedBeans = new KeyedCollection<>(); + + for (final JndiConsumer consumer : jndiConsumers) { + if (consumer == null) { + continue; + } + + if (consumer instanceof CompManagedBean) { + /* + * TOMEE-2053: It may contain invalid context service definitions + * because it is never updated with content from the ejb-jar.xml + * Wait until all other consumers have been processed, to safely + * decide which context services to transfer; + */ + + managedScheduledExecutorsFromCompManagedBeans.addAll(consumer.getManagedScheduledExecutorMap().values()); + continue; + } + managedScheduledExecutors.addAll(consumer.getManagedScheduledExecutorMap().values()); + } + + final Map managedScheduledExecutorsMap = managedScheduledExecutors.toMap(); + for (ManagedScheduledExecutor managedScheduledExecutor : managedScheduledExecutorsFromCompManagedBeans) { + //Interested only in ManagedExecutorServices that come from non-JndiConsumers + if (!managedScheduledExecutorsMap.containsKey(managedScheduledExecutor.getName().getvalue())) { + managedScheduledExecutors.add(managedScheduledExecutor); + } + } + + for (final ManagedScheduledExecutor managedScheduledExecutor : managedScheduledExecutors) { + appModule.getResources().add(toResource(managedScheduledExecutor)); + } + + return appModule; + } + + private Resource toResource(final ManagedScheduledExecutor managedScheduledExecutor) { + final String name = cleanUpName(managedScheduledExecutor.getName().getvalue()); + + final Resource def = new Resource(name, jakarta.enterprise.concurrent.ManagedScheduledExecutorService.class.getName()); + + def.setJndi(managedScheduledExecutor.getName().getvalue().replaceFirst("java:", "")); + + + String contextName = managedScheduledExecutor.getContextService().getvalue(); + // Translate JNDI name to TomEE Resource ID, otherwise AutoConfig will fail to resolve it + // and try to fix it by rewriting this to an unwanted ContextService + if ("java:comp/DefaultContextService".equals(contextName)) { + contextName = "Default Context Service"; + } + + final Properties p = def.getProperties(); + put(p, "Context", contextName); + put(p, "HungTaskThreshold", managedScheduledExecutor.getHungTaskThreshold()); + put(p, "Core", managedScheduledExecutor.getMaxAsync()); + + // to force it to be bound in JndiEncBuilder + put(p, "JndiName", def.getJndi()); + + return def; + } + + private static void put(final Properties properties, final String key, final Object value) { + if (key == null) { + return; + } + if (value == null) { + return; + } + + properties.put(key, PropertyPlaceHolderHelper.value(String.valueOf(value))); + } +} diff --git a/container/openejb-core/src/main/java/org/apache/openejb/config/ConvertManagedThreadFactoryDefinitions.java b/container/openejb-core/src/main/java/org/apache/openejb/config/ConvertManagedThreadFactoryDefinitions.java new file mode 100644 index 00000000000..95eb0a12c9b --- /dev/null +++ b/container/openejb-core/src/main/java/org/apache/openejb/config/ConvertManagedThreadFactoryDefinitions.java @@ -0,0 +1,107 @@ +/* + * 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.openejb.config; + +import org.apache.openejb.OpenEJBException; +import org.apache.openejb.config.sys.Resource; +import org.apache.openejb.jee.JndiConsumer; +import org.apache.openejb.jee.KeyedCollection; +import org.apache.openejb.jee.ManagedThreadFactory; +import org.apache.openejb.jee.ManagedThreadFactory; +import org.apache.openejb.util.PropertyPlaceHolderHelper; + +import java.util.List; +import java.util.Map; +import java.util.Properties; + +public class ConvertManagedThreadFactoryDefinitions extends BaseConvertDefinitions { + @Override + public AppModule deploy(AppModule appModule) throws OpenEJBException { + final List jndiConsumers = collectConsumers(appModule); + + final KeyedCollection managedThreadFactories = new KeyedCollection<>(); + final KeyedCollection managedThreadFactoriesFromCompManagedBeans = new KeyedCollection<>(); + + for (final JndiConsumer consumer : jndiConsumers) { + if (consumer == null) { + continue; + } + + if (consumer instanceof CompManagedBean) { + /* + * TOMEE-2053: It may contain invalid context service definitions + * because it is never updated with content from the ejb-jar.xml + * Wait until all other consumers have been processed, to safely + * decide which context services to transfer; + */ + + managedThreadFactoriesFromCompManagedBeans.addAll(consumer.getManagedThreadFactoryMap().values()); + continue; + } + managedThreadFactories.addAll(consumer.getManagedThreadFactoryMap().values()); + } + + final Map managedThreadFactoriesMap = managedThreadFactories.toMap(); + for (ManagedThreadFactory managedThreadFactory : managedThreadFactoriesFromCompManagedBeans) { + //Interested only in ManagedThreadFactoryServices that come from non-JndiConsumers + if (!managedThreadFactoriesMap.containsKey(managedThreadFactory.getName().getvalue())) { + managedThreadFactories.add(managedThreadFactory); + } + } + + for (final ManagedThreadFactory managedThreadFactory : managedThreadFactories) { + appModule.getResources().add(toResource(managedThreadFactory)); + } + + return appModule; + } + + private Resource toResource(final ManagedThreadFactory managedThreadFactory) { + final String name = cleanUpName(managedThreadFactory.getName().getvalue()); + + final Resource def = new Resource(name, jakarta.enterprise.concurrent.ManagedThreadFactory.class.getName()); + + def.setJndi(managedThreadFactory.getName().getvalue().replaceFirst("java:", "")); + + String contextName = managedThreadFactory.getContextService().getvalue(); + // Translate JNDI name to TomEE Resource ID, otherwise AutoConfig will fail to resolve it + // and try to fix it by rewriting this to an unwanted ContextService + if ("java:comp/DefaultContextService".equals(contextName)) { + contextName = "Default Context Service"; + } + + final Properties p = def.getProperties(); + put(p, "Context", contextName); + put(p, "Priority", managedThreadFactory.getPriority()); + + // to force it to be bound in JndiEncBuilder + put(p, "JndiName", def.getJndi()); + + return def; + } + + private static void put(final Properties properties, final String key, final Object value) { + if (key == null) { + return; + } + if (value == null) { + return; + } + + properties.put(key, PropertyPlaceHolderHelper.value(String.valueOf(value))); + } +} diff --git a/container/openejb-core/src/main/java/org/apache/openejb/core/ThreadContext.java b/container/openejb-core/src/main/java/org/apache/openejb/core/ThreadContext.java index ec04b96d5bb..2a5d57f0ea8 100644 --- a/container/openejb-core/src/main/java/org/apache/openejb/core/ThreadContext.java +++ b/container/openejb-core/src/main/java/org/apache/openejb/core/ThreadContext.java @@ -39,13 +39,6 @@ public static ThreadContext getThreadContext() { return threadStorage.get(); } - public static ThreadContext clear() { - final ThreadContext oldContext = threadStorage.get(); - threadStorage.set(null); - return oldContext; - } - - public static ThreadContext enter(final ThreadContext newContext) { if (newContext == null) { throw new NullPointerException("newContext is null"); diff --git a/container/openejb-core/src/main/java/org/apache/openejb/core/security/AbstractSecurityService.java b/container/openejb-core/src/main/java/org/apache/openejb/core/security/AbstractSecurityService.java index 4c8ba4f0372..48e1c2e95b9 100644 --- a/container/openejb-core/src/main/java/org/apache/openejb/core/security/AbstractSecurityService.java +++ b/container/openejb-core/src/main/java/org/apache/openejb/core/security/AbstractSecurityService.java @@ -386,7 +386,7 @@ public boolean isCallerAuthorized(final Method method, final InterfaceType type) } else { securityContext = new SecurityContext(currentIdentity.getSubject()); } - securityContext.acc.checkPermission(new EJBMethodPermission(ejbName, name, method)); + securityContext.getAccessControlContext().checkPermission(new EJBMethodPermission(ejbName, name, method)); } catch (final AccessControlException e) { return false; } @@ -505,20 +505,20 @@ public ProvidedSecurityContext(final SecurityContext context) { } } - public static final class SecurityContext { - + public static final class SecurityContext implements Serializable { public final Subject subject; - public final AccessControlContext acc; @SuppressWarnings("unchecked") public SecurityContext(final Subject subject) { this.subject = subject; - this.acc = (AccessControlContext) Subject.doAsPrivileged(subject, (PrivilegedAction) AccessController::getContext, null); + } + + public AccessControlContext getAccessControlContext() { + return (AccessControlContext) Subject.doAsPrivileged(subject, (PrivilegedAction) AccessController::getContext, null); } } protected static class Identity implements Serializable { - private final Subject subject; private final UUID token; @@ -542,7 +542,6 @@ public UUID getToken() { } public static class Group implements java.security.Principal { - private final List members = new ArrayList<>(); private final String name; @@ -562,7 +561,6 @@ public String getName() { @CallerPrincipal // to force it to be before group in getCallerPrincipal, otherwise we aren't deterministic public static class User implements Principal { - private final String name; public User(final String name) { diff --git a/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/local/ManagedConnection.java b/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/local/ManagedConnection.java index 1368fdd8597..4dda838153f 100644 --- a/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/local/ManagedConnection.java +++ b/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/local/ManagedConnection.java @@ -135,10 +135,27 @@ public Object invoke(final Object proxy, final Method method, final Object[] arg // get the already bound connection to the current transaction or enlist this one in the tx final int transactionStatus = transaction.getStatus(); if (isUnderTransaction(transactionStatus)) { - Connection connection = Connection.class.cast(registry.getResource(key)); - if (connection == null && delegate == null) { + Connection registeredConnection = Connection.class.cast(registry.getResource(key)); + if (delegate == null && registeredConnection != null) { + // this happens if the caller obtains subsequent connections from the *same* datasource + // are enlisted in the *same* transaction: + // connection != null (because it comes from the tx registry) + // delegate == null (because its a new ManagedConnection instance) + // we attempt to work-around this by looking up the connection in the tx registry in ManaagedDataSource + // and ManagedXADataSource, but there is an edge case where the connection is fetch from the datasource + // first, and a BMT tx is started by the user. + + final ManagedConnection managedConnection = ManagedConnection.class.cast(Proxy.getInvocationHandler(registeredConnection)); + this.delegate = managedConnection.delegate; + this.xaConnection = managedConnection.xaConnection; + this.xaResource = managedConnection.xaResource; + } + + if (delegate == null) { newConnection(); + } + if (registeredConnection == null) { currentTransaction = transaction; try { if (!transaction.enlistResource(getXAResource())) { @@ -167,19 +184,6 @@ public Object invoke(final Object proxy, final Method method, final Object[] arg } } } - } else if (delegate == null) { - // this happens if the caller obtains subsequent connections from the *same* datasource - // are enlisted in the *same* transaction: - // connection != null (because it comes from the tx registry) - // delegate == null (because its a new ManagedConnection instance) - // we attempt to work-around this by looking up the connection in the tx registry in ManaagedDataSource - // and ManagedXADataSource, but there is an edge case where the connection is fetch from the datasource - // first, and a BMT tx is started by the user. - - final ManagedConnection managedConnection = ManagedConnection.class.cast(Proxy.getInvocationHandler(connection)); - this.delegate = managedConnection.delegate; - this.xaConnection = managedConnection.xaConnection; - this.xaResource = managedConnection.xaResource; } return invokeUnderTransaction(method, args); diff --git a/container/openejb-core/src/main/java/org/apache/openejb/resource/thread/ManagedExecutorServiceImplFactory.java b/container/openejb-core/src/main/java/org/apache/openejb/resource/thread/ManagedExecutorServiceImplFactory.java index a97860f162a..6cdd22a92ff 100644 --- a/container/openejb-core/src/main/java/org/apache/openejb/resource/thread/ManagedExecutorServiceImplFactory.java +++ b/container/openejb-core/src/main/java/org/apache/openejb/resource/thread/ManagedExecutorServiceImplFactory.java @@ -16,6 +16,10 @@ */ package org.apache.openejb.resource.thread; +import jakarta.enterprise.concurrent.ManagedExecutorService; +import jakarta.enterprise.concurrent.ManagedThreadFactory; +import org.apache.openejb.loader.SystemInstance; +import org.apache.openejb.spi.ContainerSystem; import org.apache.openejb.threads.impl.ContextServiceImplFactory; import org.apache.openejb.threads.impl.ManagedExecutorServiceImpl; import org.apache.openejb.threads.impl.ManagedThreadFactoryImpl; @@ -24,8 +28,9 @@ import org.apache.openejb.util.LogCategory; import org.apache.openejb.util.Logger; -import jakarta.enterprise.concurrent.ManagedThreadFactory; - +import javax.naming.Context; +import javax.naming.InitialContext; +import javax.naming.NamingException; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; import java.util.concurrent.ExecutorService; @@ -41,6 +46,28 @@ public class ManagedExecutorServiceImplFactory { private String context; + public static ManagedExecutorServiceImpl lookup(String name) throws NamingException { + Object obj; + try { + obj = InitialContext.doLookup(name); + } catch (NamingException e) { + Context ctx = SystemInstance.get().getComponent(ContainerSystem.class).getJNDIContext(); + + if (name.equals("java:comp/DefaultManagedExecutorService")) { + name = "Default Managed Executor Service"; + } + + obj = ctx.lookup("openejb/Resource/" + name); + } + + if (!(obj instanceof ManagedExecutorServiceImpl mes)) { + throw new IllegalArgumentException("Resource with id " + name + + " is not a ManagedExecutorService, but is " + obj.getClass().getName()); + } + + return mes; + } + public ManagedExecutorServiceImpl create() { return new ManagedExecutorServiceImpl(createExecutorService(), ContextServiceImplFactory.lookupOrDefault(context)); } @@ -56,11 +83,18 @@ private ExecutorService createExecutorService() { ManagedThreadFactory managedThreadFactory; try { managedThreadFactory = "org.apache.openejb.threads.impl.ManagedThreadFactoryImpl".equals(threadFactory) ? - new ManagedThreadFactoryImpl() : + new ManagedThreadFactoryImpl(ManagedThreadFactoryImpl.DEFAULT_PREFIX, null, ContextServiceImplFactory.lookupOrDefault(context)) : ThreadFactories.findThreadFactory(threadFactory); } catch (final Exception e) { Logger.getInstance(LogCategory.OPENEJB, ManagedExecutorServiceImplFactory.class).warning("Can't create configured thread factory: " + threadFactory, e); - managedThreadFactory = new ManagedThreadFactoryImpl(); + managedThreadFactory = new ManagedThreadFactoryImpl(ManagedThreadFactoryImpl.DEFAULT_PREFIX, null, ContextServiceImplFactory.lookupOrDefault(context)); + } + + if (core > max) { + Logger.getInstance(LogCategory.OPENEJB, ManagedExecutorServiceImplFactory.class) + .warning("Core size (=" + core + ") is bigger than Max size (=" + max + "), lowering Core to Max"); + + core = max; } return new ThreadPoolExecutor(core, max, keepAlive.getTime(), keepAlive.getUnit(), blockingQueue, managedThreadFactory, CURejectHandler.INSTANCE); diff --git a/container/openejb-core/src/main/java/org/apache/openejb/resource/thread/ManagedScheduledExecutorServiceImplFactory.java b/container/openejb-core/src/main/java/org/apache/openejb/resource/thread/ManagedScheduledExecutorServiceImplFactory.java index 4b36bb5689a..771b160e205 100644 --- a/container/openejb-core/src/main/java/org/apache/openejb/resource/thread/ManagedScheduledExecutorServiceImplFactory.java +++ b/container/openejb-core/src/main/java/org/apache/openejb/resource/thread/ManagedScheduledExecutorServiceImplFactory.java @@ -48,7 +48,7 @@ private ScheduledExecutorService createScheduledExecutorService() { managedThreadFactory = ThreadFactories.findThreadFactory(threadFactory); } catch (final Exception e) { Logger.getInstance(LogCategory.OPENEJB, ManagedScheduledExecutorServiceImplFactory.class).warning("Unable to create configured thread factory: " + threadFactory, e); - managedThreadFactory = new ManagedThreadFactoryImpl(); + managedThreadFactory = new ManagedThreadFactoryImpl(ManagedThreadFactoryImpl.DEFAULT_PREFIX, null, ContextServiceImplFactory.lookupOrDefault(context)); } return new ScheduledThreadPoolExecutor(core, managedThreadFactory, CURejectHandler.INSTANCE); diff --git a/container/openejb-core/src/main/java/org/apache/openejb/resource/thread/ManagedThreadFactoryImplFactory.java b/container/openejb-core/src/main/java/org/apache/openejb/resource/thread/ManagedThreadFactoryImplFactory.java index 91bc37051e4..b4d7fe8de3c 100644 --- a/container/openejb-core/src/main/java/org/apache/openejb/resource/thread/ManagedThreadFactoryImplFactory.java +++ b/container/openejb-core/src/main/java/org/apache/openejb/resource/thread/ManagedThreadFactoryImplFactory.java @@ -17,18 +17,29 @@ package org.apache.openejb.resource.thread; +import org.apache.openejb.threads.impl.ContextServiceImplFactory; import org.apache.openejb.threads.impl.ManagedThreadFactoryImpl; import jakarta.enterprise.concurrent.ManagedThreadFactory; public class ManagedThreadFactoryImplFactory { private String prefix = "openejb-managed-thread-"; + private Integer priority; + private String context; public ManagedThreadFactory create() { - return new ManagedThreadFactoryImpl(prefix); + return new ManagedThreadFactoryImpl(prefix, priority, ContextServiceImplFactory.lookupOrDefault(context)); } public void setPrefix(final String prefix) { this.prefix = prefix; } + + public void setPriority(final int priority) { + this.priority = priority; + } + + public void setContext(final String context) { + this.context = context; + } } diff --git a/container/openejb-core/src/main/java/org/apache/openejb/threads/future/CUCompletableFuture.java b/container/openejb-core/src/main/java/org/apache/openejb/threads/future/CUCompletableFuture.java index 90f9c0c28b5..d2aee6febab 100644 --- a/container/openejb-core/src/main/java/org/apache/openejb/threads/future/CUCompletableFuture.java +++ b/container/openejb-core/src/main/java/org/apache/openejb/threads/future/CUCompletableFuture.java @@ -16,6 +16,7 @@ */ package org.apache.openejb.threads.future; +import jakarta.enterprise.concurrent.ContextService; import jakarta.enterprise.concurrent.ManagedExecutorService; import java.util.concurrent.CompletableFuture; @@ -28,9 +29,11 @@ public class CUCompletableFuture extends CompletableFuture { private final ManagedExecutorService executorService; + private final ContextService contextService; - public CUCompletableFuture(ManagedExecutorService executorService) { + public CUCompletableFuture(ManagedExecutorService executorService, ContextService contextService) { this.executorService = executorService; + this.contextService = contextService; } @Override @@ -40,61 +43,61 @@ public Executor defaultExecutor() { @Override public CompletableFuture newIncompleteFuture() { - return new CUCompletableFuture<>(executorService); + return new CUCompletableFuture<>(executorService, contextService); } @Override public CompletableFuture thenApply(Function fn) { - return super.thenApply(executorService.getContextService().contextualFunction(fn)); + return super.thenApply(contextService.contextualFunction(fn)); } @Override public CompletableFuture thenApplyAsync(Function fn) { - return super.thenApplyAsync(fn, executorService); + return super.thenApplyAsync(contextService.contextualFunction(fn)); } @Override public CompletableFuture thenApplyAsync(Function fn, Executor executor) { - return super.thenApplyAsync(executorService.getContextService().contextualFunction(fn), executor); + return super.thenApplyAsync(contextService.contextualFunction(fn), executor); } @Override public CompletableFuture thenCombineAsync(CompletionStage other, BiFunction fn) { - return super.thenCombineAsync(other, executorService.getContextService().contextualFunction(fn), executorService); + return super.thenCombineAsync(other, contextService.contextualFunction(fn)); } @Override public CompletableFuture thenCombineAsync(CompletionStage other, BiFunction fn, Executor executor) { - return super.thenCombineAsync(other, this.executorService.getContextService().contextualFunction(fn), executor); + return super.thenCombineAsync(other, this.contextService.contextualFunction(fn), executor); } @Override public CompletableFuture handleAsync(BiFunction fn) { - return super.handleAsync(executorService.getContextService().contextualFunction(fn)); + return super.handleAsync(contextService.contextualFunction(fn)); } @Override public CompletableFuture thenCombine(CompletionStage other, BiFunction fn) { - return super.thenCombine(other, executorService.getContextService().contextualFunction(fn)); + return super.thenCombine(other, contextService.contextualFunction(fn)); } @Override public CompletableFuture applyToEitherAsync(CompletionStage other, Function fn) { - return super.applyToEitherAsync(other, fn, executorService); + return super.applyToEitherAsync(other, contextService.contextualFunction(fn)); } @Override public CompletableFuture applyToEitherAsync(CompletionStage other, Function fn, Executor executor) { - return super.applyToEitherAsync(other, executorService.getContextService().contextualFunction(fn), executor); + return super.applyToEitherAsync(other, contextService.contextualFunction(fn), executor); } @Override public CompletableFuture thenAcceptBoth(CompletionStage other, BiConsumer action) { - return super.thenAcceptBoth(other, executorService.getContextService().contextualConsumer(action)); + return super.thenAcceptBoth(other, contextService.contextualConsumer(action)); } @Override public CompletableFuture exceptionally(Function fn) { - return super.exceptionally(this.executorService.getContextService().contextualFunction(fn)); + return super.exceptionally(this.contextService.contextualFunction(fn)); } } \ No newline at end of file diff --git a/container/openejb-core/src/main/java/org/apache/openejb/threads/future/CUScheduleFuture.java b/container/openejb-core/src/main/java/org/apache/openejb/threads/future/CUScheduledFuture.java similarity index 86% rename from container/openejb-core/src/main/java/org/apache/openejb/threads/future/CUScheduleFuture.java rename to container/openejb-core/src/main/java/org/apache/openejb/threads/future/CUScheduledFuture.java index 027f5603871..1740d32c628 100644 --- a/container/openejb-core/src/main/java/org/apache/openejb/threads/future/CUScheduleFuture.java +++ b/container/openejb-core/src/main/java/org/apache/openejb/threads/future/CUScheduledFuture.java @@ -22,8 +22,8 @@ import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; -public class CUScheduleFuture extends CUFuture implements ScheduledFuture { - public CUScheduleFuture(final ScheduledFuture delegate, final ManagedTaskListenerTask listener) { +public class CUScheduledFuture extends CUFuture implements ScheduledFuture { + public CUScheduledFuture(final ScheduledFuture delegate, final ManagedTaskListenerTask listener) { super(delegate, listener); } diff --git a/container/openejb-core/src/main/java/org/apache/openejb/threads/future/CUTriggerScheduledFuture.java b/container/openejb-core/src/main/java/org/apache/openejb/threads/future/CUTriggerScheduledFuture.java new file mode 100644 index 00000000000..d154bbf0795 --- /dev/null +++ b/container/openejb-core/src/main/java/org/apache/openejb/threads/future/CUTriggerScheduledFuture.java @@ -0,0 +1,66 @@ +/* + * 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.openejb.threads.future; + +import jakarta.enterprise.concurrent.SkippedException; +import org.apache.openejb.threads.task.TriggerTask; + +import java.util.concurrent.ExecutionException; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; + +/** + * Delegates isDone calls to TriggerTask and throws SkippedExceptions in get methods if task execution has been skipped + * @param + */ +public class CUTriggerScheduledFuture extends CUScheduledFuture { + public CUTriggerScheduledFuture(ScheduledFuture delegate, TriggerTask task) { + super(delegate, task); + } + + @Override + public boolean isDone() { + return super.isDone() && ((TriggerTask) listener).isDone(); + } + + @Override + public boolean cancel(boolean mayInterruptIfRunning) { + ((TriggerTask) listener).cancelScheduling(); + return super.cancel(mayInterruptIfRunning); + } + + @Override + public V get() throws InterruptedException, ExecutionException { + V result = super.get(); + if (((TriggerTask) listener).isSkipped()) { + throw new SkippedException(); + } + + return result; + } + + @Override + public V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException { + V result = super.get(timeout, unit); + if (((TriggerTask) listener).isSkipped()) { + throw new SkippedException(); + } + + return result; + } +} diff --git a/container/openejb-core/src/main/java/org/apache/openejb/threads/impl/ApplicationThreadContextProvider.java b/container/openejb-core/src/main/java/org/apache/openejb/threads/impl/ApplicationThreadContextProvider.java index 85e4bb1eddf..81672286820 100755 --- a/container/openejb-core/src/main/java/org/apache/openejb/threads/impl/ApplicationThreadContextProvider.java +++ b/container/openejb-core/src/main/java/org/apache/openejb/threads/impl/ApplicationThreadContextProvider.java @@ -20,20 +20,31 @@ import jakarta.enterprise.concurrent.spi.ThreadContextProvider; import jakarta.enterprise.concurrent.spi.ThreadContextRestorer; import jakarta.enterprise.concurrent.spi.ThreadContextSnapshot; +import org.apache.openejb.AppContext; import org.apache.openejb.core.ThreadContext; +import org.apache.openejb.loader.SystemInstance; +import org.apache.openejb.spi.ContainerSystem; +import org.apache.openejb.util.AppFinder; +import java.io.Serializable; import java.util.Map; -public class ApplicationThreadContextProvider implements ThreadContextProvider { +public class ApplicationThreadContextProvider implements ThreadContextProvider, Serializable { + public static final ApplicationThreadContextProvider INSTANCE = new ApplicationThreadContextProvider(); + @Override public ThreadContextSnapshot currentContext(final Map props) { - // TODO: is there anything we need to mess around with here? ClassLoader? - return new ApplicationThreadContextSnapshot(ThreadContext.getThreadContext()); + AppContext appContext = AppFinder.findAppContextOrWeb(Thread.currentThread().getContextClassLoader(), AppFinder.AppContextTransformer.INSTANCE); + if (appContext == null) { + return clearedContext(props); + } + + return new ApplicationThreadContextSnapshot(appContext.getId(), ThreadContext.getThreadContext()); } @Override public ThreadContextSnapshot clearedContext(final Map props) { - return new ApplicationThreadContextSnapshot(null); + return ThreadContextProviderUtil.NOOP_SNAPSHOT; } @Override @@ -41,36 +52,51 @@ public String getThreadContextType() { return ContextServiceDefinition.APPLICATION; } - public class ApplicationThreadContextSnapshot implements ThreadContextSnapshot { - + public static class ApplicationThreadContextSnapshot implements ThreadContextSnapshot, Serializable { + private final Object appId; private final ThreadContext threadContext; - public ApplicationThreadContextSnapshot(final ThreadContext threadContext) { + public ApplicationThreadContextSnapshot(final Object appId, final ThreadContext threadContext) { + this.appId = appId; this.threadContext = threadContext; } @Override public ThreadContextRestorer begin() { - final ThreadContext restoreContext = (threadContext == null) ? - ThreadContext.clear() : - ThreadContext.enter(threadContext); + if (appId == null) { + return ThreadContextProviderUtil.NOOP_RESTORER; + } - return new ApplicationThreadContextRestorer(restoreContext); + final AppContext appContext = SystemInstance.get().getComponent(ContainerSystem.class).getAppContext(appId); + final ClassLoader oldCl = Thread.currentThread().getContextClassLoader(); + Thread.currentThread().setContextClassLoader(appContext.getClassLoader()); + + // Don't touch ThreadContext if it is already correct or none was captured + boolean changeThreadContext = threadContext != null && threadContext != ThreadContext.getThreadContext(); + ThreadContext oldThreadContext = changeThreadContext ? ThreadContext.enter(threadContext) : null; + return new ApplicationThreadContextRestorer(oldCl, oldThreadContext, changeThreadContext); } } - public class ApplicationThreadContextRestorer implements ThreadContextRestorer { - - private final ThreadContext restoreContext; + public static class ApplicationThreadContextRestorer implements ThreadContextRestorer { + private final ClassLoader oldClassLoader; + private final ThreadContext oldThreadContext; + private final boolean exitThreadContext; - public ApplicationThreadContextRestorer(final ThreadContext restoreContext) { - this.restoreContext = restoreContext; + public ApplicationThreadContextRestorer(final ClassLoader oldClassLoader, final ThreadContext oldThreadContext, boolean exitThreadContext) { + this.oldClassLoader = oldClassLoader; + this.oldThreadContext = oldThreadContext; + this.exitThreadContext = exitThreadContext; } @Override public void endContext() throws IllegalStateException { - if (restoreContext != null) { - ThreadContext.exit(restoreContext); + if (oldClassLoader != null) { + Thread.currentThread().setContextClassLoader(oldClassLoader); + } + + if (exitThreadContext) { + ThreadContext.exit(oldThreadContext); } } } diff --git a/container/openejb-core/src/main/java/org/apache/openejb/threads/impl/ContextServiceImpl.java b/container/openejb-core/src/main/java/org/apache/openejb/threads/impl/ContextServiceImpl.java index 374eeea10a6..0f3777f18fd 100644 --- a/container/openejb-core/src/main/java/org/apache/openejb/threads/impl/ContextServiceImpl.java +++ b/container/openejb-core/src/main/java/org/apache/openejb/threads/impl/ContextServiceImpl.java @@ -16,23 +16,24 @@ */ package org.apache.openejb.threads.impl; +import jakarta.enterprise.concurrent.ContextService; import jakarta.enterprise.concurrent.ContextServiceDefinition; +import jakarta.enterprise.concurrent.ManagedExecutorService; +import jakarta.enterprise.concurrent.ManagedTask; import jakarta.enterprise.concurrent.spi.ThreadContextProvider; import jakarta.enterprise.concurrent.spi.ThreadContextRestorer; import jakarta.enterprise.concurrent.spi.ThreadContextSnapshot; -import org.apache.openejb.OpenEJB; +import org.apache.openejb.OpenEJBRuntimeException; +import org.apache.openejb.resource.thread.ManagedExecutorServiceImplFactory; +import org.apache.openejb.threads.future.CUCompletableFuture; import org.apache.openejb.threads.task.CUTask; -import jakarta.enterprise.concurrent.ContextService; -import jakarta.enterprise.concurrent.ManagedTask; -import jakarta.transaction.Transaction; - +import javax.naming.NamingException; import java.io.Serializable; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.Callable; @@ -45,24 +46,23 @@ import java.util.function.Function; import java.util.function.Supplier; -public class ContextServiceImpl implements ContextService { - - private static final HashMap EMPTY_PROPS = new HashMap(); +public class ContextServiceImpl implements ContextService, Serializable { + private final List propagated; + private final List cleared; + private final List unchanged; - private final List propagated = new ArrayList<>(); - private final List cleared = new ArrayList<>(); - private final List unchanged = new ArrayList<>(); + // TODO is lost after serialization, probably need to store some reference that can be resolved again after deserializing + private transient ManagedExecutorService mes; - public List getPropagated() { - return propagated; + public ContextServiceImpl(List propagated, List cleared, List unchanged) { + this.propagated = propagated; + this.cleared = cleared; + this.unchanged = unchanged; } - public List getCleared() { - return cleared; - } - - public List getUnchanged() { - return unchanged; + public ContextServiceImpl(ContextServiceImpl other, ManagedExecutorService mes) { + this(other.propagated, other.cleared, other.unchanged); + this.mes = mes; } @Override @@ -107,7 +107,7 @@ public T createContextualProxy(final T instance, final Class intf) { @Override public Object createContextualProxy(final Object instance, final Class... interfaces) { - return createContextualProxy(instance, EMPTY_PROPS, interfaces); + return createContextualProxy(instance, Map.of(), interfaces); } @Override @@ -117,7 +117,17 @@ public T createContextualProxy(final T instance, final Map e @Override public Object createContextualProxy(final Object instance, final Map executionProperties, final Class... interfaces) { - return Proxy.newProxyInstance(instance.getClass().getClassLoader(), interfaces, new CUHandler(instance, executionProperties)); + if (instance == null) { + throw new IllegalArgumentException("Cannot create contextual proxy, instance is null"); + } + + for (Class intf : interfaces) { + if (!intf.isInstance(instance)) { + throw new IllegalArgumentException("Cannot create contextual proxy, instance is not an instance of " + intf.getName()); + } + } + + return Proxy.newProxyInstance(instance.getClass().getClassLoader(), interfaces, new CUHandler(instance, executionProperties, this)); } @Override @@ -132,12 +142,12 @@ public Map getExecutionProperties(final Object contextualProxy) @Override public CompletableFuture withContextCapture(final CompletableFuture completableFuture) { - return createContextualProxy(completableFuture, CompletableFuture.class); + return copyInternal(completableFuture); } @Override public CompletionStage withContextCapture(final CompletionStage completionStage) { - return createContextualProxy(completionStage, CompletionStage.class); + return copyInternal(completionStage); } public Snapshot snapshot(final Map props) { @@ -195,7 +205,7 @@ public State enter(final Snapshot snapshot) { final List restorers = new ArrayList<>(); - for (ThreadContextSnapshot tcs : snapshot.getSnapshots()) { + for (ThreadContextSnapshot tcs : snapshot.snapshots()) { try { restorers.add(0, tcs.begin()); } catch (Throwable t) { @@ -208,73 +218,94 @@ public State enter(final Snapshot snapshot) { public void exit(final State state) { if (state != null) { - final List restorers = state.getRestorers(); + final List restorers = state.restorers(); for (ThreadContextRestorer restorer : restorers) { restorer.endContext(); } } } - private final class CUHandler extends CUTask implements InvocationHandler, Serializable { + private CompletableFuture copyInternal(CompletionStage future) { + final CUCompletableFuture managedFuture = new CUCompletableFuture<>(getManagedExecutorService(), this); + future.whenComplete((result, exception) -> { + if (exception == null) { + managedFuture.complete(result); + } else { + managedFuture.completeExceptionally(exception); + } + }); + return managedFuture; + } + + protected ManagedExecutorService getManagedExecutorService() { + if (mes == null) { + try { + ManagedExecutorServiceImpl defaultMes = ManagedExecutorServiceImplFactory.lookup("java:comp/DefaultManagedExecutorService"); + mes = new ManagedExecutorServiceImpl(defaultMes.getDelegate(), this); + } catch (NamingException e) { + throw new OpenEJBRuntimeException(e); + } + } + + return mes; + } + + private final static class CUHandler extends CUTask implements InvocationHandler, Serializable { private final Object instance; private final Map properties; - private final boolean suspendTx; - private CUHandler(final Object instance, final Map props) { - super(instance, ContextServiceImpl.this); + private CUHandler(final Object instance, final Map props, ContextServiceImpl contextService) { + super(instance, reconfigureContextService(contextService, props), props); + this.instance = instance; this.properties = props; - this.suspendTx = ManagedTask.SUSPEND.equals(props.get(ManagedTask.TRANSACTION)); } - @Override - public Object invoke(final Object proxy, final Method method, final Object[] args) throws Throwable { - if (method.getDeclaringClass() == Object.class) { - return method.invoke(this, args); + private static ContextServiceImpl reconfigureContextService(ContextServiceImpl contextService, Map props) { + if (props == null || !props.containsKey(ManagedTask.TRANSACTION)) { + return contextService; } - final Transaction suspendedTx; - if (suspendTx) { - suspendedTx = OpenEJB.getTransactionManager().suspend(); - } else { - suspendedTx = null; - } + ArrayList propagated = new ArrayList<>(contextService.propagated); + ArrayList cleared = new ArrayList<>(contextService.cleared); + ArrayList unchanged = new ArrayList<>(contextService.unchanged); - try { - return invoke(new Callable() { - @Override - public Object call() throws Exception { - return method.invoke(instance, args); - } - }); - } finally { - if (suspendedTx != null) { - OpenEJB.getTransactionManager().resume(suspendedTx); + if (ManagedTask.SUSPEND.equals(props.get(ManagedTask.TRANSACTION))) { + if (!cleared.contains(TxThreadContextProvider.INSTANCE)) { + cleared.add(TxThreadContextProvider.INSTANCE); } + + propagated.remove(TxThreadContextProvider.INSTANCE); + unchanged.remove(TxThreadContextProvider.INSTANCE); } - } - } - public class State { - private final List restorers; + if (ManagedTask.USE_TRANSACTION_OF_EXECUTION_THREAD.equals(props.get(ManagedTask.TRANSACTION))) { + if (!propagated.contains(TxThreadContextProvider.INSTANCE)) { + propagated.add(TxThreadContextProvider.INSTANCE); + } - public State(final List restorers) { - this.restorers = restorers; - } + cleared.remove(TxThreadContextProvider.INSTANCE); + unchanged.remove(TxThreadContextProvider.INSTANCE); + } - public List getRestorers() { - return restorers; + return new ContextServiceImpl( + new ArrayList<>(propagated), + new ArrayList<>(cleared), + new ArrayList<>(unchanged)); } - } - public class Snapshot { - private final List snapshots; - public Snapshot(final List snapshots) { - this.snapshots = snapshots; - } + @Override + public Object invoke(final Object proxy, final Method method, final Object[] args) throws Throwable { + if (method.getDeclaringClass() == Object.class) { + return method.invoke(this, args); + } - public List getSnapshots() { - return snapshots; + return invoke(() -> method.invoke(instance, args)); } } + + // Not serializable by design because e.g. ApplicationThreadContextProvider holds + // a ClassLoader to restore which is not serializable + public record State(List restorers) { } + public record Snapshot(List snapshots) implements Serializable { } } diff --git a/container/openejb-core/src/main/java/org/apache/openejb/threads/impl/ContextServiceImplFactory.java b/container/openejb-core/src/main/java/org/apache/openejb/threads/impl/ContextServiceImplFactory.java index 1a041f3cff4..6015edbcb6e 100755 --- a/container/openejb-core/src/main/java/org/apache/openejb/threads/impl/ContextServiceImplFactory.java +++ b/container/openejb-core/src/main/java/org/apache/openejb/threads/impl/ContextServiceImplFactory.java @@ -76,7 +76,16 @@ public void setUnchanged(final String unchanged) { } public static ContextServiceImpl newDefaultContextService() { - return new ContextServiceImplFactory().create(); + ContextServiceImplFactory factory = new ContextServiceImplFactory(); + + // It's unclear what the default is, spec says (§ 3.3.4.3 Default Context Service): + // The types of contexts to be propagated by this default ContextService from a contextualizing application component + // must include naming context, class loader, and security information. + // But @ContextServiceDefinition defaults to propagated="Remaining", cleared="Transaction" unchanged="" + factory.setPropagated(ContextServiceDefinition.ALL_REMAINING); + factory.setCleared(ContextServiceDefinition.TRANSACTION); + + return factory.create(); } public static ContextServiceImpl newPropagateEverythingContextService() { @@ -156,9 +165,9 @@ public ContextServiceImpl create() { final Map threadContextProviders = new HashMap<>(); // add the in-build ThreadContextProviders - threadContextProviders.put(ContextServiceDefinition.APPLICATION, new ApplicationThreadContextProvider()); - threadContextProviders.put(ContextServiceDefinition.SECURITY, new SecurityThreadContextProvider()); - threadContextProviders.put(ContextServiceDefinition.TRANSACTION, new TxThreadContextProvider()); + threadContextProviders.put(ContextServiceDefinition.APPLICATION, ApplicationThreadContextProvider.INSTANCE); + threadContextProviders.put(ContextServiceDefinition.SECURITY, SecurityThreadContextProvider.INSTANCE); + threadContextProviders.put(ContextServiceDefinition.TRANSACTION, TxThreadContextProvider.INSTANCE); getThreadContextProviders().forEach(t -> threadContextProviders.putIfAbsent(t.getThreadContextType(), t)); // Let's resolve what should actually be in each bucket: @@ -208,12 +217,7 @@ public ContextServiceImpl create() { // suspendTx = true; // } - final ContextServiceImpl contextService = new ContextServiceImpl(); - contextService.getPropagated().addAll(resolvedPropagated); - contextService.getCleared().addAll(resolvedCleared); - contextService.getUnchanged().addAll(resolvedUnchanged); - - return contextService; + return new ContextServiceImpl(resolvedPropagated, resolvedCleared, resolvedUnchanged); } protected List getThreadContextProviders() { diff --git a/container/openejb-core/src/main/java/org/apache/openejb/threads/impl/ManagedExecutorServiceImpl.java b/container/openejb-core/src/main/java/org/apache/openejb/threads/impl/ManagedExecutorServiceImpl.java index d91bef7220a..fe6221e5d7a 100644 --- a/container/openejb-core/src/main/java/org/apache/openejb/threads/impl/ManagedExecutorServiceImpl.java +++ b/container/openejb-core/src/main/java/org/apache/openejb/threads/impl/ManagedExecutorServiceImpl.java @@ -38,27 +38,37 @@ public class ManagedExecutorServiceImpl extends AbstractExecutorService implemen public ManagedExecutorServiceImpl(final ExecutorService delegate, final ContextServiceImpl contextService) { this.delegate = delegate; - this.contextService = contextService; + this.contextService = new ContextServiceImpl(contextService, this); } + // Forbidden lifecycle managing methods, see § 3.1.6.1 @Override public void shutdown() { - throw new IllegalStateException("You can't call shutdown"); + throw forbiddenMethod("shutdown"); } @Override public List shutdownNow() { - throw new IllegalStateException("You can't call shutdownNow"); + throw forbiddenMethod("shutdownNow"); } @Override public boolean isShutdown() { - return delegate.isShutdown(); + throw forbiddenMethod("isShutdown"); } @Override public boolean isTerminated() { - return delegate.isTerminated(); + throw forbiddenMethod("isTerminated"); + } + + @Override + public boolean awaitTermination(final long timeout, final TimeUnit unit) throws InterruptedException { + throw forbiddenMethod("awaitTermination"); + } + + protected IllegalStateException forbiddenMethod(String method) { + return new IllegalStateException("You can't call " + method); } public Integer getCorePoolSize() { @@ -117,11 +127,6 @@ public Long getCompletedTaskCount() { } } - @Override - public boolean awaitTermination(final long timeout, final TimeUnit unit) throws InterruptedException { - return delegate.awaitTermination(timeout, unit); - } - @Override public Future submit(final Callable task) { final CUCallable wrapper = new CUCallable<>(task, contextService); @@ -175,14 +180,14 @@ public void destroyResource() { @Override public CompletableFuture completedFuture(U value) { - final CUCompletableFuture future = new CUCompletableFuture<>(this); + final CUCompletableFuture future = new CUCompletableFuture<>(this, contextService); future.complete(value); return future; } @Override public CompletionStage completedStage(U value) { - final CUCompletableFuture future = new CUCompletableFuture<>(this); + final CUCompletableFuture future = new CUCompletableFuture<>(this, contextService); future.complete(value); return future; } @@ -199,14 +204,14 @@ public CompletionStage copy(CompletionStage stage) { @Override public CompletableFuture failedFuture(Throwable ex) { - final CUCompletableFuture future = new CUCompletableFuture<>(this); + final CUCompletableFuture future = new CUCompletableFuture<>(this, contextService); future.completeExceptionally(ex); return future; } @Override public CompletionStage failedStage(Throwable ex) { - final CUCompletableFuture future = new CUCompletableFuture<>(this); + final CUCompletableFuture future = new CUCompletableFuture<>(this, contextService); future.completeExceptionally(ex); return future.minimalCompletionStage(); } @@ -218,7 +223,7 @@ public ContextService getContextService() { @Override public CompletableFuture newIncompleteFuture() { - return new CUCompletableFuture<>(this); + return new CUCompletableFuture<>(this, contextService); } @Override @@ -228,7 +233,7 @@ public CompletableFuture runAsync(Runnable runnable) { @Override public CompletableFuture supplyAsync(Supplier supplier) { - final CUCompletableFuture managedFuture = new CUCompletableFuture<>(this); + final CUCompletableFuture managedFuture = new CUCompletableFuture<>(this, contextService); this.execute(() -> { try { managedFuture.complete(supplier.get()); @@ -240,7 +245,7 @@ public CompletableFuture supplyAsync(Supplier supplier) { } private CompletableFuture copyInternal(CompletionStage future) { - final CUCompletableFuture managedFuture = new CUCompletableFuture<>(this); + final CUCompletableFuture managedFuture = new CUCompletableFuture<>(this, contextService); future.whenComplete((result, exception) -> { if (exception == null) { managedFuture.complete(result); diff --git a/container/openejb-core/src/main/java/org/apache/openejb/threads/impl/ManagedScheduledExecutorServiceImpl.java b/container/openejb-core/src/main/java/org/apache/openejb/threads/impl/ManagedScheduledExecutorServiceImpl.java index cea54d8494f..469a8230582 100644 --- a/container/openejb-core/src/main/java/org/apache/openejb/threads/impl/ManagedScheduledExecutorServiceImpl.java +++ b/container/openejb-core/src/main/java/org/apache/openejb/threads/impl/ManagedScheduledExecutorServiceImpl.java @@ -16,7 +16,8 @@ */ package org.apache.openejb.threads.impl; -import org.apache.openejb.threads.future.CUScheduleFuture; +import org.apache.openejb.threads.future.CUScheduledFuture; +import org.apache.openejb.threads.future.CUTriggerScheduledFuture; import org.apache.openejb.threads.task.CUCallable; import org.apache.openejb.threads.task.CURunnable; import org.apache.openejb.threads.task.TriggerCallable; @@ -31,6 +32,7 @@ import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.util.Date; +import java.util.Map; import java.util.Objects; import java.util.concurrent.Callable; import java.util.concurrent.Future; @@ -55,9 +57,8 @@ public ScheduledFuture schedule(final Runnable runnable, final Trigger trigge Objects.requireNonNull(runnable); final Date taskScheduledTime = new Date(); final AtomicReference> futureHandle = new AtomicReference<>(); - final TriggerRunnable wrapper = new TriggerRunnable(this, contextService, runnable, new CURunnable(runnable), trigger, taskScheduledTime, getTaskId(runnable), AtomicReference.class.cast(futureHandle)); - final ScheduledFuture future = delegate.schedule(wrapper, trigger.getNextRunTime(wrapper.getLastExecution(), taskScheduledTime).getTime() - nowMs(), TimeUnit.MILLISECONDS); - return initTriggerScheduledFuture(runnable, AtomicReference.class.cast(futureHandle), wrapper, ScheduledFuture.class.cast(future)); + final TriggerRunnable wrapper = new TriggerRunnable(this, contextService, runnable, new CURunnable(runnable, contextService), trigger, taskScheduledTime, getTaskId(runnable), AtomicReference.class.cast(futureHandle)); + return initTriggerScheduledFuture(AtomicReference.class.cast(futureHandle), wrapper); } @Override @@ -65,25 +66,28 @@ public ScheduledFuture schedule(final Callable vCallable, final Trigge Objects.requireNonNull(vCallable); final Date taskScheduledTime = new Date(); final AtomicReference> futureHandle = new AtomicReference<>(); - final TriggerCallable wrapper = new TriggerCallable<>(this, this.contextService, vCallable, new CUCallable<>(vCallable), trigger, taskScheduledTime, getTaskId(vCallable), futureHandle); - final ScheduledFuture future = delegate.schedule(wrapper, trigger.getNextRunTime(wrapper.getLastExecution(), taskScheduledTime).getTime() - nowMs(), TimeUnit.MILLISECONDS); - return initTriggerScheduledFuture(vCallable, futureHandle, wrapper, future); + final TriggerCallable wrapper = new TriggerCallable<>(this, this.contextService, vCallable, new CUCallable<>(vCallable, contextService), trigger, taskScheduledTime, getTaskId(vCallable), futureHandle); + return initTriggerScheduledFuture(futureHandle, wrapper); } - private ScheduledFuture initTriggerScheduledFuture(final Object original, final AtomicReference> futureHandle, - final TriggerTask wrapper, final ScheduledFuture future) { - futureHandle.set(future); - wrapper.taskSubmitted(future, this, original); - return new CUScheduleFuture<>(ScheduledFutureFacade.newProxy(futureHandle), wrapper); + private ScheduledFuture initTriggerScheduledFuture(final AtomicReference> futureHandle, final TriggerTask wrapper) { + wrapper.scheduleNextRun(); + + ScheduledFuture proxy = (ScheduledFuture) Proxy.newProxyInstance( + Thread.currentThread().getContextClassLoader(), + new Class[]{ScheduledFuture.class}, + new TriggerBasedScheduledFutureFacade(futureHandle)); + + return new CUTriggerScheduledFuture<>(proxy, wrapper); } @Override public ScheduledFuture schedule(final Runnable command, final long delay, final TimeUnit unit) { Objects.requireNonNull(command); - final CURunnable wrapper = new CURunnable(command); + final CURunnable wrapper = new CURunnable(command, contextService); final ScheduledFuture future = delegate.schedule(wrapper, delay, unit); wrapper.taskSubmitted(future, this, command); - return new CUScheduleFuture<>(ScheduledFuture.class.cast(future), wrapper); + return new CUScheduledFuture<>(ScheduledFuture.class.cast(future), wrapper); } @Override @@ -92,25 +96,25 @@ public ScheduledFuture schedule(final Callable callable, final long de final CUCallable wrapper = new CUCallable<>(callable); final ScheduledFuture future = delegate.schedule(wrapper, delay, unit); wrapper.taskSubmitted(future, this, callable); - return new CUScheduleFuture<>(future, wrapper); + return new CUScheduledFuture<>(future, wrapper); } @Override public ScheduledFuture scheduleAtFixedRate(final Runnable command, final long initialDelay, final long period, final TimeUnit unit) { Objects.requireNonNull(command); - final CURunnable wrapper = new CURunnable(command); + final CURunnable wrapper = new CURunnable(command, contextService); final ScheduledFuture future = delegate.scheduleAtFixedRate(wrapper, initialDelay, period, unit); wrapper.taskSubmitted(future, this, command); - return new CUScheduleFuture<>(ScheduledFuture.class.cast(future), wrapper); + return new CUScheduledFuture<>(ScheduledFuture.class.cast(future), wrapper); } @Override public ScheduledFuture scheduleWithFixedDelay(final Runnable command, final long initialDelay, final long delay, final TimeUnit unit) { Objects.requireNonNull(command); - final CURunnable wrapper = new CURunnable(command); + final CURunnable wrapper = new CURunnable(command, contextService); final ScheduledFuture future = delegate.scheduleWithFixedDelay(wrapper, initialDelay, delay, unit); wrapper.taskSubmitted(future, this, command); - return new CUScheduleFuture<>(ScheduledFuture.class.cast(future), wrapper); + return new CUScheduledFuture<>(ScheduledFuture.class.cast(future), wrapper); } public static long nowMs() { @@ -118,19 +122,27 @@ public static long nowMs() { } private static String getTaskId(final Object runnable) { - if (ManagedTask.class.isInstance(runnable)) { - return ManagedTask.class.cast(runnable).getExecutionProperties().get(ManagedTask.IDENTITY_NAME); + if (runnable instanceof ManagedTask managedTask) { + Map executionProps = managedTask.getExecutionProperties(); + if (executionProps != null) { + return executionProps.get(ManagedTask.IDENTITY_NAME); + } } + return null; } - private static final class ScheduledFutureFacade implements InvocationHandler { - private final AtomicReference> delegate; - - private ScheduledFutureFacade(final AtomicReference> delegate) { - this.delegate = delegate; - } + @Override + public ScheduledExecutorService getDelegate() { + return delegate; + } + /** + * Automatically resolves an AtomicReference + * @param delegate + * @param + */ + private record TriggerBasedScheduledFutureFacade(AtomicReference> delegate) implements InvocationHandler { @Override public Object invoke(final Object proxy, final Method method, final Object[] args) throws Throwable { try { @@ -139,9 +151,5 @@ public Object invoke(final Object proxy, final Method method, final Object[] arg throw ite.getCause(); } } - - private static ScheduledFuture newProxy(final AtomicReference> futureHandle) { - return ScheduledFuture.class.cast(Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(), new Class[]{ScheduledFuture.class}, new ScheduledFutureFacade(futureHandle))); - } } } diff --git a/container/openejb-core/src/main/java/org/apache/openejb/threads/impl/ManagedThreadFactoryImpl.java b/container/openejb-core/src/main/java/org/apache/openejb/threads/impl/ManagedThreadFactoryImpl.java index edb4ec25cb4..4524e0b7bee 100644 --- a/container/openejb-core/src/main/java/org/apache/openejb/threads/impl/ManagedThreadFactoryImpl.java +++ b/container/openejb-core/src/main/java/org/apache/openejb/threads/impl/ManagedThreadFactoryImpl.java @@ -25,31 +25,41 @@ import java.util.concurrent.atomic.AtomicInteger; public class ManagedThreadFactoryImpl implements ManagedThreadFactory { + public static final String DEFAULT_PREFIX = "managed-thread-"; private static final AtomicInteger ID = new AtomicInteger(); + private final ContextServiceImpl contextService; private final String prefix; + private final Integer priority; + // Invoked by ThreadFactories.findThreadFactory via reflection + @SuppressWarnings("unused") public ManagedThreadFactoryImpl() { - this.prefix = "managed-thread-"; + this(DEFAULT_PREFIX, Thread.NORM_PRIORITY, ContextServiceImplFactory.getOrCreateDefaultSingleton()); } - public ManagedThreadFactoryImpl(final String prefix) { + public ManagedThreadFactoryImpl(final String prefix, final Integer priority, final ContextServiceImpl contextService) { this.prefix = prefix; + this.priority = priority; + this.contextService = contextService; } @Override public Thread newThread(final Runnable r) { - final CURunnable wrapper = new CURunnable(r); + final CURunnable wrapper = new CURunnable(r, contextService); final Thread thread = new ManagedThread(wrapper); thread.setDaemon(true); thread.setName(prefix + ID.incrementAndGet()); thread.setContextClassLoader(ManagedThreadFactoryImpl.class.getClassLoader()); // ensure we use container loader as main context classloader to avoid leaks + if (priority != null) { + thread.setPriority(priority); + } return thread; } @Override public ForkJoinWorkerThread newThread(final ForkJoinPool pool) { - return new ManagedForkJoinWorkerThread(pool); + return new ManagedForkJoinWorkerThread(pool, priority, contextService); } public static class ManagedThread extends Thread implements ManageableThread { @@ -59,20 +69,44 @@ public ManagedThread(final Runnable r) { @Override public boolean isShutdown() { - return !isAlive(); + return getState() == State.TERMINATED; } } public static class ManagedForkJoinWorkerThread extends ForkJoinWorkerThread { + private final ContextServiceImpl contextService; + private final Integer priority; + + private final ContextServiceImpl.Snapshot snapshot; + + private ContextServiceImpl.State state; + private Integer initialPriority; - /** - * Creates a ForkJoinWorkerThread operating in the given pool. - * - * @param pool the pool this thread works in - * @throws NullPointerException if pool is null - */ - protected ManagedForkJoinWorkerThread(ForkJoinPool pool) { + protected ManagedForkJoinWorkerThread(final ForkJoinPool pool, final Integer priority, final ContextServiceImpl contextService) { super(pool); + this.priority = priority; + this.contextService = contextService; + + this.snapshot = contextService.snapshot(null); + } + + @Override + protected void onStart() { + super.onStart(); + initialPriority = getPriority(); + if (priority != null) { + setPriority(priority); + } + + contextService.enter(snapshot); + } + + @Override + protected void onTermination(Throwable exception) { + setPriority(initialPriority); + contextService.exit(state); + + super.onTermination(exception); } } } diff --git a/container/openejb-core/src/main/java/org/apache/openejb/threads/impl/SecurityThreadContextProvider.java b/container/openejb-core/src/main/java/org/apache/openejb/threads/impl/SecurityThreadContextProvider.java index 73105b04901..890ff68e374 100755 --- a/container/openejb-core/src/main/java/org/apache/openejb/threads/impl/SecurityThreadContextProvider.java +++ b/container/openejb-core/src/main/java/org/apache/openejb/threads/impl/SecurityThreadContextProvider.java @@ -28,9 +28,11 @@ import org.apache.openejb.spi.SecurityService; import javax.security.auth.login.LoginException; +import java.io.Serializable; import java.util.Map; -public class SecurityThreadContextProvider implements ThreadContextProvider { +public class SecurityThreadContextProvider implements ThreadContextProvider, Serializable { + public static final SecurityThreadContextProvider INSTANCE = new SecurityThreadContextProvider(); private static final SecurityService SECURITY_SERVICE = SystemInstance.get().getComponent(SecurityService.class); @@ -80,7 +82,7 @@ public String getThreadContextType() { return ContextServiceDefinition.SECURITY; } - public class SecurityThreadContextSnapshot implements ThreadContextSnapshot { + public static class SecurityThreadContextSnapshot implements ThreadContextSnapshot, Serializable { private final boolean associate; private final Object securityServiceState; @@ -124,7 +126,7 @@ public ThreadContextRestorer begin() { } } - public class SecurityThreadContextRestorer implements ThreadContextRestorer { + public static class SecurityThreadContextRestorer implements ThreadContextRestorer { private final boolean associate; private final ThreadContext oldCtx; diff --git a/container/openejb-core/src/main/java/org/apache/openejb/threads/impl/ThreadContextProviderUtil.java b/container/openejb-core/src/main/java/org/apache/openejb/threads/impl/ThreadContextProviderUtil.java new file mode 100644 index 00000000000..f9e985c9cf7 --- /dev/null +++ b/container/openejb-core/src/main/java/org/apache/openejb/threads/impl/ThreadContextProviderUtil.java @@ -0,0 +1,39 @@ +/* + * 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.openejb.threads.impl; + +import jakarta.enterprise.concurrent.spi.ThreadContextRestorer; +import jakarta.enterprise.concurrent.spi.ThreadContextSnapshot; + +import java.io.Serializable; + +public class ThreadContextProviderUtil { + public static final ThreadContextSnapshot NOOP_SNAPSHOT = new NoOpThreadContextSnapshot(); + public static final ThreadContextRestorer NOOP_RESTORER = new NoOpThreadContextRestorer(); + + public static class NoOpThreadContextSnapshot implements ThreadContextSnapshot, Serializable { + @Override + public ThreadContextRestorer begin() { + return NOOP_RESTORER; + } + } + + public static class NoOpThreadContextRestorer implements ThreadContextRestorer { + @Override + public void endContext() throws IllegalStateException {} + } +} diff --git a/container/openejb-core/src/main/java/org/apache/openejb/threads/impl/TxThreadContextProvider.java b/container/openejb-core/src/main/java/org/apache/openejb/threads/impl/TxThreadContextProvider.java index a6eccdf0d12..09153c825c9 100755 --- a/container/openejb-core/src/main/java/org/apache/openejb/threads/impl/TxThreadContextProvider.java +++ b/container/openejb-core/src/main/java/org/apache/openejb/threads/impl/TxThreadContextProvider.java @@ -20,18 +20,31 @@ import jakarta.enterprise.concurrent.spi.ThreadContextProvider; import jakarta.enterprise.concurrent.spi.ThreadContextRestorer; import jakarta.enterprise.concurrent.spi.ThreadContextSnapshot; +import jakarta.transaction.InvalidTransactionException; +import jakarta.transaction.SystemException; +import jakarta.transaction.Transaction; +import jakarta.transaction.TransactionManager; +import org.apache.openejb.OpenEJB; +import org.apache.openejb.OpenEJBRuntimeException; +import java.io.Serializable; import java.util.Map; -public class TxThreadContextProvider implements ThreadContextProvider { +public class TxThreadContextProvider implements ThreadContextProvider, Serializable { + public static final TxThreadContextProvider INSTANCE = new TxThreadContextProvider(); + @Override public ThreadContextSnapshot currentContext(final Map props) { - return new TxThreadContextSnapshot(); + try { + return new TxThreadContextRestoringSnapshot(OpenEJB.getTransactionManager().getTransaction()); + } catch (SystemException e) { + throw new OpenEJBRuntimeException(e); + } } @Override public ThreadContextSnapshot clearedContext(final Map props) { - return new TxThreadContextSnapshot(); + return TxThreadContextClearingSnapshot.INSTANCE; } @Override @@ -39,25 +52,60 @@ public String getThreadContextType() { return ContextServiceDefinition.TRANSACTION; } - public class TxThreadContextSnapshot implements ThreadContextSnapshot { + // Basically TxThreadContextSnapshot but being serializable because it does not store a non-serializable transaction + public static class TxThreadContextClearingSnapshot implements ThreadContextSnapshot, Serializable { + public static final TxThreadContextClearingSnapshot INSTANCE = new TxThreadContextClearingSnapshot(); + @Override + public ThreadContextRestorer begin() { + try { + TransactionManager tm = OpenEJB.getTransactionManager(); + if (tm != null) { + return new TxThreadContextRestorer(tm.suspend()); + } - public TxThreadContextSnapshot() { + return ThreadContextProviderUtil.NOOP_RESTORER; + } catch (SystemException e) { + throw new OpenEJBRuntimeException(e); + } + } + } + + public static class TxThreadContextRestoringSnapshot implements ThreadContextSnapshot { + private final Transaction transaction; + + public TxThreadContextRestoringSnapshot(Transaction transaction) { + this.transaction = transaction; } @Override public ThreadContextRestorer begin() { - return new TxThreadContextRestorer(); + TransactionManager transactionManager = OpenEJB.getTransactionManager(); + + try { + Transaction oldTransaction = transactionManager.suspend(); + transactionManager.resume(transaction); + return new TxThreadContextRestorer(oldTransaction); + } catch (SystemException | InvalidTransactionException e) { + throw new OpenEJBRuntimeException(e); + } } } - public class TxThreadContextRestorer implements ThreadContextRestorer { + public static class TxThreadContextRestorer implements ThreadContextRestorer { + private final Transaction transaction; - public TxThreadContextRestorer() { + public TxThreadContextRestorer(Transaction transaction) { + this.transaction = transaction; } @Override public void endContext() throws IllegalStateException { + try { + OpenEJB.getTransactionManager().resume(transaction); + } catch (SystemException | InvalidTransactionException e) { + throw new OpenEJBRuntimeException(e); + } } } } diff --git a/container/openejb-core/src/main/java/org/apache/openejb/threads/task/CUTask.java b/container/openejb-core/src/main/java/org/apache/openejb/threads/task/CUTask.java index da4b0ba9639..c73813a262f 100644 --- a/container/openejb-core/src/main/java/org/apache/openejb/threads/task/CUTask.java +++ b/container/openejb-core/src/main/java/org/apache/openejb/threads/task/CUTask.java @@ -21,11 +21,13 @@ import org.apache.openejb.util.LogCategory; import org.apache.openejb.util.Logger; +import java.io.Serializable; import java.util.ArrayList; import java.util.Collection; +import java.util.Map; import java.util.concurrent.Callable; -public abstract class CUTask extends ManagedTaskListenerTask implements Comparable { +public abstract class CUTask extends ManagedTaskListenerTask implements Comparable, Serializable { // only updated in container startup phase, no concurrency possible, don't use it at runtime! private static volatile ContainerListener[] CONTAINER_LISTENERS = new ContainerListener[0]; @@ -39,16 +41,20 @@ public static void addContainerListener(final ContainerListener cl) { CONTAINER_LISTENERS = array; } - private final ContextServiceImpl contextService; + protected final ContextServiceImpl contextService; private final ContextServiceImpl.Snapshot snapshot; private final Object[] containerListenerStates; private final Context initialContext; public CUTask(final Object task, final ContextServiceImpl contextService) { + this(task, contextService, null); + } + + public CUTask(final Object task, final ContextServiceImpl contextService, Map props) { super(task); this.contextService = contextService; - snapshot = contextService.snapshot(null); + snapshot = contextService.snapshot(props); initialContext = new Context(); if (CONTAINER_LISTENERS.length > 0) { containerListenerStates = new Object[CONTAINER_LISTENERS.length]; @@ -118,7 +124,7 @@ private T rethrow(final Throwable t) throws Exception { * this is really just something that the TomEERealm can push exit tasks to the currently * running Context. */ - public static final class Context { + public static final class Context implements Serializable { public static final ThreadLocal CURRENT = new ThreadLocal<>(); private Context previous = null; @@ -171,7 +177,7 @@ public int compareTo(final Object o) { return Comparable.class.isInstance(delegate) ? Comparable.class.cast(delegate).compareTo(o) : -1; } - public interface ContainerListener { + public interface ContainerListener extends Serializable { T onCreation(); T onStart(T state); void onEnd(T oldState); diff --git a/container/openejb-core/src/main/java/org/apache/openejb/threads/task/ManagedTaskListenerTask.java b/container/openejb-core/src/main/java/org/apache/openejb/threads/task/ManagedTaskListenerTask.java index e0be795dd7e..7288ad031ed 100644 --- a/container/openejb-core/src/main/java/org/apache/openejb/threads/task/ManagedTaskListenerTask.java +++ b/container/openejb-core/src/main/java/org/apache/openejb/threads/task/ManagedTaskListenerTask.java @@ -19,14 +19,16 @@ import jakarta.enterprise.concurrent.ManagedExecutorService; import jakarta.enterprise.concurrent.ManagedTask; import jakarta.enterprise.concurrent.ManagedTaskListener; + +import java.io.Serializable; import java.util.concurrent.Future; -public abstract class ManagedTaskListenerTask implements ManagedTaskListener { +public abstract class ManagedTaskListenerTask implements ManagedTaskListener, Serializable { private final ManagedTaskListener listener; protected Future future; protected final Object delegate; - protected ManagedExecutorService executor; + protected transient ManagedExecutorService executor; protected ManagedTaskListenerTask(final Object task) { if (ManagedTask.class.isInstance(task)) { @@ -77,7 +79,7 @@ public Object getDelegate() { return delegate; } - private static class NoopManagedTaskListener implements ManagedTaskListener { + private static class NoopManagedTaskListener implements ManagedTaskListener, Serializable { private static final NoopManagedTaskListener INSTANCE = new NoopManagedTaskListener(); @Override diff --git a/container/openejb-core/src/main/java/org/apache/openejb/threads/task/TriggerCallable.java b/container/openejb-core/src/main/java/org/apache/openejb/threads/task/TriggerCallable.java index cf647dbc15a..f600d35378d 100644 --- a/container/openejb-core/src/main/java/org/apache/openejb/threads/task/TriggerCallable.java +++ b/container/openejb-core/src/main/java/org/apache/openejb/threads/task/TriggerCallable.java @@ -39,7 +39,7 @@ public TriggerCallable(final ManagedScheduledExecutorServiceImpl es, @Override public V call() throws Exception { - return invoke(); + return invokeExecute(); } @Override diff --git a/container/openejb-core/src/main/java/org/apache/openejb/threads/task/TriggerRunnable.java b/container/openejb-core/src/main/java/org/apache/openejb/threads/task/TriggerRunnable.java index 62d91ff42a2..8fc24ae814a 100644 --- a/container/openejb-core/src/main/java/org/apache/openejb/threads/task/TriggerRunnable.java +++ b/container/openejb-core/src/main/java/org/apache/openejb/threads/task/TriggerRunnable.java @@ -46,7 +46,7 @@ protected Void doInvoke() { @Override public void run() { try { - invoke(); + invokeExecute(); } catch (final RuntimeException re) { throw re; } catch (final Exception e) { diff --git a/container/openejb-core/src/main/java/org/apache/openejb/threads/task/TriggerTask.java b/container/openejb-core/src/main/java/org/apache/openejb/threads/task/TriggerTask.java index be0afb5f17b..ff092738206 100644 --- a/container/openejb-core/src/main/java/org/apache/openejb/threads/task/TriggerTask.java +++ b/container/openejb-core/src/main/java/org/apache/openejb/threads/task/TriggerTask.java @@ -16,86 +16,101 @@ */ package org.apache.openejb.threads.task; -import org.apache.openejb.threads.impl.ContextServiceImpl; -import org.apache.openejb.threads.impl.ManagedScheduledExecutorServiceImpl; - import jakarta.enterprise.concurrent.LastExecution; import jakarta.enterprise.concurrent.SkippedException; import jakarta.enterprise.concurrent.Trigger; +import org.apache.openejb.threads.impl.ContextServiceImpl; +import org.apache.openejb.threads.impl.ManagedScheduledExecutorServiceImpl; import java.time.ZoneId; import java.time.ZonedDateTime; import java.util.Date; -import java.util.concurrent.Callable; import java.util.concurrent.Future; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicReference; public abstract class TriggerTask extends CUTask { protected final ManagedScheduledExecutorServiceImpl executorService; protected final Trigger trigger; - protected final Date scheduledTime; + protected final Date initiallyScheduled; protected final String id; protected final AtomicReference> futureRef; - protected LastExecution lastExecution; + protected volatile LastExecution lastExecution; protected volatile boolean skipped; - protected volatile boolean done; + protected volatile boolean cancelled; - private final AtomicBoolean running = new AtomicBoolean(true); private volatile T result; + private volatile Date nextRun; protected TriggerTask(final Object original, final ContextServiceImpl contextService, final ManagedScheduledExecutorServiceImpl es, final Trigger trigger, final Date taskScheduledTime, final String id, final AtomicReference> ref) { super(original, contextService); this.executorService = es; this.trigger = trigger; - this.scheduledTime = taskScheduledTime; + this.initiallyScheduled = taskScheduledTime; this.id = id; this.futureRef = ref; } - public T invoke() throws Exception { - return invoke(new Callable() { - @Override - public T call() throws Exception { - final long wait = nextDelay(trigger.getNextRunTime(lastExecution, scheduledTime)); - if (wait > 0) { - Thread.sleep(wait); - } // else if wait < 0 then ?? - - final Date now = new Date(); - try { - final boolean skip = trigger.skipRun(lastExecution, now); - if (!skip) { - result = doInvoke(); - taskDone(future, executor, delegate, null); - lastExecution = new LastExecutionImpl(id, result, scheduledTime, now, new Date()); - } else { - result = null; - skipped = true; - running.set(false); - } - } catch (final RuntimeException re) { - final SkippedException skippedException = new SkippedException(re); - taskAborted(skippedException); - throw skippedException; - } - - final ScheduledFuture future = executorService.schedule(this, trigger.getNextRunTime(lastExecution, scheduledTime).getTime() - ManagedScheduledExecutorServiceImpl.nowMs(), TimeUnit.MILLISECONDS); - futureRef.set(future); - taskSubmitted(future, executorService, delegate); - - return result; + public void scheduleNextRun() { + synchronized (this) { + if (cancelled) { + return; + } + + this.nextRun = trigger.getNextRunTime(lastExecution, initiallyScheduled); + if (nextRun == null) { + done = true; + return; + } + + final ScheduledFuture future = executorService.getDelegate().schedule(this::invokeExecute, millisUntilNextRun(), TimeUnit.MILLISECONDS); + + futureRef.set(future); + taskSubmitted(future, executorService, delegate); + } + } + + private T execute() throws Exception { + final long wait = millisUntilNextRun(); + if (wait > 0) { + Thread.sleep(wait); + } + + final ZonedDateTime runStart = ZonedDateTime.now(); + try { + skipped = trigger.skipRun(lastExecution, initiallyScheduled); + if (!skipped) { + result = doInvoke(); + taskDone(future, executor, delegate, null); + lastExecution = new LastExecutionImpl(id, result, nextRun, runStart, ZonedDateTime.now()); + } else { + result = null; + lastExecution = new LastExecutionImpl(id, result, nextRun, null, null); } - }); + } catch (final RuntimeException re) { + final SkippedException skippedException = new SkippedException(re); + taskAborted(skippedException); + throw skippedException; + } + + scheduleNextRun(); + return result; + } + + public T invokeExecute() throws Exception { + return invoke(this::execute); } - protected long nextDelay(final Date next) { - return next.getTime() - ManagedScheduledExecutorServiceImpl.nowMs(); + protected long millisUntilNextRun() { + if (nextRun == null) { + return 0; + } + + return nextRun.getTime() - ManagedScheduledExecutorServiceImpl.nowMs(); } protected abstract T doInvoke() throws Exception; @@ -104,10 +119,6 @@ public String getId() { return id; } - public void stop() { - running.set(false); - } - public boolean isDone() { return done; } @@ -124,18 +135,26 @@ public LastExecution getLastExecution() { return lastExecution; } + public void cancelScheduling() { + synchronized (this) { + this.cancelled = true; + this.done = true; + } + } + private static class LastExecutionImpl implements LastExecution { private final String identityName; private final Object result; - private final Date scheduledStart; - private final Date runStart; - private final Date runEnd; - public LastExecutionImpl(final String identityName, final Object result, final Date scheduledStart, - final Date runStart, final Date runEnd) { + private final ZonedDateTime scheduledStart; + private final ZonedDateTime runStart; + private final ZonedDateTime runEnd; + + public LastExecutionImpl(final String identityName, final Object result, + final Date scheduledStart, final ZonedDateTime runStart, final ZonedDateTime runEnd) { this.identityName = identityName; this.result = result; - this.scheduledStart = scheduledStart; + this.scheduledStart = scheduledStart.toInstant().atZone(ZoneId.systemDefault()); this.runStart = runStart; this.runEnd = runEnd; } @@ -150,40 +169,33 @@ public Object getResult() { return result; } - @Override - public Date getScheduledStart() { - return scheduledStart; - } - @Override public ZonedDateTime getScheduledStart(final ZoneId zone) { - return getScheduledStart().toInstant().atZone(zone); - } - - @Override - public Date getRunStart() { - return runStart; + return scheduledStart.withZoneSameInstant(zone); } @Override public ZonedDateTime getRunStart(final ZoneId zone) { - return getRunStart().toInstant().atZone(zone); - } + if (runStart == null) { + return null; + } - @Override - public Date getRunEnd() { - return runEnd; + return runStart.withZoneSameInstant(zone); } @Override public ZonedDateTime getRunEnd(final ZoneId zone) { - return getRunEnd().toInstant().atZone(zone); + if (runEnd == null) { + return null; + } + + return runEnd.withZoneSameInstant(zone); } @Override public String toString() { return "LastExecutionImpl{" + - (identityName != null ? "identityName='" + identityName + "\', " : "") + + (identityName != null ? "identityName='" + identityName + "', " : "") + "result=" + result + ", scheduledStart=" + scheduledStart + ", runStart=" + runStart + diff --git a/container/openejb-core/src/main/resources/META-INF/org.apache.openejb/service-jar.xml b/container/openejb-core/src/main/resources/META-INF/org.apache.openejb/service-jar.xml index 241f9573013..b39b9bf4260 100644 --- a/container/openejb-core/src/main/resources/META-INF/org.apache.openejb/service-jar.xml +++ b/container/openejb-core/src/main/resources/META-INF/org.apache.openejb/service-jar.xml @@ -797,6 +797,9 @@ class-name="org.apache.openejb.threads.impl.ContextServiceImplFactory" factory-name="create"> SkipImplicitAttributes = true + Propagated = Remaining + Cleared = Transaction + Unchanged Prefix = openejb-managed-thread- + Priority = 5 + Context = [automatic] Lazy = true SkipImplicitAttributes = true diff --git a/container/openejb-jee-accessors/src/main/java/org/apache/openejb/jee/Adapters.java b/container/openejb-jee-accessors/src/main/java/org/apache/openejb/jee/Adapters.java index 6faf92789e5..744869d0119 100644 --- a/container/openejb-jee-accessors/src/main/java/org/apache/openejb/jee/Adapters.java +++ b/container/openejb-jee-accessors/src/main/java/org/apache/openejb/jee/Adapters.java @@ -22,11 +22,11 @@ public class Adapters { public static final CollapsedStringAdapter collapsedStringAdapterAdapter = new CollapsedStringAdapter(); + public static final TrimStringAdapter trimStringAdapterAdapter = new TrimStringAdapter(); public static final StringAdapter stringAdapterAdapter = new StringAdapter(); public static final HandlerChainsStringQNameAdapter handlerChainsStringQNameAdapterAdapter = new HandlerChainsStringQNameAdapter(); public static final TimeUnitAdapter timeUnitAdapterAdapter = new TimeUnitAdapter(); public static final BooleanAdapter booleanAdapterAdapter = new BooleanAdapter(); - public static final TrimStringAdapter trimStringAdapterAdapter = new TrimStringAdapter(); public static final LoadOnStartupAdapter loadOnStartupAdapterAdapter = new LoadOnStartupAdapter(); } diff --git a/container/openejb-jee-accessors/src/main/java/org/apache/openejb/jee/Application$JAXB.java b/container/openejb-jee-accessors/src/main/java/org/apache/openejb/jee/Application$JAXB.java index bd5e27321f1..71fcc2610c7 100644 --- a/container/openejb-jee-accessors/src/main/java/org/apache/openejb/jee/Application$JAXB.java +++ b/container/openejb-jee-accessors/src/main/java/org/apache/openejb/jee/Application$JAXB.java @@ -46,6 +46,12 @@ import static org.apache.openejb.jee.JMSConnectionFactory$JAXB.writeJMSConnectionFactory; import static org.apache.openejb.jee.JMSDestination$JAXB.readJMSDestination; import static org.apache.openejb.jee.JMSDestination$JAXB.writeJMSDestination; +import static org.apache.openejb.jee.ManagedExecutor$JAXB.readManagedExecutor; +import static org.apache.openejb.jee.ManagedExecutor$JAXB.writeManagedExecutor; +import static org.apache.openejb.jee.ManagedScheduledExecutor$JAXB.readManagedScheduledExecutor; +import static org.apache.openejb.jee.ManagedScheduledExecutor$JAXB.writeManagedScheduledExecutor; +import static org.apache.openejb.jee.ManagedThreadFactory$JAXB.readManagedThreadFactory; +import static org.apache.openejb.jee.ManagedThreadFactory$JAXB.writeManagedThreadFactory; import static org.apache.openejb.jee.MessageDestination$JAXB.readMessageDestination; import static org.apache.openejb.jee.MessageDestination$JAXB.writeMessageDestination; import static org.apache.openejb.jee.MessageDestinationRef$JAXB.readMessageDestinationRef; @@ -76,7 +82,7 @@ public class Application$JAXB public Application$JAXB() { - super(Application.class, new QName("http://java.sun.com/xml/ns/javaee".intern(), "application".intern()), new QName("http://java.sun.com/xml/ns/javaee".intern(), "applicationType".intern()), Text$JAXB.class, Icon$JAXB.class, Module$JAXB.class, SecurityRole$JAXB.class, EnvEntry$JAXB.class, EjbRef$JAXB.class, EjbLocalRef$JAXB.class, ServiceRef$JAXB.class, ResourceRef$JAXB.class, ResourceEnvRef$JAXB.class, MessageDestinationRef$JAXB.class, PersistenceContextRef$JAXB.class, PersistenceUnitRef$JAXB.class, MessageDestination$JAXB.class, DataSource$JAXB.class, JMSConnectionFactory$JAXB.class, JMSDestination$JAXB.class, ContextService$JAXB.class); + super(Application.class, new QName("http://java.sun.com/xml/ns/javaee".intern(), "application".intern()), new QName("http://java.sun.com/xml/ns/javaee".intern(), "applicationType".intern()), Text$JAXB.class, Icon$JAXB.class, Module$JAXB.class, SecurityRole$JAXB.class, EnvEntry$JAXB.class, EjbRef$JAXB.class, EjbLocalRef$JAXB.class, ServiceRef$JAXB.class, ResourceRef$JAXB.class, ResourceEnvRef$JAXB.class, MessageDestinationRef$JAXB.class, PersistenceContextRef$JAXB.class, PersistenceUnitRef$JAXB.class, MessageDestination$JAXB.class, DataSource$JAXB.class, JMSConnectionFactory$JAXB.class, JMSDestination$JAXB.class, ContextService$JAXB.class, ManagedExecutor$JAXB.class, ManagedScheduledExecutor$JAXB.class, ManagedThreadFactory$JAXB.class); } public static Application readApplication(XoXMLStreamReader reader, RuntimeContext context) @@ -132,6 +138,9 @@ public static final Application _read(XoXMLStreamReader reader, RuntimeContext c KeyedCollection jmsConnectionFactories = null; KeyedCollection jmsDestinations = null; KeyedCollection contextService = null; + KeyedCollection managedExecutor = null; + KeyedCollection managedScheduledExecutor = null; + KeyedCollection managedThreadFactory = null; // Check xsi:type QName xsiType = reader.getXsiType(); @@ -406,8 +415,44 @@ public static final Application _read(XoXMLStreamReader reader, RuntimeContext c } } contextService.add(contextServiceItem); + } else if (("managed-executor" == elementReader.getLocalName())&&("http://java.sun.com/xml/ns/javaee" == elementReader.getNamespaceURI())) { + // ELEMENT: managedExecutor + ManagedExecutor managedExecutorItem = readManagedExecutor(elementReader, context); + if (managedExecutor == null) { + managedExecutor = application.managedExecutor; + if (managedExecutor!= null) { + managedExecutor.clear(); + } else { + managedExecutor = new KeyedCollection<>(); + } + } + managedExecutor.add(managedExecutorItem); + } else if (("managed-scheduled-executor" == elementReader.getLocalName())&&("http://java.sun.com/xml/ns/javaee" == elementReader.getNamespaceURI())) { + // ELEMENT: managedScheduledExecutor + ManagedScheduledExecutor managedScheduledExecutorItem = readManagedScheduledExecutor(elementReader, context); + if (managedScheduledExecutor == null) { + managedScheduledExecutor = application.managedScheduledExecutor; + if (managedScheduledExecutor!= null) { + managedScheduledExecutor.clear(); + } else { + managedScheduledExecutor = new KeyedCollection<>(); + } + } + managedScheduledExecutor.add(managedScheduledExecutorItem); + } else if (("managed-thread-factory" == elementReader.getLocalName())&&("http://java.sun.com/xml/ns/javaee" == elementReader.getNamespaceURI())) { + // ELEMENT: managedThreadFactory + ManagedThreadFactory managedThreadFactoryItem = readManagedThreadFactory(elementReader, context); + if (managedThreadFactory == null) { + managedThreadFactory = application.managedThreadFactory; + if (managedThreadFactory!= null) { + managedThreadFactory.clear(); + } else { + managedThreadFactory = new KeyedCollection<>(); + } + } + managedThreadFactory.add(managedThreadFactoryItem); } else { - context.unexpectedElement(elementReader, new QName("http://java.sun.com/xml/ns/javaee", "application-name"), new QName("http://java.sun.com/xml/ns/javaee", "description"), new QName("http://java.sun.com/xml/ns/javaee", "display-name"), new QName("http://java.sun.com/xml/ns/javaee", "icon"), new QName("http://java.sun.com/xml/ns/javaee", "initialize-in-order"), new QName("http://java.sun.com/xml/ns/javaee", "module"), new QName("http://java.sun.com/xml/ns/javaee", "security-role"), new QName("http://java.sun.com/xml/ns/javaee", "library-directory"), new QName("http://java.sun.com/xml/ns/javaee", "env-entry"), new QName("http://java.sun.com/xml/ns/javaee", "ejb-ref"), new QName("http://java.sun.com/xml/ns/javaee", "ejb-local-ref"), new QName("http://java.sun.com/xml/ns/javaee", "service-ref"), new QName("http://java.sun.com/xml/ns/javaee", "resource-ref"), new QName("http://java.sun.com/xml/ns/javaee", "resource-env-ref"), new QName("http://java.sun.com/xml/ns/javaee", "message-destination-ref"), new QName("http://java.sun.com/xml/ns/javaee", "persistence-context-ref"), new QName("http://java.sun.com/xml/ns/javaee", "persistence-unit-ref"), new QName("http://java.sun.com/xml/ns/javaee", "message-destination"), new QName("http://java.sun.com/xml/ns/javaee", "data-source"), new QName("http://java.sun.com/xml/ns/javaee", "jms-connection-factory"), new QName("http://java.sun.com/xml/ns/javaee", "jms-destination"), new QName("http://java.sun.com/xml/ns/javaee", "context-service")); + context.unexpectedElement(elementReader, new QName("http://java.sun.com/xml/ns/javaee", "application-name"), new QName("http://java.sun.com/xml/ns/javaee", "description"), new QName("http://java.sun.com/xml/ns/javaee", "display-name"), new QName("http://java.sun.com/xml/ns/javaee", "icon"), new QName("http://java.sun.com/xml/ns/javaee", "initialize-in-order"), new QName("http://java.sun.com/xml/ns/javaee", "module"), new QName("http://java.sun.com/xml/ns/javaee", "security-role"), new QName("http://java.sun.com/xml/ns/javaee", "library-directory"), new QName("http://java.sun.com/xml/ns/javaee", "env-entry"), new QName("http://java.sun.com/xml/ns/javaee", "ejb-ref"), new QName("http://java.sun.com/xml/ns/javaee", "ejb-local-ref"), new QName("http://java.sun.com/xml/ns/javaee", "service-ref"), new QName("http://java.sun.com/xml/ns/javaee", "resource-ref"), new QName("http://java.sun.com/xml/ns/javaee", "resource-env-ref"), new QName("http://java.sun.com/xml/ns/javaee", "message-destination-ref"), new QName("http://java.sun.com/xml/ns/javaee", "persistence-context-ref"), new QName("http://java.sun.com/xml/ns/javaee", "persistence-unit-ref"), new QName("http://java.sun.com/xml/ns/javaee", "message-destination"), new QName("http://java.sun.com/xml/ns/javaee", "data-source"), new QName("http://java.sun.com/xml/ns/javaee", "jms-connection-factory"), new QName("http://java.sun.com/xml/ns/javaee", "jms-destination"), new QName("http://java.sun.com/xml/ns/javaee", "context-service"), new QName("http://java.sun.com/xml/ns/javaee", "managed-executor"), new QName("http://java.sun.com/xml/ns/javaee", "managed-scheduled-executor"), new QName("http://java.sun.com/xml/ns/javaee", "managed-thread-factory")); } } if (descriptions!= null) { @@ -475,6 +520,15 @@ public static final Application _read(XoXMLStreamReader reader, RuntimeContext c if (contextService!= null) { application.contextService = contextService; } + if (managedExecutor!= null) { + application.managedExecutor = managedExecutor; + } + if (managedScheduledExecutor!= null) { + application.managedScheduledExecutor = managedScheduledExecutor; + } + if (managedThreadFactory!= null) { + application.managedThreadFactory = managedThreadFactory; + } context.afterUnmarshal(application, LifecycleCallback.NONE); @@ -836,6 +890,42 @@ public static final void _write(XoXMLStreamWriter writer, Application applicatio } } + // ELEMENT: managedExecutor + KeyedCollection managedExecutor = application.managedExecutor; + if (managedExecutor!= null) { + for (ManagedExecutor managedExecutorItem: managedExecutor) { + if (managedExecutorItem!= null) { + writer.writeStartElement(prefix, "managed-executor", "http://java.sun.com/xml/ns/javaee"); + writeManagedExecutor(writer, managedExecutorItem, context); + writer.writeEndElement(); + } + } + } + + // ELEMENT: managedScheduledExecutor + KeyedCollection managedScheduledExecutor = application.managedScheduledExecutor; + if (managedScheduledExecutor!= null) { + for (ManagedScheduledExecutor managedScheduledExecutorItem: managedScheduledExecutor) { + if (managedScheduledExecutorItem!= null) { + writer.writeStartElement(prefix, "managed-scheduled-executor", "http://java.sun.com/xml/ns/javaee"); + writeManagedScheduledExecutor(writer, managedScheduledExecutorItem, context); + writer.writeEndElement(); + } + } + } + + // ELEMENT: managedThreadFactory + KeyedCollection managedThreadFactory = application.managedThreadFactory; + if (managedThreadFactory!= null) { + for (ManagedThreadFactory managedThreadFactoryItem: managedThreadFactory) { + if (managedThreadFactoryItem!= null) { + writer.writeStartElement(prefix, "managed-thread-factory", "http://java.sun.com/xml/ns/javaee"); + writeManagedThreadFactory(writer, managedThreadFactoryItem, context); + writer.writeEndElement(); + } + } + } + context.afterMarshal(application, LifecycleCallback.NONE); } diff --git a/container/openejb-jee-accessors/src/main/java/org/apache/openejb/jee/ApplicationClient$JAXB.java b/container/openejb-jee-accessors/src/main/java/org/apache/openejb/jee/ApplicationClient$JAXB.java index 8df39f4bf2f..e777adaea4d 100644 --- a/container/openejb-jee-accessors/src/main/java/org/apache/openejb/jee/ApplicationClient$JAXB.java +++ b/container/openejb-jee-accessors/src/main/java/org/apache/openejb/jee/ApplicationClient$JAXB.java @@ -47,6 +47,12 @@ import static org.apache.openejb.jee.JMSDestination$JAXB.writeJMSDestination; import static org.apache.openejb.jee.LifecycleCallback$JAXB.readLifecycleCallback; import static org.apache.openejb.jee.LifecycleCallback$JAXB.writeLifecycleCallback; +import static org.apache.openejb.jee.ManagedExecutor$JAXB.readManagedExecutor; +import static org.apache.openejb.jee.ManagedExecutor$JAXB.writeManagedExecutor; +import static org.apache.openejb.jee.ManagedScheduledExecutor$JAXB.readManagedScheduledExecutor; +import static org.apache.openejb.jee.ManagedScheduledExecutor$JAXB.writeManagedScheduledExecutor; +import static org.apache.openejb.jee.ManagedThreadFactory$JAXB.readManagedThreadFactory; +import static org.apache.openejb.jee.ManagedThreadFactory$JAXB.writeManagedThreadFactory; import static org.apache.openejb.jee.MessageDestination$JAXB.readMessageDestination; import static org.apache.openejb.jee.MessageDestination$JAXB.writeMessageDestination; import static org.apache.openejb.jee.MessageDestinationRef$JAXB.readMessageDestinationRef; @@ -73,7 +79,7 @@ public class ApplicationClient$JAXB public ApplicationClient$JAXB() { - super(ApplicationClient.class, new QName("http://java.sun.com/xml/ns/javaee".intern(), "application-client".intern()), new QName("http://java.sun.com/xml/ns/javaee".intern(), "application-clientType".intern()), Text$JAXB.class, Icon$JAXB.class, EnvEntry$JAXB.class, EjbRef$JAXB.class, EjbLocalRef$JAXB.class, ServiceRef$JAXB.class, ResourceRef$JAXB.class, ResourceEnvRef$JAXB.class, MessageDestinationRef$JAXB.class, PersistenceContextRef$JAXB.class, PersistenceUnitRef$JAXB.class, LifecycleCallback$JAXB.class, MessageDestination$JAXB.class, DataSource$JAXB.class, JMSConnectionFactory$JAXB.class, JMSDestination$JAXB.class, ContextService$JAXB.class); + super(ApplicationClient.class, new QName("http://java.sun.com/xml/ns/javaee".intern(), "application-client".intern()), new QName("http://java.sun.com/xml/ns/javaee".intern(), "application-clientType".intern()), Text$JAXB.class, Icon$JAXB.class, EnvEntry$JAXB.class, EjbRef$JAXB.class, EjbLocalRef$JAXB.class, ServiceRef$JAXB.class, ResourceRef$JAXB.class, ResourceEnvRef$JAXB.class, MessageDestinationRef$JAXB.class, PersistenceContextRef$JAXB.class, PersistenceUnitRef$JAXB.class, LifecycleCallback$JAXB.class, MessageDestination$JAXB.class, DataSource$JAXB.class, JMSConnectionFactory$JAXB.class, JMSDestination$JAXB.class, ContextService$JAXB.class, ManagedExecutor$JAXB.class, ManagedScheduledExecutor$JAXB.class, ManagedThreadFactory$JAXB.class); } public static ApplicationClient readApplicationClient(XoXMLStreamReader reader, RuntimeContext context) @@ -129,6 +135,9 @@ public static final ApplicationClient _read(XoXMLStreamReader reader, RuntimeCon KeyedCollection jmsConnectionFactories = null; KeyedCollection jmsDestinations = null; KeyedCollection contextService = null; + KeyedCollection managedExecutor = null; + KeyedCollection managedScheduledExecutor = null; + KeyedCollection managedThreadFactory = null; // Check xsi:type QName xsiType = reader.getXsiType(); @@ -403,8 +412,44 @@ public static final ApplicationClient _read(XoXMLStreamReader reader, RuntimeCon } } contextService.add(contextServiceItem); + } else if (("managed-executor" == elementReader.getLocalName())&&("http://java.sun.com/xml/ns/javaee" == elementReader.getNamespaceURI())) { + // ELEMENT: managedExecutor + ManagedExecutor managedExecutorItem = readManagedExecutor(elementReader, context); + if (managedExecutor == null) { + managedExecutor = applicationClient.managedExecutor; + if (managedExecutor!= null) { + managedExecutor.clear(); + } else { + managedExecutor = new KeyedCollection<>(); + } + } + managedExecutor.add(managedExecutorItem); + } else if (("managed-scheduled-executor" == elementReader.getLocalName())&&("http://java.sun.com/xml/ns/javaee" == elementReader.getNamespaceURI())) { + // ELEMENT: managedScheduledExecutor + ManagedScheduledExecutor managedScheduledExecutorItem = readManagedScheduledExecutor(elementReader, context); + if (managedScheduledExecutor == null) { + managedScheduledExecutor = applicationClient.managedScheduledExecutor; + if (managedScheduledExecutor!= null) { + managedScheduledExecutor.clear(); + } else { + managedScheduledExecutor = new KeyedCollection<>(); + } + } + managedScheduledExecutor.add(managedScheduledExecutorItem); + } else if (("managed-thread-factory" == elementReader.getLocalName())&&("http://java.sun.com/xml/ns/javaee" == elementReader.getNamespaceURI())) { + // ELEMENT: managedThreadFactory + ManagedThreadFactory managedThreadFactoryItem = readManagedThreadFactory(elementReader, context); + if (managedThreadFactory == null) { + managedThreadFactory = applicationClient.managedThreadFactory; + if (managedThreadFactory!= null) { + managedThreadFactory.clear(); + } else { + managedThreadFactory = new KeyedCollection<>(); + } + } + managedThreadFactory.add(managedThreadFactoryItem); } else { - context.unexpectedElement(elementReader, new QName("http://java.sun.com/xml/ns/javaee", "module-name"), new QName("http://java.sun.com/xml/ns/javaee", "description"), new QName("http://java.sun.com/xml/ns/javaee", "display-name"), new QName("http://java.sun.com/xml/ns/javaee", "icon"), new QName("http://java.sun.com/xml/ns/javaee", "env-entry"), new QName("http://java.sun.com/xml/ns/javaee", "ejb-ref"), new QName("http://java.sun.com/xml/ns/javaee", "ejb-local-ref"), new QName("http://java.sun.com/xml/ns/javaee", "service-ref"), new QName("http://java.sun.com/xml/ns/javaee", "resource-ref"), new QName("http://java.sun.com/xml/ns/javaee", "resource-env-ref"), new QName("http://java.sun.com/xml/ns/javaee", "message-destination-ref"), new QName("http://java.sun.com/xml/ns/javaee", "persistence-context-ref"), new QName("http://java.sun.com/xml/ns/javaee", "persistence-unit-ref"), new QName("http://java.sun.com/xml/ns/javaee", "post-construct"), new QName("http://java.sun.com/xml/ns/javaee", "pre-destroy"), new QName("http://java.sun.com/xml/ns/javaee", "callback-handler"), new QName("http://java.sun.com/xml/ns/javaee", "message-destination"), new QName("http://java.sun.com/xml/ns/javaee", "data-source"), new QName("http://java.sun.com/xml/ns/javaee", "jms-connection-factory"), new QName("http://java.sun.com/xml/ns/javaee", "jms-destination"), new QName("http://java.sun.com/xml/ns/javaee", "context-service")); + context.unexpectedElement(elementReader, new QName("http://java.sun.com/xml/ns/javaee", "module-name"), new QName("http://java.sun.com/xml/ns/javaee", "description"), new QName("http://java.sun.com/xml/ns/javaee", "display-name"), new QName("http://java.sun.com/xml/ns/javaee", "icon"), new QName("http://java.sun.com/xml/ns/javaee", "env-entry"), new QName("http://java.sun.com/xml/ns/javaee", "ejb-ref"), new QName("http://java.sun.com/xml/ns/javaee", "ejb-local-ref"), new QName("http://java.sun.com/xml/ns/javaee", "service-ref"), new QName("http://java.sun.com/xml/ns/javaee", "resource-ref"), new QName("http://java.sun.com/xml/ns/javaee", "resource-env-ref"), new QName("http://java.sun.com/xml/ns/javaee", "message-destination-ref"), new QName("http://java.sun.com/xml/ns/javaee", "persistence-context-ref"), new QName("http://java.sun.com/xml/ns/javaee", "persistence-unit-ref"), new QName("http://java.sun.com/xml/ns/javaee", "post-construct"), new QName("http://java.sun.com/xml/ns/javaee", "pre-destroy"), new QName("http://java.sun.com/xml/ns/javaee", "callback-handler"), new QName("http://java.sun.com/xml/ns/javaee", "message-destination"), new QName("http://java.sun.com/xml/ns/javaee", "data-source"), new QName("http://java.sun.com/xml/ns/javaee", "jms-connection-factory"), new QName("http://java.sun.com/xml/ns/javaee", "jms-destination"), new QName("http://java.sun.com/xml/ns/javaee", "context-service"), new QName("http://java.sun.com/xml/ns/javaee", "managed-executor"), new QName("http://java.sun.com/xml/ns/javaee", "managed-scheduled-executor"), new QName("http://java.sun.com/xml/ns/javaee", "managed-thread-factory")); } } if (descriptions!= null) { @@ -472,6 +517,15 @@ public static final ApplicationClient _read(XoXMLStreamReader reader, RuntimeCon if (contextService!= null) { applicationClient.contextService = contextService; } + if (managedExecutor!= null) { + applicationClient.managedExecutor = managedExecutor; + } + if (managedScheduledExecutor!= null) { + applicationClient.managedScheduledExecutor = managedScheduledExecutor; + } + if (managedThreadFactory!= null) { + applicationClient.managedThreadFactory = managedThreadFactory; + } context.afterUnmarshal(applicationClient, org.metatype.sxc.jaxb.LifecycleCallback.NONE); @@ -835,6 +889,42 @@ public static final void _write(XoXMLStreamWriter writer, ApplicationClient appl } } + // ELEMENT: managedExecutor + KeyedCollection managedExecutor = applicationClient.managedExecutor; + if (managedExecutor!= null) { + for (ManagedExecutor managedExecutorItem: managedExecutor) { + if (managedExecutorItem!= null) { + writer.writeStartElement(prefix, "managed-executor", "http://java.sun.com/xml/ns/javaee"); + writeManagedExecutor(writer, managedExecutorItem, context); + writer.writeEndElement(); + } + } + } + + // ELEMENT: managedScheduledExecutor + KeyedCollection managedScheduledExecutor = applicationClient.managedScheduledExecutor; + if (managedScheduledExecutor!= null) { + for (ManagedScheduledExecutor managedScheduledExecutorItem: managedScheduledExecutor) { + if (managedScheduledExecutorItem!= null) { + writer.writeStartElement(prefix, "managed-scheduled-executor", "http://java.sun.com/xml/ns/javaee"); + writeManagedScheduledExecutor(writer, managedScheduledExecutorItem, context); + writer.writeEndElement(); + } + } + } + + // ELEMENT: managedThreadFactory + KeyedCollection managedThreadFactory = applicationClient.managedThreadFactory; + if (managedThreadFactory!= null) { + for (ManagedThreadFactory managedThreadFactoryItem: managedThreadFactory) { + if (managedThreadFactoryItem!= null) { + writer.writeStartElement(prefix, "managed-thread-factory", "http://java.sun.com/xml/ns/javaee"); + writeManagedThreadFactory(writer, managedThreadFactoryItem, context); + writer.writeEndElement(); + } + } + } + context.afterMarshal(applicationClient, org.metatype.sxc.jaxb.LifecycleCallback.NONE); } diff --git a/container/openejb-jee-accessors/src/main/java/org/apache/openejb/jee/EntityBean$JAXB.java b/container/openejb-jee-accessors/src/main/java/org/apache/openejb/jee/EntityBean$JAXB.java index dbc442137aa..c8b25eac205 100644 --- a/container/openejb-jee-accessors/src/main/java/org/apache/openejb/jee/EntityBean$JAXB.java +++ b/container/openejb-jee-accessors/src/main/java/org/apache/openejb/jee/EntityBean$JAXB.java @@ -51,6 +51,12 @@ import static org.apache.openejb.jee.JMSDestination$JAXB.writeJMSDestination; import static org.apache.openejb.jee.LifecycleCallback$JAXB.readLifecycleCallback; import static org.apache.openejb.jee.LifecycleCallback$JAXB.writeLifecycleCallback; +import static org.apache.openejb.jee.ManagedExecutor$JAXB.readManagedExecutor; +import static org.apache.openejb.jee.ManagedExecutor$JAXB.writeManagedExecutor; +import static org.apache.openejb.jee.ManagedScheduledExecutor$JAXB.readManagedScheduledExecutor; +import static org.apache.openejb.jee.ManagedScheduledExecutor$JAXB.writeManagedScheduledExecutor; +import static org.apache.openejb.jee.ManagedThreadFactory$JAXB.readManagedThreadFactory; +import static org.apache.openejb.jee.ManagedThreadFactory$JAXB.writeManagedThreadFactory; import static org.apache.openejb.jee.MessageDestinationRef$JAXB.readMessageDestinationRef; import static org.apache.openejb.jee.MessageDestinationRef$JAXB.writeMessageDestinationRef; import static org.apache.openejb.jee.PersistenceContextRef$JAXB.readPersistenceContextRef; @@ -83,7 +89,7 @@ public class EntityBean$JAXB public EntityBean$JAXB() { - super(EntityBean.class, null, new QName("http://java.sun.com/xml/ns/javaee".intern(), "entity-beanType".intern()), Text$JAXB.class, Icon$JAXB.class, PersistenceType$JAXB.class, CmpVersion$JAXB.class, CmpField$JAXB.class, EnvEntry$JAXB.class, EjbRef$JAXB.class, EjbLocalRef$JAXB.class, ServiceRef$JAXB.class, ResourceRef$JAXB.class, ResourceEnvRef$JAXB.class, MessageDestinationRef$JAXB.class, PersistenceContextRef$JAXB.class, PersistenceUnitRef$JAXB.class, LifecycleCallback$JAXB.class, DataSource$JAXB.class, JMSConnectionFactory$JAXB.class, JMSDestination$JAXB.class, SecurityRoleRef$JAXB.class, SecurityIdentity$JAXB.class, Query$JAXB.class, ContextService$JAXB.class); + super(EntityBean.class, null, new QName("http://java.sun.com/xml/ns/javaee".intern(), "entity-beanType".intern()), Text$JAXB.class, Icon$JAXB.class, PersistenceType$JAXB.class, CmpVersion$JAXB.class, CmpField$JAXB.class, EnvEntry$JAXB.class, EjbRef$JAXB.class, EjbLocalRef$JAXB.class, ServiceRef$JAXB.class, ResourceRef$JAXB.class, ResourceEnvRef$JAXB.class, MessageDestinationRef$JAXB.class, PersistenceContextRef$JAXB.class, PersistenceUnitRef$JAXB.class, LifecycleCallback$JAXB.class, DataSource$JAXB.class, JMSConnectionFactory$JAXB.class, JMSDestination$JAXB.class, SecurityRoleRef$JAXB.class, SecurityIdentity$JAXB.class, Query$JAXB.class, ContextService$JAXB.class, ManagedExecutor$JAXB.class, ManagedScheduledExecutor$JAXB.class, ManagedThreadFactory$JAXB.class); } public static EntityBean readEntityBean(XoXMLStreamReader reader, RuntimeContext context) @@ -141,6 +147,9 @@ public static final EntityBean _read(XoXMLStreamReader reader, RuntimeContext co List securityRoleRef = null; List query = null; KeyedCollection contextService = null; + KeyedCollection managedExecutor = null; + KeyedCollection managedScheduledExecutor = null; + KeyedCollection managedThreadFactory = null; // Check xsi:type QName xsiType = reader.getXsiType(); @@ -565,8 +574,44 @@ public static final EntityBean _read(XoXMLStreamReader reader, RuntimeContext co } } contextService.add(contextServiceItem); + } else if (("managed-executor" == elementReader.getLocalName())&&("http://java.sun.com/xml/ns/javaee" == elementReader.getNamespaceURI())) { + // ELEMENT: managedExecutor + ManagedExecutor managedExecutorItem = readManagedExecutor(elementReader, context); + if (managedExecutor == null) { + managedExecutor = entityBean.managedExecutor; + if (managedExecutor!= null) { + managedExecutor.clear(); + } else { + managedExecutor = new KeyedCollection<>(); + } + } + managedExecutor.add(managedExecutorItem); + } else if (("managed-scheduled-executor" == elementReader.getLocalName())&&("http://java.sun.com/xml/ns/javaee" == elementReader.getNamespaceURI())) { + // ELEMENT: managedScheduledExecutor + ManagedScheduledExecutor managedScheduledExecutorItem = readManagedScheduledExecutor(elementReader, context); + if (managedScheduledExecutor == null) { + managedScheduledExecutor = entityBean.managedScheduledExecutor; + if (managedScheduledExecutor!= null) { + managedScheduledExecutor.clear(); + } else { + managedScheduledExecutor = new KeyedCollection<>(); + } + } + managedScheduledExecutor.add(managedScheduledExecutorItem); + } else if (("managed-thread-factory" == elementReader.getLocalName())&&("http://java.sun.com/xml/ns/javaee" == elementReader.getNamespaceURI())) { + // ELEMENT: managedThreadFactory + ManagedThreadFactory managedThreadFactoryItem = readManagedThreadFactory(elementReader, context); + if (managedThreadFactory == null) { + managedThreadFactory = entityBean.managedThreadFactory; + if (managedThreadFactory!= null) { + managedThreadFactory.clear(); + } else { + managedThreadFactory = new KeyedCollection<>(); + } + } + managedThreadFactory.add(managedThreadFactoryItem); } else { - context.unexpectedElement(elementReader, new QName("http://java.sun.com/xml/ns/javaee", "description"), new QName("http://java.sun.com/xml/ns/javaee", "display-name"), new QName("http://java.sun.com/xml/ns/javaee", "icon"), new QName("http://java.sun.com/xml/ns/javaee", "ejb-name"), new QName("http://java.sun.com/xml/ns/javaee", "mapped-name"), new QName("http://java.sun.com/xml/ns/javaee", "home"), new QName("http://java.sun.com/xml/ns/javaee", "remote"), new QName("http://java.sun.com/xml/ns/javaee", "local-home"), new QName("http://java.sun.com/xml/ns/javaee", "local"), new QName("http://java.sun.com/xml/ns/javaee", "ejb-class"), new QName("http://java.sun.com/xml/ns/javaee", "persistence-type"), new QName("http://java.sun.com/xml/ns/javaee", "prim-key-class"), new QName("http://java.sun.com/xml/ns/javaee", "reentrant"), new QName("http://java.sun.com/xml/ns/javaee", "cmp-version"), new QName("http://java.sun.com/xml/ns/javaee", "abstract-schema-name"), new QName("http://java.sun.com/xml/ns/javaee", "cmp-field"), new QName("http://java.sun.com/xml/ns/javaee", "primkey-field"), new QName("http://java.sun.com/xml/ns/javaee", "env-entry"), new QName("http://java.sun.com/xml/ns/javaee", "ejb-ref"), new QName("http://java.sun.com/xml/ns/javaee", "ejb-local-ref"), new QName("http://java.sun.com/xml/ns/javaee", "service-ref"), new QName("http://java.sun.com/xml/ns/javaee", "resource-ref"), new QName("http://java.sun.com/xml/ns/javaee", "resource-env-ref"), new QName("http://java.sun.com/xml/ns/javaee", "message-destination-ref"), new QName("http://java.sun.com/xml/ns/javaee", "persistence-context-ref"), new QName("http://java.sun.com/xml/ns/javaee", "persistence-unit-ref"), new QName("http://java.sun.com/xml/ns/javaee", "post-construct"), new QName("http://java.sun.com/xml/ns/javaee", "pre-destroy"), new QName("http://java.sun.com/xml/ns/javaee", "data-source"), new QName("http://java.sun.com/xml/ns/javaee", "jms-connection-factory"), new QName("http://java.sun.com/xml/ns/javaee", "jms-destination"), new QName("http://java.sun.com/xml/ns/javaee", "security-role-ref"), new QName("http://java.sun.com/xml/ns/javaee", "security-identity"), new QName("http://java.sun.com/xml/ns/javaee", "query"), new QName("http://java.sun.com/xml/ns/javaee", "context-service")); + context.unexpectedElement(elementReader, new QName("http://java.sun.com/xml/ns/javaee", "description"), new QName("http://java.sun.com/xml/ns/javaee", "display-name"), new QName("http://java.sun.com/xml/ns/javaee", "icon"), new QName("http://java.sun.com/xml/ns/javaee", "ejb-name"), new QName("http://java.sun.com/xml/ns/javaee", "mapped-name"), new QName("http://java.sun.com/xml/ns/javaee", "home"), new QName("http://java.sun.com/xml/ns/javaee", "remote"), new QName("http://java.sun.com/xml/ns/javaee", "local-home"), new QName("http://java.sun.com/xml/ns/javaee", "local"), new QName("http://java.sun.com/xml/ns/javaee", "ejb-class"), new QName("http://java.sun.com/xml/ns/javaee", "persistence-type"), new QName("http://java.sun.com/xml/ns/javaee", "prim-key-class"), new QName("http://java.sun.com/xml/ns/javaee", "reentrant"), new QName("http://java.sun.com/xml/ns/javaee", "cmp-version"), new QName("http://java.sun.com/xml/ns/javaee", "abstract-schema-name"), new QName("http://java.sun.com/xml/ns/javaee", "cmp-field"), new QName("http://java.sun.com/xml/ns/javaee", "primkey-field"), new QName("http://java.sun.com/xml/ns/javaee", "env-entry"), new QName("http://java.sun.com/xml/ns/javaee", "ejb-ref"), new QName("http://java.sun.com/xml/ns/javaee", "ejb-local-ref"), new QName("http://java.sun.com/xml/ns/javaee", "service-ref"), new QName("http://java.sun.com/xml/ns/javaee", "resource-ref"), new QName("http://java.sun.com/xml/ns/javaee", "resource-env-ref"), new QName("http://java.sun.com/xml/ns/javaee", "message-destination-ref"), new QName("http://java.sun.com/xml/ns/javaee", "persistence-context-ref"), new QName("http://java.sun.com/xml/ns/javaee", "persistence-unit-ref"), new QName("http://java.sun.com/xml/ns/javaee", "post-construct"), new QName("http://java.sun.com/xml/ns/javaee", "pre-destroy"), new QName("http://java.sun.com/xml/ns/javaee", "data-source"), new QName("http://java.sun.com/xml/ns/javaee", "jms-connection-factory"), new QName("http://java.sun.com/xml/ns/javaee", "jms-destination"), new QName("http://java.sun.com/xml/ns/javaee", "security-role-ref"), new QName("http://java.sun.com/xml/ns/javaee", "security-identity"), new QName("http://java.sun.com/xml/ns/javaee", "query"), new QName("http://java.sun.com/xml/ns/javaee", "context-service"), new QName("http://java.sun.com/xml/ns/javaee", "managed-executor"), new QName("http://java.sun.com/xml/ns/javaee", "managed-scheduled-executor"), new QName("http://java.sun.com/xml/ns/javaee", "managed-thread-factory")); } } if (descriptions!= null) { @@ -640,6 +685,15 @@ public static final EntityBean _read(XoXMLStreamReader reader, RuntimeContext co if (contextService!= null) { entityBean.contextService = contextService; } + if (managedExecutor!= null) { + entityBean.managedExecutor = managedExecutor; + } + if (managedScheduledExecutor!= null) { + entityBean.managedScheduledExecutor = managedScheduledExecutor; + } + if (managedThreadFactory!= null) { + entityBean.managedThreadFactory = managedThreadFactory; + } context.afterUnmarshal(entityBean, org.metatype.sxc.jaxb.LifecycleCallback.NONE); @@ -1171,6 +1225,42 @@ public static final void _write(XoXMLStreamWriter writer, EntityBean entityBean, } } + // ELEMENT: managedExecutor + KeyedCollection managedExecutor = entityBean.managedExecutor; + if (managedExecutor!= null) { + for (ManagedExecutor managedExecutorItem: managedExecutor) { + if (managedExecutorItem!= null) { + writer.writeStartElement(prefix, "managed-executor", "http://java.sun.com/xml/ns/javaee"); + writeManagedExecutor(writer, managedExecutorItem, context); + writer.writeEndElement(); + } + } + } + + // ELEMENT: managedScheduledExecutor + KeyedCollection managedScheduledExecutor = entityBean.managedScheduledExecutor; + if (managedScheduledExecutor!= null) { + for (ManagedScheduledExecutor managedScheduledExecutorItem: managedScheduledExecutor) { + if (managedScheduledExecutorItem!= null) { + writer.writeStartElement(prefix, "managed-scheduled-executor", "http://java.sun.com/xml/ns/javaee"); + writeManagedScheduledExecutor(writer, managedScheduledExecutorItem, context); + writer.writeEndElement(); + } + } + } + + // ELEMENT: managedThreadFactory + KeyedCollection managedThreadFactory = entityBean.managedThreadFactory; + if (managedThreadFactory!= null) { + for (ManagedThreadFactory managedThreadFactoryItem: managedThreadFactory) { + if (managedThreadFactoryItem!= null) { + writer.writeStartElement(prefix, "managed-thread-factory", "http://java.sun.com/xml/ns/javaee"); + writeManagedThreadFactory(writer, managedThreadFactoryItem, context); + writer.writeEndElement(); + } + } + } + context.afterMarshal(entityBean, org.metatype.sxc.jaxb.LifecycleCallback.NONE); } diff --git a/container/openejb-jee-accessors/src/main/java/org/apache/openejb/jee/Interceptor$JAXB.java b/container/openejb-jee-accessors/src/main/java/org/apache/openejb/jee/Interceptor$JAXB.java index ba09e65db59..a863f66eaad 100644 --- a/container/openejb-jee-accessors/src/main/java/org/apache/openejb/jee/Interceptor$JAXB.java +++ b/container/openejb-jee-accessors/src/main/java/org/apache/openejb/jee/Interceptor$JAXB.java @@ -49,6 +49,12 @@ import static org.apache.openejb.jee.JMSDestination$JAXB.writeJMSDestination; import static org.apache.openejb.jee.LifecycleCallback$JAXB.readLifecycleCallback; import static org.apache.openejb.jee.LifecycleCallback$JAXB.writeLifecycleCallback; +import static org.apache.openejb.jee.ManagedExecutor$JAXB.readManagedExecutor; +import static org.apache.openejb.jee.ManagedExecutor$JAXB.writeManagedExecutor; +import static org.apache.openejb.jee.ManagedScheduledExecutor$JAXB.readManagedScheduledExecutor; +import static org.apache.openejb.jee.ManagedScheduledExecutor$JAXB.writeManagedScheduledExecutor; +import static org.apache.openejb.jee.ManagedThreadFactory$JAXB.readManagedThreadFactory; +import static org.apache.openejb.jee.ManagedThreadFactory$JAXB.writeManagedThreadFactory; import static org.apache.openejb.jee.MessageDestinationRef$JAXB.readMessageDestinationRef; import static org.apache.openejb.jee.MessageDestinationRef$JAXB.writeMessageDestinationRef; import static org.apache.openejb.jee.PersistenceContextRef$JAXB.readPersistenceContextRef; @@ -73,7 +79,7 @@ public class Interceptor$JAXB public Interceptor$JAXB() { - super(Interceptor.class, null, new QName("http://java.sun.com/xml/ns/javaee".intern(), "interceptorType".intern()), Text$JAXB.class, AroundInvoke$JAXB.class, AroundTimeout$JAXB.class, EnvEntry$JAXB.class, EjbRef$JAXB.class, EjbLocalRef$JAXB.class, ServiceRef$JAXB.class, ResourceRef$JAXB.class, ResourceEnvRef$JAXB.class, MessageDestinationRef$JAXB.class, PersistenceContextRef$JAXB.class, PersistenceUnitRef$JAXB.class, LifecycleCallback$JAXB.class, DataSource$JAXB.class, JMSConnectionFactory$JAXB.class, JMSDestination$JAXB.class, ContextService$JAXB.class); + super(Interceptor.class, null, new QName("http://java.sun.com/xml/ns/javaee".intern(), "interceptorType".intern()), Text$JAXB.class, AroundInvoke$JAXB.class, AroundTimeout$JAXB.class, EnvEntry$JAXB.class, EjbRef$JAXB.class, EjbLocalRef$JAXB.class, ServiceRef$JAXB.class, ResourceRef$JAXB.class, ResourceEnvRef$JAXB.class, MessageDestinationRef$JAXB.class, PersistenceContextRef$JAXB.class, PersistenceUnitRef$JAXB.class, LifecycleCallback$JAXB.class, DataSource$JAXB.class, JMSConnectionFactory$JAXB.class, JMSDestination$JAXB.class, ContextService$JAXB.class, ManagedExecutor$JAXB.class, ManagedScheduledExecutor$JAXB.class, ManagedThreadFactory$JAXB.class); } public static Interceptor readInterceptor(XoXMLStreamReader reader, RuntimeContext context) @@ -134,6 +140,9 @@ public static final Interceptor _read(XoXMLStreamReader reader, RuntimeContext c List beforeCompletion = null; List afterCompletion = null; KeyedCollection contextService = null; + KeyedCollection managedExecutor = null; + KeyedCollection managedScheduledExecutor = null; + KeyedCollection managedThreadFactory = null; // Check xsi:type QName xsiType = reader.getXsiType(); @@ -453,8 +462,44 @@ public static final Interceptor _read(XoXMLStreamReader reader, RuntimeContext c } } contextService.add(contextServiceItem); + } else if (("managed-executor" == elementReader.getLocalName())&&("http://java.sun.com/xml/ns/javaee" == elementReader.getNamespaceURI())) { + // ELEMENT: managedExecutor + ManagedExecutor managedExecutorItem = readManagedExecutor(elementReader, context); + if (managedExecutor == null) { + managedExecutor = interceptor.managedExecutor; + if (managedExecutor!= null) { + managedExecutor.clear(); + } else { + managedExecutor = new KeyedCollection<>(); + } + } + managedExecutor.add(managedExecutorItem); + } else if (("managed-scheduled-executor" == elementReader.getLocalName())&&("http://java.sun.com/xml/ns/javaee" == elementReader.getNamespaceURI())) { + // ELEMENT: managedScheduledExecutor + ManagedScheduledExecutor managedScheduledExecutorItem = readManagedScheduledExecutor(elementReader, context); + if (managedScheduledExecutor == null) { + managedScheduledExecutor = interceptor.managedScheduledExecutor; + if (managedScheduledExecutor!= null) { + managedScheduledExecutor.clear(); + } else { + managedScheduledExecutor = new KeyedCollection<>(); + } + } + managedScheduledExecutor.add(managedScheduledExecutorItem); + } else if (("managed-thread-factory" == elementReader.getLocalName())&&("http://java.sun.com/xml/ns/javaee" == elementReader.getNamespaceURI())) { + // ELEMENT: managedThreadFactory + ManagedThreadFactory managedThreadFactoryItem = readManagedThreadFactory(elementReader, context); + if (managedThreadFactory == null) { + managedThreadFactory = interceptor.managedThreadFactory; + if (managedThreadFactory!= null) { + managedThreadFactory.clear(); + } else { + managedThreadFactory = new KeyedCollection<>(); + } + } + managedThreadFactory.add(managedThreadFactoryItem); } else { - context.unexpectedElement(elementReader, new QName("http://java.sun.com/xml/ns/javaee", "description"), new QName("http://java.sun.com/xml/ns/javaee", "interceptor-class"), new QName("http://java.sun.com/xml/ns/javaee", "around-invoke"), new QName("http://java.sun.com/xml/ns/javaee", "around-timeout"), new QName("http://java.sun.com/xml/ns/javaee", "env-entry"), new QName("http://java.sun.com/xml/ns/javaee", "ejb-ref"), new QName("http://java.sun.com/xml/ns/javaee", "ejb-local-ref"), new QName("http://java.sun.com/xml/ns/javaee", "service-ref"), new QName("http://java.sun.com/xml/ns/javaee", "resource-ref"), new QName("http://java.sun.com/xml/ns/javaee", "resource-env-ref"), new QName("http://java.sun.com/xml/ns/javaee", "message-destination-ref"), new QName("http://java.sun.com/xml/ns/javaee", "persistence-context-ref"), new QName("http://java.sun.com/xml/ns/javaee", "persistence-unit-ref"), new QName("http://java.sun.com/xml/ns/javaee", "around-construct"), new QName("http://java.sun.com/xml/ns/javaee", "post-construct"), new QName("http://java.sun.com/xml/ns/javaee", "pre-destroy"), new QName("http://java.sun.com/xml/ns/javaee", "data-source"), new QName("http://java.sun.com/xml/ns/javaee", "jms-connection-factory"), new QName("http://java.sun.com/xml/ns/javaee", "jms-destination"), new QName("http://java.sun.com/xml/ns/javaee", "post-activate"), new QName("http://java.sun.com/xml/ns/javaee", "pre-passivate"), new QName("http://java.sun.com/xml/ns/javaee", "after-begin"), new QName("http://java.sun.com/xml/ns/javaee", "before-completion"), new QName("http://java.sun.com/xml/ns/javaee", "after-completion"), new QName("http://java.sun.com/xml/ns/javaee", "context-service")); + context.unexpectedElement(elementReader, new QName("http://java.sun.com/xml/ns/javaee", "description"), new QName("http://java.sun.com/xml/ns/javaee", "interceptor-class"), new QName("http://java.sun.com/xml/ns/javaee", "around-invoke"), new QName("http://java.sun.com/xml/ns/javaee", "around-timeout"), new QName("http://java.sun.com/xml/ns/javaee", "env-entry"), new QName("http://java.sun.com/xml/ns/javaee", "ejb-ref"), new QName("http://java.sun.com/xml/ns/javaee", "ejb-local-ref"), new QName("http://java.sun.com/xml/ns/javaee", "service-ref"), new QName("http://java.sun.com/xml/ns/javaee", "resource-ref"), new QName("http://java.sun.com/xml/ns/javaee", "resource-env-ref"), new QName("http://java.sun.com/xml/ns/javaee", "message-destination-ref"), new QName("http://java.sun.com/xml/ns/javaee", "persistence-context-ref"), new QName("http://java.sun.com/xml/ns/javaee", "persistence-unit-ref"), new QName("http://java.sun.com/xml/ns/javaee", "around-construct"), new QName("http://java.sun.com/xml/ns/javaee", "post-construct"), new QName("http://java.sun.com/xml/ns/javaee", "pre-destroy"), new QName("http://java.sun.com/xml/ns/javaee", "data-source"), new QName("http://java.sun.com/xml/ns/javaee", "jms-connection-factory"), new QName("http://java.sun.com/xml/ns/javaee", "jms-destination"), new QName("http://java.sun.com/xml/ns/javaee", "post-activate"), new QName("http://java.sun.com/xml/ns/javaee", "pre-passivate"), new QName("http://java.sun.com/xml/ns/javaee", "after-begin"), new QName("http://java.sun.com/xml/ns/javaee", "before-completion"), new QName("http://java.sun.com/xml/ns/javaee", "after-completion"), new QName("http://java.sun.com/xml/ns/javaee", "context-service"), new QName("http://java.sun.com/xml/ns/javaee", "managed-executor"), new QName("http://java.sun.com/xml/ns/javaee", "managed-scheduled-executor"), new QName("http://java.sun.com/xml/ns/javaee", "managed-thread-factory")); } } if (descriptions!= null) { @@ -533,6 +578,15 @@ public static final Interceptor _read(XoXMLStreamReader reader, RuntimeContext c if (contextService!= null) { interceptor.contextService = contextService; } + if (managedExecutor!= null) { + interceptor.managedExecutor = managedExecutor; + } + if (managedScheduledExecutor!= null) { + interceptor.managedScheduledExecutor = managedScheduledExecutor; + } + if (managedThreadFactory!= null) { + interceptor.managedThreadFactory = managedThreadFactory; + } context.afterUnmarshal(interceptor, org.metatype.sxc.jaxb.LifecycleCallback.NONE); @@ -929,6 +983,42 @@ public static final void _write(XoXMLStreamWriter writer, Interceptor intercepto } } + // ELEMENT: managedExecutor + KeyedCollection managedExecutor = interceptor.managedExecutor; + if (managedExecutor!= null) { + for (ManagedExecutor managedExecutorItem: managedExecutor) { + if (managedExecutorItem!= null) { + writer.writeStartElement(prefix, "managed-executor", "http://java.sun.com/xml/ns/javaee"); + writeManagedExecutor(writer, managedExecutorItem, context); + writer.writeEndElement(); + } + } + } + + // ELEMENT: managedScheduledExecutor + KeyedCollection managedScheduledExecutor = interceptor.managedScheduledExecutor; + if (managedScheduledExecutor!= null) { + for (ManagedScheduledExecutor managedScheduledExecutorItem: managedScheduledExecutor) { + if (managedScheduledExecutorItem!= null) { + writer.writeStartElement(prefix, "managed-scheduled-executor", "http://java.sun.com/xml/ns/javaee"); + writeManagedScheduledExecutor(writer, managedScheduledExecutorItem, context); + writer.writeEndElement(); + } + } + } + + // ELEMENT: managedThreadFactory + KeyedCollection managedThreadFactory = interceptor.managedThreadFactory; + if (managedThreadFactory!= null) { + for (ManagedThreadFactory managedThreadFactoryItem: managedThreadFactory) { + if (managedThreadFactoryItem!= null) { + writer.writeStartElement(prefix, "managed-thread-factory", "http://java.sun.com/xml/ns/javaee"); + writeManagedThreadFactory(writer, managedThreadFactoryItem, context); + writer.writeEndElement(); + } + } + } + context.afterMarshal(interceptor, org.metatype.sxc.jaxb.LifecycleCallback.NONE); } diff --git a/container/openejb-jee-accessors/src/main/java/org/apache/openejb/jee/ManagedBean$JAXB.java b/container/openejb-jee-accessors/src/main/java/org/apache/openejb/jee/ManagedBean$JAXB.java index e550d8cb5a0..22883c64e45 100644 --- a/container/openejb-jee-accessors/src/main/java/org/apache/openejb/jee/ManagedBean$JAXB.java +++ b/container/openejb-jee-accessors/src/main/java/org/apache/openejb/jee/ManagedBean$JAXB.java @@ -62,6 +62,12 @@ import static org.apache.openejb.jee.JMSDestination$JAXB.writeJMSDestination; import static org.apache.openejb.jee.LifecycleCallback$JAXB.readLifecycleCallback; import static org.apache.openejb.jee.LifecycleCallback$JAXB.writeLifecycleCallback; +import static org.apache.openejb.jee.ManagedExecutor$JAXB.readManagedExecutor; +import static org.apache.openejb.jee.ManagedExecutor$JAXB.writeManagedExecutor; +import static org.apache.openejb.jee.ManagedScheduledExecutor$JAXB.readManagedScheduledExecutor; +import static org.apache.openejb.jee.ManagedScheduledExecutor$JAXB.writeManagedScheduledExecutor; +import static org.apache.openejb.jee.ManagedThreadFactory$JAXB.readManagedThreadFactory; +import static org.apache.openejb.jee.ManagedThreadFactory$JAXB.writeManagedThreadFactory; import static org.apache.openejb.jee.MessageDestinationRef$JAXB.readMessageDestinationRef; import static org.apache.openejb.jee.MessageDestinationRef$JAXB.writeMessageDestinationRef; import static org.apache.openejb.jee.NamedMethod$JAXB.readNamedMethod; @@ -102,7 +108,7 @@ public class ManagedBean$JAXB public ManagedBean$JAXB() { - super(ManagedBean.class, null, new QName("http://java.sun.com/xml/ns/javaee".intern(), "managedBean".intern()), Text$JAXB.class, Icon$JAXB.class, Empty$JAXB.class, SessionType$JAXB.class, Timeout$JAXB.class, NamedMethod$JAXB.class, Timer$JAXB.class, ConcurrencyManagementType$JAXB.class, ConcurrentMethod$JAXB.class, InitMethod$JAXB.class, RemoveMethod$JAXB.class, AsyncMethod$JAXB.class, TransactionType$JAXB.class, AroundInvoke$JAXB.class, AroundTimeout$JAXB.class, EnvEntry$JAXB.class, EjbRef$JAXB.class, EjbLocalRef$JAXB.class, ServiceRef$JAXB.class, ResourceRef$JAXB.class, ResourceEnvRef$JAXB.class, MessageDestinationRef$JAXB.class, PersistenceContextRef$JAXB.class, PersistenceUnitRef$JAXB.class, LifecycleCallback$JAXB.class, DataSource$JAXB.class, JMSConnectionFactory$JAXB.class, JMSDestination$JAXB.class, SecurityRoleRef$JAXB.class, SecurityIdentity$JAXB.class, ContextService$JAXB.class); + super(ManagedBean.class, null, new QName("http://java.sun.com/xml/ns/javaee".intern(), "managedBean".intern()), Text$JAXB.class, Icon$JAXB.class, Empty$JAXB.class, SessionType$JAXB.class, Timeout$JAXB.class, NamedMethod$JAXB.class, Timer$JAXB.class, ConcurrencyManagementType$JAXB.class, ConcurrentMethod$JAXB.class, InitMethod$JAXB.class, RemoveMethod$JAXB.class, AsyncMethod$JAXB.class, TransactionType$JAXB.class, AroundInvoke$JAXB.class, AroundTimeout$JAXB.class, EnvEntry$JAXB.class, EjbRef$JAXB.class, EjbLocalRef$JAXB.class, ServiceRef$JAXB.class, ResourceRef$JAXB.class, ResourceEnvRef$JAXB.class, MessageDestinationRef$JAXB.class, PersistenceContextRef$JAXB.class, PersistenceUnitRef$JAXB.class, LifecycleCallback$JAXB.class, DataSource$JAXB.class, JMSConnectionFactory$JAXB.class, JMSDestination$JAXB.class, SecurityRoleRef$JAXB.class, SecurityIdentity$JAXB.class, ContextService$JAXB.class, ManagedExecutor$JAXB.class, ManagedScheduledExecutor$JAXB.class, ManagedThreadFactory$JAXB.class); } public static ManagedBean readManagedBean(XoXMLStreamReader reader, RuntimeContext context) @@ -169,6 +175,9 @@ public static final ManagedBean _read(XoXMLStreamReader reader, RuntimeContext c List prePassivate = null; List securityRoleRef = null; KeyedCollection contextService = null; + KeyedCollection managedExecutor = null; + KeyedCollection managedScheduledExecutor = null; + KeyedCollection managedThreadFactory = null; // Check xsi:type QName xsiType = reader.getXsiType(); @@ -737,8 +746,44 @@ public static final ManagedBean _read(XoXMLStreamReader reader, RuntimeContext c } } contextService.add(contextServiceItem); + } else if (("managed-executor" == elementReader.getLocalName())&&("http://java.sun.com/xml/ns/javaee" == elementReader.getNamespaceURI())) { + // ELEMENT: managedExecutor + ManagedExecutor managedExecutorItem = readManagedExecutor(elementReader, context); + if (managedExecutor == null) { + managedExecutor = managedBean.managedExecutor; + if (managedExecutor!= null) { + managedExecutor.clear(); + } else { + managedExecutor = new KeyedCollection<>(); + } + } + managedExecutor.add(managedExecutorItem); + } else if (("managed-scheduled-executor" == elementReader.getLocalName())&&("http://java.sun.com/xml/ns/javaee" == elementReader.getNamespaceURI())) { + // ELEMENT: managedScheduledExecutor + ManagedScheduledExecutor managedScheduledExecutorItem = readManagedScheduledExecutor(elementReader, context); + if (managedScheduledExecutor == null) { + managedScheduledExecutor = managedBean.managedScheduledExecutor; + if (managedScheduledExecutor!= null) { + managedScheduledExecutor.clear(); + } else { + managedScheduledExecutor = new KeyedCollection<>(); + } + } + managedScheduledExecutor.add(managedScheduledExecutorItem); + } else if (("managed-thread-factory" == elementReader.getLocalName())&&("http://java.sun.com/xml/ns/javaee" == elementReader.getNamespaceURI())) { + // ELEMENT: managedThreadFactory + ManagedThreadFactory managedThreadFactoryItem = readManagedThreadFactory(elementReader, context); + if (managedThreadFactory == null) { + managedThreadFactory = managedBean.managedThreadFactory; + if (managedThreadFactory!= null) { + managedThreadFactory.clear(); + } else { + managedThreadFactory = new KeyedCollection<>(); + } + } + managedThreadFactory.add(managedThreadFactoryItem); } else { - context.unexpectedElement(elementReader, new QName("http://java.sun.com/xml/ns/javaee", "hidden"), new QName("http://java.sun.com/xml/ns/javaee", "description"), new QName("http://java.sun.com/xml/ns/javaee", "display-name"), new QName("http://java.sun.com/xml/ns/javaee", "icon"), new QName("http://java.sun.com/xml/ns/javaee", "ejb-name"), new QName("http://java.sun.com/xml/ns/javaee", "mapped-name"), new QName("http://java.sun.com/xml/ns/javaee", "home"), new QName("http://java.sun.com/xml/ns/javaee", "remote"), new QName("http://java.sun.com/xml/ns/javaee", "local-home"), new QName("http://java.sun.com/xml/ns/javaee", "local"), new QName("http://java.sun.com/xml/ns/javaee", "business-local"), new QName("http://java.sun.com/xml/ns/javaee", "business-remote"), new QName("http://java.sun.com/xml/ns/javaee", "local-bean"), new QName("http://java.sun.com/xml/ns/javaee", "service-endpoint"), new QName("http://java.sun.com/xml/ns/javaee", "ejb-class"), new QName("http://java.sun.com/xml/ns/javaee", "session-type"), new QName("http://java.sun.com/xml/ns/javaee", "stateful-timeout"), new QName("http://java.sun.com/xml/ns/javaee", "timeout-method"), new QName("http://java.sun.com/xml/ns/javaee", "timer"), new QName("http://java.sun.com/xml/ns/javaee", "init-on-startup"), new QName("http://java.sun.com/xml/ns/javaee", "concurrency-management-type"), new QName("http://java.sun.com/xml/ns/javaee", "concurrent-method"), new QName("http://java.sun.com/xml/ns/javaee", "depends-on"), new QName("http://java.sun.com/xml/ns/javaee", "init-method"), new QName("http://java.sun.com/xml/ns/javaee", "remove-method"), new QName("http://java.sun.com/xml/ns/javaee", "async-method"), new QName("http://java.sun.com/xml/ns/javaee", "transaction-type"), new QName("http://java.sun.com/xml/ns/javaee", "after-begin-method"), new QName("http://java.sun.com/xml/ns/javaee", "before-completion-method"), new QName("http://java.sun.com/xml/ns/javaee", "after-completion-method"), new QName("http://java.sun.com/xml/ns/javaee", "around-invoke"), new QName("http://java.sun.com/xml/ns/javaee", "around-timeout"), new QName("http://java.sun.com/xml/ns/javaee", "env-entry"), new QName("http://java.sun.com/xml/ns/javaee", "ejb-ref"), new QName("http://java.sun.com/xml/ns/javaee", "ejb-local-ref"), new QName("http://java.sun.com/xml/ns/javaee", "service-ref"), new QName("http://java.sun.com/xml/ns/javaee", "resource-ref"), new QName("http://java.sun.com/xml/ns/javaee", "resource-env-ref"), new QName("http://java.sun.com/xml/ns/javaee", "message-destination-ref"), new QName("http://java.sun.com/xml/ns/javaee", "persistence-context-ref"), new QName("http://java.sun.com/xml/ns/javaee", "persistence-unit-ref"), new QName("http://java.sun.com/xml/ns/javaee", "post-construct"), new QName("http://java.sun.com/xml/ns/javaee", "pre-destroy"), new QName("http://java.sun.com/xml/ns/javaee", "data-source"), new QName("http://java.sun.com/xml/ns/javaee", "jms-connection-factory"), new QName("http://java.sun.com/xml/ns/javaee", "jms-destination"), new QName("http://java.sun.com/xml/ns/javaee", "post-activate"), new QName("http://java.sun.com/xml/ns/javaee", "pre-passivate"), new QName("http://java.sun.com/xml/ns/javaee", "security-role-ref"), new QName("http://java.sun.com/xml/ns/javaee", "security-identity"), new QName("http://java.sun.com/xml/ns/javaee", "passivation-capable"), new QName("http://java.sun.com/xml/ns/javaee", "context-service")); + context.unexpectedElement(elementReader, new QName("http://java.sun.com/xml/ns/javaee", "hidden"), new QName("http://java.sun.com/xml/ns/javaee", "description"), new QName("http://java.sun.com/xml/ns/javaee", "display-name"), new QName("http://java.sun.com/xml/ns/javaee", "icon"), new QName("http://java.sun.com/xml/ns/javaee", "ejb-name"), new QName("http://java.sun.com/xml/ns/javaee", "mapped-name"), new QName("http://java.sun.com/xml/ns/javaee", "home"), new QName("http://java.sun.com/xml/ns/javaee", "remote"), new QName("http://java.sun.com/xml/ns/javaee", "local-home"), new QName("http://java.sun.com/xml/ns/javaee", "local"), new QName("http://java.sun.com/xml/ns/javaee", "business-local"), new QName("http://java.sun.com/xml/ns/javaee", "business-remote"), new QName("http://java.sun.com/xml/ns/javaee", "local-bean"), new QName("http://java.sun.com/xml/ns/javaee", "service-endpoint"), new QName("http://java.sun.com/xml/ns/javaee", "ejb-class"), new QName("http://java.sun.com/xml/ns/javaee", "session-type"), new QName("http://java.sun.com/xml/ns/javaee", "stateful-timeout"), new QName("http://java.sun.com/xml/ns/javaee", "timeout-method"), new QName("http://java.sun.com/xml/ns/javaee", "timer"), new QName("http://java.sun.com/xml/ns/javaee", "init-on-startup"), new QName("http://java.sun.com/xml/ns/javaee", "concurrency-management-type"), new QName("http://java.sun.com/xml/ns/javaee", "concurrent-method"), new QName("http://java.sun.com/xml/ns/javaee", "depends-on"), new QName("http://java.sun.com/xml/ns/javaee", "init-method"), new QName("http://java.sun.com/xml/ns/javaee", "remove-method"), new QName("http://java.sun.com/xml/ns/javaee", "async-method"), new QName("http://java.sun.com/xml/ns/javaee", "transaction-type"), new QName("http://java.sun.com/xml/ns/javaee", "after-begin-method"), new QName("http://java.sun.com/xml/ns/javaee", "before-completion-method"), new QName("http://java.sun.com/xml/ns/javaee", "after-completion-method"), new QName("http://java.sun.com/xml/ns/javaee", "around-invoke"), new QName("http://java.sun.com/xml/ns/javaee", "around-timeout"), new QName("http://java.sun.com/xml/ns/javaee", "env-entry"), new QName("http://java.sun.com/xml/ns/javaee", "ejb-ref"), new QName("http://java.sun.com/xml/ns/javaee", "ejb-local-ref"), new QName("http://java.sun.com/xml/ns/javaee", "service-ref"), new QName("http://java.sun.com/xml/ns/javaee", "resource-ref"), new QName("http://java.sun.com/xml/ns/javaee", "resource-env-ref"), new QName("http://java.sun.com/xml/ns/javaee", "message-destination-ref"), new QName("http://java.sun.com/xml/ns/javaee", "persistence-context-ref"), new QName("http://java.sun.com/xml/ns/javaee", "persistence-unit-ref"), new QName("http://java.sun.com/xml/ns/javaee", "post-construct"), new QName("http://java.sun.com/xml/ns/javaee", "pre-destroy"), new QName("http://java.sun.com/xml/ns/javaee", "data-source"), new QName("http://java.sun.com/xml/ns/javaee", "jms-connection-factory"), new QName("http://java.sun.com/xml/ns/javaee", "jms-destination"), new QName("http://java.sun.com/xml/ns/javaee", "post-activate"), new QName("http://java.sun.com/xml/ns/javaee", "pre-passivate"), new QName("http://java.sun.com/xml/ns/javaee", "security-role-ref"), new QName("http://java.sun.com/xml/ns/javaee", "security-identity"), new QName("http://java.sun.com/xml/ns/javaee", "passivation-capable"), new QName("http://java.sun.com/xml/ns/javaee", "context-service"), new QName("http://java.sun.com/xml/ns/javaee", "managed-executor"), new QName("http://java.sun.com/xml/ns/javaee", "managed-scheduled-executor"), new QName("http://java.sun.com/xml/ns/javaee", "managed-thread-factory")); } } if (descriptions!= null) { @@ -839,6 +884,15 @@ public static final ManagedBean _read(XoXMLStreamReader reader, RuntimeContext c if (contextService!= null) { managedBean.contextService = contextService; } + if (managedExecutor!= null) { + managedBean.managedExecutor = managedExecutor; + } + if (managedScheduledExecutor!= null) { + managedBean.managedScheduledExecutor = managedScheduledExecutor; + } + if (managedThreadFactory!= null) { + managedBean.managedThreadFactory = managedThreadFactory; + } context.afterUnmarshal(managedBean, org.metatype.sxc.jaxb.LifecycleCallback.NONE); @@ -1584,6 +1638,42 @@ public static final void _write(XoXMLStreamWriter writer, ManagedBean managedBea } } + // ELEMENT: managedExecutor + KeyedCollection managedExecutor = managedBean.managedExecutor; + if (managedExecutor!= null) { + for (ManagedExecutor managedExecutorItem: managedExecutor) { + if (managedExecutorItem!= null) { + writer.writeStartElement(prefix, "managed-executor", "http://java.sun.com/xml/ns/javaee"); + writeManagedExecutor(writer, managedExecutorItem, context); + writer.writeEndElement(); + } + } + } + + // ELEMENT: managedScheduledExecutor + KeyedCollection managedScheduledExecutor = managedBean.managedScheduledExecutor; + if (managedScheduledExecutor!= null) { + for (ManagedScheduledExecutor managedScheduledExecutorItem: managedScheduledExecutor) { + if (managedScheduledExecutorItem!= null) { + writer.writeStartElement(prefix, "managed-scheduled-executor", "http://java.sun.com/xml/ns/javaee"); + writeManagedScheduledExecutor(writer, managedScheduledExecutorItem, context); + writer.writeEndElement(); + } + } + } + + // ELEMENT: managedThreadFactory + KeyedCollection managedThreadFactory = managedBean.managedThreadFactory; + if (managedThreadFactory!= null) { + for (ManagedThreadFactory managedThreadFactoryItem: managedThreadFactory) { + if (managedThreadFactoryItem!= null) { + writer.writeStartElement(prefix, "managed-thread-factory", "http://java.sun.com/xml/ns/javaee"); + writeManagedThreadFactory(writer, managedThreadFactoryItem, context); + writer.writeEndElement(); + } + } + } + // ELEMENT: hidden Boolean hidden = managedBean.hidden; writer.writeStartElement(prefix, "hidden", "http://java.sun.com/xml/ns/javaee"); diff --git a/container/openejb-jee-accessors/src/main/java/org/apache/openejb/jee/ManagedExecutor$JAXB.java b/container/openejb-jee-accessors/src/main/java/org/apache/openejb/jee/ManagedExecutor$JAXB.java new file mode 100644 index 00000000000..5174c14ef88 --- /dev/null +++ b/container/openejb-jee-accessors/src/main/java/org/apache/openejb/jee/ManagedExecutor$JAXB.java @@ -0,0 +1,233 @@ +/** + * 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.openejb.jee; + +import java.util.ArrayList; +import java.util.List; +import javax.xml.XMLConstants; +import javax.xml.namespace.QName; +import org.apache.openejb.jee.jba.JndiName; +import org.apache.openejb.jee.jba.JndiName$JAXB; +import org.metatype.sxc.jaxb.JAXBObject; +import org.metatype.sxc.jaxb.LifecycleCallback; +import org.metatype.sxc.jaxb.RuntimeContext; +import org.metatype.sxc.util.Attribute; +import org.metatype.sxc.util.XoXMLStreamReader; +import org.metatype.sxc.util.XoXMLStreamWriter; + + +import static org.apache.openejb.jee.Description$JAXB.readDescription; +import static org.apache.openejb.jee.Description$JAXB.writeDescription; +import static org.apache.openejb.jee.Property$JAXB.readProperty; +import static org.apache.openejb.jee.Property$JAXB.writeProperty; +import static org.apache.openejb.jee.jba.JndiName$JAXB.readJndiName; +import static org.apache.openejb.jee.jba.JndiName$JAXB.writeJndiName; + +@SuppressWarnings({ + "StringEquality" +}) +public class ManagedExecutor$JAXB + extends JAXBObject +{ + + + public ManagedExecutor$JAXB() { + super(ManagedExecutor.class, null, new QName("http://java.sun.com/xml/ns/javaee".intern(), "managed-executorType".intern()), Description$JAXB.class, JndiName$JAXB.class, Property$JAXB.class); + } + + public static ManagedExecutor readManagedExecutor(XoXMLStreamReader reader, RuntimeContext context) + throws Exception + { + return _read(reader, context); + } + + public static void writeManagedExecutor(XoXMLStreamWriter writer, ManagedExecutor managedExecutor, RuntimeContext context) + throws Exception + { + _write(writer, managedExecutor, context); + } + + public void write(XoXMLStreamWriter writer, ManagedExecutor managedExecutor, RuntimeContext context) + throws Exception + { + _write(writer, managedExecutor, context); + } + + public static final ManagedExecutor _read(XoXMLStreamReader reader, RuntimeContext context) + throws Exception + { + + // Check for xsi:nil + if (reader.isXsiNil()) { + return null; + } + + if (context == null) { + context = new RuntimeContext(); + } + + ManagedExecutor managedExecutor = new ManagedExecutor(); + context.beforeUnmarshal(managedExecutor, LifecycleCallback.NONE); + + List properties = null; + + // Check xsi:type + QName xsiType = reader.getXsiType(); + if (xsiType!= null) { + if (("managed-executorType"!= xsiType.getLocalPart())||("http://java.sun.com/xml/ns/javaee"!= xsiType.getNamespaceURI())) { + return context.unexpectedXsiType(reader, ManagedExecutor.class); + } + } + + // Read attributes + for (Attribute attribute: reader.getAttributes()) { + if (XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI!= attribute.getNamespace()) { + context.unexpectedAttribute(attribute); + } + } + + // Read elements + for (XoXMLStreamReader elementReader: reader.getChildElements()) { + if (("description" == elementReader.getLocalName())&&("http://java.sun.com/xml/ns/javaee" == elementReader.getNamespaceURI())) { + // ELEMENT: description + Description description = readDescription(elementReader, context); + managedExecutor.description = description; + } else if (("name" == elementReader.getLocalName())&&("http://java.sun.com/xml/ns/javaee" == elementReader.getNamespaceURI())) { + // ELEMENT: name + JndiName name = readJndiName(elementReader, context); + managedExecutor.name = name; + } else if (("context-service-ref" == elementReader.getLocalName())&&("http://java.sun.com/xml/ns/javaee" == elementReader.getNamespaceURI())) { + // ELEMENT: contextService + JndiName contextService = readJndiName(elementReader, context); + managedExecutor.contextService = contextService; + } else if (("hung-task-threshold" == elementReader.getLocalName())&&("http://java.sun.com/xml/ns/javaee" == elementReader.getNamespaceURI())) { + // ELEMENT: hungTaskThreshold + Long hungTaskThreshold = Long.valueOf(elementReader.getElementText()); + managedExecutor.hungTaskThreshold = hungTaskThreshold; + } else if (("max-async" == elementReader.getLocalName())&&("http://java.sun.com/xml/ns/javaee" == elementReader.getNamespaceURI())) { + // ELEMENT: maxAsync + Integer maxAsync = Integer.valueOf(elementReader.getElementText()); + managedExecutor.maxAsync = maxAsync; + } else if (("properties" == elementReader.getLocalName())&&("http://java.sun.com/xml/ns/javaee" == elementReader.getNamespaceURI())) { + // ELEMENT: properties + Property propertiesItem = readProperty(elementReader, context); + if (properties == null) { + properties = managedExecutor.properties; + if (properties!= null) { + properties.clear(); + } else { + properties = new ArrayList<>(); + } + } + properties.add(propertiesItem); + } else { + context.unexpectedElement(elementReader, new QName("http://java.sun.com/xml/ns/javaee", "description"), new QName("http://java.sun.com/xml/ns/javaee", "name"), new QName("http://java.sun.com/xml/ns/javaee", "context-service-ref"), new QName("http://java.sun.com/xml/ns/javaee", "hung-task-threshold"), new QName("http://java.sun.com/xml/ns/javaee", "max-async"), new QName("http://java.sun.com/xml/ns/javaee", "properties")); + } + } + if (properties!= null) { + managedExecutor.properties = properties; + } + + context.afterUnmarshal(managedExecutor, LifecycleCallback.NONE); + + return managedExecutor; + } + + public final ManagedExecutor read(XoXMLStreamReader reader, RuntimeContext context) + throws Exception + { + return _read(reader, context); + } + + public static final void _write(XoXMLStreamWriter writer, ManagedExecutor managedExecutor, RuntimeContext context) + throws Exception + { + if (managedExecutor == null) { + writer.writeXsiNil(); + return ; + } + + if (context == null) { + context = new RuntimeContext(); + } + + String prefix = writer.getUniquePrefix("http://java.sun.com/xml/ns/javaee"); + if (ManagedExecutor.class!= managedExecutor.getClass()) { + context.unexpectedSubclass(writer, managedExecutor, ManagedExecutor.class); + return ; + } + + context.beforeMarshal(managedExecutor, LifecycleCallback.NONE); + + + // ELEMENT: description + Description description = managedExecutor.description; + if (description!= null) { + writer.writeStartElement(prefix, "description", "http://java.sun.com/xml/ns/javaee"); + writeDescription(writer, description, context); + writer.writeEndElement(); + } + + // ELEMENT: name + JndiName name = managedExecutor.name; + if (name!= null) { + writer.writeStartElement(prefix, "name", "http://java.sun.com/xml/ns/javaee"); + writeJndiName(writer, name, context); + writer.writeEndElement(); + } + + // ELEMENT: contextService + JndiName contextService = managedExecutor.contextService; + if (contextService!= null) { + writer.writeStartElement(prefix, "context-service-ref", "http://java.sun.com/xml/ns/javaee"); + writeJndiName(writer, contextService, context); + writer.writeEndElement(); + } + + // ELEMENT: hungTaskThreshold + Long hungTaskThreshold = managedExecutor.hungTaskThreshold; + if (hungTaskThreshold!= null) { + writer.writeStartElement(prefix, "hung-task-threshold", "http://java.sun.com/xml/ns/javaee"); + writer.writeCharacters(Long.toString(hungTaskThreshold)); + writer.writeEndElement(); + } + + // ELEMENT: maxAsync + Integer maxAsync = managedExecutor.maxAsync; + if (maxAsync!= null) { + writer.writeStartElement(prefix, "max-async", "http://java.sun.com/xml/ns/javaee"); + writer.writeCharacters(Integer.toString(maxAsync)); + writer.writeEndElement(); + } + + // ELEMENT: properties + List properties = managedExecutor.properties; + if (properties!= null) { + for (Property propertiesItem: properties) { + if (propertiesItem!= null) { + writer.writeStartElement(prefix, "properties", "http://java.sun.com/xml/ns/javaee"); + writeProperty(writer, propertiesItem, context); + writer.writeEndElement(); + } + } + } + + context.afterMarshal(managedExecutor, LifecycleCallback.NONE); + } + +} diff --git a/container/openejb-jee-accessors/src/main/java/org/apache/openejb/jee/ManagedScheduledExecutor$JAXB.java b/container/openejb-jee-accessors/src/main/java/org/apache/openejb/jee/ManagedScheduledExecutor$JAXB.java new file mode 100644 index 00000000000..56ede4b696d --- /dev/null +++ b/container/openejb-jee-accessors/src/main/java/org/apache/openejb/jee/ManagedScheduledExecutor$JAXB.java @@ -0,0 +1,233 @@ +/** + * 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.openejb.jee; + +import java.util.ArrayList; +import java.util.List; +import javax.xml.XMLConstants; +import javax.xml.namespace.QName; +import org.apache.openejb.jee.jba.JndiName; +import org.apache.openejb.jee.jba.JndiName$JAXB; +import org.metatype.sxc.jaxb.JAXBObject; +import org.metatype.sxc.jaxb.LifecycleCallback; +import org.metatype.sxc.jaxb.RuntimeContext; +import org.metatype.sxc.util.Attribute; +import org.metatype.sxc.util.XoXMLStreamReader; +import org.metatype.sxc.util.XoXMLStreamWriter; + + +import static org.apache.openejb.jee.Description$JAXB.readDescription; +import static org.apache.openejb.jee.Description$JAXB.writeDescription; +import static org.apache.openejb.jee.Property$JAXB.readProperty; +import static org.apache.openejb.jee.Property$JAXB.writeProperty; +import static org.apache.openejb.jee.jba.JndiName$JAXB.readJndiName; +import static org.apache.openejb.jee.jba.JndiName$JAXB.writeJndiName; + +@SuppressWarnings({ + "StringEquality" +}) +public class ManagedScheduledExecutor$JAXB + extends JAXBObject +{ + + + public ManagedScheduledExecutor$JAXB() { + super(ManagedScheduledExecutor.class, null, new QName("http://java.sun.com/xml/ns/javaee".intern(), "managed-scheduled-executorType".intern()), Description$JAXB.class, JndiName$JAXB.class, Property$JAXB.class); + } + + public static ManagedScheduledExecutor readManagedScheduledExecutor(XoXMLStreamReader reader, RuntimeContext context) + throws Exception + { + return _read(reader, context); + } + + public static void writeManagedScheduledExecutor(XoXMLStreamWriter writer, ManagedScheduledExecutor managedScheduledExecutor, RuntimeContext context) + throws Exception + { + _write(writer, managedScheduledExecutor, context); + } + + public void write(XoXMLStreamWriter writer, ManagedScheduledExecutor managedScheduledExecutor, RuntimeContext context) + throws Exception + { + _write(writer, managedScheduledExecutor, context); + } + + public static final ManagedScheduledExecutor _read(XoXMLStreamReader reader, RuntimeContext context) + throws Exception + { + + // Check for xsi:nil + if (reader.isXsiNil()) { + return null; + } + + if (context == null) { + context = new RuntimeContext(); + } + + ManagedScheduledExecutor managedScheduledExecutor = new ManagedScheduledExecutor(); + context.beforeUnmarshal(managedScheduledExecutor, LifecycleCallback.NONE); + + List properties = null; + + // Check xsi:type + QName xsiType = reader.getXsiType(); + if (xsiType!= null) { + if (("managed-scheduled-executorType"!= xsiType.getLocalPart())||("http://java.sun.com/xml/ns/javaee"!= xsiType.getNamespaceURI())) { + return context.unexpectedXsiType(reader, ManagedScheduledExecutor.class); + } + } + + // Read attributes + for (Attribute attribute: reader.getAttributes()) { + if (XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI!= attribute.getNamespace()) { + context.unexpectedAttribute(attribute); + } + } + + // Read elements + for (XoXMLStreamReader elementReader: reader.getChildElements()) { + if (("description" == elementReader.getLocalName())&&("http://java.sun.com/xml/ns/javaee" == elementReader.getNamespaceURI())) { + // ELEMENT: description + Description description = readDescription(elementReader, context); + managedScheduledExecutor.description = description; + } else if (("name" == elementReader.getLocalName())&&("http://java.sun.com/xml/ns/javaee" == elementReader.getNamespaceURI())) { + // ELEMENT: name + JndiName name = readJndiName(elementReader, context); + managedScheduledExecutor.name = name; + } else if (("context-service-ref" == elementReader.getLocalName())&&("http://java.sun.com/xml/ns/javaee" == elementReader.getNamespaceURI())) { + // ELEMENT: contextService + JndiName contextService = readJndiName(elementReader, context); + managedScheduledExecutor.contextService = contextService; + } else if (("hung-task-threshold" == elementReader.getLocalName())&&("http://java.sun.com/xml/ns/javaee" == elementReader.getNamespaceURI())) { + // ELEMENT: hungTaskThreshold + Long hungTaskThreshold = Long.valueOf(elementReader.getElementText()); + managedScheduledExecutor.hungTaskThreshold = hungTaskThreshold; + } else if (("max-async" == elementReader.getLocalName())&&("http://java.sun.com/xml/ns/javaee" == elementReader.getNamespaceURI())) { + // ELEMENT: maxAsync + Integer maxAsync = Integer.valueOf(elementReader.getElementText()); + managedScheduledExecutor.maxAsync = maxAsync; + } else if (("property" == elementReader.getLocalName())&&("http://java.sun.com/xml/ns/javaee" == elementReader.getNamespaceURI())) { + // ELEMENT: properties + Property propertiesItem = readProperty(elementReader, context); + if (properties == null) { + properties = managedScheduledExecutor.properties; + if (properties!= null) { + properties.clear(); + } else { + properties = new ArrayList<>(); + } + } + properties.add(propertiesItem); + } else { + context.unexpectedElement(elementReader, new QName("http://java.sun.com/xml/ns/javaee", "description"), new QName("http://java.sun.com/xml/ns/javaee", "name"), new QName("http://java.sun.com/xml/ns/javaee", "context-service-ref"), new QName("http://java.sun.com/xml/ns/javaee", "hung-task-threshold"), new QName("http://java.sun.com/xml/ns/javaee", "max-async"), new QName("http://java.sun.com/xml/ns/javaee", "property")); + } + } + if (properties!= null) { + managedScheduledExecutor.properties = properties; + } + + context.afterUnmarshal(managedScheduledExecutor, LifecycleCallback.NONE); + + return managedScheduledExecutor; + } + + public final ManagedScheduledExecutor read(XoXMLStreamReader reader, RuntimeContext context) + throws Exception + { + return _read(reader, context); + } + + public static final void _write(XoXMLStreamWriter writer, ManagedScheduledExecutor managedScheduledExecutor, RuntimeContext context) + throws Exception + { + if (managedScheduledExecutor == null) { + writer.writeXsiNil(); + return ; + } + + if (context == null) { + context = new RuntimeContext(); + } + + String prefix = writer.getUniquePrefix("http://java.sun.com/xml/ns/javaee"); + if (ManagedScheduledExecutor.class!= managedScheduledExecutor.getClass()) { + context.unexpectedSubclass(writer, managedScheduledExecutor, ManagedScheduledExecutor.class); + return ; + } + + context.beforeMarshal(managedScheduledExecutor, LifecycleCallback.NONE); + + + // ELEMENT: description + Description description = managedScheduledExecutor.description; + if (description!= null) { + writer.writeStartElement(prefix, "description", "http://java.sun.com/xml/ns/javaee"); + writeDescription(writer, description, context); + writer.writeEndElement(); + } + + // ELEMENT: name + JndiName name = managedScheduledExecutor.name; + if (name!= null) { + writer.writeStartElement(prefix, "name", "http://java.sun.com/xml/ns/javaee"); + writeJndiName(writer, name, context); + writer.writeEndElement(); + } + + // ELEMENT: contextService + JndiName contextService = managedScheduledExecutor.contextService; + if (contextService!= null) { + writer.writeStartElement(prefix, "context-service-ref", "http://java.sun.com/xml/ns/javaee"); + writeJndiName(writer, contextService, context); + writer.writeEndElement(); + } + + // ELEMENT: hungTaskThreshold + Long hungTaskThreshold = managedScheduledExecutor.hungTaskThreshold; + if (hungTaskThreshold!= null) { + writer.writeStartElement(prefix, "hung-task-threshold", "http://java.sun.com/xml/ns/javaee"); + writer.writeCharacters(Long.toString(hungTaskThreshold)); + writer.writeEndElement(); + } + + // ELEMENT: maxAsync + Integer maxAsync = managedScheduledExecutor.maxAsync; + if (maxAsync!= null) { + writer.writeStartElement(prefix, "max-async", "http://java.sun.com/xml/ns/javaee"); + writer.writeCharacters(Integer.toString(maxAsync)); + writer.writeEndElement(); + } + + // ELEMENT: properties + List properties = managedScheduledExecutor.properties; + if (properties!= null) { + for (Property propertiesItem: properties) { + if (propertiesItem!= null) { + writer.writeStartElement(prefix, "property", "http://java.sun.com/xml/ns/javaee"); + writeProperty(writer, propertiesItem, context); + writer.writeEndElement(); + } + } + } + + context.afterMarshal(managedScheduledExecutor, LifecycleCallback.NONE); + } + +} diff --git a/container/openejb-jee-accessors/src/main/java/org/apache/openejb/jee/ManagedThreadFactory$JAXB.java b/container/openejb-jee-accessors/src/main/java/org/apache/openejb/jee/ManagedThreadFactory$JAXB.java new file mode 100644 index 00000000000..3abc843d507 --- /dev/null +++ b/container/openejb-jee-accessors/src/main/java/org/apache/openejb/jee/ManagedThreadFactory$JAXB.java @@ -0,0 +1,221 @@ +/** + * 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.openejb.jee; + +import java.util.ArrayList; +import java.util.List; +import javax.xml.XMLConstants; +import javax.xml.namespace.QName; +import org.apache.openejb.jee.jba.JndiName; +import org.apache.openejb.jee.jba.JndiName$JAXB; +import org.metatype.sxc.jaxb.JAXBObject; +import org.metatype.sxc.jaxb.LifecycleCallback; +import org.metatype.sxc.jaxb.RuntimeContext; +import org.metatype.sxc.util.Attribute; +import org.metatype.sxc.util.XoXMLStreamReader; +import org.metatype.sxc.util.XoXMLStreamWriter; + + +import static org.apache.openejb.jee.Description$JAXB.readDescription; +import static org.apache.openejb.jee.Description$JAXB.writeDescription; +import static org.apache.openejb.jee.Property$JAXB.readProperty; +import static org.apache.openejb.jee.Property$JAXB.writeProperty; +import static org.apache.openejb.jee.jba.JndiName$JAXB.readJndiName; +import static org.apache.openejb.jee.jba.JndiName$JAXB.writeJndiName; + +@SuppressWarnings({ + "StringEquality" +}) +public class ManagedThreadFactory$JAXB + extends JAXBObject +{ + + + public ManagedThreadFactory$JAXB() { + super(ManagedThreadFactory.class, null, new QName("http://java.sun.com/xml/ns/javaee".intern(), "managed-thread-factoryType".intern()), Description$JAXB.class, JndiName$JAXB.class, Property$JAXB.class); + } + + public static ManagedThreadFactory readManagedThreadFactory(XoXMLStreamReader reader, RuntimeContext context) + throws Exception + { + return _read(reader, context); + } + + public static void writeManagedThreadFactory(XoXMLStreamWriter writer, ManagedThreadFactory managedThreadFactory, RuntimeContext context) + throws Exception + { + _write(writer, managedThreadFactory, context); + } + + public void write(XoXMLStreamWriter writer, ManagedThreadFactory managedThreadFactory, RuntimeContext context) + throws Exception + { + _write(writer, managedThreadFactory, context); + } + + public static final ManagedThreadFactory _read(XoXMLStreamReader reader, RuntimeContext context) + throws Exception + { + + // Check for xsi:nil + if (reader.isXsiNil()) { + return null; + } + + if (context == null) { + context = new RuntimeContext(); + } + + ManagedThreadFactory managedThreadFactory = new ManagedThreadFactory(); + context.beforeUnmarshal(managedThreadFactory, LifecycleCallback.NONE); + + List properties = null; + + // Check xsi:type + QName xsiType = reader.getXsiType(); + if (xsiType!= null) { + if (("managed-thread-factoryType"!= xsiType.getLocalPart())||("http://java.sun.com/xml/ns/javaee"!= xsiType.getNamespaceURI())) { + return context.unexpectedXsiType(reader, ManagedThreadFactory.class); + } + } + + // Read attributes + for (Attribute attribute: reader.getAttributes()) { + if (XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI!= attribute.getNamespace()) { + context.unexpectedAttribute(attribute); + } + } + + // Read elements + for (XoXMLStreamReader elementReader: reader.getChildElements()) { + if (("description" == elementReader.getLocalName())&&("http://java.sun.com/xml/ns/javaee" == elementReader.getNamespaceURI())) { + // ELEMENT: description + Description description = readDescription(elementReader, context); + managedThreadFactory.description = description; + } else if (("name" == elementReader.getLocalName())&&("http://java.sun.com/xml/ns/javaee" == elementReader.getNamespaceURI())) { + // ELEMENT: name + JndiName name = readJndiName(elementReader, context); + managedThreadFactory.name = name; + } else if (("context-service-ref" == elementReader.getLocalName())&&("http://java.sun.com/xml/ns/javaee" == elementReader.getNamespaceURI())) { + // ELEMENT: contextService + JndiName contextService = readJndiName(elementReader, context); + managedThreadFactory.contextService = contextService; + } else if (("priority" == elementReader.getLocalName())&&("http://java.sun.com/xml/ns/javaee" == elementReader.getNamespaceURI())) { + // ELEMENT: priority + Integer priority = Integer.valueOf(elementReader.getElementText()); + managedThreadFactory.priority = priority; + } else if (("property" == elementReader.getLocalName())&&("http://java.sun.com/xml/ns/javaee" == elementReader.getNamespaceURI())) { + // ELEMENT: properties + Property propertiesItem = readProperty(elementReader, context); + if (properties == null) { + properties = managedThreadFactory.properties; + if (properties!= null) { + properties.clear(); + } else { + properties = new ArrayList<>(); + } + } + properties.add(propertiesItem); + } else { + context.unexpectedElement(elementReader, new QName("http://java.sun.com/xml/ns/javaee", "description"), new QName("http://java.sun.com/xml/ns/javaee", "name"), new QName("http://java.sun.com/xml/ns/javaee", "context-service-ref"), new QName("http://java.sun.com/xml/ns/javaee", "priority"), new QName("http://java.sun.com/xml/ns/javaee", "property")); + } + } + if (properties!= null) { + managedThreadFactory.properties = properties; + } + + context.afterUnmarshal(managedThreadFactory, LifecycleCallback.NONE); + + return managedThreadFactory; + } + + public final ManagedThreadFactory read(XoXMLStreamReader reader, RuntimeContext context) + throws Exception + { + return _read(reader, context); + } + + public static final void _write(XoXMLStreamWriter writer, ManagedThreadFactory managedThreadFactory, RuntimeContext context) + throws Exception + { + if (managedThreadFactory == null) { + writer.writeXsiNil(); + return ; + } + + if (context == null) { + context = new RuntimeContext(); + } + + String prefix = writer.getUniquePrefix("http://java.sun.com/xml/ns/javaee"); + if (ManagedThreadFactory.class!= managedThreadFactory.getClass()) { + context.unexpectedSubclass(writer, managedThreadFactory, ManagedThreadFactory.class); + return ; + } + + context.beforeMarshal(managedThreadFactory, LifecycleCallback.NONE); + + + // ELEMENT: description + Description description = managedThreadFactory.description; + if (description!= null) { + writer.writeStartElement(prefix, "description", "http://java.sun.com/xml/ns/javaee"); + writeDescription(writer, description, context); + writer.writeEndElement(); + } + + // ELEMENT: name + JndiName name = managedThreadFactory.name; + if (name!= null) { + writer.writeStartElement(prefix, "name", "http://java.sun.com/xml/ns/javaee"); + writeJndiName(writer, name, context); + writer.writeEndElement(); + } + + // ELEMENT: contextService + JndiName contextService = managedThreadFactory.contextService; + if (contextService!= null) { + writer.writeStartElement(prefix, "context-service-ref", "http://java.sun.com/xml/ns/javaee"); + writeJndiName(writer, contextService, context); + writer.writeEndElement(); + } + + // ELEMENT: priority + Integer priority = managedThreadFactory.priority; + if (priority!= null) { + writer.writeStartElement(prefix, "priority", "http://java.sun.com/xml/ns/javaee"); + writer.writeCharacters(Integer.toString(priority)); + writer.writeEndElement(); + } + + // ELEMENT: properties + List properties = managedThreadFactory.properties; + if (properties!= null) { + for (Property propertiesItem: properties) { + if (propertiesItem!= null) { + writer.writeStartElement(prefix, "property", "http://java.sun.com/xml/ns/javaee"); + writeProperty(writer, propertiesItem, context); + writer.writeEndElement(); + } + } + } + + context.afterMarshal(managedThreadFactory, LifecycleCallback.NONE); + } + +} diff --git a/container/openejb-jee-accessors/src/main/java/org/apache/openejb/jee/MessageDrivenBean$JAXB.java b/container/openejb-jee-accessors/src/main/java/org/apache/openejb/jee/MessageDrivenBean$JAXB.java index dd375b1dc98..c2bb2aff253 100644 --- a/container/openejb-jee-accessors/src/main/java/org/apache/openejb/jee/MessageDrivenBean$JAXB.java +++ b/container/openejb-jee-accessors/src/main/java/org/apache/openejb/jee/MessageDrivenBean$JAXB.java @@ -53,6 +53,12 @@ import static org.apache.openejb.jee.JMSDestination$JAXB.writeJMSDestination; import static org.apache.openejb.jee.LifecycleCallback$JAXB.readLifecycleCallback; import static org.apache.openejb.jee.LifecycleCallback$JAXB.writeLifecycleCallback; +import static org.apache.openejb.jee.ManagedExecutor$JAXB.readManagedExecutor; +import static org.apache.openejb.jee.ManagedExecutor$JAXB.writeManagedExecutor; +import static org.apache.openejb.jee.ManagedScheduledExecutor$JAXB.readManagedScheduledExecutor; +import static org.apache.openejb.jee.ManagedScheduledExecutor$JAXB.writeManagedScheduledExecutor; +import static org.apache.openejb.jee.ManagedThreadFactory$JAXB.readManagedThreadFactory; +import static org.apache.openejb.jee.ManagedThreadFactory$JAXB.writeManagedThreadFactory; import static org.apache.openejb.jee.MessageDestinationRef$JAXB.readMessageDestinationRef; import static org.apache.openejb.jee.MessageDestinationRef$JAXB.writeMessageDestinationRef; import static org.apache.openejb.jee.MessageDrivenDestination$JAXB.readMessageDrivenDestination; @@ -89,7 +95,7 @@ public class MessageDrivenBean$JAXB public MessageDrivenBean$JAXB() { - super(MessageDrivenBean.class, null, new QName("http://java.sun.com/xml/ns/javaee".intern(), "message-driven-beanType".intern()), Text$JAXB.class, Icon$JAXB.class, NamedMethod$JAXB.class, Timer$JAXB.class, TransactionType$JAXB.class, MessageDrivenDestination$JAXB.class, ActivationConfig$JAXB.class, AroundInvoke$JAXB.class, AroundTimeout$JAXB.class, EnvEntry$JAXB.class, EjbRef$JAXB.class, EjbLocalRef$JAXB.class, ServiceRef$JAXB.class, ResourceRef$JAXB.class, ResourceEnvRef$JAXB.class, MessageDestinationRef$JAXB.class, PersistenceContextRef$JAXB.class, PersistenceUnitRef$JAXB.class, LifecycleCallback$JAXB.class, DataSource$JAXB.class, JMSConnectionFactory$JAXB.class, JMSDestination$JAXB.class, SecurityRoleRef$JAXB.class, SecurityIdentity$JAXB.class, ContextService$JAXB.class); + super(MessageDrivenBean.class, null, new QName("http://java.sun.com/xml/ns/javaee".intern(), "message-driven-beanType".intern()), Text$JAXB.class, Icon$JAXB.class, NamedMethod$JAXB.class, Timer$JAXB.class, TransactionType$JAXB.class, MessageDrivenDestination$JAXB.class, ActivationConfig$JAXB.class, AroundInvoke$JAXB.class, AroundTimeout$JAXB.class, EnvEntry$JAXB.class, EjbRef$JAXB.class, EjbLocalRef$JAXB.class, ServiceRef$JAXB.class, ResourceRef$JAXB.class, ResourceEnvRef$JAXB.class, MessageDestinationRef$JAXB.class, PersistenceContextRef$JAXB.class, PersistenceUnitRef$JAXB.class, LifecycleCallback$JAXB.class, DataSource$JAXB.class, JMSConnectionFactory$JAXB.class, JMSDestination$JAXB.class, SecurityRoleRef$JAXB.class, SecurityIdentity$JAXB.class, ContextService$JAXB.class, ManagedExecutor$JAXB.class, ManagedScheduledExecutor$JAXB.class, ManagedThreadFactory$JAXB.class); } public static MessageDrivenBean readMessageDrivenBean(XoXMLStreamReader reader, RuntimeContext context) @@ -148,6 +154,9 @@ public static final MessageDrivenBean _read(XoXMLStreamReader reader, RuntimeCon KeyedCollection jmsDestinations = null; List securityRoleRef = null; KeyedCollection contextService = null; + KeyedCollection managedExecutor = null; + KeyedCollection managedScheduledExecutor = null; + KeyedCollection managedThreadFactory = null; // Check xsi:type QName xsiType = reader.getXsiType(); @@ -563,8 +572,44 @@ public static final MessageDrivenBean _read(XoXMLStreamReader reader, RuntimeCon } } contextService.add(contextServiceItem); + } else if (("managed-executor" == elementReader.getLocalName())&&("http://java.sun.com/xml/ns/javaee" == elementReader.getNamespaceURI())) { + // ELEMENT: managedExecutor + ManagedExecutor managedExecutorItem = readManagedExecutor(elementReader, context); + if (managedExecutor == null) { + managedExecutor = messageDrivenBean.managedExecutor; + if (managedExecutor!= null) { + managedExecutor.clear(); + } else { + managedExecutor = new KeyedCollection<>(); + } + } + managedExecutor.add(managedExecutorItem); + } else if (("managed-scheduled-executor" == elementReader.getLocalName())&&("http://java.sun.com/xml/ns/javaee" == elementReader.getNamespaceURI())) { + // ELEMENT: managedScheduledExecutor + ManagedScheduledExecutor managedScheduledExecutorItem = readManagedScheduledExecutor(elementReader, context); + if (managedScheduledExecutor == null) { + managedScheduledExecutor = messageDrivenBean.managedScheduledExecutor; + if (managedScheduledExecutor!= null) { + managedScheduledExecutor.clear(); + } else { + managedScheduledExecutor = new KeyedCollection<>(); + } + } + managedScheduledExecutor.add(managedScheduledExecutorItem); + } else if (("managed-thread-factory" == elementReader.getLocalName())&&("http://java.sun.com/xml/ns/javaee" == elementReader.getNamespaceURI())) { + // ELEMENT: managedThreadFactory + ManagedThreadFactory managedThreadFactoryItem = readManagedThreadFactory(elementReader, context); + if (managedThreadFactory == null) { + managedThreadFactory = messageDrivenBean.managedThreadFactory; + if (managedThreadFactory!= null) { + managedThreadFactory.clear(); + } else { + managedThreadFactory = new KeyedCollection<>(); + } + } + managedThreadFactory.add(managedThreadFactoryItem); } else { - context.unexpectedElement(elementReader, new QName("http://java.sun.com/xml/ns/javaee", "description"), new QName("http://java.sun.com/xml/ns/javaee", "display-name"), new QName("http://java.sun.com/xml/ns/javaee", "icon"), new QName("http://java.sun.com/xml/ns/javaee", "ejb-name"), new QName("http://java.sun.com/xml/ns/javaee", "mapped-name"), new QName("http://java.sun.com/xml/ns/javaee", "ejb-class"), new QName("http://java.sun.com/xml/ns/javaee", "messaging-type"), new QName("http://java.sun.com/xml/ns/javaee", "timeout-method"), new QName("http://java.sun.com/xml/ns/javaee", "timer"), new QName("http://java.sun.com/xml/ns/javaee", "transaction-type"), new QName("http://java.sun.com/xml/ns/javaee", "message-selector"), new QName("http://java.sun.com/xml/ns/javaee", "acknowledge-mode"), new QName("http://java.sun.com/xml/ns/javaee", "message-driven-destination"), new QName("http://java.sun.com/xml/ns/javaee", "message-destination-type"), new QName("http://java.sun.com/xml/ns/javaee", "message-destination-link"), new QName("http://java.sun.com/xml/ns/javaee", "activation-config"), new QName("http://java.sun.com/xml/ns/javaee", "around-invoke"), new QName("http://java.sun.com/xml/ns/javaee", "around-timeout"), new QName("http://java.sun.com/xml/ns/javaee", "env-entry"), new QName("http://java.sun.com/xml/ns/javaee", "ejb-ref"), new QName("http://java.sun.com/xml/ns/javaee", "ejb-local-ref"), new QName("http://java.sun.com/xml/ns/javaee", "service-ref"), new QName("http://java.sun.com/xml/ns/javaee", "resource-ref"), new QName("http://java.sun.com/xml/ns/javaee", "resource-env-ref"), new QName("http://java.sun.com/xml/ns/javaee", "message-destination-ref"), new QName("http://java.sun.com/xml/ns/javaee", "persistence-context-ref"), new QName("http://java.sun.com/xml/ns/javaee", "persistence-unit-ref"), new QName("http://java.sun.com/xml/ns/javaee", "post-construct"), new QName("http://java.sun.com/xml/ns/javaee", "pre-destroy"), new QName("http://java.sun.com/xml/ns/javaee", "data-source"), new QName("http://java.sun.com/xml/ns/javaee", "jms-connection-factory"), new QName("http://java.sun.com/xml/ns/javaee", "jms-destination"), new QName("http://java.sun.com/xml/ns/javaee", "security-role-ref"), new QName("http://java.sun.com/xml/ns/javaee", "security-identity"), new QName("http://java.sun.com/xml/ns/javaee", "context-service")); + context.unexpectedElement(elementReader, new QName("http://java.sun.com/xml/ns/javaee", "description"), new QName("http://java.sun.com/xml/ns/javaee", "display-name"), new QName("http://java.sun.com/xml/ns/javaee", "icon"), new QName("http://java.sun.com/xml/ns/javaee", "ejb-name"), new QName("http://java.sun.com/xml/ns/javaee", "mapped-name"), new QName("http://java.sun.com/xml/ns/javaee", "ejb-class"), new QName("http://java.sun.com/xml/ns/javaee", "messaging-type"), new QName("http://java.sun.com/xml/ns/javaee", "timeout-method"), new QName("http://java.sun.com/xml/ns/javaee", "timer"), new QName("http://java.sun.com/xml/ns/javaee", "transaction-type"), new QName("http://java.sun.com/xml/ns/javaee", "message-selector"), new QName("http://java.sun.com/xml/ns/javaee", "acknowledge-mode"), new QName("http://java.sun.com/xml/ns/javaee", "message-driven-destination"), new QName("http://java.sun.com/xml/ns/javaee", "message-destination-type"), new QName("http://java.sun.com/xml/ns/javaee", "message-destination-link"), new QName("http://java.sun.com/xml/ns/javaee", "activation-config"), new QName("http://java.sun.com/xml/ns/javaee", "around-invoke"), new QName("http://java.sun.com/xml/ns/javaee", "around-timeout"), new QName("http://java.sun.com/xml/ns/javaee", "env-entry"), new QName("http://java.sun.com/xml/ns/javaee", "ejb-ref"), new QName("http://java.sun.com/xml/ns/javaee", "ejb-local-ref"), new QName("http://java.sun.com/xml/ns/javaee", "service-ref"), new QName("http://java.sun.com/xml/ns/javaee", "resource-ref"), new QName("http://java.sun.com/xml/ns/javaee", "resource-env-ref"), new QName("http://java.sun.com/xml/ns/javaee", "message-destination-ref"), new QName("http://java.sun.com/xml/ns/javaee", "persistence-context-ref"), new QName("http://java.sun.com/xml/ns/javaee", "persistence-unit-ref"), new QName("http://java.sun.com/xml/ns/javaee", "post-construct"), new QName("http://java.sun.com/xml/ns/javaee", "pre-destroy"), new QName("http://java.sun.com/xml/ns/javaee", "data-source"), new QName("http://java.sun.com/xml/ns/javaee", "jms-connection-factory"), new QName("http://java.sun.com/xml/ns/javaee", "jms-destination"), new QName("http://java.sun.com/xml/ns/javaee", "security-role-ref"), new QName("http://java.sun.com/xml/ns/javaee", "security-identity"), new QName("http://java.sun.com/xml/ns/javaee", "context-service"), new QName("http://java.sun.com/xml/ns/javaee", "managed-executor"), new QName("http://java.sun.com/xml/ns/javaee", "managed-scheduled-executor"), new QName("http://java.sun.com/xml/ns/javaee", "managed-thread-factory")); } } if (descriptions!= null) { @@ -641,6 +686,15 @@ public static final MessageDrivenBean _read(XoXMLStreamReader reader, RuntimeCon if (contextService!= null) { messageDrivenBean.contextService = contextService; } + if (managedExecutor!= null) { + messageDrivenBean.managedExecutor = managedExecutor; + } + if (managedScheduledExecutor!= null) { + messageDrivenBean.managedScheduledExecutor = managedScheduledExecutor; + } + if (managedThreadFactory!= null) { + messageDrivenBean.managedThreadFactory = managedThreadFactory; + } context.afterUnmarshal(messageDrivenBean, org.metatype.sxc.jaxb.LifecycleCallback.NONE); @@ -1167,6 +1221,42 @@ public static final void _write(XoXMLStreamWriter writer, MessageDrivenBean mess } } + // ELEMENT: managedExecutor + KeyedCollection managedExecutor = messageDrivenBean.managedExecutor; + if (managedExecutor!= null) { + for (ManagedExecutor managedExecutorItem: managedExecutor) { + if (managedExecutorItem!= null) { + writer.writeStartElement(prefix, "managed-executor", "http://java.sun.com/xml/ns/javaee"); + writeManagedExecutor(writer, managedExecutorItem, context); + writer.writeEndElement(); + } + } + } + + // ELEMENT: managedScheduledExecutor + KeyedCollection managedScheduledExecutor = messageDrivenBean.managedScheduledExecutor; + if (managedScheduledExecutor!= null) { + for (ManagedScheduledExecutor managedScheduledExecutorItem: managedScheduledExecutor) { + if (managedScheduledExecutorItem!= null) { + writer.writeStartElement(prefix, "managed-scheduled-executor", "http://java.sun.com/xml/ns/javaee"); + writeManagedScheduledExecutor(writer, managedScheduledExecutorItem, context); + writer.writeEndElement(); + } + } + } + + // ELEMENT: managedThreadFactory + KeyedCollection managedThreadFactory = messageDrivenBean.managedThreadFactory; + if (managedThreadFactory!= null) { + for (ManagedThreadFactory managedThreadFactoryItem: managedThreadFactory) { + if (managedThreadFactoryItem!= null) { + writer.writeStartElement(prefix, "managed-thread-factory", "http://java.sun.com/xml/ns/javaee"); + writeManagedThreadFactory(writer, managedThreadFactoryItem, context); + writer.writeEndElement(); + } + } + } + context.afterMarshal(messageDrivenBean, org.metatype.sxc.jaxb.LifecycleCallback.NONE); } diff --git a/container/openejb-jee-accessors/src/main/java/org/apache/openejb/jee/ObjectFactory$JAXB.java b/container/openejb-jee-accessors/src/main/java/org/apache/openejb/jee/ObjectFactory$JAXB.java index d1f3d7cef8c..1791a62848c 100644 --- a/container/openejb-jee-accessors/src/main/java/org/apache/openejb/jee/ObjectFactory$JAXB.java +++ b/container/openejb-jee-accessors/src/main/java/org/apache/openejb/jee/ObjectFactory$JAXB.java @@ -31,14 +31,14 @@ public class ObjectFactory$JAXB private final Map> rootElements = new HashMap<>(); public ObjectFactory$JAXB() { - super(ObjectFactory.class, Application$JAXB.class, ApplicationClient$JAXB.class, EjbJar$JAXB.class, EjbRelationshipRole$JAXB.class, Text$JAXB.class, WebApp$JAXB.class, TldTaglib$JAXB.class, Connector$JAXB.class, Webservices$JAXB.class, JavaWsdlMapping$JAXB.class, FacesConfig$JAXB.class, WebFragment$JAXB.class); - rootElements.put(new QName("http://java.sun.com/xml/ns/javaee".intern(), "application".intern()), Application$JAXB.class); - rootElements.put(new QName("http://java.sun.com/xml/ns/javaee".intern(), "application-client".intern()), ApplicationClient$JAXB.class); - rootElements.put(new QName("http://java.sun.com/xml/ns/javaee".intern(), "ejb-jar".intern()), EjbJar$JAXB.class); + super(ObjectFactory.class, EjbRelationshipRole$JAXB.class, Text$JAXB.class, Application$JAXB.class, ApplicationClient$JAXB.class, EjbJar$JAXB.class, WebApp$JAXB.class, TldTaglib$JAXB.class, Connector$JAXB.class, Webservices$JAXB.class, JavaWsdlMapping$JAXB.class, FacesConfig$JAXB.class, WebFragment$JAXB.class); rootElements.put(new QName("http://java.sun.com/xml/ns/javaee".intern(), "ejb-relation-name".intern()), org.metatype.sxc.jaxb.StandardJAXBObjects.StringJAXB.class); rootElements.put(new QName("http://java.sun.com/xml/ns/javaee".intern(), "ejb-relationship-role".intern()), EjbRelationshipRole$JAXB.class); rootElements.put(new QName("http://java.sun.com/xml/ns/javaee".intern(), "description".intern()), Text$JAXB.class); rootElements.put(new QName("http://java.sun.com/xml/ns/javaee".intern(), "http-method".intern()), org.metatype.sxc.jaxb.StandardJAXBObjects.StringJAXB.class); + rootElements.put(new QName("http://java.sun.com/xml/ns/javaee".intern(), "application".intern()), Application$JAXB.class); + rootElements.put(new QName("http://java.sun.com/xml/ns/javaee".intern(), "application-client".intern()), ApplicationClient$JAXB.class); + rootElements.put(new QName("http://java.sun.com/xml/ns/javaee".intern(), "ejb-jar".intern()), EjbJar$JAXB.class); rootElements.put(new QName("http://java.sun.com/xml/ns/javaee".intern(), "web-app".intern()), WebApp$JAXB.class); rootElements.put(new QName("http://java.sun.com/xml/ns/javaee".intern(), "taglib".intern()), TldTaglib$JAXB.class); rootElements.put(new QName("http://java.sun.com/xml/ns/j2ee".intern(), "connector".intern()), Connector$JAXB.class); diff --git a/container/openejb-jee-accessors/src/main/java/org/apache/openejb/jee/SessionBean$JAXB.java b/container/openejb-jee-accessors/src/main/java/org/apache/openejb/jee/SessionBean$JAXB.java index 859f19aa3a1..940905f404b 100644 --- a/container/openejb-jee-accessors/src/main/java/org/apache/openejb/jee/SessionBean$JAXB.java +++ b/container/openejb-jee-accessors/src/main/java/org/apache/openejb/jee/SessionBean$JAXB.java @@ -64,6 +64,12 @@ import static org.apache.openejb.jee.LifecycleCallback$JAXB.writeLifecycleCallback; import static org.apache.openejb.jee.ManagedBean$JAXB.readManagedBean; import static org.apache.openejb.jee.ManagedBean$JAXB.writeManagedBean; +import static org.apache.openejb.jee.ManagedExecutor$JAXB.readManagedExecutor; +import static org.apache.openejb.jee.ManagedExecutor$JAXB.writeManagedExecutor; +import static org.apache.openejb.jee.ManagedScheduledExecutor$JAXB.readManagedScheduledExecutor; +import static org.apache.openejb.jee.ManagedScheduledExecutor$JAXB.writeManagedScheduledExecutor; +import static org.apache.openejb.jee.ManagedThreadFactory$JAXB.readManagedThreadFactory; +import static org.apache.openejb.jee.ManagedThreadFactory$JAXB.writeManagedThreadFactory; import static org.apache.openejb.jee.MessageDestinationRef$JAXB.readMessageDestinationRef; import static org.apache.openejb.jee.MessageDestinationRef$JAXB.writeMessageDestinationRef; import static org.apache.openejb.jee.NamedMethod$JAXB.readNamedMethod; @@ -110,7 +116,7 @@ public class SessionBean$JAXB public SessionBean$JAXB() { - super(SessionBean.class, null, new QName("http://java.sun.com/xml/ns/javaee".intern(), "session-beanType".intern()), Text$JAXB.class, Icon$JAXB.class, Empty$JAXB.class, SessionType$JAXB.class, Timeout$JAXB.class, NamedMethod$JAXB.class, Timer$JAXB.class, ConcurrencyManagementType$JAXB.class, ConcurrentMethod$JAXB.class, InitMethod$JAXB.class, RemoveMethod$JAXB.class, AsyncMethod$JAXB.class, TransactionType$JAXB.class, AroundInvoke$JAXB.class, AroundTimeout$JAXB.class, EnvEntry$JAXB.class, EjbRef$JAXB.class, EjbLocalRef$JAXB.class, ServiceRef$JAXB.class, ResourceRef$JAXB.class, ResourceEnvRef$JAXB.class, MessageDestinationRef$JAXB.class, PersistenceContextRef$JAXB.class, PersistenceUnitRef$JAXB.class, LifecycleCallback$JAXB.class, DataSource$JAXB.class, JMSConnectionFactory$JAXB.class, JMSDestination$JAXB.class, SecurityRoleRef$JAXB.class, SecurityIdentity$JAXB.class, ContextService$JAXB.class, StatelessBean$JAXB.class, StatefulBean$JAXB.class, SingletonBean$JAXB.class, ManagedBean$JAXB.class); + super(SessionBean.class, null, new QName("http://java.sun.com/xml/ns/javaee".intern(), "session-beanType".intern()), Text$JAXB.class, Icon$JAXB.class, Empty$JAXB.class, SessionType$JAXB.class, Timeout$JAXB.class, NamedMethod$JAXB.class, Timer$JAXB.class, ConcurrencyManagementType$JAXB.class, ConcurrentMethod$JAXB.class, InitMethod$JAXB.class, RemoveMethod$JAXB.class, AsyncMethod$JAXB.class, TransactionType$JAXB.class, AroundInvoke$JAXB.class, AroundTimeout$JAXB.class, EnvEntry$JAXB.class, EjbRef$JAXB.class, EjbLocalRef$JAXB.class, ServiceRef$JAXB.class, ResourceRef$JAXB.class, ResourceEnvRef$JAXB.class, MessageDestinationRef$JAXB.class, PersistenceContextRef$JAXB.class, PersistenceUnitRef$JAXB.class, LifecycleCallback$JAXB.class, DataSource$JAXB.class, JMSConnectionFactory$JAXB.class, JMSDestination$JAXB.class, SecurityRoleRef$JAXB.class, SecurityIdentity$JAXB.class, ContextService$JAXB.class, ManagedExecutor$JAXB.class, ManagedScheduledExecutor$JAXB.class, ManagedThreadFactory$JAXB.class, StatelessBean$JAXB.class, StatefulBean$JAXB.class, SingletonBean$JAXB.class, ManagedBean$JAXB.class); } public static SessionBean readSessionBean(XoXMLStreamReader reader, RuntimeContext context) @@ -177,6 +183,9 @@ public static final SessionBean _read(XoXMLStreamReader reader, RuntimeContext c List prePassivate = null; List securityRoleRef = null; KeyedCollection contextService = null; + KeyedCollection managedExecutor = null; + KeyedCollection managedScheduledExecutor = null; + KeyedCollection managedThreadFactory = null; // Check xsi:type QName xsiType = reader.getXsiType(); @@ -749,8 +758,44 @@ public static final SessionBean _read(XoXMLStreamReader reader, RuntimeContext c } } contextService.add(contextServiceItem); + } else if (("managed-executor" == elementReader.getLocalName())&&("http://java.sun.com/xml/ns/javaee" == elementReader.getNamespaceURI())) { + // ELEMENT: managedExecutor + ManagedExecutor managedExecutorItem = readManagedExecutor(elementReader, context); + if (managedExecutor == null) { + managedExecutor = sessionBean.managedExecutor; + if (managedExecutor!= null) { + managedExecutor.clear(); + } else { + managedExecutor = new KeyedCollection<>(); + } + } + managedExecutor.add(managedExecutorItem); + } else if (("managed-scheduled-executor" == elementReader.getLocalName())&&("http://java.sun.com/xml/ns/javaee" == elementReader.getNamespaceURI())) { + // ELEMENT: managedScheduledExecutor + ManagedScheduledExecutor managedScheduledExecutorItem = readManagedScheduledExecutor(elementReader, context); + if (managedScheduledExecutor == null) { + managedScheduledExecutor = sessionBean.managedScheduledExecutor; + if (managedScheduledExecutor!= null) { + managedScheduledExecutor.clear(); + } else { + managedScheduledExecutor = new KeyedCollection<>(); + } + } + managedScheduledExecutor.add(managedScheduledExecutorItem); + } else if (("managed-thread-factory" == elementReader.getLocalName())&&("http://java.sun.com/xml/ns/javaee" == elementReader.getNamespaceURI())) { + // ELEMENT: managedThreadFactory + ManagedThreadFactory managedThreadFactoryItem = readManagedThreadFactory(elementReader, context); + if (managedThreadFactory == null) { + managedThreadFactory = sessionBean.managedThreadFactory; + if (managedThreadFactory!= null) { + managedThreadFactory.clear(); + } else { + managedThreadFactory = new KeyedCollection<>(); + } + } + managedThreadFactory.add(managedThreadFactoryItem); } else { - context.unexpectedElement(elementReader, new QName("http://java.sun.com/xml/ns/javaee", "description"), new QName("http://java.sun.com/xml/ns/javaee", "display-name"), new QName("http://java.sun.com/xml/ns/javaee", "icon"), new QName("http://java.sun.com/xml/ns/javaee", "ejb-name"), new QName("http://java.sun.com/xml/ns/javaee", "mapped-name"), new QName("http://java.sun.com/xml/ns/javaee", "home"), new QName("http://java.sun.com/xml/ns/javaee", "remote"), new QName("http://java.sun.com/xml/ns/javaee", "local-home"), new QName("http://java.sun.com/xml/ns/javaee", "local"), new QName("http://java.sun.com/xml/ns/javaee", "business-local"), new QName("http://java.sun.com/xml/ns/javaee", "business-remote"), new QName("http://java.sun.com/xml/ns/javaee", "local-bean"), new QName("http://java.sun.com/xml/ns/javaee", "service-endpoint"), new QName("http://java.sun.com/xml/ns/javaee", "ejb-class"), new QName("http://java.sun.com/xml/ns/javaee", "session-type"), new QName("http://java.sun.com/xml/ns/javaee", "stateful-timeout"), new QName("http://java.sun.com/xml/ns/javaee", "timeout-method"), new QName("http://java.sun.com/xml/ns/javaee", "timer"), new QName("http://java.sun.com/xml/ns/javaee", "init-on-startup"), new QName("http://java.sun.com/xml/ns/javaee", "concurrency-management-type"), new QName("http://java.sun.com/xml/ns/javaee", "concurrent-method"), new QName("http://java.sun.com/xml/ns/javaee", "depends-on"), new QName("http://java.sun.com/xml/ns/javaee", "init-method"), new QName("http://java.sun.com/xml/ns/javaee", "remove-method"), new QName("http://java.sun.com/xml/ns/javaee", "async-method"), new QName("http://java.sun.com/xml/ns/javaee", "transaction-type"), new QName("http://java.sun.com/xml/ns/javaee", "after-begin-method"), new QName("http://java.sun.com/xml/ns/javaee", "before-completion-method"), new QName("http://java.sun.com/xml/ns/javaee", "after-completion-method"), new QName("http://java.sun.com/xml/ns/javaee", "around-invoke"), new QName("http://java.sun.com/xml/ns/javaee", "around-timeout"), new QName("http://java.sun.com/xml/ns/javaee", "env-entry"), new QName("http://java.sun.com/xml/ns/javaee", "ejb-ref"), new QName("http://java.sun.com/xml/ns/javaee", "ejb-local-ref"), new QName("http://java.sun.com/xml/ns/javaee", "service-ref"), new QName("http://java.sun.com/xml/ns/javaee", "resource-ref"), new QName("http://java.sun.com/xml/ns/javaee", "resource-env-ref"), new QName("http://java.sun.com/xml/ns/javaee", "message-destination-ref"), new QName("http://java.sun.com/xml/ns/javaee", "persistence-context-ref"), new QName("http://java.sun.com/xml/ns/javaee", "persistence-unit-ref"), new QName("http://java.sun.com/xml/ns/javaee", "post-construct"), new QName("http://java.sun.com/xml/ns/javaee", "pre-destroy"), new QName("http://java.sun.com/xml/ns/javaee", "data-source"), new QName("http://java.sun.com/xml/ns/javaee", "jms-connection-factory"), new QName("http://java.sun.com/xml/ns/javaee", "jms-destination"), new QName("http://java.sun.com/xml/ns/javaee", "post-activate"), new QName("http://java.sun.com/xml/ns/javaee", "pre-passivate"), new QName("http://java.sun.com/xml/ns/javaee", "security-role-ref"), new QName("http://java.sun.com/xml/ns/javaee", "security-identity"), new QName("http://java.sun.com/xml/ns/javaee", "passivation-capable"), new QName("http://java.sun.com/xml/ns/javaee", "context-service")); + context.unexpectedElement(elementReader, new QName("http://java.sun.com/xml/ns/javaee", "description"), new QName("http://java.sun.com/xml/ns/javaee", "display-name"), new QName("http://java.sun.com/xml/ns/javaee", "icon"), new QName("http://java.sun.com/xml/ns/javaee", "ejb-name"), new QName("http://java.sun.com/xml/ns/javaee", "mapped-name"), new QName("http://java.sun.com/xml/ns/javaee", "home"), new QName("http://java.sun.com/xml/ns/javaee", "remote"), new QName("http://java.sun.com/xml/ns/javaee", "local-home"), new QName("http://java.sun.com/xml/ns/javaee", "local"), new QName("http://java.sun.com/xml/ns/javaee", "business-local"), new QName("http://java.sun.com/xml/ns/javaee", "business-remote"), new QName("http://java.sun.com/xml/ns/javaee", "local-bean"), new QName("http://java.sun.com/xml/ns/javaee", "service-endpoint"), new QName("http://java.sun.com/xml/ns/javaee", "ejb-class"), new QName("http://java.sun.com/xml/ns/javaee", "session-type"), new QName("http://java.sun.com/xml/ns/javaee", "stateful-timeout"), new QName("http://java.sun.com/xml/ns/javaee", "timeout-method"), new QName("http://java.sun.com/xml/ns/javaee", "timer"), new QName("http://java.sun.com/xml/ns/javaee", "init-on-startup"), new QName("http://java.sun.com/xml/ns/javaee", "concurrency-management-type"), new QName("http://java.sun.com/xml/ns/javaee", "concurrent-method"), new QName("http://java.sun.com/xml/ns/javaee", "depends-on"), new QName("http://java.sun.com/xml/ns/javaee", "init-method"), new QName("http://java.sun.com/xml/ns/javaee", "remove-method"), new QName("http://java.sun.com/xml/ns/javaee", "async-method"), new QName("http://java.sun.com/xml/ns/javaee", "transaction-type"), new QName("http://java.sun.com/xml/ns/javaee", "after-begin-method"), new QName("http://java.sun.com/xml/ns/javaee", "before-completion-method"), new QName("http://java.sun.com/xml/ns/javaee", "after-completion-method"), new QName("http://java.sun.com/xml/ns/javaee", "around-invoke"), new QName("http://java.sun.com/xml/ns/javaee", "around-timeout"), new QName("http://java.sun.com/xml/ns/javaee", "env-entry"), new QName("http://java.sun.com/xml/ns/javaee", "ejb-ref"), new QName("http://java.sun.com/xml/ns/javaee", "ejb-local-ref"), new QName("http://java.sun.com/xml/ns/javaee", "service-ref"), new QName("http://java.sun.com/xml/ns/javaee", "resource-ref"), new QName("http://java.sun.com/xml/ns/javaee", "resource-env-ref"), new QName("http://java.sun.com/xml/ns/javaee", "message-destination-ref"), new QName("http://java.sun.com/xml/ns/javaee", "persistence-context-ref"), new QName("http://java.sun.com/xml/ns/javaee", "persistence-unit-ref"), new QName("http://java.sun.com/xml/ns/javaee", "post-construct"), new QName("http://java.sun.com/xml/ns/javaee", "pre-destroy"), new QName("http://java.sun.com/xml/ns/javaee", "data-source"), new QName("http://java.sun.com/xml/ns/javaee", "jms-connection-factory"), new QName("http://java.sun.com/xml/ns/javaee", "jms-destination"), new QName("http://java.sun.com/xml/ns/javaee", "post-activate"), new QName("http://java.sun.com/xml/ns/javaee", "pre-passivate"), new QName("http://java.sun.com/xml/ns/javaee", "security-role-ref"), new QName("http://java.sun.com/xml/ns/javaee", "security-identity"), new QName("http://java.sun.com/xml/ns/javaee", "passivation-capable"), new QName("http://java.sun.com/xml/ns/javaee", "context-service"), new QName("http://java.sun.com/xml/ns/javaee", "managed-executor"), new QName("http://java.sun.com/xml/ns/javaee", "managed-scheduled-executor"), new QName("http://java.sun.com/xml/ns/javaee", "managed-thread-factory")); } } if (descriptions!= null) { @@ -851,6 +896,15 @@ public static final SessionBean _read(XoXMLStreamReader reader, RuntimeContext c if (contextService!= null) { sessionBean.contextService = contextService; } + if (managedExecutor!= null) { + sessionBean.managedExecutor = managedExecutor; + } + if (managedScheduledExecutor!= null) { + sessionBean.managedScheduledExecutor = managedScheduledExecutor; + } + if (managedThreadFactory!= null) { + sessionBean.managedThreadFactory = managedThreadFactory; + } context.afterUnmarshal(sessionBean, org.metatype.sxc.jaxb.LifecycleCallback.NONE); @@ -1612,6 +1666,42 @@ public static final void _write(XoXMLStreamWriter writer, SessionBean sessionBea } } + // ELEMENT: managedExecutor + KeyedCollection managedExecutor = sessionBean.managedExecutor; + if (managedExecutor!= null) { + for (ManagedExecutor managedExecutorItem: managedExecutor) { + if (managedExecutorItem!= null) { + writer.writeStartElement(prefix, "managed-executor", "http://java.sun.com/xml/ns/javaee"); + writeManagedExecutor(writer, managedExecutorItem, context); + writer.writeEndElement(); + } + } + } + + // ELEMENT: managedScheduledExecutor + KeyedCollection managedScheduledExecutor = sessionBean.managedScheduledExecutor; + if (managedScheduledExecutor!= null) { + for (ManagedScheduledExecutor managedScheduledExecutorItem: managedScheduledExecutor) { + if (managedScheduledExecutorItem!= null) { + writer.writeStartElement(prefix, "managed-scheduled-executor", "http://java.sun.com/xml/ns/javaee"); + writeManagedScheduledExecutor(writer, managedScheduledExecutorItem, context); + writer.writeEndElement(); + } + } + } + + // ELEMENT: managedThreadFactory + KeyedCollection managedThreadFactory = sessionBean.managedThreadFactory; + if (managedThreadFactory!= null) { + for (ManagedThreadFactory managedThreadFactoryItem: managedThreadFactory) { + if (managedThreadFactoryItem!= null) { + writer.writeStartElement(prefix, "managed-thread-factory", "http://java.sun.com/xml/ns/javaee"); + writeManagedThreadFactory(writer, managedThreadFactoryItem, context); + writer.writeEndElement(); + } + } + } + context.afterMarshal(sessionBean, org.metatype.sxc.jaxb.LifecycleCallback.NONE); } diff --git a/container/openejb-jee-accessors/src/main/java/org/apache/openejb/jee/SingletonBean$JAXB.java b/container/openejb-jee-accessors/src/main/java/org/apache/openejb/jee/SingletonBean$JAXB.java index cc847eb2ed1..cf99a7b92b0 100644 --- a/container/openejb-jee-accessors/src/main/java/org/apache/openejb/jee/SingletonBean$JAXB.java +++ b/container/openejb-jee-accessors/src/main/java/org/apache/openejb/jee/SingletonBean$JAXB.java @@ -62,6 +62,12 @@ import static org.apache.openejb.jee.JMSDestination$JAXB.writeJMSDestination; import static org.apache.openejb.jee.LifecycleCallback$JAXB.readLifecycleCallback; import static org.apache.openejb.jee.LifecycleCallback$JAXB.writeLifecycleCallback; +import static org.apache.openejb.jee.ManagedExecutor$JAXB.readManagedExecutor; +import static org.apache.openejb.jee.ManagedExecutor$JAXB.writeManagedExecutor; +import static org.apache.openejb.jee.ManagedScheduledExecutor$JAXB.readManagedScheduledExecutor; +import static org.apache.openejb.jee.ManagedScheduledExecutor$JAXB.writeManagedScheduledExecutor; +import static org.apache.openejb.jee.ManagedThreadFactory$JAXB.readManagedThreadFactory; +import static org.apache.openejb.jee.ManagedThreadFactory$JAXB.writeManagedThreadFactory; import static org.apache.openejb.jee.MessageDestinationRef$JAXB.readMessageDestinationRef; import static org.apache.openejb.jee.MessageDestinationRef$JAXB.writeMessageDestinationRef; import static org.apache.openejb.jee.NamedMethod$JAXB.readNamedMethod; @@ -102,7 +108,7 @@ public class SingletonBean$JAXB public SingletonBean$JAXB() { - super(SingletonBean.class, null, new QName("http://java.sun.com/xml/ns/javaee".intern(), "singletonBean".intern()), Text$JAXB.class, Icon$JAXB.class, Empty$JAXB.class, SessionType$JAXB.class, Timeout$JAXB.class, NamedMethod$JAXB.class, Timer$JAXB.class, ConcurrencyManagementType$JAXB.class, ConcurrentMethod$JAXB.class, InitMethod$JAXB.class, RemoveMethod$JAXB.class, AsyncMethod$JAXB.class, TransactionType$JAXB.class, AroundInvoke$JAXB.class, AroundTimeout$JAXB.class, EnvEntry$JAXB.class, EjbRef$JAXB.class, EjbLocalRef$JAXB.class, ServiceRef$JAXB.class, ResourceRef$JAXB.class, ResourceEnvRef$JAXB.class, MessageDestinationRef$JAXB.class, PersistenceContextRef$JAXB.class, PersistenceUnitRef$JAXB.class, LifecycleCallback$JAXB.class, DataSource$JAXB.class, JMSConnectionFactory$JAXB.class, JMSDestination$JAXB.class, SecurityRoleRef$JAXB.class, SecurityIdentity$JAXB.class, ContextService$JAXB.class); + super(SingletonBean.class, null, new QName("http://java.sun.com/xml/ns/javaee".intern(), "singletonBean".intern()), Text$JAXB.class, Icon$JAXB.class, Empty$JAXB.class, SessionType$JAXB.class, Timeout$JAXB.class, NamedMethod$JAXB.class, Timer$JAXB.class, ConcurrencyManagementType$JAXB.class, ConcurrentMethod$JAXB.class, InitMethod$JAXB.class, RemoveMethod$JAXB.class, AsyncMethod$JAXB.class, TransactionType$JAXB.class, AroundInvoke$JAXB.class, AroundTimeout$JAXB.class, EnvEntry$JAXB.class, EjbRef$JAXB.class, EjbLocalRef$JAXB.class, ServiceRef$JAXB.class, ResourceRef$JAXB.class, ResourceEnvRef$JAXB.class, MessageDestinationRef$JAXB.class, PersistenceContextRef$JAXB.class, PersistenceUnitRef$JAXB.class, LifecycleCallback$JAXB.class, DataSource$JAXB.class, JMSConnectionFactory$JAXB.class, JMSDestination$JAXB.class, SecurityRoleRef$JAXB.class, SecurityIdentity$JAXB.class, ContextService$JAXB.class, ManagedExecutor$JAXB.class, ManagedScheduledExecutor$JAXB.class, ManagedThreadFactory$JAXB.class); } public static SingletonBean readSingletonBean(XoXMLStreamReader reader, RuntimeContext context) @@ -169,6 +175,9 @@ public static final SingletonBean _read(XoXMLStreamReader reader, RuntimeContext List prePassivate = null; List securityRoleRef = null; KeyedCollection contextService = null; + KeyedCollection managedExecutor = null; + KeyedCollection managedScheduledExecutor = null; + KeyedCollection managedThreadFactory = null; // Check xsi:type QName xsiType = reader.getXsiType(); @@ -733,8 +742,44 @@ public static final SingletonBean _read(XoXMLStreamReader reader, RuntimeContext } } contextService.add(contextServiceItem); + } else if (("managed-executor" == elementReader.getLocalName())&&("http://java.sun.com/xml/ns/javaee" == elementReader.getNamespaceURI())) { + // ELEMENT: managedExecutor + ManagedExecutor managedExecutorItem = readManagedExecutor(elementReader, context); + if (managedExecutor == null) { + managedExecutor = singletonBean.managedExecutor; + if (managedExecutor!= null) { + managedExecutor.clear(); + } else { + managedExecutor = new KeyedCollection<>(); + } + } + managedExecutor.add(managedExecutorItem); + } else if (("managed-scheduled-executor" == elementReader.getLocalName())&&("http://java.sun.com/xml/ns/javaee" == elementReader.getNamespaceURI())) { + // ELEMENT: managedScheduledExecutor + ManagedScheduledExecutor managedScheduledExecutorItem = readManagedScheduledExecutor(elementReader, context); + if (managedScheduledExecutor == null) { + managedScheduledExecutor = singletonBean.managedScheduledExecutor; + if (managedScheduledExecutor!= null) { + managedScheduledExecutor.clear(); + } else { + managedScheduledExecutor = new KeyedCollection<>(); + } + } + managedScheduledExecutor.add(managedScheduledExecutorItem); + } else if (("managed-thread-factory" == elementReader.getLocalName())&&("http://java.sun.com/xml/ns/javaee" == elementReader.getNamespaceURI())) { + // ELEMENT: managedThreadFactory + ManagedThreadFactory managedThreadFactoryItem = readManagedThreadFactory(elementReader, context); + if (managedThreadFactory == null) { + managedThreadFactory = singletonBean.managedThreadFactory; + if (managedThreadFactory!= null) { + managedThreadFactory.clear(); + } else { + managedThreadFactory = new KeyedCollection<>(); + } + } + managedThreadFactory.add(managedThreadFactoryItem); } else { - context.unexpectedElement(elementReader, new QName("http://java.sun.com/xml/ns/javaee", "description"), new QName("http://java.sun.com/xml/ns/javaee", "display-name"), new QName("http://java.sun.com/xml/ns/javaee", "icon"), new QName("http://java.sun.com/xml/ns/javaee", "ejb-name"), new QName("http://java.sun.com/xml/ns/javaee", "mapped-name"), new QName("http://java.sun.com/xml/ns/javaee", "home"), new QName("http://java.sun.com/xml/ns/javaee", "remote"), new QName("http://java.sun.com/xml/ns/javaee", "local-home"), new QName("http://java.sun.com/xml/ns/javaee", "local"), new QName("http://java.sun.com/xml/ns/javaee", "business-local"), new QName("http://java.sun.com/xml/ns/javaee", "business-remote"), new QName("http://java.sun.com/xml/ns/javaee", "local-bean"), new QName("http://java.sun.com/xml/ns/javaee", "service-endpoint"), new QName("http://java.sun.com/xml/ns/javaee", "ejb-class"), new QName("http://java.sun.com/xml/ns/javaee", "session-type"), new QName("http://java.sun.com/xml/ns/javaee", "stateful-timeout"), new QName("http://java.sun.com/xml/ns/javaee", "timeout-method"), new QName("http://java.sun.com/xml/ns/javaee", "timer"), new QName("http://java.sun.com/xml/ns/javaee", "init-on-startup"), new QName("http://java.sun.com/xml/ns/javaee", "concurrency-management-type"), new QName("http://java.sun.com/xml/ns/javaee", "concurrent-method"), new QName("http://java.sun.com/xml/ns/javaee", "depends-on"), new QName("http://java.sun.com/xml/ns/javaee", "init-method"), new QName("http://java.sun.com/xml/ns/javaee", "remove-method"), new QName("http://java.sun.com/xml/ns/javaee", "async-method"), new QName("http://java.sun.com/xml/ns/javaee", "transaction-type"), new QName("http://java.sun.com/xml/ns/javaee", "after-begin-method"), new QName("http://java.sun.com/xml/ns/javaee", "before-completion-method"), new QName("http://java.sun.com/xml/ns/javaee", "after-completion-method"), new QName("http://java.sun.com/xml/ns/javaee", "around-invoke"), new QName("http://java.sun.com/xml/ns/javaee", "around-timeout"), new QName("http://java.sun.com/xml/ns/javaee", "env-entry"), new QName("http://java.sun.com/xml/ns/javaee", "ejb-ref"), new QName("http://java.sun.com/xml/ns/javaee", "ejb-local-ref"), new QName("http://java.sun.com/xml/ns/javaee", "service-ref"), new QName("http://java.sun.com/xml/ns/javaee", "resource-ref"), new QName("http://java.sun.com/xml/ns/javaee", "resource-env-ref"), new QName("http://java.sun.com/xml/ns/javaee", "message-destination-ref"), new QName("http://java.sun.com/xml/ns/javaee", "persistence-context-ref"), new QName("http://java.sun.com/xml/ns/javaee", "persistence-unit-ref"), new QName("http://java.sun.com/xml/ns/javaee", "post-construct"), new QName("http://java.sun.com/xml/ns/javaee", "pre-destroy"), new QName("http://java.sun.com/xml/ns/javaee", "data-source"), new QName("http://java.sun.com/xml/ns/javaee", "jms-connection-factory"), new QName("http://java.sun.com/xml/ns/javaee", "jms-destination"), new QName("http://java.sun.com/xml/ns/javaee", "post-activate"), new QName("http://java.sun.com/xml/ns/javaee", "pre-passivate"), new QName("http://java.sun.com/xml/ns/javaee", "security-role-ref"), new QName("http://java.sun.com/xml/ns/javaee", "security-identity"), new QName("http://java.sun.com/xml/ns/javaee", "passivation-capable"), new QName("http://java.sun.com/xml/ns/javaee", "context-service")); + context.unexpectedElement(elementReader, new QName("http://java.sun.com/xml/ns/javaee", "description"), new QName("http://java.sun.com/xml/ns/javaee", "display-name"), new QName("http://java.sun.com/xml/ns/javaee", "icon"), new QName("http://java.sun.com/xml/ns/javaee", "ejb-name"), new QName("http://java.sun.com/xml/ns/javaee", "mapped-name"), new QName("http://java.sun.com/xml/ns/javaee", "home"), new QName("http://java.sun.com/xml/ns/javaee", "remote"), new QName("http://java.sun.com/xml/ns/javaee", "local-home"), new QName("http://java.sun.com/xml/ns/javaee", "local"), new QName("http://java.sun.com/xml/ns/javaee", "business-local"), new QName("http://java.sun.com/xml/ns/javaee", "business-remote"), new QName("http://java.sun.com/xml/ns/javaee", "local-bean"), new QName("http://java.sun.com/xml/ns/javaee", "service-endpoint"), new QName("http://java.sun.com/xml/ns/javaee", "ejb-class"), new QName("http://java.sun.com/xml/ns/javaee", "session-type"), new QName("http://java.sun.com/xml/ns/javaee", "stateful-timeout"), new QName("http://java.sun.com/xml/ns/javaee", "timeout-method"), new QName("http://java.sun.com/xml/ns/javaee", "timer"), new QName("http://java.sun.com/xml/ns/javaee", "init-on-startup"), new QName("http://java.sun.com/xml/ns/javaee", "concurrency-management-type"), new QName("http://java.sun.com/xml/ns/javaee", "concurrent-method"), new QName("http://java.sun.com/xml/ns/javaee", "depends-on"), new QName("http://java.sun.com/xml/ns/javaee", "init-method"), new QName("http://java.sun.com/xml/ns/javaee", "remove-method"), new QName("http://java.sun.com/xml/ns/javaee", "async-method"), new QName("http://java.sun.com/xml/ns/javaee", "transaction-type"), new QName("http://java.sun.com/xml/ns/javaee", "after-begin-method"), new QName("http://java.sun.com/xml/ns/javaee", "before-completion-method"), new QName("http://java.sun.com/xml/ns/javaee", "after-completion-method"), new QName("http://java.sun.com/xml/ns/javaee", "around-invoke"), new QName("http://java.sun.com/xml/ns/javaee", "around-timeout"), new QName("http://java.sun.com/xml/ns/javaee", "env-entry"), new QName("http://java.sun.com/xml/ns/javaee", "ejb-ref"), new QName("http://java.sun.com/xml/ns/javaee", "ejb-local-ref"), new QName("http://java.sun.com/xml/ns/javaee", "service-ref"), new QName("http://java.sun.com/xml/ns/javaee", "resource-ref"), new QName("http://java.sun.com/xml/ns/javaee", "resource-env-ref"), new QName("http://java.sun.com/xml/ns/javaee", "message-destination-ref"), new QName("http://java.sun.com/xml/ns/javaee", "persistence-context-ref"), new QName("http://java.sun.com/xml/ns/javaee", "persistence-unit-ref"), new QName("http://java.sun.com/xml/ns/javaee", "post-construct"), new QName("http://java.sun.com/xml/ns/javaee", "pre-destroy"), new QName("http://java.sun.com/xml/ns/javaee", "data-source"), new QName("http://java.sun.com/xml/ns/javaee", "jms-connection-factory"), new QName("http://java.sun.com/xml/ns/javaee", "jms-destination"), new QName("http://java.sun.com/xml/ns/javaee", "post-activate"), new QName("http://java.sun.com/xml/ns/javaee", "pre-passivate"), new QName("http://java.sun.com/xml/ns/javaee", "security-role-ref"), new QName("http://java.sun.com/xml/ns/javaee", "security-identity"), new QName("http://java.sun.com/xml/ns/javaee", "passivation-capable"), new QName("http://java.sun.com/xml/ns/javaee", "context-service"), new QName("http://java.sun.com/xml/ns/javaee", "managed-executor"), new QName("http://java.sun.com/xml/ns/javaee", "managed-scheduled-executor"), new QName("http://java.sun.com/xml/ns/javaee", "managed-thread-factory")); } } if (descriptions!= null) { @@ -835,6 +880,15 @@ public static final SingletonBean _read(XoXMLStreamReader reader, RuntimeContext if (contextService!= null) { singletonBean.contextService = contextService; } + if (managedExecutor!= null) { + singletonBean.managedExecutor = managedExecutor; + } + if (managedScheduledExecutor!= null) { + singletonBean.managedScheduledExecutor = managedScheduledExecutor; + } + if (managedThreadFactory!= null) { + singletonBean.managedThreadFactory = managedThreadFactory; + } context.afterUnmarshal(singletonBean, org.metatype.sxc.jaxb.LifecycleCallback.NONE); @@ -1580,6 +1634,42 @@ public static final void _write(XoXMLStreamWriter writer, SingletonBean singleto } } + // ELEMENT: managedExecutor + KeyedCollection managedExecutor = singletonBean.managedExecutor; + if (managedExecutor!= null) { + for (ManagedExecutor managedExecutorItem: managedExecutor) { + if (managedExecutorItem!= null) { + writer.writeStartElement(prefix, "managed-executor", "http://java.sun.com/xml/ns/javaee"); + writeManagedExecutor(writer, managedExecutorItem, context); + writer.writeEndElement(); + } + } + } + + // ELEMENT: managedScheduledExecutor + KeyedCollection managedScheduledExecutor = singletonBean.managedScheduledExecutor; + if (managedScheduledExecutor!= null) { + for (ManagedScheduledExecutor managedScheduledExecutorItem: managedScheduledExecutor) { + if (managedScheduledExecutorItem!= null) { + writer.writeStartElement(prefix, "managed-scheduled-executor", "http://java.sun.com/xml/ns/javaee"); + writeManagedScheduledExecutor(writer, managedScheduledExecutorItem, context); + writer.writeEndElement(); + } + } + } + + // ELEMENT: managedThreadFactory + KeyedCollection managedThreadFactory = singletonBean.managedThreadFactory; + if (managedThreadFactory!= null) { + for (ManagedThreadFactory managedThreadFactoryItem: managedThreadFactory) { + if (managedThreadFactoryItem!= null) { + writer.writeStartElement(prefix, "managed-thread-factory", "http://java.sun.com/xml/ns/javaee"); + writeManagedThreadFactory(writer, managedThreadFactoryItem, context); + writer.writeEndElement(); + } + } + } + context.afterMarshal(singletonBean, org.metatype.sxc.jaxb.LifecycleCallback.NONE); } diff --git a/container/openejb-jee-accessors/src/main/java/org/apache/openejb/jee/StatefulBean$JAXB.java b/container/openejb-jee-accessors/src/main/java/org/apache/openejb/jee/StatefulBean$JAXB.java index a53e0063849..0882755217a 100644 --- a/container/openejb-jee-accessors/src/main/java/org/apache/openejb/jee/StatefulBean$JAXB.java +++ b/container/openejb-jee-accessors/src/main/java/org/apache/openejb/jee/StatefulBean$JAXB.java @@ -62,6 +62,12 @@ import static org.apache.openejb.jee.JMSDestination$JAXB.writeJMSDestination; import static org.apache.openejb.jee.LifecycleCallback$JAXB.readLifecycleCallback; import static org.apache.openejb.jee.LifecycleCallback$JAXB.writeLifecycleCallback; +import static org.apache.openejb.jee.ManagedExecutor$JAXB.readManagedExecutor; +import static org.apache.openejb.jee.ManagedExecutor$JAXB.writeManagedExecutor; +import static org.apache.openejb.jee.ManagedScheduledExecutor$JAXB.readManagedScheduledExecutor; +import static org.apache.openejb.jee.ManagedScheduledExecutor$JAXB.writeManagedScheduledExecutor; +import static org.apache.openejb.jee.ManagedThreadFactory$JAXB.readManagedThreadFactory; +import static org.apache.openejb.jee.ManagedThreadFactory$JAXB.writeManagedThreadFactory; import static org.apache.openejb.jee.MessageDestinationRef$JAXB.readMessageDestinationRef; import static org.apache.openejb.jee.MessageDestinationRef$JAXB.writeMessageDestinationRef; import static org.apache.openejb.jee.NamedMethod$JAXB.readNamedMethod; @@ -102,7 +108,7 @@ public class StatefulBean$JAXB public StatefulBean$JAXB() { - super(StatefulBean.class, null, new QName("http://java.sun.com/xml/ns/javaee".intern(), "statefulBean".intern()), Text$JAXB.class, Icon$JAXB.class, Empty$JAXB.class, SessionType$JAXB.class, Timeout$JAXB.class, NamedMethod$JAXB.class, Timer$JAXB.class, ConcurrencyManagementType$JAXB.class, ConcurrentMethod$JAXB.class, InitMethod$JAXB.class, RemoveMethod$JAXB.class, AsyncMethod$JAXB.class, TransactionType$JAXB.class, AroundInvoke$JAXB.class, AroundTimeout$JAXB.class, EnvEntry$JAXB.class, EjbRef$JAXB.class, EjbLocalRef$JAXB.class, ServiceRef$JAXB.class, ResourceRef$JAXB.class, ResourceEnvRef$JAXB.class, MessageDestinationRef$JAXB.class, PersistenceContextRef$JAXB.class, PersistenceUnitRef$JAXB.class, LifecycleCallback$JAXB.class, DataSource$JAXB.class, JMSConnectionFactory$JAXB.class, JMSDestination$JAXB.class, SecurityRoleRef$JAXB.class, SecurityIdentity$JAXB.class, ContextService$JAXB.class); + super(StatefulBean.class, null, new QName("http://java.sun.com/xml/ns/javaee".intern(), "statefulBean".intern()), Text$JAXB.class, Icon$JAXB.class, Empty$JAXB.class, SessionType$JAXB.class, Timeout$JAXB.class, NamedMethod$JAXB.class, Timer$JAXB.class, ConcurrencyManagementType$JAXB.class, ConcurrentMethod$JAXB.class, InitMethod$JAXB.class, RemoveMethod$JAXB.class, AsyncMethod$JAXB.class, TransactionType$JAXB.class, AroundInvoke$JAXB.class, AroundTimeout$JAXB.class, EnvEntry$JAXB.class, EjbRef$JAXB.class, EjbLocalRef$JAXB.class, ServiceRef$JAXB.class, ResourceRef$JAXB.class, ResourceEnvRef$JAXB.class, MessageDestinationRef$JAXB.class, PersistenceContextRef$JAXB.class, PersistenceUnitRef$JAXB.class, LifecycleCallback$JAXB.class, DataSource$JAXB.class, JMSConnectionFactory$JAXB.class, JMSDestination$JAXB.class, SecurityRoleRef$JAXB.class, SecurityIdentity$JAXB.class, ContextService$JAXB.class, ManagedExecutor$JAXB.class, ManagedScheduledExecutor$JAXB.class, ManagedThreadFactory$JAXB.class); } public static StatefulBean readStatefulBean(XoXMLStreamReader reader, RuntimeContext context) @@ -169,6 +175,9 @@ public static final StatefulBean _read(XoXMLStreamReader reader, RuntimeContext List prePassivate = null; List securityRoleRef = null; KeyedCollection contextService = null; + KeyedCollection managedExecutor = null; + KeyedCollection managedScheduledExecutor = null; + KeyedCollection managedThreadFactory = null; // Check xsi:type QName xsiType = reader.getXsiType(); @@ -733,8 +742,44 @@ public static final StatefulBean _read(XoXMLStreamReader reader, RuntimeContext } } contextService.add(contextServiceItem); + } else if (("managed-executor" == elementReader.getLocalName())&&("http://java.sun.com/xml/ns/javaee" == elementReader.getNamespaceURI())) { + // ELEMENT: managedExecutor + ManagedExecutor managedExecutorItem = readManagedExecutor(elementReader, context); + if (managedExecutor == null) { + managedExecutor = statefulBean.managedExecutor; + if (managedExecutor!= null) { + managedExecutor.clear(); + } else { + managedExecutor = new KeyedCollection<>(); + } + } + managedExecutor.add(managedExecutorItem); + } else if (("managed-scheduled-executor" == elementReader.getLocalName())&&("http://java.sun.com/xml/ns/javaee" == elementReader.getNamespaceURI())) { + // ELEMENT: managedScheduledExecutor + ManagedScheduledExecutor managedScheduledExecutorItem = readManagedScheduledExecutor(elementReader, context); + if (managedScheduledExecutor == null) { + managedScheduledExecutor = statefulBean.managedScheduledExecutor; + if (managedScheduledExecutor!= null) { + managedScheduledExecutor.clear(); + } else { + managedScheduledExecutor = new KeyedCollection<>(); + } + } + managedScheduledExecutor.add(managedScheduledExecutorItem); + } else if (("managed-thread-factory" == elementReader.getLocalName())&&("http://java.sun.com/xml/ns/javaee" == elementReader.getNamespaceURI())) { + // ELEMENT: managedThreadFactory + ManagedThreadFactory managedThreadFactoryItem = readManagedThreadFactory(elementReader, context); + if (managedThreadFactory == null) { + managedThreadFactory = statefulBean.managedThreadFactory; + if (managedThreadFactory!= null) { + managedThreadFactory.clear(); + } else { + managedThreadFactory = new KeyedCollection<>(); + } + } + managedThreadFactory.add(managedThreadFactoryItem); } else { - context.unexpectedElement(elementReader, new QName("http://java.sun.com/xml/ns/javaee", "description"), new QName("http://java.sun.com/xml/ns/javaee", "display-name"), new QName("http://java.sun.com/xml/ns/javaee", "icon"), new QName("http://java.sun.com/xml/ns/javaee", "ejb-name"), new QName("http://java.sun.com/xml/ns/javaee", "mapped-name"), new QName("http://java.sun.com/xml/ns/javaee", "home"), new QName("http://java.sun.com/xml/ns/javaee", "remote"), new QName("http://java.sun.com/xml/ns/javaee", "local-home"), new QName("http://java.sun.com/xml/ns/javaee", "local"), new QName("http://java.sun.com/xml/ns/javaee", "business-local"), new QName("http://java.sun.com/xml/ns/javaee", "business-remote"), new QName("http://java.sun.com/xml/ns/javaee", "local-bean"), new QName("http://java.sun.com/xml/ns/javaee", "service-endpoint"), new QName("http://java.sun.com/xml/ns/javaee", "ejb-class"), new QName("http://java.sun.com/xml/ns/javaee", "session-type"), new QName("http://java.sun.com/xml/ns/javaee", "stateful-timeout"), new QName("http://java.sun.com/xml/ns/javaee", "timeout-method"), new QName("http://java.sun.com/xml/ns/javaee", "timer"), new QName("http://java.sun.com/xml/ns/javaee", "init-on-startup"), new QName("http://java.sun.com/xml/ns/javaee", "concurrency-management-type"), new QName("http://java.sun.com/xml/ns/javaee", "concurrent-method"), new QName("http://java.sun.com/xml/ns/javaee", "depends-on"), new QName("http://java.sun.com/xml/ns/javaee", "init-method"), new QName("http://java.sun.com/xml/ns/javaee", "remove-method"), new QName("http://java.sun.com/xml/ns/javaee", "async-method"), new QName("http://java.sun.com/xml/ns/javaee", "transaction-type"), new QName("http://java.sun.com/xml/ns/javaee", "after-begin-method"), new QName("http://java.sun.com/xml/ns/javaee", "before-completion-method"), new QName("http://java.sun.com/xml/ns/javaee", "after-completion-method"), new QName("http://java.sun.com/xml/ns/javaee", "around-invoke"), new QName("http://java.sun.com/xml/ns/javaee", "around-timeout"), new QName("http://java.sun.com/xml/ns/javaee", "env-entry"), new QName("http://java.sun.com/xml/ns/javaee", "ejb-ref"), new QName("http://java.sun.com/xml/ns/javaee", "ejb-local-ref"), new QName("http://java.sun.com/xml/ns/javaee", "service-ref"), new QName("http://java.sun.com/xml/ns/javaee", "resource-ref"), new QName("http://java.sun.com/xml/ns/javaee", "resource-env-ref"), new QName("http://java.sun.com/xml/ns/javaee", "message-destination-ref"), new QName("http://java.sun.com/xml/ns/javaee", "persistence-context-ref"), new QName("http://java.sun.com/xml/ns/javaee", "persistence-unit-ref"), new QName("http://java.sun.com/xml/ns/javaee", "post-construct"), new QName("http://java.sun.com/xml/ns/javaee", "pre-destroy"), new QName("http://java.sun.com/xml/ns/javaee", "data-source"), new QName("http://java.sun.com/xml/ns/javaee", "jms-connection-factory"), new QName("http://java.sun.com/xml/ns/javaee", "jms-destination"), new QName("http://java.sun.com/xml/ns/javaee", "post-activate"), new QName("http://java.sun.com/xml/ns/javaee", "pre-passivate"), new QName("http://java.sun.com/xml/ns/javaee", "security-role-ref"), new QName("http://java.sun.com/xml/ns/javaee", "security-identity"), new QName("http://java.sun.com/xml/ns/javaee", "passivation-capable"), new QName("http://java.sun.com/xml/ns/javaee", "context-service")); + context.unexpectedElement(elementReader, new QName("http://java.sun.com/xml/ns/javaee", "description"), new QName("http://java.sun.com/xml/ns/javaee", "display-name"), new QName("http://java.sun.com/xml/ns/javaee", "icon"), new QName("http://java.sun.com/xml/ns/javaee", "ejb-name"), new QName("http://java.sun.com/xml/ns/javaee", "mapped-name"), new QName("http://java.sun.com/xml/ns/javaee", "home"), new QName("http://java.sun.com/xml/ns/javaee", "remote"), new QName("http://java.sun.com/xml/ns/javaee", "local-home"), new QName("http://java.sun.com/xml/ns/javaee", "local"), new QName("http://java.sun.com/xml/ns/javaee", "business-local"), new QName("http://java.sun.com/xml/ns/javaee", "business-remote"), new QName("http://java.sun.com/xml/ns/javaee", "local-bean"), new QName("http://java.sun.com/xml/ns/javaee", "service-endpoint"), new QName("http://java.sun.com/xml/ns/javaee", "ejb-class"), new QName("http://java.sun.com/xml/ns/javaee", "session-type"), new QName("http://java.sun.com/xml/ns/javaee", "stateful-timeout"), new QName("http://java.sun.com/xml/ns/javaee", "timeout-method"), new QName("http://java.sun.com/xml/ns/javaee", "timer"), new QName("http://java.sun.com/xml/ns/javaee", "init-on-startup"), new QName("http://java.sun.com/xml/ns/javaee", "concurrency-management-type"), new QName("http://java.sun.com/xml/ns/javaee", "concurrent-method"), new QName("http://java.sun.com/xml/ns/javaee", "depends-on"), new QName("http://java.sun.com/xml/ns/javaee", "init-method"), new QName("http://java.sun.com/xml/ns/javaee", "remove-method"), new QName("http://java.sun.com/xml/ns/javaee", "async-method"), new QName("http://java.sun.com/xml/ns/javaee", "transaction-type"), new QName("http://java.sun.com/xml/ns/javaee", "after-begin-method"), new QName("http://java.sun.com/xml/ns/javaee", "before-completion-method"), new QName("http://java.sun.com/xml/ns/javaee", "after-completion-method"), new QName("http://java.sun.com/xml/ns/javaee", "around-invoke"), new QName("http://java.sun.com/xml/ns/javaee", "around-timeout"), new QName("http://java.sun.com/xml/ns/javaee", "env-entry"), new QName("http://java.sun.com/xml/ns/javaee", "ejb-ref"), new QName("http://java.sun.com/xml/ns/javaee", "ejb-local-ref"), new QName("http://java.sun.com/xml/ns/javaee", "service-ref"), new QName("http://java.sun.com/xml/ns/javaee", "resource-ref"), new QName("http://java.sun.com/xml/ns/javaee", "resource-env-ref"), new QName("http://java.sun.com/xml/ns/javaee", "message-destination-ref"), new QName("http://java.sun.com/xml/ns/javaee", "persistence-context-ref"), new QName("http://java.sun.com/xml/ns/javaee", "persistence-unit-ref"), new QName("http://java.sun.com/xml/ns/javaee", "post-construct"), new QName("http://java.sun.com/xml/ns/javaee", "pre-destroy"), new QName("http://java.sun.com/xml/ns/javaee", "data-source"), new QName("http://java.sun.com/xml/ns/javaee", "jms-connection-factory"), new QName("http://java.sun.com/xml/ns/javaee", "jms-destination"), new QName("http://java.sun.com/xml/ns/javaee", "post-activate"), new QName("http://java.sun.com/xml/ns/javaee", "pre-passivate"), new QName("http://java.sun.com/xml/ns/javaee", "security-role-ref"), new QName("http://java.sun.com/xml/ns/javaee", "security-identity"), new QName("http://java.sun.com/xml/ns/javaee", "passivation-capable"), new QName("http://java.sun.com/xml/ns/javaee", "context-service"), new QName("http://java.sun.com/xml/ns/javaee", "managed-executor"), new QName("http://java.sun.com/xml/ns/javaee", "managed-scheduled-executor"), new QName("http://java.sun.com/xml/ns/javaee", "managed-thread-factory")); } } if (descriptions!= null) { @@ -835,6 +880,15 @@ public static final StatefulBean _read(XoXMLStreamReader reader, RuntimeContext if (contextService!= null) { statefulBean.contextService = contextService; } + if (managedExecutor!= null) { + statefulBean.managedExecutor = managedExecutor; + } + if (managedScheduledExecutor!= null) { + statefulBean.managedScheduledExecutor = managedScheduledExecutor; + } + if (managedThreadFactory!= null) { + statefulBean.managedThreadFactory = managedThreadFactory; + } context.afterUnmarshal(statefulBean, org.metatype.sxc.jaxb.LifecycleCallback.NONE); @@ -1580,6 +1634,42 @@ public static final void _write(XoXMLStreamWriter writer, StatefulBean statefulB } } + // ELEMENT: managedExecutor + KeyedCollection managedExecutor = statefulBean.managedExecutor; + if (managedExecutor!= null) { + for (ManagedExecutor managedExecutorItem: managedExecutor) { + if (managedExecutorItem!= null) { + writer.writeStartElement(prefix, "managed-executor", "http://java.sun.com/xml/ns/javaee"); + writeManagedExecutor(writer, managedExecutorItem, context); + writer.writeEndElement(); + } + } + } + + // ELEMENT: managedScheduledExecutor + KeyedCollection managedScheduledExecutor = statefulBean.managedScheduledExecutor; + if (managedScheduledExecutor!= null) { + for (ManagedScheduledExecutor managedScheduledExecutorItem: managedScheduledExecutor) { + if (managedScheduledExecutorItem!= null) { + writer.writeStartElement(prefix, "managed-scheduled-executor", "http://java.sun.com/xml/ns/javaee"); + writeManagedScheduledExecutor(writer, managedScheduledExecutorItem, context); + writer.writeEndElement(); + } + } + } + + // ELEMENT: managedThreadFactory + KeyedCollection managedThreadFactory = statefulBean.managedThreadFactory; + if (managedThreadFactory!= null) { + for (ManagedThreadFactory managedThreadFactoryItem: managedThreadFactory) { + if (managedThreadFactoryItem!= null) { + writer.writeStartElement(prefix, "managed-thread-factory", "http://java.sun.com/xml/ns/javaee"); + writeManagedThreadFactory(writer, managedThreadFactoryItem, context); + writer.writeEndElement(); + } + } + } + context.afterMarshal(statefulBean, org.metatype.sxc.jaxb.LifecycleCallback.NONE); } diff --git a/container/openejb-jee-accessors/src/main/java/org/apache/openejb/jee/StatelessBean$JAXB.java b/container/openejb-jee-accessors/src/main/java/org/apache/openejb/jee/StatelessBean$JAXB.java index cce8b3a5ef8..92eac06c3a8 100644 --- a/container/openejb-jee-accessors/src/main/java/org/apache/openejb/jee/StatelessBean$JAXB.java +++ b/container/openejb-jee-accessors/src/main/java/org/apache/openejb/jee/StatelessBean$JAXB.java @@ -62,6 +62,12 @@ import static org.apache.openejb.jee.JMSDestination$JAXB.writeJMSDestination; import static org.apache.openejb.jee.LifecycleCallback$JAXB.readLifecycleCallback; import static org.apache.openejb.jee.LifecycleCallback$JAXB.writeLifecycleCallback; +import static org.apache.openejb.jee.ManagedExecutor$JAXB.readManagedExecutor; +import static org.apache.openejb.jee.ManagedExecutor$JAXB.writeManagedExecutor; +import static org.apache.openejb.jee.ManagedScheduledExecutor$JAXB.readManagedScheduledExecutor; +import static org.apache.openejb.jee.ManagedScheduledExecutor$JAXB.writeManagedScheduledExecutor; +import static org.apache.openejb.jee.ManagedThreadFactory$JAXB.readManagedThreadFactory; +import static org.apache.openejb.jee.ManagedThreadFactory$JAXB.writeManagedThreadFactory; import static org.apache.openejb.jee.MessageDestinationRef$JAXB.readMessageDestinationRef; import static org.apache.openejb.jee.MessageDestinationRef$JAXB.writeMessageDestinationRef; import static org.apache.openejb.jee.NamedMethod$JAXB.readNamedMethod; @@ -102,7 +108,7 @@ public class StatelessBean$JAXB public StatelessBean$JAXB() { - super(StatelessBean.class, null, new QName("http://java.sun.com/xml/ns/javaee".intern(), "statelessBean".intern()), Text$JAXB.class, Icon$JAXB.class, Empty$JAXB.class, SessionType$JAXB.class, Timeout$JAXB.class, NamedMethod$JAXB.class, Timer$JAXB.class, ConcurrencyManagementType$JAXB.class, ConcurrentMethod$JAXB.class, InitMethod$JAXB.class, RemoveMethod$JAXB.class, AsyncMethod$JAXB.class, TransactionType$JAXB.class, AroundInvoke$JAXB.class, AroundTimeout$JAXB.class, EnvEntry$JAXB.class, EjbRef$JAXB.class, EjbLocalRef$JAXB.class, ServiceRef$JAXB.class, ResourceRef$JAXB.class, ResourceEnvRef$JAXB.class, MessageDestinationRef$JAXB.class, PersistenceContextRef$JAXB.class, PersistenceUnitRef$JAXB.class, LifecycleCallback$JAXB.class, DataSource$JAXB.class, JMSConnectionFactory$JAXB.class, JMSDestination$JAXB.class, SecurityRoleRef$JAXB.class, SecurityIdentity$JAXB.class, ContextService$JAXB.class); + super(StatelessBean.class, null, new QName("http://java.sun.com/xml/ns/javaee".intern(), "statelessBean".intern()), Text$JAXB.class, Icon$JAXB.class, Empty$JAXB.class, SessionType$JAXB.class, Timeout$JAXB.class, NamedMethod$JAXB.class, Timer$JAXB.class, ConcurrencyManagementType$JAXB.class, ConcurrentMethod$JAXB.class, InitMethod$JAXB.class, RemoveMethod$JAXB.class, AsyncMethod$JAXB.class, TransactionType$JAXB.class, AroundInvoke$JAXB.class, AroundTimeout$JAXB.class, EnvEntry$JAXB.class, EjbRef$JAXB.class, EjbLocalRef$JAXB.class, ServiceRef$JAXB.class, ResourceRef$JAXB.class, ResourceEnvRef$JAXB.class, MessageDestinationRef$JAXB.class, PersistenceContextRef$JAXB.class, PersistenceUnitRef$JAXB.class, LifecycleCallback$JAXB.class, DataSource$JAXB.class, JMSConnectionFactory$JAXB.class, JMSDestination$JAXB.class, SecurityRoleRef$JAXB.class, SecurityIdentity$JAXB.class, ContextService$JAXB.class, ManagedExecutor$JAXB.class, ManagedScheduledExecutor$JAXB.class, ManagedThreadFactory$JAXB.class); } public static StatelessBean readStatelessBean(XoXMLStreamReader reader, RuntimeContext context) @@ -169,6 +175,9 @@ public static final StatelessBean _read(XoXMLStreamReader reader, RuntimeContext List prePassivate = null; List securityRoleRef = null; KeyedCollection contextService = null; + KeyedCollection managedExecutor = null; + KeyedCollection managedScheduledExecutor = null; + KeyedCollection managedThreadFactory = null; // Check xsi:type QName xsiType = reader.getXsiType(); @@ -733,8 +742,44 @@ public static final StatelessBean _read(XoXMLStreamReader reader, RuntimeContext } } contextService.add(contextServiceItem); + } else if (("managed-executor" == elementReader.getLocalName())&&("http://java.sun.com/xml/ns/javaee" == elementReader.getNamespaceURI())) { + // ELEMENT: managedExecutor + ManagedExecutor managedExecutorItem = readManagedExecutor(elementReader, context); + if (managedExecutor == null) { + managedExecutor = statelessBean.managedExecutor; + if (managedExecutor!= null) { + managedExecutor.clear(); + } else { + managedExecutor = new KeyedCollection<>(); + } + } + managedExecutor.add(managedExecutorItem); + } else if (("managed-scheduled-executor" == elementReader.getLocalName())&&("http://java.sun.com/xml/ns/javaee" == elementReader.getNamespaceURI())) { + // ELEMENT: managedScheduledExecutor + ManagedScheduledExecutor managedScheduledExecutorItem = readManagedScheduledExecutor(elementReader, context); + if (managedScheduledExecutor == null) { + managedScheduledExecutor = statelessBean.managedScheduledExecutor; + if (managedScheduledExecutor!= null) { + managedScheduledExecutor.clear(); + } else { + managedScheduledExecutor = new KeyedCollection<>(); + } + } + managedScheduledExecutor.add(managedScheduledExecutorItem); + } else if (("managed-thread-factory" == elementReader.getLocalName())&&("http://java.sun.com/xml/ns/javaee" == elementReader.getNamespaceURI())) { + // ELEMENT: managedThreadFactory + ManagedThreadFactory managedThreadFactoryItem = readManagedThreadFactory(elementReader, context); + if (managedThreadFactory == null) { + managedThreadFactory = statelessBean.managedThreadFactory; + if (managedThreadFactory!= null) { + managedThreadFactory.clear(); + } else { + managedThreadFactory = new KeyedCollection<>(); + } + } + managedThreadFactory.add(managedThreadFactoryItem); } else { - context.unexpectedElement(elementReader, new QName("http://java.sun.com/xml/ns/javaee", "description"), new QName("http://java.sun.com/xml/ns/javaee", "display-name"), new QName("http://java.sun.com/xml/ns/javaee", "icon"), new QName("http://java.sun.com/xml/ns/javaee", "ejb-name"), new QName("http://java.sun.com/xml/ns/javaee", "mapped-name"), new QName("http://java.sun.com/xml/ns/javaee", "home"), new QName("http://java.sun.com/xml/ns/javaee", "remote"), new QName("http://java.sun.com/xml/ns/javaee", "local-home"), new QName("http://java.sun.com/xml/ns/javaee", "local"), new QName("http://java.sun.com/xml/ns/javaee", "business-local"), new QName("http://java.sun.com/xml/ns/javaee", "business-remote"), new QName("http://java.sun.com/xml/ns/javaee", "local-bean"), new QName("http://java.sun.com/xml/ns/javaee", "service-endpoint"), new QName("http://java.sun.com/xml/ns/javaee", "ejb-class"), new QName("http://java.sun.com/xml/ns/javaee", "session-type"), new QName("http://java.sun.com/xml/ns/javaee", "stateful-timeout"), new QName("http://java.sun.com/xml/ns/javaee", "timeout-method"), new QName("http://java.sun.com/xml/ns/javaee", "timer"), new QName("http://java.sun.com/xml/ns/javaee", "init-on-startup"), new QName("http://java.sun.com/xml/ns/javaee", "concurrency-management-type"), new QName("http://java.sun.com/xml/ns/javaee", "concurrent-method"), new QName("http://java.sun.com/xml/ns/javaee", "depends-on"), new QName("http://java.sun.com/xml/ns/javaee", "init-method"), new QName("http://java.sun.com/xml/ns/javaee", "remove-method"), new QName("http://java.sun.com/xml/ns/javaee", "async-method"), new QName("http://java.sun.com/xml/ns/javaee", "transaction-type"), new QName("http://java.sun.com/xml/ns/javaee", "after-begin-method"), new QName("http://java.sun.com/xml/ns/javaee", "before-completion-method"), new QName("http://java.sun.com/xml/ns/javaee", "after-completion-method"), new QName("http://java.sun.com/xml/ns/javaee", "around-invoke"), new QName("http://java.sun.com/xml/ns/javaee", "around-timeout"), new QName("http://java.sun.com/xml/ns/javaee", "env-entry"), new QName("http://java.sun.com/xml/ns/javaee", "ejb-ref"), new QName("http://java.sun.com/xml/ns/javaee", "ejb-local-ref"), new QName("http://java.sun.com/xml/ns/javaee", "service-ref"), new QName("http://java.sun.com/xml/ns/javaee", "resource-ref"), new QName("http://java.sun.com/xml/ns/javaee", "resource-env-ref"), new QName("http://java.sun.com/xml/ns/javaee", "message-destination-ref"), new QName("http://java.sun.com/xml/ns/javaee", "persistence-context-ref"), new QName("http://java.sun.com/xml/ns/javaee", "persistence-unit-ref"), new QName("http://java.sun.com/xml/ns/javaee", "post-construct"), new QName("http://java.sun.com/xml/ns/javaee", "pre-destroy"), new QName("http://java.sun.com/xml/ns/javaee", "data-source"), new QName("http://java.sun.com/xml/ns/javaee", "jms-connection-factory"), new QName("http://java.sun.com/xml/ns/javaee", "jms-destination"), new QName("http://java.sun.com/xml/ns/javaee", "post-activate"), new QName("http://java.sun.com/xml/ns/javaee", "pre-passivate"), new QName("http://java.sun.com/xml/ns/javaee", "security-role-ref"), new QName("http://java.sun.com/xml/ns/javaee", "security-identity"), new QName("http://java.sun.com/xml/ns/javaee", "passivation-capable"), new QName("http://java.sun.com/xml/ns/javaee", "context-service")); + context.unexpectedElement(elementReader, new QName("http://java.sun.com/xml/ns/javaee", "description"), new QName("http://java.sun.com/xml/ns/javaee", "display-name"), new QName("http://java.sun.com/xml/ns/javaee", "icon"), new QName("http://java.sun.com/xml/ns/javaee", "ejb-name"), new QName("http://java.sun.com/xml/ns/javaee", "mapped-name"), new QName("http://java.sun.com/xml/ns/javaee", "home"), new QName("http://java.sun.com/xml/ns/javaee", "remote"), new QName("http://java.sun.com/xml/ns/javaee", "local-home"), new QName("http://java.sun.com/xml/ns/javaee", "local"), new QName("http://java.sun.com/xml/ns/javaee", "business-local"), new QName("http://java.sun.com/xml/ns/javaee", "business-remote"), new QName("http://java.sun.com/xml/ns/javaee", "local-bean"), new QName("http://java.sun.com/xml/ns/javaee", "service-endpoint"), new QName("http://java.sun.com/xml/ns/javaee", "ejb-class"), new QName("http://java.sun.com/xml/ns/javaee", "session-type"), new QName("http://java.sun.com/xml/ns/javaee", "stateful-timeout"), new QName("http://java.sun.com/xml/ns/javaee", "timeout-method"), new QName("http://java.sun.com/xml/ns/javaee", "timer"), new QName("http://java.sun.com/xml/ns/javaee", "init-on-startup"), new QName("http://java.sun.com/xml/ns/javaee", "concurrency-management-type"), new QName("http://java.sun.com/xml/ns/javaee", "concurrent-method"), new QName("http://java.sun.com/xml/ns/javaee", "depends-on"), new QName("http://java.sun.com/xml/ns/javaee", "init-method"), new QName("http://java.sun.com/xml/ns/javaee", "remove-method"), new QName("http://java.sun.com/xml/ns/javaee", "async-method"), new QName("http://java.sun.com/xml/ns/javaee", "transaction-type"), new QName("http://java.sun.com/xml/ns/javaee", "after-begin-method"), new QName("http://java.sun.com/xml/ns/javaee", "before-completion-method"), new QName("http://java.sun.com/xml/ns/javaee", "after-completion-method"), new QName("http://java.sun.com/xml/ns/javaee", "around-invoke"), new QName("http://java.sun.com/xml/ns/javaee", "around-timeout"), new QName("http://java.sun.com/xml/ns/javaee", "env-entry"), new QName("http://java.sun.com/xml/ns/javaee", "ejb-ref"), new QName("http://java.sun.com/xml/ns/javaee", "ejb-local-ref"), new QName("http://java.sun.com/xml/ns/javaee", "service-ref"), new QName("http://java.sun.com/xml/ns/javaee", "resource-ref"), new QName("http://java.sun.com/xml/ns/javaee", "resource-env-ref"), new QName("http://java.sun.com/xml/ns/javaee", "message-destination-ref"), new QName("http://java.sun.com/xml/ns/javaee", "persistence-context-ref"), new QName("http://java.sun.com/xml/ns/javaee", "persistence-unit-ref"), new QName("http://java.sun.com/xml/ns/javaee", "post-construct"), new QName("http://java.sun.com/xml/ns/javaee", "pre-destroy"), new QName("http://java.sun.com/xml/ns/javaee", "data-source"), new QName("http://java.sun.com/xml/ns/javaee", "jms-connection-factory"), new QName("http://java.sun.com/xml/ns/javaee", "jms-destination"), new QName("http://java.sun.com/xml/ns/javaee", "post-activate"), new QName("http://java.sun.com/xml/ns/javaee", "pre-passivate"), new QName("http://java.sun.com/xml/ns/javaee", "security-role-ref"), new QName("http://java.sun.com/xml/ns/javaee", "security-identity"), new QName("http://java.sun.com/xml/ns/javaee", "passivation-capable"), new QName("http://java.sun.com/xml/ns/javaee", "context-service"), new QName("http://java.sun.com/xml/ns/javaee", "managed-executor"), new QName("http://java.sun.com/xml/ns/javaee", "managed-scheduled-executor"), new QName("http://java.sun.com/xml/ns/javaee", "managed-thread-factory")); } } if (descriptions!= null) { @@ -835,6 +880,15 @@ public static final StatelessBean _read(XoXMLStreamReader reader, RuntimeContext if (contextService!= null) { statelessBean.contextService = contextService; } + if (managedExecutor!= null) { + statelessBean.managedExecutor = managedExecutor; + } + if (managedScheduledExecutor!= null) { + statelessBean.managedScheduledExecutor = managedScheduledExecutor; + } + if (managedThreadFactory!= null) { + statelessBean.managedThreadFactory = managedThreadFactory; + } context.afterUnmarshal(statelessBean, org.metatype.sxc.jaxb.LifecycleCallback.NONE); @@ -1580,6 +1634,42 @@ public static final void _write(XoXMLStreamWriter writer, StatelessBean stateles } } + // ELEMENT: managedExecutor + KeyedCollection managedExecutor = statelessBean.managedExecutor; + if (managedExecutor!= null) { + for (ManagedExecutor managedExecutorItem: managedExecutor) { + if (managedExecutorItem!= null) { + writer.writeStartElement(prefix, "managed-executor", "http://java.sun.com/xml/ns/javaee"); + writeManagedExecutor(writer, managedExecutorItem, context); + writer.writeEndElement(); + } + } + } + + // ELEMENT: managedScheduledExecutor + KeyedCollection managedScheduledExecutor = statelessBean.managedScheduledExecutor; + if (managedScheduledExecutor!= null) { + for (ManagedScheduledExecutor managedScheduledExecutorItem: managedScheduledExecutor) { + if (managedScheduledExecutorItem!= null) { + writer.writeStartElement(prefix, "managed-scheduled-executor", "http://java.sun.com/xml/ns/javaee"); + writeManagedScheduledExecutor(writer, managedScheduledExecutorItem, context); + writer.writeEndElement(); + } + } + } + + // ELEMENT: managedThreadFactory + KeyedCollection managedThreadFactory = statelessBean.managedThreadFactory; + if (managedThreadFactory!= null) { + for (ManagedThreadFactory managedThreadFactoryItem: managedThreadFactory) { + if (managedThreadFactoryItem!= null) { + writer.writeStartElement(prefix, "managed-thread-factory", "http://java.sun.com/xml/ns/javaee"); + writeManagedThreadFactory(writer, managedThreadFactoryItem, context); + writer.writeEndElement(); + } + } + } + context.afterMarshal(statelessBean, org.metatype.sxc.jaxb.LifecycleCallback.NONE); } diff --git a/container/openejb-jee-accessors/src/main/java/org/apache/openejb/jee/WebApp$JAXB.java b/container/openejb-jee-accessors/src/main/java/org/apache/openejb/jee/WebApp$JAXB.java index 6459e9d8b8b..8f33e9e2e40 100644 --- a/container/openejb-jee-accessors/src/main/java/org/apache/openejb/jee/WebApp$JAXB.java +++ b/container/openejb-jee-accessors/src/main/java/org/apache/openejb/jee/WebApp$JAXB.java @@ -65,6 +65,12 @@ import static org.apache.openejb.jee.LocaleEncodingMappingList$JAXB.writeLocaleEncodingMappingList; import static org.apache.openejb.jee.LoginConfig$JAXB.readLoginConfig; import static org.apache.openejb.jee.LoginConfig$JAXB.writeLoginConfig; +import static org.apache.openejb.jee.ManagedExecutor$JAXB.readManagedExecutor; +import static org.apache.openejb.jee.ManagedExecutor$JAXB.writeManagedExecutor; +import static org.apache.openejb.jee.ManagedScheduledExecutor$JAXB.readManagedScheduledExecutor; +import static org.apache.openejb.jee.ManagedScheduledExecutor$JAXB.writeManagedScheduledExecutor; +import static org.apache.openejb.jee.ManagedThreadFactory$JAXB.readManagedThreadFactory; +import static org.apache.openejb.jee.ManagedThreadFactory$JAXB.writeManagedThreadFactory; import static org.apache.openejb.jee.MessageDestination$JAXB.readMessageDestination; import static org.apache.openejb.jee.MessageDestination$JAXB.writeMessageDestination; import static org.apache.openejb.jee.MessageDestinationRef$JAXB.readMessageDestinationRef; @@ -109,7 +115,7 @@ public class WebApp$JAXB public WebApp$JAXB() { - super(WebApp.class, new QName("http://java.sun.com/xml/ns/javaee".intern(), "web-app".intern()), new QName("http://java.sun.com/xml/ns/javaee".intern(), "web-appType".intern()), Text$JAXB.class, Icon$JAXB.class, Empty$JAXB.class, ParamValue$JAXB.class, Filter$JAXB.class, FilterMapping$JAXB.class, Listener$JAXB.class, Servlet$JAXB.class, ServletMapping$JAXB.class, SessionConfig$JAXB.class, MimeMapping$JAXB.class, WelcomeFileList$JAXB.class, ErrorPage$JAXB.class, Taglib$JAXB.class, JspConfig$JAXB.class, SecurityConstraint$JAXB.class, LoginConfig$JAXB.class, SecurityRole$JAXB.class, LocaleEncodingMappingList$JAXB.class, EnvEntry$JAXB.class, EjbRef$JAXB.class, EjbLocalRef$JAXB.class, ServiceRef$JAXB.class, ResourceRef$JAXB.class, ResourceEnvRef$JAXB.class, MessageDestinationRef$JAXB.class, PersistenceContextRef$JAXB.class, PersistenceUnitRef$JAXB.class, LifecycleCallback$JAXB.class, MessageDestination$JAXB.class, AbsoluteOrdering$JAXB.class, DataSource$JAXB.class, JMSConnectionFactory$JAXB.class, JMSDestination$JAXB.class, ContextService$JAXB.class); + super(WebApp.class, new QName("http://java.sun.com/xml/ns/javaee".intern(), "web-app".intern()), new QName("http://java.sun.com/xml/ns/javaee".intern(), "web-appType".intern()), Text$JAXB.class, Icon$JAXB.class, Empty$JAXB.class, ParamValue$JAXB.class, Filter$JAXB.class, FilterMapping$JAXB.class, Listener$JAXB.class, Servlet$JAXB.class, ServletMapping$JAXB.class, SessionConfig$JAXB.class, MimeMapping$JAXB.class, WelcomeFileList$JAXB.class, ErrorPage$JAXB.class, Taglib$JAXB.class, JspConfig$JAXB.class, SecurityConstraint$JAXB.class, LoginConfig$JAXB.class, SecurityRole$JAXB.class, LocaleEncodingMappingList$JAXB.class, EnvEntry$JAXB.class, EjbRef$JAXB.class, EjbLocalRef$JAXB.class, ServiceRef$JAXB.class, ResourceRef$JAXB.class, ResourceEnvRef$JAXB.class, MessageDestinationRef$JAXB.class, PersistenceContextRef$JAXB.class, PersistenceUnitRef$JAXB.class, LifecycleCallback$JAXB.class, MessageDestination$JAXB.class, AbsoluteOrdering$JAXB.class, DataSource$JAXB.class, JMSConnectionFactory$JAXB.class, JMSDestination$JAXB.class, ContextService$JAXB.class, ManagedExecutor$JAXB.class, ManagedScheduledExecutor$JAXB.class, ManagedThreadFactory$JAXB.class); } public static WebApp readWebApp(XoXMLStreamReader reader, RuntimeContext context) @@ -181,6 +187,9 @@ public static final WebApp _read(XoXMLStreamReader reader, RuntimeContext contex KeyedCollection jmsConnectionFactories = null; KeyedCollection jmsDestinations = null; KeyedCollection contextService = null; + KeyedCollection managedExecutor = null; + KeyedCollection managedScheduledExecutor = null; + KeyedCollection managedThreadFactory = null; List others = null; // Check xsi:type @@ -660,6 +669,42 @@ public static final WebApp _read(XoXMLStreamReader reader, RuntimeContext contex } } contextService.add(contextServiceItem); + } else if (("managed-executor" == elementReader.getLocalName())&&("http://java.sun.com/xml/ns/javaee" == elementReader.getNamespaceURI())) { + // ELEMENT: managedExecutor + ManagedExecutor managedExecutorItem = readManagedExecutor(elementReader, context); + if (managedExecutor == null) { + managedExecutor = webApp.managedExecutor; + if (managedExecutor!= null) { + managedExecutor.clear(); + } else { + managedExecutor = new KeyedCollection<>(); + } + } + managedExecutor.add(managedExecutorItem); + } else if (("managed-scheduled-executor" == elementReader.getLocalName())&&("http://java.sun.com/xml/ns/javaee" == elementReader.getNamespaceURI())) { + // ELEMENT: managedScheduledExecutor + ManagedScheduledExecutor managedScheduledExecutorItem = readManagedScheduledExecutor(elementReader, context); + if (managedScheduledExecutor == null) { + managedScheduledExecutor = webApp.managedScheduledExecutor; + if (managedScheduledExecutor!= null) { + managedScheduledExecutor.clear(); + } else { + managedScheduledExecutor = new KeyedCollection<>(); + } + } + managedScheduledExecutor.add(managedScheduledExecutorItem); + } else if (("managed-thread-factory" == elementReader.getLocalName())&&("http://java.sun.com/xml/ns/javaee" == elementReader.getNamespaceURI())) { + // ELEMENT: managedThreadFactory + ManagedThreadFactory managedThreadFactoryItem = readManagedThreadFactory(elementReader, context); + if (managedThreadFactory == null) { + managedThreadFactory = webApp.managedThreadFactory; + if (managedThreadFactory!= null) { + managedThreadFactory.clear(); + } else { + managedThreadFactory = new KeyedCollection<>(); + } + } + managedThreadFactory.add(managedThreadFactoryItem); } else { // ELEMENT_REF: others if (others == null) { @@ -786,6 +831,15 @@ public static final WebApp _read(XoXMLStreamReader reader, RuntimeContext contex if (contextService!= null) { webApp.contextService = contextService; } + if (managedExecutor!= null) { + webApp.managedExecutor = managedExecutor; + } + if (managedScheduledExecutor!= null) { + webApp.managedScheduledExecutor = managedScheduledExecutor; + } + if (managedThreadFactory!= null) { + webApp.managedThreadFactory = managedThreadFactory; + } if (others!= null) { webApp.others = others; } @@ -1373,6 +1427,42 @@ public static final void _write(XoXMLStreamWriter writer, WebApp webApp, Runtime } } + // ELEMENT: managedExecutor + KeyedCollection managedExecutor = webApp.managedExecutor; + if (managedExecutor!= null) { + for (ManagedExecutor managedExecutorItem: managedExecutor) { + if (managedExecutorItem!= null) { + writer.writeStartElement(prefix, "managed-executor", "http://java.sun.com/xml/ns/javaee"); + writeManagedExecutor(writer, managedExecutorItem, context); + writer.writeEndElement(); + } + } + } + + // ELEMENT: managedScheduledExecutor + KeyedCollection managedScheduledExecutor = webApp.managedScheduledExecutor; + if (managedScheduledExecutor!= null) { + for (ManagedScheduledExecutor managedScheduledExecutorItem: managedScheduledExecutor) { + if (managedScheduledExecutorItem!= null) { + writer.writeStartElement(prefix, "managed-scheduled-executor", "http://java.sun.com/xml/ns/javaee"); + writeManagedScheduledExecutor(writer, managedScheduledExecutorItem, context); + writer.writeEndElement(); + } + } + } + + // ELEMENT: managedThreadFactory + KeyedCollection managedThreadFactory = webApp.managedThreadFactory; + if (managedThreadFactory!= null) { + for (ManagedThreadFactory managedThreadFactoryItem: managedThreadFactory) { + if (managedThreadFactoryItem!= null) { + writer.writeStartElement(prefix, "managed-thread-factory", "http://java.sun.com/xml/ns/javaee"); + writeManagedThreadFactory(writer, managedThreadFactoryItem, context); + writer.writeEndElement(); + } + } + } + // ELEMENT_REF: others List others = webApp.others; if (others!= null) { diff --git a/container/openejb-jee-accessors/src/main/java/org/apache/openejb/jee/WebFragment$JAXB.java b/container/openejb-jee-accessors/src/main/java/org/apache/openejb/jee/WebFragment$JAXB.java index 55da8d4c63b..b052470bb10 100644 --- a/container/openejb-jee-accessors/src/main/java/org/apache/openejb/jee/WebFragment$JAXB.java +++ b/container/openejb-jee-accessors/src/main/java/org/apache/openejb/jee/WebFragment$JAXB.java @@ -63,6 +63,12 @@ import static org.apache.openejb.jee.LocaleEncodingMappingList$JAXB.writeLocaleEncodingMappingList; import static org.apache.openejb.jee.LoginConfig$JAXB.readLoginConfig; import static org.apache.openejb.jee.LoginConfig$JAXB.writeLoginConfig; +import static org.apache.openejb.jee.ManagedExecutor$JAXB.readManagedExecutor; +import static org.apache.openejb.jee.ManagedExecutor$JAXB.writeManagedExecutor; +import static org.apache.openejb.jee.ManagedScheduledExecutor$JAXB.readManagedScheduledExecutor; +import static org.apache.openejb.jee.ManagedScheduledExecutor$JAXB.writeManagedScheduledExecutor; +import static org.apache.openejb.jee.ManagedThreadFactory$JAXB.readManagedThreadFactory; +import static org.apache.openejb.jee.ManagedThreadFactory$JAXB.writeManagedThreadFactory; import static org.apache.openejb.jee.MessageDestination$JAXB.readMessageDestination; import static org.apache.openejb.jee.MessageDestination$JAXB.writeMessageDestination; import static org.apache.openejb.jee.MessageDestinationRef$JAXB.readMessageDestinationRef; @@ -107,7 +113,7 @@ public class WebFragment$JAXB public WebFragment$JAXB() { - super(WebFragment.class, new QName("http://java.sun.com/xml/ns/javaee".intern(), "web-fragment".intern()), new QName("http://java.sun.com/xml/ns/javaee".intern(), "web-fragmentType".intern()), Text$JAXB.class, Icon$JAXB.class, Empty$JAXB.class, ParamValue$JAXB.class, Filter$JAXB.class, FilterMapping$JAXB.class, Listener$JAXB.class, Servlet$JAXB.class, ServletMapping$JAXB.class, SessionConfig$JAXB.class, MimeMapping$JAXB.class, WelcomeFileList$JAXB.class, ErrorPage$JAXB.class, JspConfig$JAXB.class, SecurityConstraint$JAXB.class, LoginConfig$JAXB.class, SecurityRole$JAXB.class, LocaleEncodingMappingList$JAXB.class, EnvEntry$JAXB.class, EjbRef$JAXB.class, EjbLocalRef$JAXB.class, ServiceRef$JAXB.class, ResourceRef$JAXB.class, ResourceEnvRef$JAXB.class, MessageDestinationRef$JAXB.class, PersistenceContextRef$JAXB.class, PersistenceUnitRef$JAXB.class, LifecycleCallback$JAXB.class, MessageDestination$JAXB.class, Ordering$JAXB.class, DataSource$JAXB.class, JMSConnectionFactory$JAXB.class, JMSDestination$JAXB.class, ContextService$JAXB.class); + super(WebFragment.class, new QName("http://java.sun.com/xml/ns/javaee".intern(), "web-fragment".intern()), new QName("http://java.sun.com/xml/ns/javaee".intern(), "web-fragmentType".intern()), Text$JAXB.class, Icon$JAXB.class, Empty$JAXB.class, ParamValue$JAXB.class, Filter$JAXB.class, FilterMapping$JAXB.class, Listener$JAXB.class, Servlet$JAXB.class, ServletMapping$JAXB.class, SessionConfig$JAXB.class, MimeMapping$JAXB.class, WelcomeFileList$JAXB.class, ErrorPage$JAXB.class, JspConfig$JAXB.class, SecurityConstraint$JAXB.class, LoginConfig$JAXB.class, SecurityRole$JAXB.class, LocaleEncodingMappingList$JAXB.class, EnvEntry$JAXB.class, EjbRef$JAXB.class, EjbLocalRef$JAXB.class, ServiceRef$JAXB.class, ResourceRef$JAXB.class, ResourceEnvRef$JAXB.class, MessageDestinationRef$JAXB.class, PersistenceContextRef$JAXB.class, PersistenceUnitRef$JAXB.class, LifecycleCallback$JAXB.class, MessageDestination$JAXB.class, Ordering$JAXB.class, DataSource$JAXB.class, JMSConnectionFactory$JAXB.class, JMSDestination$JAXB.class, ContextService$JAXB.class, ManagedExecutor$JAXB.class, ManagedScheduledExecutor$JAXB.class, ManagedThreadFactory$JAXB.class); } public static WebFragment readWebFragment(XoXMLStreamReader reader, RuntimeContext context) @@ -179,6 +185,9 @@ public static final WebFragment _read(XoXMLStreamReader reader, RuntimeContext c KeyedCollection jmsConnectionFactories = null; KeyedCollection jmsDestinations = null; KeyedCollection contextService = null; + KeyedCollection managedExecutor = null; + KeyedCollection managedScheduledExecutor = null; + KeyedCollection managedThreadFactory = null; // Check xsi:type QName xsiType = reader.getXsiType(); @@ -636,8 +645,44 @@ public static final WebFragment _read(XoXMLStreamReader reader, RuntimeContext c } } contextService.add(contextServiceItem); + } else if (("managed-executor" == elementReader.getLocalName())&&("http://java.sun.com/xml/ns/javaee" == elementReader.getNamespaceURI())) { + // ELEMENT: managedExecutor + ManagedExecutor managedExecutorItem = readManagedExecutor(elementReader, context); + if (managedExecutor == null) { + managedExecutor = webFragment.managedExecutor; + if (managedExecutor!= null) { + managedExecutor.clear(); + } else { + managedExecutor = new KeyedCollection<>(); + } + } + managedExecutor.add(managedExecutorItem); + } else if (("managed-scheduled-executor" == elementReader.getLocalName())&&("http://java.sun.com/xml/ns/javaee" == elementReader.getNamespaceURI())) { + // ELEMENT: managedScheduledExecutor + ManagedScheduledExecutor managedScheduledExecutorItem = readManagedScheduledExecutor(elementReader, context); + if (managedScheduledExecutor == null) { + managedScheduledExecutor = webFragment.managedScheduledExecutor; + if (managedScheduledExecutor!= null) { + managedScheduledExecutor.clear(); + } else { + managedScheduledExecutor = new KeyedCollection<>(); + } + } + managedScheduledExecutor.add(managedScheduledExecutorItem); + } else if (("managed-thread-factory" == elementReader.getLocalName())&&("http://java.sun.com/xml/ns/javaee" == elementReader.getNamespaceURI())) { + // ELEMENT: managedThreadFactory + ManagedThreadFactory managedThreadFactoryItem = readManagedThreadFactory(elementReader, context); + if (managedThreadFactory == null) { + managedThreadFactory = webFragment.managedThreadFactory; + if (managedThreadFactory!= null) { + managedThreadFactory.clear(); + } else { + managedThreadFactory = new KeyedCollection<>(); + } + } + managedThreadFactory.add(managedThreadFactoryItem); } else { - context.unexpectedElement(elementReader, new QName("http://java.sun.com/xml/ns/javaee", "description"), new QName("http://java.sun.com/xml/ns/javaee", "display-name"), new QName("http://java.sun.com/xml/ns/javaee", "icon"), new QName("http://java.sun.com/xml/ns/javaee", "distributable"), new QName("http://java.sun.com/xml/ns/javaee", "context-param"), new QName("http://java.sun.com/xml/ns/javaee", "filter"), new QName("http://java.sun.com/xml/ns/javaee", "filter-mapping"), new QName("http://java.sun.com/xml/ns/javaee", "listener"), new QName("http://java.sun.com/xml/ns/javaee", "servlet"), new QName("http://java.sun.com/xml/ns/javaee", "servlet-mapping"), new QName("http://java.sun.com/xml/ns/javaee", "session-config"), new QName("http://java.sun.com/xml/ns/javaee", "mime-mapping"), new QName("http://java.sun.com/xml/ns/javaee", "welcome-file-list"), new QName("http://java.sun.com/xml/ns/javaee", "error-page"), new QName("http://java.sun.com/xml/ns/javaee", "jsp-config"), new QName("http://java.sun.com/xml/ns/javaee", "security-constraint"), new QName("http://java.sun.com/xml/ns/javaee", "login-config"), new QName("http://java.sun.com/xml/ns/javaee", "security-role"), new QName("http://java.sun.com/xml/ns/javaee", "locale-encoding-mapping-list"), new QName("http://java.sun.com/xml/ns/javaee", "env-entry"), new QName("http://java.sun.com/xml/ns/javaee", "ejb-ref"), new QName("http://java.sun.com/xml/ns/javaee", "ejb-local-ref"), new QName("http://java.sun.com/xml/ns/javaee", "service-ref"), new QName("http://java.sun.com/xml/ns/javaee", "resource-ref"), new QName("http://java.sun.com/xml/ns/javaee", "resource-env-ref"), new QName("http://java.sun.com/xml/ns/javaee", "message-destination-ref"), new QName("http://java.sun.com/xml/ns/javaee", "persistence-context-ref"), new QName("http://java.sun.com/xml/ns/javaee", "persistence-unit-ref"), new QName("http://java.sun.com/xml/ns/javaee", "post-construct"), new QName("http://java.sun.com/xml/ns/javaee", "pre-destroy"), new QName("http://java.sun.com/xml/ns/javaee", "message-destination"), new QName("http://java.sun.com/xml/ns/javaee", "ordering"), new QName("http://java.sun.com/xml/ns/javaee", "data-source"), new QName("http://java.sun.com/xml/ns/javaee", "jms-connection-factory"), new QName("http://java.sun.com/xml/ns/javaee", "jms-destination"), new QName("http://java.sun.com/xml/ns/javaee", "name"), new QName("http://java.sun.com/xml/ns/javaee", "context-service")); + context.unexpectedElement(elementReader, new QName("http://java.sun.com/xml/ns/javaee", "description"), new QName("http://java.sun.com/xml/ns/javaee", "display-name"), new QName("http://java.sun.com/xml/ns/javaee", "icon"), new QName("http://java.sun.com/xml/ns/javaee", "distributable"), new QName("http://java.sun.com/xml/ns/javaee", "context-param"), new QName("http://java.sun.com/xml/ns/javaee", "filter"), new QName("http://java.sun.com/xml/ns/javaee", "filter-mapping"), new QName("http://java.sun.com/xml/ns/javaee", "listener"), new QName("http://java.sun.com/xml/ns/javaee", "servlet"), new QName("http://java.sun.com/xml/ns/javaee", "servlet-mapping"), new QName("http://java.sun.com/xml/ns/javaee", "session-config"), new QName("http://java.sun.com/xml/ns/javaee", "mime-mapping"), new QName("http://java.sun.com/xml/ns/javaee", "welcome-file-list"), new QName("http://java.sun.com/xml/ns/javaee", "error-page"), new QName("http://java.sun.com/xml/ns/javaee", "jsp-config"), new QName("http://java.sun.com/xml/ns/javaee", "security-constraint"), new QName("http://java.sun.com/xml/ns/javaee", "login-config"), new QName("http://java.sun.com/xml/ns/javaee", "security-role"), new QName("http://java.sun.com/xml/ns/javaee", "locale-encoding-mapping-list"), new QName("http://java.sun.com/xml/ns/javaee", "env-entry"), new QName("http://java.sun.com/xml/ns/javaee", "ejb-ref"), new QName("http://java.sun.com/xml/ns/javaee", "ejb-local-ref"), new QName("http://java.sun.com/xml/ns/javaee", "service-ref"), new QName("http://java.sun.com/xml/ns/javaee", "resource-ref"), new QName("http://java.sun.com/xml/ns/javaee", "resource-env-ref"), new QName("http://java.sun.com/xml/ns/javaee", "message-destination-ref"), new QName("http://java.sun.com/xml/ns/javaee", "persistence-context-ref"), new QName("http://java.sun.com/xml/ns/javaee", "persistence-unit-ref"), new QName("http://java.sun.com/xml/ns/javaee", "post-construct"), new QName("http://java.sun.com/xml/ns/javaee", "pre-destroy"), new QName("http://java.sun.com/xml/ns/javaee", "message-destination"), new QName("http://java.sun.com/xml/ns/javaee", "ordering"), new QName("http://java.sun.com/xml/ns/javaee", "data-source"), new QName("http://java.sun.com/xml/ns/javaee", "jms-connection-factory"), new QName("http://java.sun.com/xml/ns/javaee", "jms-destination"), new QName("http://java.sun.com/xml/ns/javaee", "name"), new QName("http://java.sun.com/xml/ns/javaee", "context-service"), new QName("http://java.sun.com/xml/ns/javaee", "managed-executor"), new QName("http://java.sun.com/xml/ns/javaee", "managed-scheduled-executor"), new QName("http://java.sun.com/xml/ns/javaee", "managed-thread-factory")); } } if (descriptions!= null) { @@ -753,6 +798,15 @@ public static final WebFragment _read(XoXMLStreamReader reader, RuntimeContext c if (contextService!= null) { webFragment.contextService = contextService; } + if (managedExecutor!= null) { + webFragment.managedExecutor = managedExecutor; + } + if (managedScheduledExecutor!= null) { + webFragment.managedScheduledExecutor = managedScheduledExecutor; + } + if (managedThreadFactory!= null) { + webFragment.managedThreadFactory = managedThreadFactory; + } context.afterUnmarshal(webFragment, org.metatype.sxc.jaxb.LifecycleCallback.NONE); @@ -1310,6 +1364,42 @@ public static final void _write(XoXMLStreamWriter writer, WebFragment webFragmen } } + // ELEMENT: managedExecutor + KeyedCollection managedExecutor = webFragment.managedExecutor; + if (managedExecutor!= null) { + for (ManagedExecutor managedExecutorItem: managedExecutor) { + if (managedExecutorItem!= null) { + writer.writeStartElement(prefix, "managed-executor", "http://java.sun.com/xml/ns/javaee"); + writeManagedExecutor(writer, managedExecutorItem, context); + writer.writeEndElement(); + } + } + } + + // ELEMENT: managedScheduledExecutor + KeyedCollection managedScheduledExecutor = webFragment.managedScheduledExecutor; + if (managedScheduledExecutor!= null) { + for (ManagedScheduledExecutor managedScheduledExecutorItem: managedScheduledExecutor) { + if (managedScheduledExecutorItem!= null) { + writer.writeStartElement(prefix, "managed-scheduled-executor", "http://java.sun.com/xml/ns/javaee"); + writeManagedScheduledExecutor(writer, managedScheduledExecutorItem, context); + writer.writeEndElement(); + } + } + } + + // ELEMENT: managedThreadFactory + KeyedCollection managedThreadFactory = webFragment.managedThreadFactory; + if (managedThreadFactory!= null) { + for (ManagedThreadFactory managedThreadFactoryItem: managedThreadFactory) { + if (managedThreadFactoryItem!= null) { + writer.writeStartElement(prefix, "managed-thread-factory", "http://java.sun.com/xml/ns/javaee"); + writeManagedThreadFactory(writer, managedThreadFactoryItem, context); + writer.writeEndElement(); + } + } + } + context.afterMarshal(webFragment, org.metatype.sxc.jaxb.LifecycleCallback.NONE); } diff --git a/container/openejb-jee-accessors/src/main/java/org/apache/openejb/jee/oejb3/Adapters.java b/container/openejb-jee-accessors/src/main/java/org/apache/openejb/jee/oejb3/Adapters.java index b665c83f8db..8167765a026 100644 --- a/container/openejb-jee-accessors/src/main/java/org/apache/openejb/jee/oejb3/Adapters.java +++ b/container/openejb-jee-accessors/src/main/java/org/apache/openejb/jee/oejb3/Adapters.java @@ -21,7 +21,7 @@ public class Adapters { - public static final PropertiesAdapter propertiesAdapterAdapter = new PropertiesAdapter(); public static final CollapsedStringAdapter collapsedStringAdapterAdapter = new CollapsedStringAdapter(); + public static final PropertiesAdapter propertiesAdapterAdapter = new PropertiesAdapter(); } diff --git a/container/openejb-jee-accessors/src/main/java/org/apache/openejb/jee/oejb3/ObjectFactory$JAXB.java b/container/openejb-jee-accessors/src/main/java/org/apache/openejb/jee/oejb3/ObjectFactory$JAXB.java index 0b13a20e5f8..228d11dce3c 100644 --- a/container/openejb-jee-accessors/src/main/java/org/apache/openejb/jee/oejb3/ObjectFactory$JAXB.java +++ b/container/openejb-jee-accessors/src/main/java/org/apache/openejb/jee/oejb3/ObjectFactory$JAXB.java @@ -31,11 +31,11 @@ public class ObjectFactory$JAXB private final Map> rootElements = new HashMap<>(); public ObjectFactory$JAXB() { - super(ObjectFactory.class, EjbDeployment$JAXB.class, OpenejbJar$JAXB.class, EjbLink$JAXB.class, ResourceLink$JAXB.class, MethodParams$JAXB.class, QueryMethod$JAXB.class, Query$JAXB.class); - rootElements.put(new QName("http://www.openejb.org/openejb-jar/1.1".intern(), "method-param".intern()), org.metatype.sxc.jaxb.StandardJAXBObjects.StringJAXB.class); - rootElements.put(new QName("http://www.openejb.org/openejb-jar/1.1".intern(), "method-name".intern()), org.metatype.sxc.jaxb.StandardJAXBObjects.StringJAXB.class); - rootElements.put(new QName("http://www.openejb.org/openejb-jar/1.1".intern(), "object-ql".intern()), org.metatype.sxc.jaxb.StandardJAXBObjects.StringJAXB.class); + super(ObjectFactory.class, Query$JAXB.class, QueryMethod$JAXB.class, EjbDeployment$JAXB.class, MethodParams$JAXB.class, ResourceLink$JAXB.class, EjbLink$JAXB.class, OpenejbJar$JAXB.class); rootElements.put(new QName("http://www.openejb.org/openejb-jar/1.1".intern(), "description".intern()), org.metatype.sxc.jaxb.StandardJAXBObjects.StringJAXB.class); + rootElements.put(new QName("http://www.openejb.org/openejb-jar/1.1".intern(), "object-ql".intern()), org.metatype.sxc.jaxb.StandardJAXBObjects.StringJAXB.class); + rootElements.put(new QName("http://www.openejb.org/openejb-jar/1.1".intern(), "method-name".intern()), org.metatype.sxc.jaxb.StandardJAXBObjects.StringJAXB.class); + rootElements.put(new QName("http://www.openejb.org/openejb-jar/1.1".intern(), "method-param".intern()), org.metatype.sxc.jaxb.StandardJAXBObjects.StringJAXB.class); } public Map> getRootElements() { diff --git a/container/openejb-jee/src/main/java/org/apache/openejb/jee/Application.java b/container/openejb-jee/src/main/java/org/apache/openejb/jee/Application.java index 620a9cb4fb5..933135e5e7f 100644 --- a/container/openejb-jee/src/main/java/org/apache/openejb/jee/Application.java +++ b/container/openejb-jee/src/main/java/org/apache/openejb/jee/Application.java @@ -95,7 +95,10 @@ "dataSource", "jmsConnectionFactories", "jmsDestinations", - "contextService" + "contextService", + "managedExecutor", + "managedScheduledExecutor", + "managedThreadFactory" }) public class Application implements JndiConsumer, NamedModule { @@ -141,6 +144,12 @@ public class Application implements JndiConsumer, NamedModule { protected KeyedCollection dataSource; @XmlElement(name = "context-service") protected KeyedCollection contextService; + @XmlElement(name = "managed-executor") + protected KeyedCollection managedExecutor; + @XmlElement(name = "managed-scheduled-executor") + protected KeyedCollection managedScheduledExecutor; + @XmlElement(name = "managed-thread-factory") + protected KeyedCollection managedThreadFactory; @XmlElement(name = "jms-connection-factory", required = true) protected KeyedCollection jmsConnectionFactories; @XmlElement(name = "jms-destination") @@ -452,4 +461,31 @@ public Map getContextServiceMap() { } return this.contextService.toMap(); } + + @Override + public Map getManagedExecutorMap() { + if (managedExecutor == null) { + managedExecutor = new KeyedCollection<>(); + } + + return this.managedExecutor.toMap(); + } + + @Override + public Map getManagedScheduledExecutorMap() { + if (managedScheduledExecutor == null) { + managedScheduledExecutor = new KeyedCollection<>(); + } + + return this.managedScheduledExecutor.toMap(); + } + + @Override + public Map getManagedThreadFactoryMap() { + if (managedThreadFactory == null) { + managedThreadFactory = new KeyedCollection<>(); + } + + return this.managedThreadFactory.toMap(); + } } diff --git a/container/openejb-jee/src/main/java/org/apache/openejb/jee/ApplicationClient.java b/container/openejb-jee/src/main/java/org/apache/openejb/jee/ApplicationClient.java index 941e277bd73..89b53eb6e23 100644 --- a/container/openejb-jee/src/main/java/org/apache/openejb/jee/ApplicationClient.java +++ b/container/openejb-jee/src/main/java/org/apache/openejb/jee/ApplicationClient.java @@ -90,8 +90,10 @@ "dataSource", "jmsConnectionFactories", "jmsDestinations", - "contextService" - + "contextService", + "managedExecutor", + "managedScheduledExecutor", + "managedThreadFactory" }) public class ApplicationClient implements JndiConsumer, Lifecycle, NamedModule { @@ -152,6 +154,12 @@ public class ApplicationClient implements JndiConsumer, Lifecycle, NamedModule { protected String mainClass; @XmlElement(name="context-service") protected KeyedCollection contextService; + @XmlElement(name = "managed-executor") + protected KeyedCollection managedExecutor; + @XmlElement(name = "managed-scheduled-executor") + protected KeyedCollection managedScheduledExecutor; + @XmlElement(name = "managed-thread-factory") + protected KeyedCollection managedThreadFactory; public ApplicationClient() { } @@ -458,4 +466,31 @@ public Map getContextServiceMap() { } return this.contextService.toMap(); } + + @Override + public Map getManagedExecutorMap() { + if (managedExecutor == null) { + managedExecutor = new KeyedCollection<>(); + } + + return this.managedExecutor.toMap(); + } + + @Override + public Map getManagedScheduledExecutorMap() { + if (managedScheduledExecutor == null) { + managedScheduledExecutor = new KeyedCollection<>(); + } + + return this.managedScheduledExecutor.toMap(); + } + + @Override + public Map getManagedThreadFactoryMap() { + if (managedThreadFactory == null) { + managedThreadFactory = new KeyedCollection<>(); + } + + return this.managedThreadFactory.toMap(); + } } diff --git a/container/openejb-jee/src/main/java/org/apache/openejb/jee/EntityBean.java b/container/openejb-jee/src/main/java/org/apache/openejb/jee/EntityBean.java index 391ca4248b6..56d83ddaa9f 100644 --- a/container/openejb-jee/src/main/java/org/apache/openejb/jee/EntityBean.java +++ b/container/openejb-jee/src/main/java/org/apache/openejb/jee/EntityBean.java @@ -109,7 +109,10 @@ "securityRoleRef", "securityIdentity", "query", - "contextService" + "contextService", + "managedExecutor", + "managedScheduledExecutor", + "managedThreadFactory" }) public class EntityBean implements RemoteBean { @@ -186,6 +189,12 @@ public class EntityBean implements RemoteBean { protected String id; @XmlElement(name="context-service") protected KeyedCollection contextService; + @XmlElement(name="managed-executor") + protected KeyedCollection managedExecutor; + @XmlElement(name = "managed-scheduled-executor") + protected KeyedCollection managedScheduledExecutor; + @XmlElement(name = "managed-thread-factory") + protected KeyedCollection managedThreadFactory; public EntityBean() { final Set publicIds = JaxbJavaee.currentPublicId.get(); @@ -637,4 +646,30 @@ public Map getContextServiceMap() { } return this.contextService.toMap(); } + + @Override + public Map getManagedExecutorMap() { + if (managedExecutor == null) { + managedExecutor = new KeyedCollection(); + } + return this.managedExecutor.toMap(); + } + + @Override + public Map getManagedScheduledExecutorMap() { + if (managedScheduledExecutor == null) { + managedScheduledExecutor = new KeyedCollection<>(); + } + + return this.managedScheduledExecutor.toMap(); + } + + @Override + public Map getManagedThreadFactoryMap() { + if (managedThreadFactory == null) { + managedThreadFactory = new KeyedCollection<>(); + } + + return this.managedThreadFactory.toMap(); + } } diff --git a/container/openejb-jee/src/main/java/org/apache/openejb/jee/Interceptor.java b/container/openejb-jee/src/main/java/org/apache/openejb/jee/Interceptor.java index 80ea96f3316..bc8a3dfed92 100644 --- a/container/openejb-jee/src/main/java/org/apache/openejb/jee/Interceptor.java +++ b/container/openejb-jee/src/main/java/org/apache/openejb/jee/Interceptor.java @@ -85,7 +85,10 @@ "afterBegin", "beforeCompletion", "afterCompletion", - "contextService" + "contextService", + "managedExecutor", + "managedScheduledExecutor", + "managedThreadFactory" }) public class Interceptor implements JndiConsumer, Session { @@ -143,6 +146,12 @@ public class Interceptor implements JndiConsumer, Session { protected String id; @XmlElement(name="context-service") protected KeyedCollection contextService; + @XmlElement(name="managed-executor") + protected KeyedCollection managedExecutor; + @XmlElement(name = "managed-scheduled-executor") + protected KeyedCollection managedScheduledExecutor; + @XmlElement(name = "managed-thread-factory") + protected KeyedCollection managedThreadFactory; public Interceptor() { } @@ -483,4 +492,30 @@ public Map getContextServiceMap() { } return this.contextService.toMap(); } + + @Override + public Map getManagedExecutorMap() { + if (managedExecutor == null) { + managedExecutor = new KeyedCollection(); + } + return this.managedExecutor.toMap(); + } + + @Override + public Map getManagedScheduledExecutorMap() { + if (managedScheduledExecutor == null) { + managedScheduledExecutor = new KeyedCollection<>(); + } + + return this.managedScheduledExecutor.toMap(); + } + + @Override + public Map getManagedThreadFactoryMap() { + if (managedThreadFactory == null) { + managedThreadFactory = new KeyedCollection<>(); + } + + return this.managedThreadFactory.toMap(); + } } diff --git a/container/openejb-jee/src/main/java/org/apache/openejb/jee/JndiConsumer.java b/container/openejb-jee/src/main/java/org/apache/openejb/jee/JndiConsumer.java index d38c90d554c..29ea377908c 100644 --- a/container/openejb-jee/src/main/java/org/apache/openejb/jee/JndiConsumer.java +++ b/container/openejb-jee/src/main/java/org/apache/openejb/jee/JndiConsumer.java @@ -79,4 +79,7 @@ public interface JndiConsumer { Map getJMSDestinationMap(); Map getContextServiceMap(); + Map getManagedExecutorMap(); + Map getManagedScheduledExecutorMap(); + Map getManagedThreadFactoryMap(); } diff --git a/container/openejb-jee/src/main/java/org/apache/openejb/jee/ManagedExecutor.java b/container/openejb-jee/src/main/java/org/apache/openejb/jee/ManagedExecutor.java new file mode 100755 index 00000000000..82335aea84d --- /dev/null +++ b/container/openejb-jee/src/main/java/org/apache/openejb/jee/ManagedExecutor.java @@ -0,0 +1,102 @@ +/* + * 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.openejb.jee; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlType; +import org.apache.openejb.jee.jba.JndiName; + +import java.util.List; + +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "managed-executorType", propOrder = { + "description", + "name", + "contextService", + "hungTaskThreshold", + "maxAsync", + "properties" +}) +public class ManagedExecutor implements Keyable { + @XmlElement + protected Description description; + @XmlElement + protected JndiName name; + @XmlElement(name = "context-service-ref") + protected JndiName contextService; + @XmlElement(name = "hung-task-threshold") + protected Long hungTaskThreshold; + @XmlElement(name = "max-async") + protected Integer maxAsync; + @XmlElement(name = "properties") + protected List properties; + + public Description getDescription() { + return description; + } + + public void setDescription(Description description) { + this.description = description; + } + + public JndiName getName() { + return name; + } + + public void setName(JndiName name) { + this.name = name; + } + + public JndiName getContextService() { + return contextService; + } + + public void setContextService(JndiName contextService) { + this.contextService = contextService; + } + + public Long getHungTaskThreshold() { + return hungTaskThreshold; + } + + public void setHungTaskThreshold(Long longHungTaskThreshold) { + this.hungTaskThreshold = longHungTaskThreshold; + } + + public Integer getMaxAsync() { + return maxAsync; + } + + public void setMaxAsync(Integer maxAsync) { + this.maxAsync = maxAsync; + } + + public List getProperties() { + return properties; + } + + public void setProperties(List properties) { + this.properties = properties; + } + + @Override + public String getKey() { + return name.getvalue(); + } +} diff --git a/container/openejb-jee/src/main/java/org/apache/openejb/jee/ManagedScheduledExecutor.java b/container/openejb-jee/src/main/java/org/apache/openejb/jee/ManagedScheduledExecutor.java new file mode 100644 index 00000000000..aec88382427 --- /dev/null +++ b/container/openejb-jee/src/main/java/org/apache/openejb/jee/ManagedScheduledExecutor.java @@ -0,0 +1,103 @@ +/* + * 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.openejb.jee; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlType; +import org.apache.openejb.jee.jba.JndiName; + +import java.util.List; + + +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "managed-scheduled-executorType", propOrder = { + "description", + "name", + "contextService", + "hungTaskThreshold", + "maxAsync", + "properties" +}) +public class ManagedScheduledExecutor implements Keyable { + @XmlElement + protected Description description; + @XmlElement + protected JndiName name; + @XmlElement(name = "context-service-ref") + protected JndiName contextService; + @XmlElement(name = "hung-task-threshold") + protected Long hungTaskThreshold; + @XmlElement(name = "max-async") + protected Integer maxAsync; + @XmlElement(name = "property") + protected List properties; + + public Description getDescription() { + return description; + } + + public void setDescription(Description description) { + this.description = description; + } + + public JndiName getName() { + return name; + } + + public void setName(JndiName name) { + this.name = name; + } + + public JndiName getContextService() { + return contextService; + } + + public void setContextService(JndiName contextService) { + this.contextService = contextService; + } + + public Long getHungTaskThreshold() { + return hungTaskThreshold; + } + + public void setHungTaskThreshold(Long hungTaskThreshold) { + this.hungTaskThreshold = hungTaskThreshold; + } + + public Integer getMaxAsync() { + return maxAsync; + } + + public void setMaxAsync(Integer maxAsync) { + this.maxAsync = maxAsync; + } + + public List getProperties() { + return properties; + } + + public void setProperties(List properties) { + this.properties = properties; + } + + @Override + public String getKey() { + return name.getvalue(); + } +} diff --git a/container/openejb-jee/src/main/java/org/apache/openejb/jee/ManagedThreadFactory.java b/container/openejb-jee/src/main/java/org/apache/openejb/jee/ManagedThreadFactory.java new file mode 100644 index 00000000000..23a44ba5b65 --- /dev/null +++ b/container/openejb-jee/src/main/java/org/apache/openejb/jee/ManagedThreadFactory.java @@ -0,0 +1,91 @@ +/* + * 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.openejb.jee; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlType; +import org.apache.openejb.jee.jba.JndiName; + +import java.util.List; + +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "managed-thread-factoryType", propOrder = { + "description", + "name", + "contextService", + "priority", + "properties" +}) +public class ManagedThreadFactory implements Keyable { + @XmlElement + protected Description description; + @XmlElement + protected JndiName name; + @XmlElement(name = "context-service-ref") + protected JndiName contextService; + @XmlElement + protected Integer priority; + @XmlElement(name = "property") + protected List properties; + + public Description getDescription() { + return description; + } + + public void setDescription(Description description) { + this.description = description; + } + + public JndiName getName() { + return name; + } + + public void setName(JndiName name) { + this.name = name; + } + + public JndiName getContextService() { + return contextService; + } + + public void setContextService(JndiName contextService) { + this.contextService = contextService; + } + + public Integer getPriority() { + return priority; + } + + public void setPriority(Integer priority) { + this.priority = priority; + } + + public List getProperties() { + return properties; + } + + public void setProperties(List properties) { + this.properties = properties; + } + + @Override + public String getKey() { + return name.getvalue(); + } +} diff --git a/container/openejb-jee/src/main/java/org/apache/openejb/jee/MessageDrivenBean.java b/container/openejb-jee/src/main/java/org/apache/openejb/jee/MessageDrivenBean.java index 586904af9da..b6cb3f05a8e 100644 --- a/container/openejb-jee/src/main/java/org/apache/openejb/jee/MessageDrivenBean.java +++ b/container/openejb-jee/src/main/java/org/apache/openejb/jee/MessageDrivenBean.java @@ -104,7 +104,10 @@ "jmsDestinations", "securityRoleRef", "securityIdentity", - "contextService" + "contextService", + "managedExecutor", + "managedScheduledExecutor", + "managedThreadFactory" }) public class MessageDrivenBean implements EnterpriseBean, TimerConsumer, Invokable { @@ -176,6 +179,12 @@ public class MessageDrivenBean implements EnterpriseBean, TimerConsumer, Invokab protected String id; @XmlElement(name="context-service") protected KeyedCollection contextService; + @XmlElement(name="managed-executor") + protected KeyedCollection managedExecutor; + @XmlElement(name = "managed-scheduled-executor") + protected KeyedCollection managedScheduledExecutor; + @XmlElement(name = "managed-thread-factory") + protected KeyedCollection managedThreadFactory; public MessageDrivenBean() { } @@ -654,4 +663,30 @@ public Map getContextServiceMap() { } return this.contextService.toMap(); } + + @Override + public Map getManagedExecutorMap() { + if (managedExecutor == null) { + managedExecutor = new KeyedCollection(); + } + return this.managedExecutor.toMap(); + } + + @Override + public Map getManagedScheduledExecutorMap() { + if (managedScheduledExecutor == null) { + managedScheduledExecutor = new KeyedCollection<>(); + } + + return this.managedScheduledExecutor.toMap(); + } + + @Override + public Map getManagedThreadFactoryMap() { + if (managedThreadFactory == null) { + managedThreadFactory = new KeyedCollection<>(); + } + + return this.managedThreadFactory.toMap(); + } } diff --git a/container/openejb-jee/src/main/java/org/apache/openejb/jee/SessionBean.java b/container/openejb-jee/src/main/java/org/apache/openejb/jee/SessionBean.java index 07bc67b849b..4f8a99cc550 100644 --- a/container/openejb-jee/src/main/java/org/apache/openejb/jee/SessionBean.java +++ b/container/openejb-jee/src/main/java/org/apache/openejb/jee/SessionBean.java @@ -145,7 +145,10 @@ "securityRoleRef", "securityIdentity", "passivationCapable", - "contextService" + "contextService", + "managedExecutor", + "managedScheduledExecutor", + "managedThreadFactory" }) @XmlSeeAlso({StatelessBean.class, StatefulBean.class, SingletonBean.class, ManagedBean.class}) public class SessionBean implements RemoteBean, Session, TimerConsumer { @@ -273,6 +276,12 @@ public class SessionBean implements RemoteBean, Session, TimerConsumer { private final Collection parents = new ArrayList(); // always needed so initialize it early @XmlElement(name="context-service") protected KeyedCollection contextService; + @XmlElement(name="managed-executor") + protected KeyedCollection managedExecutor; + @XmlElement(name = "managed-scheduled-executor") + protected KeyedCollection managedScheduledExecutor; + @XmlElement(name = "managed-thread-factory") + protected KeyedCollection managedThreadFactory; public SessionBean() { } @@ -966,4 +975,30 @@ public Map getContextServiceMap() { } return this.contextService.toMap(); } + + @Override + public Map getManagedExecutorMap() { + if (managedExecutor == null) { + managedExecutor = new KeyedCollection(); + } + return this.managedExecutor.toMap(); + } + + @Override + public Map getManagedScheduledExecutorMap() { + if (managedScheduledExecutor == null) { + managedScheduledExecutor = new KeyedCollection<>(); + } + + return this.managedScheduledExecutor.toMap(); + } + + @Override + public Map getManagedThreadFactoryMap() { + if (managedThreadFactory == null) { + managedThreadFactory = new KeyedCollection<>(); + } + + return this.managedThreadFactory.toMap(); + } } diff --git a/container/openejb-jee/src/main/java/org/apache/openejb/jee/WebApp.java b/container/openejb-jee/src/main/java/org/apache/openejb/jee/WebApp.java index a7fa6cc60b4..320764e984a 100644 --- a/container/openejb-jee/src/main/java/org/apache/openejb/jee/WebApp.java +++ b/container/openejb-jee/src/main/java/org/apache/openejb/jee/WebApp.java @@ -101,6 +101,9 @@ "jmsDestinations", "moduleName", "contextService", + "managedExecutor", + "managedScheduledExecutor", + "managedThreadFactory", "others" }) public class WebApp implements WebCommon, Lifecycle, NamedModule { @@ -197,6 +200,12 @@ public class WebApp implements WebCommon, Lifecycle, NamedModule { protected String version = "3.0"; @XmlElement(name="context-service") protected KeyedCollection contextService; + @XmlElement(name="managed-executor") + protected KeyedCollection managedExecutor; + @XmlElement(name = "managed-scheduled-executor") + protected KeyedCollection managedScheduledExecutor; + @XmlElement(name = "managed-thread-factory") + protected KeyedCollection managedThreadFactory; @XmlAnyElement protected List others; @@ -833,4 +842,30 @@ public Map getContextServiceMap() { } return this.contextService.toMap(); } + + @Override + public Map getManagedExecutorMap() { + if (managedExecutor == null) { + managedExecutor = new KeyedCollection<>(); + } + return this.managedExecutor.toMap(); + } + + @Override + public Map getManagedScheduledExecutorMap() { + if (managedScheduledExecutor == null) { + managedScheduledExecutor = new KeyedCollection<>(); + } + + return this.managedScheduledExecutor.toMap(); + } + + @Override + public Map getManagedThreadFactoryMap() { + if (managedThreadFactory == null) { + managedThreadFactory = new KeyedCollection<>(); + } + + return this.managedThreadFactory.toMap(); + } } diff --git a/container/openejb-jee/src/main/java/org/apache/openejb/jee/WebFragment.java b/container/openejb-jee/src/main/java/org/apache/openejb/jee/WebFragment.java index 72c492f0ae0..52913066ddf 100644 --- a/container/openejb-jee/src/main/java/org/apache/openejb/jee/WebFragment.java +++ b/container/openejb-jee/src/main/java/org/apache/openejb/jee/WebFragment.java @@ -96,8 +96,10 @@ "jmsConnectionFactories", "jmsDestinations", "name", - "contextService" - + "contextService", + "managedExecutor", + "managedScheduledExecutor", + "managedThreadFactory" }) public class WebFragment implements WebCommon { @XmlTransient @@ -191,7 +193,12 @@ public class WebFragment implements WebCommon { protected String version; @XmlElement(name="context-service") protected KeyedCollection contextService; - + @XmlElement(name="managed-executor") + protected KeyedCollection managedExecutor; + @XmlElement(name = "managed-scheduled-executor") + protected KeyedCollection managedScheduledExecutor; + @XmlElement(name = "managed-thread-factory") + protected KeyedCollection managedThreadFactory; @Override public String getJndiConsumerName() { @@ -646,4 +653,30 @@ public Map getContextServiceMap() { } return this.contextService.toMap(); } + + @Override + public Map getManagedExecutorMap() { + if (managedExecutor == null) { + managedExecutor = new KeyedCollection<>(); + } + return this.managedExecutor.toMap(); + } + + @Override + public Map getManagedScheduledExecutorMap() { + if (managedScheduledExecutor == null) { + managedScheduledExecutor = new KeyedCollection<>(); + } + + return this.managedScheduledExecutor.toMap(); + } + + @Override + public Map getManagedThreadFactoryMap() { + if (managedThreadFactory == null) { + managedThreadFactory = new KeyedCollection<>(); + } + + return this.managedThreadFactory.toMap(); + } } \ No newline at end of file diff --git a/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRSService.java b/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRSService.java index 1035eca7fe1..c139b626e84 100644 --- a/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRSService.java +++ b/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRSService.java @@ -180,22 +180,7 @@ public void init(final Properties properties) throws Exception { SystemInstance.get().setComponent(RESTResourceFinder.class, new CxfRESTResourceFinder()); try { - CUTask.addContainerListener(new CUTask.ContainerListener() { - @Override - public Object onCreation() { - return Contexts.state(); - } - - @Override - public Object onStart(final Object state) { - return Contexts.restore(state); - } - - @Override - public void onEnd(final Object oldState) { - Contexts.restore(oldState); - } - }); + CUTask.addContainerListener(ContextContainerListener.INSTANCE); } catch(final Throwable th) { // unlikely but means the container core has been customized so just ignore it } @@ -424,4 +409,23 @@ public Object invoke(final Object ignored, final Method method, final Object[] a } } } + + private static class ContextContainerListener implements CUTask.ContainerListener { + protected static ContextContainerListener INSTANCE = new ContextContainerListener(); + + @Override + public Object onCreation() { + return Contexts.state(); + } + + @Override + public Object onStart(final Object state) { + return Contexts.restore(state); + } + + @Override + public void onEnd(final Object oldState) { + Contexts.restore(oldState); + } + } } diff --git a/tck/concurrency-signature-test/pom.xml b/tck/concurrency-signature-test/pom.xml index d0f5bb2bbfc..2d328573cc3 100644 --- a/tck/concurrency-signature-test/pom.xml +++ b/tck/concurrency-signature-test/pom.xml @@ -27,7 +27,8 @@ TomEE :: TCK :: Concurrency Signature Tests - 3.0.3 + 3.0.4 + 2.3 @@ -38,10 +39,10 @@ test - org.netbeans.tools + jakarta.tck sigtest-maven-plugin - 1.6 - test + ${sigtest.version} + provided org.testng @@ -139,9 +140,6 @@ ${project.build.directory}/signaturedirectory/jakartaee-api.jar:${project.build.directory}/jimage/java.base:${project.build.directory}/jimage/java.rmi:${project.build.directory}/jimage/java.sql:${project.build.directory}/jimage/java.naming - ${surefire.argline} --add-exports java.base/jdk.internal.vm.annotation=ALL-UNNAMED - --add-opens java.base/jdk.internal.vm.annotation=ALL-UNNAMED - diff --git a/tck/concurrency-signature-test/src/test/resources/arquillian.xml b/tck/concurrency-signature-test/src/test/resources/arquillian.xml index e77f9360549..7d1d366f87c 100644 --- a/tck/concurrency-signature-test/src/test/resources/arquillian.xml +++ b/tck/concurrency-signature-test/src/test/resources/arquillian.xml @@ -32,7 +32,9 @@ mvn:org.testng:testng:7.5:jar + mvn:jakarta.tck:sigtest-maven-plugin:2.3:jar + --add-exports java.base/jdk.internal.vm.annotation=ALL-UNNAMED --add-opens java.base/jdk.internal.vm.annotation=ALL-UNNAMED diff --git a/tck/concurrency-standalone/pom.xml b/tck/concurrency-standalone/pom.xml index 76b8e14d219..08f2faaf1e6 100644 --- a/tck/concurrency-standalone/pom.xml +++ b/tck/concurrency-standalone/pom.xml @@ -33,7 +33,7 @@ 17 - 3.0.3 + 3.0.4 6.0.0 7.5.1 1.6 @@ -123,6 +123,12 @@ ${version.derby} provided + + org.apache.derby + derbyshared + ${version.derby} + provided + diff --git a/tck/concurrency-standalone/src/test/resources/arquillian.xml b/tck/concurrency-standalone/src/test/resources/arquillian.xml index 94022dc59d8..06ee1dea08f 100644 --- a/tck/concurrency-standalone/src/test/resources/arquillian.xml +++ b/tck/concurrency-standalone/src/test/resources/arquillian.xml @@ -33,6 +33,7 @@ mvn:org.apache.derby:derby:10.15.2.0 mvn:org.apache.derby:derbytools:10.15.2.0 + mvn:org.apache.derby:derbyshared:10.15.2.0 mvn:org.testng:testng:7.5 target/tomee @@ -46,13 +47,14 @@ -1 -1 -1 - microprofile + plus false src/test/conf false mvn:org.apache.derby:derby:10.15.2.0 mvn:org.apache.derby:derbytools:10.15.2.0 + mvn:org.apache.derby:derbyshared:10.15.2.0 mvn:org.testng:testng:7.5 target/tomee @@ -66,13 +68,14 @@ -1 -1 -1 - microprofile + plume false src/test/conf false mvn:org.apache.derby:derby:10.15.2.0 mvn:org.apache.derby:derbytools:10.15.2.0 + mvn:org.apache.derby:derbyshared:10.15.2.0 mvn:org.testng:testng:7.5 target/tomee @@ -93,6 +96,7 @@ mvn:org.apache.derby:derby:10.15.2.0 mvn:org.apache.derby:derbytools:10.15.2.0 + mvn:org.apache.derby:derbyshared:10.15.2.0 mvn:org.testng:testng:7.5 target/tomee diff --git a/tck/concurrency-standalone/suite-web.xml b/tck/concurrency-standalone/suite-web.xml index 5bf8dc87347..fea9a5434e4 100644 --- a/tck/concurrency-standalone/suite-web.xml +++ b/tck/concurrency-standalone/suite-web.xml @@ -28,7 +28,9 @@ - + + + \ No newline at end of file diff --git a/tck/concurrency-standalone/suite.xml b/tck/concurrency-standalone/suite.xml index 119824cfc17..6a76c97712b 100644 --- a/tck/concurrency-standalone/suite.xml +++ b/tck/concurrency-standalone/suite.xml @@ -28,7 +28,9 @@ - + + + \ No newline at end of file