FileDocCategorySizeDatePackage
DistributedReadOnlyBeanServiceImpl.javaAPI DocGlassfish v2 API9255Fri May 04 22:33:12 BST 2007com.sun.ejb.spi.distributed

DistributedReadOnlyBeanServiceImpl

public class DistributedReadOnlyBeanServiceImpl extends Object implements DistributedReadOnlyBeanService

Fields Summary
private static final Logger
_logger
private ConcurrentHashMap
refreshHandlers
private DistributedReadOnlyBeanNotifier
robNotifier
Constructors Summary
Methods Summary
public voidaddReadOnlyBeanRefreshEventHandler(long ejbID, java.lang.ClassLoader loader, ReadOnlyBeanRefreshEventHandler handler)

        refreshHandlers.put(ejbID, new ReadOnlyBeanRefreshHandlerInfo(
                ejbID, loader, handler));
        _logger.log(Level.INFO, "Registered ReadOnlyBeanRefreshEventHandler: "
                + ejbID + "; " + handler);
    
public voidhandleRefreshAllRequest(long ejbID)

        refreshRequestReceived(true, ejbID, null);
    
public voidhandleRefreshRequest(long ejbID, byte[] pkData)

        refreshRequestReceived(false, ejbID, pkData);
    
public voidnotifyRefresh(long ejbID, java.lang.Object pk)

        if (robNotifier != null) {
            byte[] pkData = null;
            
            ByteArrayOutputStream bos = null;
            ObjectOutputStream oos = null;
            try {
                bos = new ByteArrayOutputStream();
                oos = new ObjectOutputStream(bos);
                
                oos.writeObject(pk);
                oos.flush();
                bos.flush();
                pkData = bos.toByteArray();
                robNotifier.notifyRefresh(ejbID, pkData);
            } catch (Exception ex) {
                _logger.log(Level.WARNING, "Error during notifyRefresh", ex);
            } finally {
                if (oos != null) {
                    try { oos.close(); } catch(IOException ioEx) {};
                }
                if (bos != null) {
                    try { bos.close(); } catch(IOException ioEx) {};
                }
            }
        } else {
            if (_logger.isLoggable(Level.FINE)) {
                _logger.log(Level.FINE,
                        "DistributedReadOnlyBeanService ignoring request "
                        + "for notifyRefresh: " + ejbID);
            }
        }
    
public voidnotifyRefreshAll(long ejbID)

        if (robNotifier != null) {
            robNotifier.notifyRefreshAll(ejbID);
        }  else {
            if (_logger.isLoggable(Level.FINE)) {
                _logger.log(Level.FINE,
                        "DistributedReadOnlyBeanService ignoring request "
                        + "for notifyRefreshAll: " + ejbID);
            }
        }
    
private voidrefreshRequestReceived(boolean refreshAll, long ejbID, byte[] pkData)


        final ReadOnlyBeanRefreshHandlerInfo info = refreshHandlers.get(ejbID);
        if (info == null) {
            //TODO: Log something
            return;
        }
        
        final Thread currentThread = Thread.currentThread();
        final ClassLoader prevClassLoader = currentThread.getContextClassLoader();
        
        try {
            if(System.getSecurityManager() == null) {
                currentThread.setContextClassLoader(info.loader);
            } else {
                java.security.AccessController.doPrivileged(
                        new java.security.PrivilegedAction() {
                    public java.lang.Object run() {
                        currentThread.setContextClassLoader(info.loader);
                        return null;
                    }
                });
            }
            
            if (! refreshAll) {
                ByteArrayInputStream bis = null;
                ObjectInputStream ois = null;
                Serializable pk = null;
                try {
                    bis = new ByteArrayInputStream(pkData);
                    ois = new ObjectInputStream(bis);
                    
                    pk = (Serializable) ois.readObject();
                } catch (IOException ioEx) {
                    _logger.log(Level.WARNING, "Error during refresh", ioEx);
                } catch (ClassNotFoundException cnfEx) {
                    _logger.log(Level.WARNING, "Error during refresh", cnfEx);
                } finally {
                    if (ois != null) {
                        try {
                            ois.close();
                        } catch(IOException ioEx) {
                            _logger.log(Level.WARNING, 
                                    "Error while closing object stream", ioEx);
                        };
                    }
                    if (bis != null) {
                        try {
                            bis.close();
                        } catch(IOException ioEx) {
                            _logger.log(Level.WARNING, 
                                    "Error while closing byte stream", ioEx);
                        };
                    }
                }
                if (pk != null) {
                    info.handler.handleRefreshRequest(pk);
                }
            } else {
                info.handler.handleRefreshAllRequest();
            }
        } catch (Exception ex) {
            _logger.log(Level.WARNING, "Error during refresh", ex);
        } finally {
            if(System.getSecurityManager() == null) {
                currentThread.setContextClassLoader(prevClassLoader);
            } else {
                java.security.AccessController.doPrivileged(
                        new java.security.PrivilegedAction() {
                    public java.lang.Object run() {
                        currentThread.setContextClassLoader(prevClassLoader);
                        return null;
                    }
                });
            }
        }        
    
public voidremoveReadOnlyBeanRefreshEventHandler(long ejbID)

        refreshHandlers.remove(ejbID);
    
public voidsetDistributedReadOnlyBeanNotifier(DistributedReadOnlyBeanNotifier notifier)

    
      
              
        this.robNotifier = notifier;
        _logger.log(Level.INFO, "Registered ReadOnlyBeanNotifier: "
                + notifier);