blob: 2b8aa872d786c8d5da7941569cd1ae889b461a2d [file] [log] [blame]
/*
* Copyright (c) 2008, 2009, 2011, 2012, 2015 Eike Stepper (Berlin, Germany) and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Eike Stepper - initial API and implementation
*/
package org.eclipse.net4j.buddies.internal.common;
import org.eclipse.net4j.buddies.common.IBuddy;
import org.eclipse.net4j.buddies.common.ICollaboration;
import org.eclipse.net4j.buddies.common.IFacility;
import org.eclipse.net4j.buddies.common.IFacilityInstalledEvent;
import org.eclipse.net4j.buddies.common.IMembership;
import org.eclipse.net4j.buddies.common.IMessage;
import org.eclipse.net4j.buddies.internal.common.bundle.OM;
import org.eclipse.net4j.buddies.internal.common.protocol.MessageNotification;
import org.eclipse.net4j.signal.SignalProtocol;
import org.eclipse.net4j.util.AdapterUtil;
import org.eclipse.net4j.util.ObjectUtil;
import org.eclipse.net4j.util.event.Event;
import org.eclipse.net4j.util.event.IEvent;
import org.eclipse.net4j.util.event.IListener;
import org.eclipse.net4j.util.lifecycle.LifecycleUtil;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
/**
* @author Eike Stepper
*/
public class Collaboration extends MembershipContainer implements ICollaboration
{
private long id;
private String title;
private String description;
private Visibility visibility = Visibility.PRIVATE;
private ConcurrentMap<String, IFacility> facilities = new ConcurrentHashMap<String, IFacility>();
public Collaboration(long id)
{
this.id = id;
}
public long getID()
{
return id;
}
public String getTitle()
{
return title == null ? String.valueOf(id) : title;
}
public String getDescription()
{
return description;
}
public Visibility getVisibility()
{
return visibility;
}
public boolean isPublic()
{
return visibility == Visibility.PUBLIC;
}
public void setPublic(String title, String description)
{
visibility = Visibility.PUBLIC;
this.title = title;
this.description = description;
}
public void setPrivate()
{
visibility = Visibility.PRIVATE;
title = null;
description = null;
}
public IMembership getMembership(IBuddy buddy)
{
return getMembership(buddy, this);
}
public IMembership removeMembership(IBuddy buddy)
{
return removeMembership(buddy, this);
}
public IBuddy getBuddy(String userID)
{
for (IMembership membership : getMemberships())
{
IBuddy buddy = membership.getBuddy();
if (ObjectUtil.equals(buddy.getUserID(), userID))
{
return buddy;
}
}
return null;
}
public IBuddy[] getBuddies()
{
List<IBuddy> buddies = new ArrayList<IBuddy>();
for (IMembership membership : getMemberships())
{
IBuddy buddy = membership.getBuddy();
buddies.add(buddy);
}
return buddies.toArray(new IBuddy[buddies.size()]);
}
public String[] getFacilityTypes()
{
return facilities.keySet().toArray(new String[facilities.size()]);
}
public IFacility[] getFacilities()
{
return facilities.values().toArray(new IFacility[facilities.size()]);
}
public IFacility getFacility(String type)
{
return facilities.get(type);
}
public boolean addFacility(IFacility facility, boolean remote)
{
String type = facility.getType();
if (!facilities.containsKey(type))
{
facilities.put(type, facility);
IListener[] listeners = getListeners();
if (listeners != null)
{
fireEvent(new FacilityInstalledEvent(this, facility, remote), listeners);
}
facility.addListener(this);
return true;
}
return false;
}
public void sendMessage(long collaborationID, String facilityType, IMessage message)
{
IMembership[] elements = getElements();
for (IMembership membership : elements)
{
IBuddy receiver = membership.getBuddy();
if (!ObjectUtil.equals(receiver.getUserID(), message.getSenderID()))
{
try
{
SignalProtocol<?> protocol = (SignalProtocol<?>)receiver.getSession().getProtocol();
new MessageNotification(protocol, collaborationID, facilityType, message).sendAsync();
}
catch (Exception ex)
{
OM.LOG.error(ex);
}
}
}
}
@SuppressWarnings({ "unchecked", "rawtypes" })
public Object getAdapter(Class adapter)
{
return AdapterUtil.adapt(this, adapter, false);
}
@Override
public boolean equals(Object obj)
{
if (obj == this)
{
return true;
}
if (obj instanceof ICollaboration)
{
ICollaboration collaboration = (ICollaboration)obj;
return getID() == collaboration.getID();
}
return false;
}
@Override
public int hashCode()
{
return ObjectUtil.hashCode(id);
}
@Override
public String toString()
{
return MessageFormat.format("{0}[{1}]", getClass().getSimpleName(), getTitle()); //$NON-NLS-1$
}
@Override
public void notifyEvent(IEvent event)
{
super.notifyEvent(event);
if (event.getSource() instanceof IFacility)
{
notifyFacilityEvent(event);
}
}
protected void notifyFacilityEvent(IEvent event)
{
}
@Override
protected void doDeactivate() throws Exception
{
for (IFacility facility : getFacilities())
{
facility.removeListener(this);
LifecycleUtil.deactivate(facility);
}
for (IMembership membership : getMemberships())
{
LifecycleUtil.deactivate(membership);
}
super.doDeactivate();
}
/**
* @author Eike Stepper
*/
private static final class FacilityInstalledEvent extends Event implements IFacilityInstalledEvent
{
private static final long serialVersionUID = 1L;
private IFacility facility;
private boolean remote;
public FacilityInstalledEvent(ICollaboration source, IFacility facility, boolean remote)
{
super(source);
this.facility = facility;
this.remote = remote;
}
@Override
public ICollaboration getSource()
{
return (ICollaboration)super.getSource();
}
public IFacility getFacility()
{
return facility;
}
public boolean fromRemote()
{
return remote;
}
@Override
public String toString()
{
return MessageFormat.format("FacilityInstalledEvent[source={0}, facility={1}, remote={2}]", getSource(), //$NON-NLS-1$
facility, remote);
}
}
}