Skip to content

Commit

Permalink
GlassFishORBHelper changed to singleton, lifecycle
Browse files Browse the repository at this point in the history
- Hard to trace all paths, but it seems this behaves better
- Using annotations instead of implements

Signed-off-by: David Matějček <david.matejcek@omnifish.ee>

# Conflicts:
#	appserver/orb/orb-connector/src/main/java/org/glassfish/enterprise/iiop/api/GlassFishORBHelper.java
  • Loading branch information
dmatej committed Feb 13, 2024
1 parent b515e00 commit 6f6b961
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 67 deletions.
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (c) 2024 Contributors to the Eclipse Foundation.
* Copyright (c) 2022, 2024 Contributors to the Eclipse Foundation.
* Copyright (c) 2009, 2021 Oracle and/or its affiliates. All rights reserved.
*
* This program and the accompanying materials are made available under the
Expand All @@ -19,6 +19,9 @@

import com.sun.logging.LogDomains;

import jakarta.annotation.PostConstruct;
import jakarta.annotation.PreDestroy;
import jakarta.ejb.Singleton;
import jakarta.inject.Inject;
import jakarta.inject.Provider;

Expand All @@ -29,27 +32,24 @@
import java.util.logging.Logger;

import org.glassfish.api.admin.ProcessEnvironment;
import org.glassfish.api.event.EventListener;
import org.glassfish.api.event.Events;
import org.glassfish.api.naming.GlassfishNamingManager;
import org.glassfish.hk2.api.PostConstruct;
import org.glassfish.hk2.api.ServiceLocator;
import org.glassfish.internal.api.ORBLocator;
import org.jvnet.hk2.annotations.Service;
import org.omg.CORBA.ORB;
import org.omg.PortableInterceptor.ServerRequestInfo;

import static com.sun.logging.LogDomains.CORBA_LOGGER;
import static org.glassfish.api.event.EventTypes.SERVER_SHUTDOWN;

/**
* This class exposes any orb/iiop functionality needed by modules in the app server. This prevents modules from needing
* any direct dependencies on the orb-iiop module.
* This class exposes any orb/iiop functionality needed by modules in the app server.
* This prevents modules from needing any direct dependencies on the orb-iiop module.
*
* @author Mahesh Kannan Date: Jan 17, 2009
*/
@Service
public class GlassFishORBHelper implements PostConstruct, ORBLocator {
@Singleton
public class GlassFishORBHelper implements ORBLocator {

private static final Logger LOG = LogDomains.getLogger(GlassFishORBHelper.class, CORBA_LOGGER, false);

Expand All @@ -65,38 +65,30 @@ public class GlassFishORBHelper implements PostConstruct, ORBLocator {
@Inject
Provider<GlassfishNamingManager> glassfishNamingManagerProvider;

@Inject
private Provider<Events> eventsProvider;

private volatile ORB orb;

private ProtocolManager protocolManager;

private SelectableChannelDelegate selectableChannelDelegate;

private GlassFishORBFactory orbFactory;
private boolean destroyed;

@Override
@PostConstruct
public void postConstruct() {
orbFactory = services.getService(GlassFishORBFactory.class);
}

@PreDestroy
public void onShutdown() {
LOG.log(Level.FINE, "ORB Shutdown started");
orb.destroy();
// FIXME: getORB is able to create another, it should be refactored and simplified.
destroyed = true;
LOG.log(Level.CONFIG, "ORB Shutdown started");
if (orb != null) {
orb.destroy();
orb = null;
}
}

public synchronized void setORB(ORB orb) {
this.orb = orb;

if (orb != null) {
EventListener glassfishEventListener = event -> {
if (event.is(SERVER_SHUTDOWN)) {
onShutdown();
}
};
eventsProvider.get().register(glassfishEventListener);
}
}

/**
Expand All @@ -108,15 +100,15 @@ public ORB getORB() {
// Use a volatile double-checked locking idiom here so that we can publish
// a partly-initialized ORB early, so that lazy init can come into getORB()
// and allow an invocation to the transport to complete.
if (orb == null) {
if (orb == null && !destroyed) {

synchronized (this) {
if (orb == null) {
try {
boolean isServer = processEnv.getProcessType().isServer();

Properties props = new Properties();
props.setProperty(GlassFishORBFactory.ENV_IS_SERVER_PROPERTY, Boolean.valueOf(isServer).toString());
props.setProperty(GlassFishORBFactory.ENV_IS_SERVER_PROPERTY, Boolean.toString(isServer));

// Create orb and make it visible.
//
Expand Down Expand Up @@ -179,7 +171,7 @@ public interface SelectableChannelDelegate {
* orb.
*/
public ProtocolManager getProtocolManager() {
if (!processEnv.getProcessType().isServer()) {
if (!processEnv.getProcessType().isServer() || destroyed) {
return null;
}

Expand All @@ -193,7 +185,7 @@ public ProtocolManager getProtocolManager() {
}

public boolean isORBInitialized() {
return (orb != null);
return orb != null;
}

public int getOTSPolicyType() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,51 +17,44 @@

package org.glassfish.enterprise.iiop.impl;

// import org.glassfish.pfl.dynamic.copyobject.spi.CopyobjectDefaults ;
import com.sun.corba.ee.spi.copyobject.CopyobjectDefaults ;
import org.glassfish.pfl.dynamic.copyobject.spi.ObjectCopierFactory ;
import com.sun.corba.ee.impl.naming.cosnaming.TransientNameService;
import com.sun.corba.ee.spi.copyobject.CopierManager;
import com.sun.corba.ee.spi.copyobject.CopyobjectDefaults ;
import com.sun.corba.ee.spi.orb.DataCollector;
import com.sun.corba.ee.spi.orb.ORB;
import com.sun.corba.ee.spi.orb.ORBConfigurator;
import com.sun.corba.ee.spi.presentation.rmi.InvocationInterceptor;
import com.sun.corba.ee.spi.threadpool.NoSuchWorkQueueException;
import com.sun.corba.ee.spi.threadpool.ThreadPool;
import com.sun.corba.ee.spi.threadpool.ThreadPoolManager;
import com.sun.corba.ee.spi.presentation.rmi.InvocationInterceptor;
import com.sun.corba.ee.spi.transport.TransportManager;
import com.sun.corba.ee.spi.transport.Acceptor;
import com.sun.corba.ee.spi.transport.TransportDefault;
import com.sun.corba.ee.spi.transport.TransportManager;
import com.sun.logging.LogDomains;
import org.glassfish.orb.admin.config.IiopListener;
import org.glassfish.grizzly.config.dom.Ssl;
import java.util.logging.Logger;
import org.glassfish.enterprise.iiop.api.IIOPConstants;
import org.glassfish.enterprise.iiop.util.S1ASThreadPoolManager;
import org.glassfish.enterprise.iiop.util.IIOPUtils;

import java.nio.channels.SocketChannel;
import java.net.Socket;
import java.nio.channels.SelectableChannel;
import java.nio.channels.SocketChannel;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;

import org.glassfish.enterprise.iiop.api.GlassFishORBHelper;

import com.sun.corba.ee.impl.naming.cosnaming.TransientNameService;

// TODO import org.omg.CORBA.TSIdentification;

// TODO import com.sun.corba.ee.impl.txpoa.TSIdentificationImpl;

import com.sun.corba.ee.spi.threadpool.ThreadPool;
import java.util.logging.Level;
import java.util.Set;
import java.util.HashSet;
import java.util.Arrays;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import java.nio.channels.SelectableChannel;

import org.glassfish.enterprise.iiop.api.GlassFishORBHelper;
import org.glassfish.enterprise.iiop.api.IIOPConstants;
import org.glassfish.enterprise.iiop.util.IIOPUtils;
import org.glassfish.enterprise.iiop.util.S1ASThreadPoolManager;
import org.glassfish.enterprise.iiop.util.ThreadPoolStats;
import org.glassfish.enterprise.iiop.util.ThreadPoolStatsImpl;
import org.glassfish.external.probe.provider.PluginPoint;
import org.glassfish.external.probe.provider.StatsProviderManager;
import org.glassfish.grizzly.config.dom.Ssl;
import org.glassfish.orb.admin.config.IiopListener;
import org.glassfish.pfl.dynamic.copyobject.spi.ObjectCopierFactory ;

public class PEORBConfigurator implements ORBConfigurator {
private static final java.util.logging.Logger logger =
Expand All @@ -74,20 +67,18 @@ public class PEORBConfigurator implements ORBConfigurator {
private static final String DEFAULT_ORB_INIT_HOST = "localhost";

// TODO private static TSIdentification tsIdent;
private static ORB theORB;
private static ThreadPoolManager threadpoolMgr = null;
private static boolean txServiceInitialized = false;

static {
// TODO tsIdent = new TSIdentificationImpl();
}

private GlassFishORBHelper getHelper() {
IIOPUtils iiopUtils = IIOPUtils.getInstance();
return iiopUtils.getHabitat().getService(
GlassFishORBHelper.class);
return iiopUtils.getHabitat().getService(GlassFishORBHelper.class);
}

@Override
public void configure(DataCollector dc, ORB orb) {
try {
//begin temp fix for bug 6320008
Expand Down Expand Up @@ -217,7 +208,7 @@ private Acceptor addAcceptor( org.omg.CORBA.ORB orb, boolean isLazy,
return acceptor;
}

private static final Set<String> ANY_ADDRS = new HashSet<String>(
private static final Set<String> ANY_ADDRS = new HashSet<>(
Arrays.asList( "0.0.0.0", "::", "::ffff:0.0.0.0" ) ) ;

private String handleAddrAny( String hostAddr ) {
Expand All @@ -242,12 +233,12 @@ private void createORBListeners(IIOPUtils iiopUtils,
}

var lazyListeners = Stream.of(iiopListenerBeans)
.filter(ilb -> Boolean.valueOf(ilb.getLazyInit())).collect(Collectors.toList());
.filter(ilb -> Boolean.parseBoolean(ilb.getLazyInit())).collect(Collectors.toList());

if (lazyListeners.size() > 1) {
throw new IllegalStateException(
"Only one iiop-listener can be configured with lazy-init=true. "
+ lazyListeners.stream().map(ilb -> ilb.getId()).collect(Collectors.toList()));
+ lazyListeners.stream().map(IiopListener::getId).collect(Collectors.toList()));
}

var lazySslListeners = lazyListeners.stream()
Expand All @@ -257,22 +248,22 @@ private void createORBListeners(IIOPUtils iiopUtils,
if (lazySslListeners.size() > 0) {
throw new IllegalStateException(
"Lazy-init not supported for SSL iiop-listeners. "
+ lazySslListeners.stream().map(ilb -> ilb.getId()).collect(Collectors.toList()));
+ lazySslListeners.stream().map(IiopListener::getId).collect(Collectors.toList()));
}

for (IiopListener ilb : iiopListenerBeans) {
if (!Boolean.parseBoolean(ilb.getEnabled())) {
continue;
}

boolean isLazy = Boolean.valueOf(ilb.getLazyInit());
boolean isLazy = Boolean.parseBoolean(ilb.getLazyInit());
int port = Integer.parseInt(ilb.getPort());
String host = handleAddrAny(ilb.getAddress());

boolean isSslListener = Boolean.valueOf(ilb.getSecurityEnabled()) && ilb.getSsl() != null;
if (isSslListener) {
Ssl sslBean = ilb.getSsl();
boolean clientAuth = Boolean.valueOf(
boolean clientAuth = Boolean.parseBoolean(
sslBean.getClientAuthEnabled());
String type = clientAuth ? SSL_MUTUALAUTH : SSL;
addAcceptor(orb, isLazy, host, type, port);
Expand All @@ -290,7 +281,7 @@ private void createORBListeners(IIOPUtils iiopUtils,
private static class AcceptorDelegateImpl
implements GlassFishORBHelper.SelectableChannelDelegate {

private Acceptor acceptor;
private final Acceptor acceptor;

AcceptorDelegateImpl(Acceptor lazyAcceptor) {
acceptor = lazyAcceptor;
Expand Down

0 comments on commit 6f6b961

Please sign in to comment.