/**
* Copyright (c) 2011, SOCIETIES Consortium (WATERFORD INSTITUTE OF TECHNOLOGY (TSSG), HERIOT-WATT UNIVERSITY (HWU), SOLUTA.NET
* (SN), GERMAN AEROSPACE CENTRE (Deutsches Zentrum fuer Luft- und Raumfahrt e.V.) (DLR), Zavod za varnostne tehnologije
* informacijske držbe in elektronsko poslovanje (SETCCE), INSTITUTE OF COMMUNICATION AND COMPUTER SYSTEMS (ICCS), LAKE
* COMMUNICATIONS (LAKE), INTEL PERFORMANCE LEARNING SOLUTIONS LTD (INTEL), PORTUGAL TELECOM INOAÇÃO, SA (PTIN), IBM Corp.,
* INSTITUT TELECOM (ITSUD), AMITEC DIACHYTI EFYIA PLIROFORIKI KAI EPIKINONIES ETERIA PERIORISMENIS EFTHINIS (AMITEC), TELECOM
* ITALIA S.p.a.(TI), TRIALOG (TRIALOG), Stiftelsen SINTEF (SINTEF), NEC EUROPE LTD (NEC))
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following
* conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
* BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
* SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.societies.orchestration.CSM.main.java.GroupIdentfier;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.societies.api.comm.xmpp.pubsub.Subscriber;
import org.societies.api.identity.IIdentity;
import org.societies.orchestration.CSM.main.java.Models.ModelManager;
import org.societies.orchestration.CSM.main.java.csm.CSM;
import org.societies.orchestration.CSM.main.java.csm.CommunitySuggestion;
import org.societies.api.osgi.event.*;
import org.societies.orchestration.api.CssDCEvent;
//import org.societies.api.osgi.event.CSSEventConstants;
//import org.societies.api.osgi.event.EventListener;
//import org.societies.api.osgi.event.EventTypes;
//import org.societies.api.osgi.event.IEventMgr;
//import org.societies.api.osgi.event.InternalEvent;
public class GroupManager extends EventListener implements Subscriber {
private Logger LOG = LoggerFactory.getLogger(CSM.class);
private HashMap<String, ArrayList<String>> ownerModels;
private HashMap<String, String> attMap; // inner index
private HashMap<String, ArrayList<Integer>> ownAttMap;
private ArrayList<Integer> ownerRelationship; // mapping
private ModelManager modelMang;
private IEventMgr eventMgr;
private publishSuggestion ps;
public GroupManager(ModelManager modelMang)
{
LOG.info("GroupManager : set up ");
ownerModels = new HashMap<String, ArrayList<String>>();
this.modelMang = modelMang;
ownAttMap = new HashMap<String, ArrayList<Integer>>();
attMap = new HashMap<String, String>();
this.registerForEvents();
}
public void addUser(IIdentity user){
LOG.info("GroupManager : New User ");
ArrayList<String> models = new ArrayList<String>();
ownerModels.put(user.getJid(), models);
}
public void AttributeUpdate(IIdentity user,String att){
LOG.info("GroupManager : Attribute Update");
ArrayList<String> models = ownerModels.get(user.getJid());
}
private void groupUpdateUpdate(){
LOG.info("GroupManager : Group Update");
// join
// leave
}
private void updateGrouping(IIdentity id, String att, String val)
{
LOG.info("GroupManager : Update Grouping ");
//
updateAttribute(att);
updateOwnerValue(id, att, val);
newModelCheck(id, att, val);
existModelCheck(id, att, val);
}
private void existModelCheck(IIdentity id, String att, String value){
LOG.info("GroupManager : exist Model Check ");
//
ArrayList<String> models = modelMang.getSubscribed(id);
for (String model : models){
if (modelMang.getModel(model) != null){
// check if new update is outside the valid range
CommunitySuggestion cs = new CommunitySuggestion();
cs.setSuggestionType("LEAVE");
ArrayList<String> memList = new ArrayList<String>();
memList.add(id.toString());
cs.setMembersList(memList);
cs.setName("TO DO"); // TODO
sendMsg(cs);
}
}
}
private void registerForEvents() {
String eventFilter = "(&" +
"(" + CSSEventConstants.EVENT_NAME + "=newaction)" +
"(" + CSSEventConstants.EVENT_SOURCE + "=org/societies/orchestration/CSSDC)" +
")";
this.getEventMgr().subscribeInternalEvent(this, new String[]{EventTypes.CSSDC_EVENT}, eventFilter);
LOG.info("GroupManager : registered for events ");
}
/**************************************************************
*
***************************************************************/
public HashMap<String, Integer> getAllOwnerAtt(String att){
LOG.info("GroupManager : get All Owner Att ");
//
HashMap<String, Integer> i = new HashMap<String, Integer>();
@SuppressWarnings("rawtypes")
Iterator it = ownAttMap.entrySet().iterator();
while (it.hasNext()) {
@SuppressWarnings("unchecked")
Map.Entry<String, ArrayList<Integer>> entry = (Map.Entry<String, ArrayList<Integer>>)it.next();
//
// ** TODO
//
//i.put(entry.getKey(), entry.getValue().get(attMap.get(att)));
it.remove();
}
return i;
}
private void updateAttribute(String att){
LOG.info("GroupManager : update Attribute ");
//
//check attribute is in map index
if (!attMap.containsKey(att)){
//
// ** TODO
//
//attMap.put(att, attMap.size());
//
for (ArrayList<Integer> ownAttValue : ownAttMap.values()) {
ownAttValue.set(attMap.size(), 0);
}
}
}
private void updateOwnerValue(IIdentity id, String att, String val)
{
LOG.info("GroupManager : update Owner Value ");
//
// ** TODO
//
//ownAttMap.get(id).set(attMap.get(att), val);
}
private void sendMsg(CommunitySuggestion cs){
LOG.info("GroupManager : send Msg ");
ps.sendSuggestion(cs);
}
private void deleteGrouping(IIdentity id){
LOG.info("GroupManager : delete Grouping ");
// assume just user
ArrayList<String> models = modelMang.getSubscribed(id);
// send leave messages
// remove from various internal lists
}
private void newModelCheck(IIdentity id, String att, String value){
LOG.info("GroupManager : new Model Check ");
HashMap<String, String> models = modelMang.getUnSubscribed(id);
// for the unsubscribed models
// check if new update is within the valid range
// if so
// check if owners other attributes for this model are in required range
// if so send them as a JOIN message
//
}
/**
* @return the eventMgr
*/
public IEventMgr getEventMgr() {
return eventMgr;
}
/**
* @param eventMgr the eventMgr to set
*/
public void setEventMgr(IEventMgr eventMgr) {
this.eventMgr = eventMgr;
}
/* (non-Javadoc)
* @see org.societies.api.comm.xmpp.pubsub.Subscriber#pubsubEvent(org.societies.api.identity.IIdentity, java.lang.String, java.lang.String, java.lang.Object)
*/
@Override
public void pubsubEvent(IIdentity arg0, String arg1, String arg2,
Object arg3) {
// TODO Auto-generated method stub
}
/* (non-Javadoc)
* @see org.societies.api.osgi.event.EventListener#handleInternalEvent(org.societies.api.osgi.event.InternalEvent)
*/
@Override
public void handleInternalEvent(InternalEvent arg0) {
LOG.info("recieved an internal event");
CssDCEvent cde = (CssDCEvent) arg0.geteventInfo();
//String evtType = cde.getEvtT;
IIdentity user = cde.getUserId();
//if (evtType.equals("Create")){
//}
//else if ( (evtType.equals("Mod")) || (evtType.equals("Update") )){
//}
//else if (evtType.equals("Removal")){
//}
}
/* (non-Javadoc)
* @see org.societies.api.osgi.event.EventListener#handleExternalEvent(org.societies.api.osgi.event.CSSEvent)
*/
@Override
public void handleExternalEvent(CSSEvent arg0) {
LOG.info("recieved an external event");
}
}