/**
* Copyright 2010-2011 Voxeo Corporation
*
* Licensed 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 com.voxeo.moho.conference;
import java.util.Map;
import java.util.Properties;
import java.util.concurrent.Callable;
import javax.media.mscontrol.Parameters;
import javax.media.mscontrol.join.Joinable.Direction;
import org.apache.log4j.Logger;
import com.voxeo.moho.JoinWorker;
import com.voxeo.moho.Joint;
import com.voxeo.moho.JointImpl;
import com.voxeo.moho.MixerEndpoint;
import com.voxeo.moho.MixerImpl;
import com.voxeo.moho.Participant;
import com.voxeo.moho.ParticipantContainer;
import com.voxeo.moho.Unjoint;
import com.voxeo.moho.UnjointImpl;
import com.voxeo.moho.common.event.MohoUnjoinCompleteEvent;
import com.voxeo.moho.event.JoinCompleteEvent;
import com.voxeo.moho.event.UnjoinCompleteEvent;
import com.voxeo.moho.spi.ExecutionContext;
public class ConferenceImpl extends MixerImpl implements Conference, ParticipantContainer {
private static final Logger LOG = Logger.getLogger(ConferenceImpl.class);
protected int _maxSeats;
protected int _occupiedSeats;
protected ConferenceController _controller;
protected Object _lock = new Object();
protected ConferenceImpl(final ExecutionContext context, final MixerEndpoint address,
final Map<Object, Object> params, final String name, final int seats, final ConferenceController controller,
Parameters parameters) {
super(context, address, name, params, parameters);
_maxSeats = seats;
_controller = controller;
}
@Override
public String getId() {
return _id;
}
@Override
public Joint join(final Participant other, final JoinType type, final Direction direction)
throws IllegalStateException {
checkState();
return new JointImpl(_context.getExecutor(), new JoinWorker() {
@Override
public JoinCompleteEvent call() throws Exception {
synchronized (_lock) {
if (_controller != null) {
_controller.preJoin(other, ConferenceImpl.this);
}
final JoinCompleteEvent retval = ConferenceImpl.super.join(other, type, direction).get();
_occupiedSeats = _occupiedSeats + 1;
if (_controller != null) {
_controller.postJoin(other, ConferenceImpl.this);
}
return retval;
}
}
@Override
public boolean cancel() {
return false;
}
});
}
@Override
public Joint join(final Participant other, final JoinType type, final Direction direction, final Properties props)
throws IllegalStateException {
checkState();
return new JointImpl(_context.getExecutor(), new JoinWorker() {
@Override
public JoinCompleteEvent call() throws Exception {
synchronized (_lock) {
if (_controller != null) {
_controller.preJoin(other, ConferenceImpl.this);
}
final JoinCompleteEvent retval = ConferenceImpl.super.join(other, type, direction, props).get();
_occupiedSeats = _occupiedSeats + 1;
if (_controller != null) {
_controller.postJoin(other, ConferenceImpl.this);
}
return retval;
}
}
@Override
public boolean cancel() {
return false;
}
});
}
public MohoUnjoinCompleteEvent doUnjoin(final Participant other, boolean isInitiator) throws Exception {
synchronized (_lock) {
MohoUnjoinCompleteEvent event = null;
try {
if (_controller != null) {
_controller.preUnjoin(other, this);
}
_occupiedSeats = _occupiedSeats - 1;
event = super.doUnjoin(other, isInitiator);
}
catch (final Exception e) {
LOG.warn("", e);
throw e;
}
finally {
if (_controller != null) {
_controller.postUnjoin(other, this);
}
}
return event;
}
}
@Override
public Unjoint unjoin(final Participant p) {
Unjoint task = new UnjointImpl(_context.getExecutor(), new Callable<UnjoinCompleteEvent>() {
@Override
public UnjoinCompleteEvent call() throws Exception {
return doUnjoin(p, true);
}
});
return task;
}
@Override
public int getMaxSeats() {
return _maxSeats;
}
@Override
public int getOccupiedSeats() {
return _occupiedSeats;
}
@Override
public ConferenceController getController() {
return _controller;
}
@Override
public void setController(ConferenceController controller) {
this._controller = controller;
}
}