/**
* 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 družbe in elektronsko poslovanje (SETCCE), INSTITUTE OF COMMUNICATION AND COMPUTER SYSTEMS (ICCS), LAKE
* COMMUNICATIONS (LAKE), INTEL PERFORMANCE LEARNING SOLUTIONS LTD (INTEL), PORTUGAL TELECOM INOVAÇÃ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.webapp.controller;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import javax.servlet.http.HttpSession;
import javax.validation.Valid;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.societies.webapp.models.CisCreationForm;
import org.societies.webapp.models.CisManagerForm;
import org.societies.webapp.models.PrivacyActionForm;
import org.societies.webapp.models.PrivacyConditionForm;
import org.societies.webapp.models.PrivacyPolicyResourceForm;
import org.societies.webapp.models.WebAppParticipant;
import org.societies.webapp.models.privacy.CisCtxAttributeHumanTypes;
import org.societies.webapp.models.privacy.CisCtxAttributeTypes;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
import org.societies.api.cis.attributes.Rule;
import org.societies.api.cis.attributes.MembershipCriteria;
import org.societies.api.cis.management.ICisManager;
import org.societies.api.cis.management.ICisManagerCallback;
import org.societies.api.cis.management.ICisOwned;
import org.societies.api.cis.management.ICis;
import org.societies.api.cis.management.ICisParticipant;
import org.societies.api.comm.xmpp.interfaces.ICommManager;
import org.societies.api.context.model.CtxAttributeTypes;
import org.societies.api.context.model.MalformedCtxIdentifierException;
import org.societies.api.identity.IIdentity;
import org.societies.api.identity.InvalidFormatException;
import org.societies.api.identity.Requestor;
import org.societies.api.internal.comm.ICommManagerController;
import org.societies.api.internal.privacytrust.privacyprotection.IPrivacyPolicyManager;
import org.societies.api.internal.useragent.feedback.IUserFeedback;
import org.societies.api.privacytrust.privacy.model.privacypolicy.RequestPolicy;
import org.societies.api.privacytrust.privacy.model.privacypolicy.constants.ActionConstants;
import org.societies.api.privacytrust.privacy.model.privacypolicy.constants.ConditionConstants;
import org.societies.api.schema.cis.community.Community;
import org.societies.api.schema.cis.community.CommunityMethods;
import org.societies.api.schema.cis.community.Criteria;
import org.societies.api.schema.cis.community.MembershipCrit;
import org.societies.api.schema.cis.community.Participant;
import org.societies.api.schema.cis.directory.CisAdvertisementRecord;
import org.societies.api.schema.identity.DataIdentifierScheme;
import java.lang.reflect.Field;
import java.security.InvalidParameterException;
@Controller
public class CisManagerController {
/**
* OSGI service get auto injected
*/
@Autowired
private ICisManager cisManager;
@Autowired(required=false)
private IPrivacyPolicyManager privacyPolicyManager;
@Autowired
private ICommManager commMngrRef;
//@Autowired
//private IUserFeedback userFeedback;
// -- Data for the Privacy Policy Form
private static String[] resourceList;
private static String[] resourceHumanList;
private static String[] resourceSchemeList;
List<Participant> m_remoteMemberRecords = new ArrayList<Participant>();
// store the interfaces of remote and local CISs
//private ArrayList<ICis> remoteCISs;
//private ArrayList<ICisOwned> localCISs;
//for the callback
private String resultCallback;
private Community remoteCommunity;
private HttpSession m_session;
private static Logger LOG = LoggerFactory.getLogger(CisManagerController.class);
@RequestMapping(value = "/cismanager.html", method = RequestMethod.GET)
public ModelAndView cssManager() {
Map<String, Object> model = new HashMap<String, Object>();
model.put("message", "Welcome to the CIS Manager");
CisManagerForm cisForm = new CisManagerForm();
//LIST METHODS AVAIABLE TO TEST
Map<String, String> methods = new LinkedHashMap<String, String>();
methods.put("CreateCis", "Create a CIS ");
methods.put("GetCisList", "List my CISs");
methods.put("JoinRemoteCIS", "Join a remote CIS");
methods.put("LeaveRemoteCIS", "Leave a remote CIS");
methods.put("GetMemberList", "Get list of members of a CIS");
methods.put("GetMemberListRemote", "Get list of members from remote CIS");
methods.put("AddMember", "Add member to a CIS");
methods.put("RemoveMemberFromCIS", "Remove member from a CIS");
model.put("methods", methods);
model.put("cmForm", cisForm);
//remoteCISs = new ArrayList<ICis>();
//localCISs = new ArrayList<ICisOwned>();
/*localCISs.addAll(this.getCisManager().getListOfOwnedCis());
remoteCISs.addAll(this.getCisManager().getRemoteCis());
Iterator<ICisOwned> it = localCISs.iterator();
ICisOwned thisCis = null;
String res = "";
String log = "Log ";
while(it.hasNext() && thisCis != null){
ICisOwned element = it.next();
log.concat(("CIS initially added with jid = " + element.getCisId()));
}
*/
// criteria
// TODO: get from CtxAttributeTypes
String [] attributeList = {"addressHomeCity", "interests","music","religiouslViews"};
String [] operatorList = {"equals", "differentFrom"};
model.put("attributeList", attributeList);
model.put("operatorList", operatorList);
// end of criteria
//model.put("remoteCISsArray", remoteCISs);
//model.put("localCISsArray", localCISs);
//model.put("log", log);
model.put("cismanagerResult", "CIS Management Result :");
return new ModelAndView("cismanager", model);
}
@RequestMapping(value = "/createnewcis.html", method = RequestMethod.GET)
public ModelAndView createNewCis() {
Map<String, Object> model = new HashMap<String, Object>();
model.put("message", "Welcome to the CIS Manager");
CisManagerForm cisForm = new CisManagerForm();
//LIST METHODS AVAIABLE TO TEST
Map<String, String> methods = new LinkedHashMap<String, String>();
methods.put("CreateCis", "Create a CIS ");
methods.put("GetCisList", "List my CISs");
methods.put("JoinRemoteCIS", "Join a remote CIS");
methods.put("LeaveRemoteCIS", "Leave a remote CIS");
methods.put("GetMemberList", "Get list of members of a CIS");
methods.put("GetMemberListRemote", "Get list of members from remote CIS");
methods.put("AddMember", "Add member to a CIS");
methods.put("RemoveMemberFromCIS", "Remove member from a CIS");
model.put("methods", methods);
//Auto populate
cisForm.setCssId(getCommMngrRef().getIdManager().getThisNetworkNode().getBareJid());
cisForm.setCisType("RICH");
cisForm.setCisMode(0);
model.put("cmForm", cisForm);
// TODO: get from CtxAttributeTypes
String [] attributeList = {"addressHomeCity", "interests","music","religiouslViews"};
String [] operatorList = {"equals", "differentFrom"};
model.put("attributeList", attributeList);
model.put("operatorList", operatorList);
// end of criteria
//model.put("remoteCISsArray", remoteCISs);
//model.put("localCISsArray", localCISs);
//model.put("log", log);
model.put("cismanagerResult", "CIS Management Result :");
return new ModelAndView("createNewCis", model);
}
@SuppressWarnings("unchecked")
@RequestMapping(value = "/cismanager.html", method = RequestMethod.POST)
public ModelAndView cssManager(@Valid CisManagerForm cisForm, BindingResult result, Map model, HttpSession session) {
boolean displayFormAtResult = true;
m_session = session;
model.put("message", "Welcome to the CIS Manager Page");
if (result.hasErrors()) {
model.put("res", "CIS Manager form error");
return new ModelAndView("cismanager", model);
}
if (getCisManager() == null) {
model.put("errormsg", "CIS Manager Service reference not avaiable");
return new ModelAndView("error", model);
}
String res = "Starting...";
String method = cisForm.getMethod();
res = "Method: " + method;
try {
if (method.equalsIgnoreCase("CreateCis")) {
model.put("methodcalled", "CreateCis");
res = "Creating CIS...";
// -- Retrieve CIS Configuration
Hashtable<String, MembershipCriteria> cisCriteria = null;
if(null !=cisForm && null != cisForm.getValue() && false == cisForm.getValue().isEmpty()){
cisCriteria = new Hashtable<String, MembershipCriteria> ();
MembershipCriteria m = new MembershipCriteria();
try{
Rule r = new Rule(cisForm.getOperator(),new ArrayList(Arrays.asList(cisForm.getValue())));
m.setRule(r);
cisCriteria.put(cisForm.getAttribute(), m);
LOG.info("Membership criteria rule #1: "+ cisForm.getAttribute() + ", " + cisForm.getOperator()+ ", " + cisForm.getValue());
}
catch(InvalidParameterException e){
throw new Exception(" excepation of invalid param " + cisForm.getAttribute() + ", " + cisForm.getOperator()+ ", " + cisForm.getValue());
}
}
// -- Fill CisCreationForm for next step
CisCreationForm cisCreationForm = generateCisCreationForm(cisForm, cisCriteria);
cisCreationForm.setMode("SHARED");
LOG.info("Proposed CIS Privacy Policy");
LOG.info(cisCreationForm.toString());
// Send page to generate the privacy policy
generateResourceLists();
model.put("res", res);
model.put("cisCreationForm", cisCreationForm);
model.put("ActionList", new String[]{"READ", "WRITE", "CREATE", "DELETE"});//ActionConstants.values());
model.put("ConditionList", ConditionConstants.values());
model.put("ResourceList", resourceList);
model.put("ResourceHumanList", resourceHumanList);
model.put("ResourceSchemeList", resourceSchemeList);
return new ModelAndView("privacy/privacy-policy/create-cis-step-2", model);
// model.put("methodcalled", "CreateCis");
// res = "Creating CIS...";
//
// Hashtable<String, MembershipCriteria> cisCriteria = new Hashtable<String, MembershipCriteria> ();
// MembershipCriteria m = new MembershipCriteria();
// try{
// Rule r = new Rule(cisForm.getOperator(),new ArrayList(Arrays.asList(cisForm.getValue())));
// m.setRule(r);
// cisCriteria.put(cisForm.getAttribute(), m);
// }
// catch(InvalidParameterException e){
// // TODO: treat expection
// res += " excepation of invalid param " + cisForm.getAttribute() + ", " + cisForm.getOperator()+ ", " + cisForm.getValue();
// }
//
// Future<ICisOwned> cisResult = this.getCisManager().createCis(
// cisForm.getCisName(),
// cisForm.getCisType(),cisCriteria,""
// ); // for some strange reason null instead of cisCriteria did not work
//
// res = "Successfully created CIS: " + cisResult.get().getCisId();
// //localCISs.add(cisResult.get());
} else if (method.equalsIgnoreCase("GetCisList")) {
model.put("methodcalled", "GetCisList");
//ICisRecord searchRecord = null;
//ICisRecord[] records = this.getCisManager().getCisList(searchRecord);
List<ICis> records = this.getCisManager().getCisList();
IIdentity currentNodeId = commMngrRef.getIdManager().getThisNetworkNode();
model.put("cisrecords", records);
model.put("currentNodeId", currentNodeId);
} else if (method.equalsIgnoreCase("JoinRemoteCIS")) {
model.put("methodcalled", "JoinRemoteCIS");
// TODO: get a real advertisement
LOG.info("[CisManagerController] "+cisForm);
CisAdvertisementRecord ad = new CisAdvertisementRecord();
ad.setId(cisForm.getCisJid());
LOG.info(" cisForm.getCssId() is " + cisForm.getCssId());
ad.setCssownerid((null != cisForm.getCssId() && !"".equals(cisForm.getCssId())) ? cisForm.getCssId() : "university.societies.local");
// in order to force the join to send qualifications, Ill add some criteria to the AdRecord
//MembershipCrit membershipCrit = new MembershipCrit();
//List<Criteria> criteria = new ArrayList<Criteria>();
//Criteria c1 = new Criteria();c1.setAttrib(CtxAttributeTypes.ADDRESS_HOME_CITY);c1.setOperator("equals");c1.setValue1("something");
//Criteria c2 = new Criteria();c2.setAttrib(CtxAttributeTypes.RELIGIOUS_VIEWS);c2.setOperator("equals");c2.setValue1("something");
//criteria.add(c1);criteria.add(c2);membershipCrit.setCriteria(criteria);
//ad.setMembershipCrit(membershipCrit);
// done setting membership crit
this.getCisManager().joinRemoteCIS(ad, icall);
displayFormAtResult = false;
//Thread.sleep(5 * 1000);
//model.put("joinStatus", "pending");//resultCallback);
/*if(!resultCallback.startsWith("Failure") ){
ICis i = getCisManager().getCis(cisForm.getCisJid());
model.put("cis", i);
}*/
res = "Join in progress...";
model.put("res", res);
} else if (method.equalsIgnoreCase("LeaveRemoteCIS")) {
model.put("methodcalled", "LeaveRemoteCIS");
this.getCisManager().leaveRemoteCIS(cisForm.getCisJid(), icall);
res = "left CIS: ";
} else if (method.equalsIgnoreCase("GetMemberList")) {
model.put("methodcalled", "GetMemberList");
model.put("cisid", cisForm.getCisJid());
ICisOwned thisCis = null;
List<ICisOwned> ownedCISs = this.getCisManager().getListOfOwnedCis();
if (ownedCISs.size() > 0) {
// res = "before addall";
// localCISs.addAll(ownedCISs);
// res = "AfteraddAll";
Iterator<ICisOwned> it = ownedCISs.iterator();
res = "Beforewhile";
while(it.hasNext() && thisCis == null){
ICisOwned element = it.next();
res = "BeforeIf";
if (element.getCisId().equalsIgnoreCase(cisForm.getCisJid())) {
thisCis = element;
//break;
}
}
}
if(thisCis == null){
res = "thisCIS is null";
//NOT LOCAL CIS, SO CALL REMOTE
ICis remoteCIS = this.getCisManager().getCis(cisForm.getCisJid().trim());
if (remoteCIS != null) {
res = cisForm.getCisJid().trim();
Requestor req = new Requestor(this.commMngrRef.getIdManager().getThisNetworkNode());
remoteCIS.getListOfMembers(req, icall);
//remoteCIS.getListOfMembers(icall);
res = "After getList";
Thread.sleep(5000);
List<WebAppParticipant> membersDetails = new ArrayList<WebAppParticipant>();
if (m_remoteMemberRecords != null)
{
for ( int memberIndex = 0; memberIndex < m_remoteMemberRecords.size(); memberIndex++)
{
WebAppParticipant memberDetail = new WebAppParticipant();
memberDetail.setMembersJid(m_remoteMemberRecords.get(memberIndex).getJid());
memberDetail.setMembershipType(m_remoteMemberRecords.get(memberIndex).getRole());
membersDetails.add(memberDetail);
}
}
model.put("memberRecords", membersDetails);
}
cisForm.setMethod("GetMemberListRemote");
model.put("methodcalled", "GetMemberListRemote");
model.put("method", "GetMemberListRemote");
res = "CIS==null: " + cisForm.getMethod();
} else {
Set<ICisParticipant> records = thisCis.getMemberList();
model.put("memberRecords", records);
res = "CIS is not null";
}
} else if (method.equalsIgnoreCase("GetMemberListRemote")) {
model.put("methodcalled", "GetMemberListRemote");
model.put("method", "GetMemberListRemote");
model.put("cisid", cisForm.getCisJid());
//CALL REMOTE
res += cisForm.getCisJid();
res += "Before Remote";
ICis remoteCIS = this.getCisManager().getCis(cisForm.getCisJid());
Requestor req = new Requestor(this.commMngrRef.getIdManager().getThisNetworkNode());
remoteCIS.getListOfMembers(req, icall);
//remoteCIS.getListOfMembers(icall);
res += "After Remote";
} else if (method.equalsIgnoreCase("RefreshRemoteMembers")) {
model.put("methodcalled", "RefreshRemoteMembers");
model.put("cisid", cisForm.getCisJid());
Community remoteCommunity = (Community)m_session.getAttribute("community");
List<Participant> membersRemote = (List<Participant>) m_session.getAttribute("remoteMemberRecords");
model.put("remoteMemberRecords", membersRemote);
model.put("community", remoteCommunity);
Set<ICisParticipant> records = null;
model.put("memberRecords", records);
} else if (method.equalsIgnoreCase("AddMember")) {
model.put("methodcalled", "AddMember");
// TODO
res = "";
List<ICisOwned> listOwned = this.cisManager.getListOfOwnedCis();
Iterator<ICisOwned> it = listOwned.iterator();
ICisOwned thisCis = null;
res +=" owned size " + listOwned.size();
while(it.hasNext() ){//&& (thisCis != null)){
res +="got in the loop";
ICisOwned element = it.next();
if (element.getCisId().equalsIgnoreCase(cisForm.getCisJid())){
res +="found a match";
thisCis = element;
}
else{
res +="CIS being compared = " + element.getCisId() + "and form = " + cisForm.getCssId();
}
}
res += " interactor done ";
if(thisCis == null){
res +="CIS not found: " + cisForm.getCssId();
}else{
if (thisCis.addMember(cisForm.getCssId(), cisForm.getRole()))
res += "member added ";
else
res += "error when adding member";
}
model.put("res", res);
} else if (method.equalsIgnoreCase("RemoveMemberFromCIS")) {
model.put("methodcalled", "RemoveMemberFromCIS");
// TODO
// model.put("cisrecords", records);
} else {
model.put("methodcalled", "Unknown");
res = "error unknown metod";
}
//ALWAYS RETURN THE LIST OF CIS'S I OWN OR AM MEMBER OF
// UPDATE, not always
if(displayFormAtResult){
IIdentity currentNodeId = commMngrRef.getIdManager().getThisNetworkNode();
model.put("currentNodeId", currentNodeId);
List<ICis> records = this.getCisManager().getCisList();
model.put("cisrecords", records);
}
} catch (Exception ex) {
LOG.error("Error when managing CIS", ex);
res += "Oops!!!! <br/>" + ex.getMessage();//.getMessage();
}
//model.put("res", res);
if(displayFormAtResult){
LOG.info("going to put form");
model.put("cmForm", cisForm);
}
return new ModelAndView("cismanagerresult", model);
}
@SuppressWarnings("unchecked")
@RequestMapping(value = "/createnewcis.html", method = RequestMethod.POST)
public ModelAndView createNewCis(@Valid CisManagerForm cisForm, BindingResult result, Map model, HttpSession session) {
m_session = session;
model.put("message", "Welcome to the CIS Manager Page");
if (result.hasErrors()) {
model.put("res", "CIS Manager form error");
return new ModelAndView("cismanager", model);
}
if (getCisManager() == null) {
model.put("errormsg", "CIS Manager Service reference not avaiable");
return new ModelAndView("error", model);
}
String res = "Starting...";
String method = cisForm.getMethod();
res = "Method: " + method;
try {
model.put("methodcalled", "CreateCis");
res = "Creating CIS...";
// -- Retrieve CIS Configuration
Hashtable<String, MembershipCriteria> cisCriteria = null;
if(null !=cisForm && null != cisForm.getValue() && false == cisForm.getValue().isEmpty()){
cisCriteria = new Hashtable<String, MembershipCriteria> ();
MembershipCriteria m = new MembershipCriteria();
try{
Rule r = new Rule(cisForm.getOperator(),new ArrayList(Arrays.asList(cisForm.getValue())));
m.setRule(r);
cisCriteria.put(cisForm.getAttribute(), m);
LOG.info("Membership criteria rule #1: "+ cisForm.getAttribute() + ", " + cisForm.getOperator()+ ", " + cisForm.getValue());
}
catch(InvalidParameterException e){
throw new Exception(" excepation of invalid param " + cisForm.getAttribute() + ", " + cisForm.getOperator()+ ", " + cisForm.getValue());
}
}
// -- Fill CisCreationForm for next step
CisCreationForm cisCreationForm = generateCisCreationForm(cisForm, cisCriteria);
cisCreationForm.setMode("SHARED");
LOG.info("Proposed CIS Privacy Policy");
LOG.info(cisCreationForm.toString());
// Send page to generate the privacy policy
generateResourceLists();
model.put("res", res);
model.put("cisCreationForm", cisCreationForm);
model.put("ActionList", new String[]{"READ", "WRITE", "CREATE", "DELETE"});//ActionConstants.values());
model.put("ConditionList", ConditionConstants.values());
model.put("ResourceList", resourceList);
model.put("ResourceHumanList", resourceHumanList);
model.put("ResourceSchemeList", resourceSchemeList);
} catch (Exception ex) {
LOG.error("Error when managing CIS", ex);
res += "Oops!!!! <br/>" + ex.getMessage();//.getMessage();
}
return new ModelAndView("privacy/privacy-policy/create-cis-step-2", model);
}
@RequestMapping(value = "/create-cis-step-3.html", method = RequestMethod.POST)
public ModelAndView createCisEnd(@Valid CisCreationForm cisCreationForm, BindingResult result, Map model, HttpSession session) {
LOG.debug("Create CIS Step 3: CIS creation");
// -- Verification
if (result.hasErrors()) {
LOG.warn("BindingResult has errors");
model.put("errormsg", "Create CIS Step 2: privacy policy form error<br />"+result.toString()+"<br />"+result.getFieldErrors().get(0).getObjectName());
return new ModelAndView("error", model);
}
LOG.debug(cisCreationForm.toString());
// -- Storage
RequestPolicy privacyPolicy;
StringBuffer resultMsg = new StringBuffer();
if (!isDepencyInjectionDone()) {
resultMsg.append("Error with dependency injection");
LOG.error("Error with dependency injection");
}
else {
try {
// -- CIS Configuration
Hashtable<String, MembershipCriteria> cisCriteria = null;
if (null !=cisCreationForm && null != cisCreationForm.getValue() && false == cisCreationForm.getValue().isEmpty()){
cisCriteria = new Hashtable<String, MembershipCriteria> ();
MembershipCriteria m = new MembershipCriteria();
try {
Rule r = new Rule(cisCreationForm.getOperator(), new ArrayList(Arrays.asList(cisCreationForm.getValue())));
m.setRule(r);
cisCriteria.put(cisCreationForm.getAttribute(), m);
}
catch(InvalidParameterException e){
resultMsg.append("Warning: Can't retrieve the membership criterii.");
}
}
// -- Generate Privacy Policy
CisCreationForm cisData;
// If custom: keep like it is
// Else: generate a pre-configured privacy policy
if (!"CUSTOM".equals(cisCreationForm.getMode())) {
LOG.info("Not CUSTOM mode, but "+cisCreationForm.getMode()+" mode");
cisData = generateCisCreationForm(cisCreationForm, cisCriteria, cisCreationForm.getMode());
}
else {
cisData = cisCreationForm;
}
// Generate a real privacy policy
privacyPolicy = cisData.toRequestPolicy(commMngrRef.getIdManager());
// -- CIS creation
Future<ICisOwned> cisResult = this.getCisManager().createCis(
cisData.getCisName(),
cisData.getCisType(),
cisCriteria,
"",
privacyPolicy.toXMLString()
); // for some strange reason null instead of cisCriteria did not work
ICisOwned newCis = cisResult.get();
if (null == newCis) {
throw new NullPointerException("Can't create the CIS");
}
// Result
resultMsg.append("The CIS '"+cisCreationForm.getCisName()+"' has been successfully created!");
resultMsg.append("New CIS Id "+newCis.getCisId());
} catch(InvalidParameterException e){
resultMsg.append("Error during the CIS creation: "+e.getMessage());
LOG.error("Error during the CIS creation", e);
} catch (InterruptedException e) {
resultMsg.append("Error during the CIS creation: "+e.getMessage());
LOG.error("Error during the CIS creation (interrupted)", e);
} catch (ExecutionException e) {
resultMsg.append("Error during the CIS creation: "+e.getMessage());
LOG.error("Error during the CIS creation (excecution)", e);
} catch (InvalidFormatException e) {
resultMsg.append("Error during the CIS privacy policy saving: "+e.getMessage());
LOG.error("Error during the CIS privacy policy saving", e);
} catch (MalformedCtxIdentifierException e) {
resultMsg.append("Error during the CIS privacy policy (retrieve resource) saving: "+e.getMessage());
LOG.error("Error during the CIS privacy policy (retrieve resource) saving", e);
} catch (IllegalArgumentException e) {
resultMsg.append("Error during the CIS privacy policy (illegal argument) saving: "+e.getMessage());
LOG.error("Error during the CIS privacy policy (illegal argument) saving", e);
} catch (IllegalAccessException e) {
resultMsg.append("Error during the CIS privacy policy (illegal access) saving: "+e.getMessage());
LOG.error("Error during the CIS privacy policy (illegal access) saving", e);
}
}
// -- Display the result
model.put("res", resultMsg.toString());
model.put("methodcalled", "CreateCis");
return new ModelAndView("cismanagerresult", model);
}
public static void generateResourceLists() throws IllegalArgumentException, IllegalAccessException {
Field[] resourceTypeArray = CisCtxAttributeTypes.class.getDeclaredFields();
Field[] resourceHumanTypeArray = CisCtxAttributeHumanTypes.class.getDeclaredFields();
resourceList = new String[resourceTypeArray.length];
resourceHumanList = new String[resourceTypeArray.length];
for(int i=0; i<resourceTypeArray.length; i++) {
resourceList[i] = DataIdentifierScheme.CONTEXT+":///"+((String)resourceTypeArray[i].get(null));
resourceHumanList[i] = DataIdentifierScheme.CONTEXT+": "+((String)resourceHumanTypeArray[i].get(null));
}
DataIdentifierScheme[] schemes = DataIdentifierScheme.values();
resourceSchemeList = new String[schemes.length];
for(int j=0; j<schemes.length; j++) {
resourceSchemeList[j] = schemes[j].value();
}
}
public CisCreationForm generateCisCreationForm(CisManagerForm cisForm, Map<String, MembershipCriteria> cisCriteria) throws IllegalArgumentException, IllegalAccessException {
return generateCisCreationForm(cisForm, cisCriteria, "SHARED");
}
public CisCreationForm generateCisCreationForm(CisManagerForm cisForm, Map<String, MembershipCriteria> cisCriteria, String mode) throws IllegalArgumentException, IllegalAccessException {
generateResourceLists();
// -- Fill CisCreationForm for next step
CisCreationForm cisCreationForm = new CisCreationForm();
if (null != cisForm) {
cisCreationForm.fillCisConfiguration(cisForm);
}
// -- Prepare condition list
List<PrivacyConditionForm> conditionsCisMemberList = new ArrayList<PrivacyConditionForm>();
List<PrivacyConditionForm> conditionsCisMembershipCriteria = new ArrayList<PrivacyConditionForm>();
List<PrivacyConditionForm> conditionsCisCommunityContext = new ArrayList<PrivacyConditionForm>();
if ("SHARED".equals(mode)) {
LOG.info("SHARED mode");
conditionsCisMemberList.add(new PrivacyConditionForm(ConditionConstants.RIGHT_TO_OPTOUT, "1", false));
conditionsCisMemberList.add(new PrivacyConditionForm(ConditionConstants.STORE_IN_SECURE_STORAGE, "1", false));
conditionsCisMemberList.add(new PrivacyConditionForm(ConditionConstants.SHARE_WITH_CIS_MEMBERS_ONLY, "1", false));
conditionsCisCommunityContext.add(new PrivacyConditionForm(ConditionConstants.RIGHT_TO_OPTOUT, "1", false));
conditionsCisCommunityContext.add(new PrivacyConditionForm(ConditionConstants.STORE_IN_SECURE_STORAGE, "1", false));
conditionsCisCommunityContext.add(new PrivacyConditionForm(ConditionConstants.SHARE_WITH_CIS_MEMBERS_ONLY, "1", false));
}
else if ("PUBLIC".equals(mode)) {
LOG.info("PUBLIC mode");
conditionsCisMemberList.add(new PrivacyConditionForm(ConditionConstants.RIGHT_TO_OPTOUT, "1", false));
conditionsCisMemberList.add(new PrivacyConditionForm(ConditionConstants.STORE_IN_SECURE_STORAGE, "1", false));
conditionsCisMemberList.add(new PrivacyConditionForm(ConditionConstants.SHARE_WITH_3RD_PARTIES, "1", false));
conditionsCisCommunityContext.add(new PrivacyConditionForm(ConditionConstants.RIGHT_TO_OPTOUT, "1", false));
conditionsCisCommunityContext.add(new PrivacyConditionForm(ConditionConstants.STORE_IN_SECURE_STORAGE, "1", false));
conditionsCisCommunityContext.add(new PrivacyConditionForm(ConditionConstants.SHARE_WITH_3RD_PARTIES, "1", false));
}
else {
LOG.info("PRIVATE mode");
conditionsCisMemberList.add(new PrivacyConditionForm(ConditionConstants.RIGHT_TO_OPTOUT, "1", false));
conditionsCisMemberList.add(new PrivacyConditionForm(ConditionConstants.STORE_IN_SECURE_STORAGE, "1", false));
conditionsCisMemberList.add(new PrivacyConditionForm(ConditionConstants.SHARE_WITH_CIS_OWNER_ONLY, "1", false));
conditionsCisCommunityContext.add(new PrivacyConditionForm(ConditionConstants.RIGHT_TO_OPTOUT, "1", false));
conditionsCisCommunityContext.add(new PrivacyConditionForm(ConditionConstants.STORE_IN_SECURE_STORAGE, "1", false));
conditionsCisCommunityContext.add(new PrivacyConditionForm(ConditionConstants.SHARE_WITH_CIS_OWNER_ONLY, "1", false));
}
conditionsCisMembershipCriteria.add(new PrivacyConditionForm(ConditionConstants.RIGHT_TO_OPTOUT, "1", false));
conditionsCisMembershipCriteria.add(new PrivacyConditionForm(ConditionConstants.MAY_BE_INFERRED, "1", false));
conditionsCisMembershipCriteria.add(new PrivacyConditionForm(ConditionConstants.SHARE_WITH_CIS_OWNER_ONLY, "1", false));
// -- Infer first version of the privacy policy: using CIS member list
PrivacyPolicyResourceForm resourceCisMemberList = new PrivacyPolicyResourceForm();
resourceCisMemberList.setResourceSchemeCustom(DataIdentifierScheme.CIS.value());
resourceCisMemberList.setResourceTypeCustom("cis-member-list");
resourceCisMemberList.addAction(new PrivacyActionForm(ActionConstants.READ));
resourceCisMemberList.addAction(new PrivacyActionForm(ActionConstants.CREATE));
resourceCisMemberList.setConditions(conditionsCisMemberList);
cisCreationForm.addResource(resourceCisMemberList);
// -- Infer first version of the privacy policy: using membership criteria
if (null != cisCriteria && cisCriteria.size() > 0) {
PrivacyPolicyResourceForm resource = new PrivacyPolicyResourceForm();
resource.setResourceType(DataIdentifierScheme.CONTEXT+":///"+cisCreationForm.getAttribute());
resource.addAction(new PrivacyActionForm(ActionConstants.READ));
resource.addAction(new PrivacyActionForm(ActionConstants.CREATE));
resource.setConditions(conditionsCisMembershipCriteria);
cisCreationForm.addResource(resource);
}
// -- Infer first version of the privacy policy: using Community Context Data
for(int i=0; i<resourceList.length; i++) {
PrivacyPolicyResourceForm resource = new PrivacyPolicyResourceForm();
resource.setResourceType(resourceList[i]);
resource.addAction(new PrivacyActionForm(ActionConstants.READ));
resource.addAction(new PrivacyActionForm(ActionConstants.CREATE));
resource.setConditions(conditionsCisCommunityContext);
cisCreationForm.addResource(resource);
}
return cisCreationForm;
}
// callback
WebAppCISCallback icall = new WebAppCISCallback();//this.userFeedback);
public class WebAppCISCallback implements ICisManagerCallback{
public WebAppCISCallback(){//IUserFeedback userFeedback){
super();
//this.userFeedback = userFeedback;
}
//IUserFeedback userFeedback;
public void receiveResult(CommunityMethods communityResultObject) {
if(communityResultObject == null){
resultCallback = "Failure getting result from remote node!";
}
else {
if(communityResultObject.getJoinResponse() != null){
if(communityResultObject.getJoinResponse().isResult()){
if(null != communityResultObject.getJoinResponse().getCommunity() && null != communityResultObject.getJoinResponse().getCommunity().getCommunityJid()
&& communityResultObject.getJoinResponse().getCommunity().getCommunityJid().isEmpty() == false){
String community = communityResultObject.getJoinResponse().getCommunity().getCommunityJid();
LOG.info("callback for join regarindg community " + community);
//this.userFeedback.showNotification("Joined CIS: " + community);
resultCallback = "Joined CIS " + community;
remoteCommunity = communityResultObject.getJoinResponse().getCommunity();
m_session.setAttribute("community", remoteCommunity);
LOG.info("done at join response");
}
else{
resultCallback = "Joined CIS work but community xsd was bogus ";
}
}else{
resultCallback = "Failure when trying to joined CIS: " + communityResultObject.getJoinResponse().getCommunity().getCommunityJid();
//this.userFeedback.showNotification("failed to join " + communityResultObject.getJoinResponse().getCommunity().getCommunityJid());
}
}
if(communityResultObject.getWhoResponse() != null){
LOG.debug("### " + communityResultObject.getWhoResponse().getParticipant().size());
m_session.setAttribute("community", remoteCommunity);
m_remoteMemberRecords = communityResultObject.getWhoResponse().getParticipant();
m_session.setAttribute("remoteMemberRecords", m_remoteMemberRecords);
}
}
}
}
// -- Dependency Injection
private boolean isDepencyInjectionDone() {
return isDepencyInjectionDone(0);
}
private boolean isDepencyInjectionDone(int level) {
if (null == commMngrRef) {
LOG.info("[Dependency Injection] Missing ICommManager");
return false;
}
if (null == commMngrRef.getIdManager()) {
LOG.info("[Dependency Injection] Missing IIdentityManager");
return false;
}
if (null == cisManager) {
LOG.info("[Dependency Injection] Missing ICisManager");
return false;
}
return true;
}
public void setPrivacyPolicyManager(IPrivacyPolicyManager privacyPolicyManager) {
this.privacyPolicyManager = privacyPolicyManager;
LOG.info("[DepencyInjection] IPrivacyPolicyManager injected");
}
public ICommManager getCommMngrRef() {
return this.commMngrRef;
}
public void setCommMngrRef(ICommManager commMngrRef) {
this.commMngrRef = commMngrRef;
LOG.info("[DepencyInjection] ICommManager injected");
}
public ICisManager getCisManager() {
return cisManager;
}
public void setCisManager(ICisManager cisManager) {
this.cisManager = cisManager;
}
@SuppressWarnings("unchecked")
@RequestMapping(value = "/pilotmycommunities.html", method = RequestMethod.GET)
public ModelAndView myCommumities()
{
Map<String, Object> model = new HashMap<String, Object>();
model.put("message", "Welcome to the CIS Manager Page");
// cismanager result page seems to want this for some reason!??
CisManagerForm cisForm = new CisManagerForm();
cisForm.setMethod("GetCisList");
model.put("cisForm", cisForm);
List<String> methodList = new ArrayList<String>();
methodList.add(new String("GetCisList"));
model.put("method", methodList);
model.put("methodcalled", "GetCisList");
if (getCisManager() == null) {
model.put("errormsg", "CIS Manager Service reference not avaiable");
return new ModelAndView("error", model);
}
String res = "Starting...";
try {
//ICisRecord searchRecord = null;
//ICisRecord[] records = this.getCisManager().getCisList(searchRecord);
List<ICis> records = this.getCisManager().getCisList();
IIdentity currentNodeId = commMngrRef.getIdManager().getThisNetworkNode();
model.put("cisrecords", records);
model.put("currentNodeId", currentNodeId);
} catch (Exception ex) {
LOG.error("Error when managing CIS", ex);
res += "Oops!!!! <br/>" + ex.getMessage();//.getMessage();
}
model.put("res", res);
return new ModelAndView("pilotmycommunities", model);
}
@SuppressWarnings("unchecked")
@RequestMapping(value = "/mycisappspilot.html", method = RequestMethod.GET)
public ModelAndView myCommumityApps()
{
Map<String, Object> model = new HashMap<String, Object>();
model.put("message", "Welcome to the CIS Apps Page");
// cismanager result page seems to want this for some reason!??
CisManagerForm cisForm = new CisManagerForm();
cisForm.setMethod("GetCisList");
model.put("cisForm", cisForm);
List<String> methodList = new ArrayList<String>();
methodList.add(new String("GetCisList"));
model.put("method", methodList);
model.put("methodcalled", "GetCisList");
if (getCisManager() == null) {
model.put("errormsg", "CIS Manager Service reference not avaiable");
return new ModelAndView("error", model);
}
String res = "Starting...";
try {
//ICisRecord searchRecord = null;
//ICisRecord[] records = this.getCisManager().getCisList(searchRecord);
List<ICis> records = this.getCisManager().getCisList();
IIdentity currentNodeId = commMngrRef.getIdManager().getThisNetworkNode();
model.put("cisrecords", records);
model.put("currentNodeId", currentNodeId);
} catch (Exception ex) {
LOG.error("Error when managing CIS", ex);
res += "Oops!!!! <br/>" + ex.getMessage();//.getMessage();
}
model.put("res", res);
return new ModelAndView("mycisappspilot", model);
}
}