/**
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 (IBM),
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.cis.directory;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Future;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.criterion.Restrictions;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.societies.api.schema.cis.community.Criteria;
import org.societies.api.schema.cis.community.MembershipCrit;
import org.societies.api.schema.cis.directory.CisAdvertisementRecord;
import org.societies.api.cis.directory.ICisAdvertisementRecord;
import org.societies.api.cis.directory.ICisDirectory;
import org.societies.cis.directory.model.CisAdvertisementRecordEntry;
import org.societies.cis.directory.model.CriteriaRecordEntry;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.AsyncResult;
public class CisDirectory implements ICisDirectory {
private SessionFactory sessionFactory;
private static Logger log = LoggerFactory.getLogger(CisDirectory.class);
/**
* @return the sessionFactory
*/
public SessionFactory getSessionFactory() {
return sessionFactory;
}
/**
* @param sessionFactory the sessionFactory to set
*/
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
public CisDirectory() {
log.info("CIS Directory bundle instantiated.");
}
/* @see org.societies.api.cis.directory.ICisDirectory#addCisAdvertisementRecord
* (org.societies.api.schema.cis.directory.CisAdvertisementRecord) */
@Override
public void addCisAdvertisementRecord(CisAdvertisementRecord cisAdRec) {
log.info("addCisAdvertisementRecord called.");
System.out.println("+++++++++++++++++++++++ Name is = " + cisAdRec.getName());
System.out.println("+++++++++++++++++++++++ ID is = " + cisAdRec.getId());
System.out.println("+++++++++++++++++++++++ Owner Id is = " + cisAdRec.getCssownerid());
Session session = sessionFactory.openSession();
CisAdvertisementRecordEntry advertEntry = null;
Transaction t = session.beginTransaction();
try {
//ADVERTISEMENT RECORD
advertEntry = new CisAdvertisementRecordEntry(cisAdRec.getName(),
cisAdRec.getId(), cisAdRec.getCssownerid(), cisAdRec.getPassword(), cisAdRec.getType());
session.save(advertEntry);
//SET OF CRITERIA RECORDS
for(Criteria tmpCrit: cisAdRec.getMembershipCrit().getCriteria()) {
CriteriaRecordEntry critEntry = new CriteriaRecordEntry(tmpCrit.getAttrib(), tmpCrit.getOperator(), tmpCrit.getValue1(), tmpCrit.getValue2(), tmpCrit.getRank());
critEntry.setCisAdvertRecord(advertEntry);
advertEntry.getCriteriaRecords().add(critEntry);
session.save(critEntry);
}
t.commit();
log.debug("Cis Advertisement Record Saved.");
} catch (Exception e) {
t.rollback();
e.printStackTrace();
} finally {
if (session != null) {
session.close();
}
}
}
/*@see org.societies.api.cis.directory.ICisDirectory#deleteCisAdvertisementRecord
* (org.societies.api.schema.cis.directory.CisAdvertisementRecord) */
@Override
public void deleteCisAdvertisementRecord(CisAdvertisementRecord cisAdRec) {
Session session = sessionFactory.openSession();
Transaction t = session.beginTransaction();
try {
Query dbQuery = session.createQuery("FROM CisAdvertisementRecordEntry WHERE id = :CisId");
dbQuery.setParameter("CisId", cisAdRec.getId());
CisAdvertisementRecordEntry advertEntry = (CisAdvertisementRecordEntry)dbQuery.list().get(0);
session.delete(advertEntry);
t.commit();
log.debug("Cis Advertisement Record deleted.");
} catch (Exception e) {
t.rollback();
e.printStackTrace();
} finally {
if (session != null) {
session.close();
}
}
}
/*@see org.societies.api.cis.directory.ICisDirectory#findAllCisAdvertisementRecords() */
@SuppressWarnings("unchecked")
@Override
@Async
public Future<List<CisAdvertisementRecord>> findAllCisAdvertisementRecords() {
Session session = sessionFactory.openSession();
List<CisAdvertisementRecordEntry> tmpAdvertList = new ArrayList<CisAdvertisementRecordEntry>();
List<CisAdvertisementRecord> returnList = new ArrayList<CisAdvertisementRecord>();
CisAdvertisementRecord record = null;
try {
tmpAdvertList = session.createCriteria(CisAdvertisementRecordEntry.class).list();
for (CisAdvertisementRecordEntry entry : tmpAdvertList) {
record = new CisAdvertisementRecord();
record.setName(entry.getName());
record.setId(entry.getId());
record.setCssownerid(entry.getCssOwnerId());
record.setPassword(entry.getpassword());
record.setType(entry.gettype());
//MEMBERSHIP CRITERIA
MembershipCrit memberCrit = new MembershipCrit();
for(CriteriaRecordEntry critRecord: entry.getCriteriaRecords()) {
Criteria crit = new Criteria();
crit.setAttrib(critRecord.getAttrib());
crit.setOperator(critRecord.getOperator());
crit.setRank(critRecord.getRank());
crit.setValue1(critRecord.getValue1());
crit.setValue2(critRecord.getValue2());
memberCrit.getCriteria().add(crit);
}
record.setMembershipCrit(memberCrit);
returnList.add(record);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (session != null) {
session.close();
}
}
return new AsyncResult<List<CisAdvertisementRecord>>(returnList);
}
/*@see org.societies.api.cis.directory.ICisDirectory#findForAllCis(org.societies
* .api.schema.cis.directory.CisAdvertisementRecord) */
@SuppressWarnings("unchecked")
@Override
@Async
public Future<List<CisAdvertisementRecord>> findForAllCis( CisAdvertisementRecord filteredcis, String filter) {
//filter by name, search directory and return CISs that match the relevant name
Session session = sessionFactory.openSession();
List<CisAdvertisementRecordEntry> tmpAdvertList = new ArrayList<CisAdvertisementRecordEntry>();
List<CisAdvertisementRecord> returnList = new ArrayList<CisAdvertisementRecord>();
CisAdvertisementRecord record = null;
try {
tmpAdvertList = session.createCriteria(CisAdvertisementRecordEntry.class).list();
for (CisAdvertisementRecordEntry entry : tmpAdvertList) {
record = new CisAdvertisementRecord();
if (record.getName().equals(filter)) {
record.setName(entry.getName());
record.setId(entry.getId());
record.setCssownerid(entry.getCssOwnerId());
record.setPassword(entry.getpassword());
record.setType(entry.gettype());
//MEMBERSHIP CRITERIA
MembershipCrit memberCrit = new MembershipCrit();
for(CriteriaRecordEntry critRecord: entry.getCriteriaRecords()) {
Criteria crit = new Criteria();
crit.setAttrib(critRecord.getAttrib());
crit.setOperator(critRecord.getOperator());
crit.setRank(critRecord.getRank());
crit.setValue1(critRecord.getValue1());
crit.setValue2(critRecord.getValue2());
memberCrit.getCriteria().add(crit);
}
record.setMembershipCrit(memberCrit);
returnList.add(record);
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (session != null) {
session.close();
}
}
return new AsyncResult<List<CisAdvertisementRecord>>(returnList);
}
/* @see org.societies.api.cis.directory.ICisDirectory#updateCisAdvertisementRecord(org.societies.api.schema.cis.directory.CisAdvertisementRecord,
* org.societies.api.schema.cis.directory.CisAdvertisementRecord) */
@Override
public void updateCisAdvertisementRecord(CisAdvertisementRecord oldCisValues, CisAdvertisementRecord updatedCisValues) {
this.deleteCisAdvertisementRecord(oldCisValues);
this.addCisAdvertisementRecord(updatedCisValues);
/*
Session session = sessionFactory.openSession();
Transaction t = session.beginTransaction();
try {
//DELETE OLD ADVERTISEMENT RECORD
Query dbQuery = session.createQuery("FROM CisAdvertisementRecordEntry WHERE id = :CisId");
dbQuery.setParameter("CisId", oldCisValues.getId());
CisAdvertisementRecordEntry advertEntry = (CisAdvertisementRecordEntry)dbQuery.list().get(0);
System.out.println("+++++++++++++++++++++++ Deleting Record" + oldCisValues.getId());
session.delete(advertEntry);
//NEW ADVERTISEMENT RECORD
CisAdvertisementRecordEntry newAdvertEntry = new CisAdvertisementRecordEntry(updatedCisValues.getName(), updatedCisValues.getId(),
updatedCisValues.getUri(), updatedCisValues.getPassword(), updatedCisValues.getType());
session.save(newAdvertEntry);
//SET OF CRITERIA RECORDS
for(Criteria tmpCrit: updatedCisValues.getMembershipCrit().getCriteria()) {
CriteriaRecordEntry critEntry = new CriteriaRecordEntry(tmpCrit.getAttrib(), tmpCrit.getOperator(), tmpCrit.getValue1(), tmpCrit.getValue2(), tmpCrit.getRank());
critEntry.setCisAdvertRecord(advertEntry);
newAdvertEntry.getCriteriaRecords().add(critEntry);
session.save(critEntry);
}
t.commit();
log.debug("Cis Advertisement Record updated.");
} catch (Exception e) {
t.rollback();
e.printStackTrace();
} finally {
if (session != null) {
session.close();
}
}
*/
}
@Override
public Integer AddPeerDirectory(String arg0, String arg1, Integer arg2) {
// TODO Auto-generated method stub
return null;
}
@Override
public Boolean RegisterCis(ICisAdvertisementRecord arg0) {
// TODO Auto-generated method stub
return null;
}
@Override
public Boolean UnregisterCis(ICisAdvertisementRecord arg0) {
// TODO Auto-generated method stub
return null;
}
@Override
public String getURI() {
// TODO Auto-generated method stub
return null;
}
@Override
public Boolean ping() {
// TODO Auto-generated method stub
return null;
}
@Override
public ICisAdvertisementRecord[] searchByName(String arg0) {
// TODO Auto-generated method stub
return null;
}
@Override
public ICisAdvertisementRecord[] searchByOwner(String arg0) {
// TODO Auto-generated method stub
return null;
}
@Override
public ICisAdvertisementRecord[] searchByUri(String arg0) {
// TODO Auto-generated method stub
return null;
}
@Override
public Future<List<CisAdvertisementRecord>> searchByID(String cisID) {
//TODO: We really want to deprecate this call and always use the searchByIDs
// but since andoid also using, leaving it for now ...
//filter by id, search directory and return CISs that match the relevant cis id
// should only be one, but easier to return a list of one as that is
// what all other searches will return a list
Session session = sessionFactory.openSession();
List<CisAdvertisementRecordEntry> tmpAdvertList = new ArrayList<CisAdvertisementRecordEntry>();
List<CisAdvertisementRecord> returnList = new ArrayList<CisAdvertisementRecord>();
CisAdvertisementRecord record = null;
try {
tmpAdvertList = session.createCriteria(CisAdvertisementRecordEntry.class)
.add(Restrictions.eq("id", cisID).ignoreCase()).list();
if ((tmpAdvertList != null) && (tmpAdvertList.size() > 0))
{
for (CisAdvertisementRecordEntry entry : tmpAdvertList) {
// Since it's uniquer we should only get one
record = new CisAdvertisementRecord();
record.setName(entry.getName());
record.setId(entry.getId());
record.setCssownerid(entry.getCssOwnerId());
record.setPassword(entry.getpassword());
record.setType(entry.gettype());
//MEMBERSHIP CRITERIA
MembershipCrit memberCrit = new MembershipCrit();
for(CriteriaRecordEntry critRecord: entry.getCriteriaRecords()) {
Criteria crit = new Criteria();
crit.setAttrib(critRecord.getAttrib());
crit.setOperator(critRecord.getOperator());
crit.setRank(critRecord.getRank());
crit.setValue1(critRecord.getValue1());
crit.setValue2(critRecord.getValue2());
memberCrit.getCriteria().add(crit);
}
record.setMembershipCrit(memberCrit);
returnList.add(record);
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (session != null) {
session.close();
}
}
return new AsyncResult<List<CisAdvertisementRecord>>(returnList);
}
@Override
public Future<List<CisAdvertisementRecord>> searchByIDS(List<String> cisIDs) {
//filter by id, search directory and return CISs that match the relevant cis id
// should only be one, but easier to return a list of one as that is
// what all other searches will return a list
Session session = sessionFactory.openSession();
List<CisAdvertisementRecordEntry> tmpAdvertList = new ArrayList<CisAdvertisementRecordEntry>();
List<CisAdvertisementRecord> returnList = new ArrayList<CisAdvertisementRecord>();
CisAdvertisementRecord record = null;
try {
if (cisIDs.size() > 0) // not use searching if we have an empty list!
{
tmpAdvertList = session.createCriteria(CisAdvertisementRecordEntry.class).
add(Restrictions.in("id",cisIDs)).list();
if ((tmpAdvertList != null) && (tmpAdvertList.size() > 0))
{
for (CisAdvertisementRecordEntry entry : tmpAdvertList)
{
record = new CisAdvertisementRecord();
record.setName(entry.getName());
record.setId(entry.getId());
record.setCssownerid(entry.getCssOwnerId());
record.setPassword(entry.getpassword());
record.setType(entry.gettype());
// MEMBERSHIP CRITERIA
MembershipCrit memberCrit = new MembershipCrit();
for(CriteriaRecordEntry critRecord: entry.getCriteriaRecords()) {
Criteria crit = new Criteria();
crit.setAttrib(critRecord.getAttrib());
crit.setOperator(critRecord.getOperator());
crit.setRank(critRecord.getRank());
crit.setValue1(critRecord.getValue1());
crit.setValue2(critRecord.getValue2());
memberCrit.getCriteria().add(crit);
}
record.setMembershipCrit(memberCrit);
returnList.add(record);
}
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (session != null) {
session.close();
}
}
return new AsyncResult<List<CisAdvertisementRecord>>(returnList);
}
}