All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.apache.cayenne.rop.HttpClientConnection Maven / Gradle / Ivy

There is a newer version: 4.2.1
Show newest version
/*****************************************************************
 *   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.cayenne.rop;

import org.apache.cayenne.CayenneRuntimeException;
import org.apache.cayenne.di.BeforeScopeEnd;
import org.apache.cayenne.event.EventBridge;
import org.apache.cayenne.event.EventBridgeFactory;
import org.apache.cayenne.remote.BaseConnection;
import org.apache.cayenne.remote.ClientMessage;
import org.apache.cayenne.remote.RemoteService;
import org.apache.cayenne.remote.RemoteSession;

import java.rmi.RemoteException;

public class HttpClientConnection extends BaseConnection {

	private RemoteService remoteService;
	private RemoteSession session;

	private String sharedSessionName;
    
    public HttpClientConnection(RemoteService remoteService, String sharedSession) {
        this.remoteService = remoteService;
        this.sharedSessionName = sharedSession;
    }

    public RemoteSession getSession() {
        return session;
    }

	@Override
	protected void beforeSendMessage(ClientMessage message) throws CayenneRuntimeException {
		if (session == null) {
			connect();
		}
	}

	@Override
	protected Object doSendMessage(ClientMessage message) throws CayenneRuntimeException {
        try {
            return remoteService.processMessage(message);
        }
        catch (CayenneRuntimeException e) {
            throw e;
        }
        catch (Throwable th) {
            throw new CayenneRuntimeException(th.getMessage(), th);
        }
	}

	@Override
	public EventBridge getServerEventBridge() throws CayenneRuntimeException {
        if (session == null) {
            connect();
        }

        return createServerEventBridge(session);
	}

    @BeforeScopeEnd
    public void shutdown() throws RemoteException {
            remoteService.close();
    }

	protected synchronized void connect() {
		if (session != null) {
			return;
		}
        
        long t0 = System.currentTimeMillis();

		// create server session...
		try {
			this.session = (sharedSessionName != null) ? remoteService
					.establishSharedSession(sharedSessionName) : remoteService
					.establishSession();
		}
		catch (Throwable th) {
			logger.info(th.getMessage(), th);
			throw new CayenneRuntimeException(th.getMessage(), th);
		}

        if (logger.isInfoEnabled()) {
            long time = System.currentTimeMillis() - t0;
            logger.info("=== Connected, session: "
                    + session
                    + " - took "
                    + time
                    + " ms.");
        }
	}

    /**
     * Creates an EventBridge that will listen for server events. Returns null if server
     * events support is not configured in the descriptor.
     *
     * @throws CayenneRuntimeException if EventBridge startup fails for any reason.
     */
    protected EventBridge createServerEventBridge(RemoteSession session) throws CayenneRuntimeException {

        if (!session.isServerEventsEnabled()) {
            return null;
        }

        try {
            EventBridgeFactory factory = (EventBridgeFactory) Class.forName(session.getEventBridgeFactory())
                    .newInstance();

            // must use "name", not the sessionId as an external subject for the
            // event bridge
            return factory.createEventBridge(RemoteSession.getSubjects(), session.getName(),
                    session.getEventBridgeParameters());
        } catch (Exception ex) {
            throw new CayenneRuntimeException("Error creating EventBridge.", ex);
        }
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy