package com.idega.user.data;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import javax.ejb.CreateException;
import javax.ejb.EJBException;
import javax.ejb.FinderException;
import javax.ejb.RemoveException;
import com.idega.core.builder.data.ICDomain;
import com.idega.core.builder.data.ICPage;
import com.idega.core.contact.data.Email;
import com.idega.core.contact.data.Phone;
import com.idega.core.contact.data.PhoneBMPBean;
import com.idega.core.data.ICTreeNode;
import com.idega.core.file.data.ICFile;
import com.idega.core.location.data.Address;
import com.idega.core.location.data.AddressType;
import com.idega.core.net.data.ICNetwork;
import com.idega.core.net.data.ICProtocol;
import com.idega.data.GenericEntity;
import com.idega.data.IDOAddRelationshipException;
import com.idega.data.IDOCompositePrimaryKeyException;
import com.idega.data.IDOEntityDefinition;
import com.idega.data.IDOException;
import com.idega.data.IDOLookup;
import com.idega.data.IDOLookupException;
import com.idega.data.IDOQuery;
import com.idega.data.IDORelationshipException;
import com.idega.data.IDOUtil;
import com.idega.data.MetaDataCapable;
import com.idega.data.UniqueIDCapable;
import com.idega.data.query.AND;
import com.idega.data.query.Column;
import com.idega.data.query.Criteria;
import com.idega.data.query.InCriteria;
import com.idega.data.query.MatchCriteria;
import com.idega.data.query.OR;
import com.idega.data.query.SelectQuery;
import com.idega.data.query.Table;
import com.idega.data.query.WildCardColumn;
import com.idega.idegaweb.IWApplicationContext;
import com.idega.util.IWTimestamp;
import com.idega.util.ListUtil;
/**
* Title: IW Core
* Description:
* Copyright: Copyright (c) 2001-2003 idega software
* Company: idega.is
* @author <a href="mailto:gummi@idega.is">Gu�mundur �g�st S�mundsson</a>,
* @version 1.0
*/
public class GroupBMPBean extends com.idega.core.data.GenericGroupBMPBean implements Group, ICTreeNode, MetaDataCapable,UniqueIDCapable {
private static final int PREFETCH_SIZE = 100;
public static final int GROUP_ID_EVERYONE = -7913;
public static final int GROUP_ID_USERS = -1906;
private static final String RELATION_TYPE_GROUP_PARENT = "GROUP_PARENT";
private static final String SQL_RELATION_ADDRESS = "IC_GROUP_ADDRESS";
public final static String SQL_RELATION_EMAIL = "IC_GROUP_EMAIL";
public final static String SQL_RELATION_PHONE = "IC_GROUP_PHONE";
private static final String ENTITY_NAME = "ic_group";
static final String COLUMN_GROUP_ID = "IC_GROUP_ID";
static final String COLUMN_NAME = "NAME";
static final String COLUMN_GROUP_TYPE = "GROUP_TYPE";
static final String COLUMN_DESCRIPTION = "DESCRIPTION";
static final String COLUMN_EXTRA_INFO = "EXTRA_INFO";
static final String COLUMN_CREATED = "CREATED";
static final String COLUMN_HOME_PAGE_ID = "HOME_PAGE_ID";
static final String COLUMN_HOME_FOLDER_ID = "HOME_FOLDER_ID";
static final String COLUMN_ALIAS_TO_GROUP = "ALIAS_ID";
static final String COLUMN_PERMISSION_CONTROLLING_GROUP = "PERM_GROUP_ID";
static final String COLUMN_IS_PERMISSION_CONTROLLING_GROUP = "IS_PERM_CONTROLLING";
static final String COLUMN_SHORT_NAME = "SHORT_NAME";
static final String COLUMN_ABBREVATION = "ABBR";
static final String META_DATA_HOME_PAGE = "homepage";
private static List userGroupTypeSingletonList;
private List userRepresentativeGroupTypeList;
public final void initializeAttributes() {
addAttribute(getIDColumnName());
addAttribute(getNameColumnName(), "Group name", true, true, "java.lang.String");
addAttribute(getGroupTypeColumnName(), "Group type", true, true, String.class, 30, "many-to-one", GroupType.class);
addAttribute(getGroupDescriptionColumnName(), "Description", true, true, "java.lang.String");
addAttribute(getExtraInfoColumnName(), "Extra information", true, true, "java.lang.String");
addAttribute(COLUMN_CREATED, "Created when", Timestamp.class);
addAttribute(getColumnNameHomePageID(), "Home page ID", true, true, Integer.class, "many-to-one", ICPage.class);
setNullable(getColumnNameHomePageID(), true);
addAttribute(COLUMN_SHORT_NAME, "Short name", true, true, String.class);
addAttribute(COLUMN_ABBREVATION, "Abbrevation", true, true, String.class);
//adds a unique id string column to this entity that is set when the entity is first stored.
addUniqueIDColumn();
this.addManyToManyRelationShip(ICNetwork.class, "ic_group_network");
this.addManyToManyRelationShip(ICProtocol.class, "ic_group_protocol");
this.addManyToManyRelationShip(Phone.class, SQL_RELATION_PHONE);
this.addManyToManyRelationShip(Email.class, SQL_RELATION_EMAIL);
this.addManyToManyRelationShip(Address.class, SQL_RELATION_ADDRESS);
addMetaDataRelationship();
//can have extra info in the ic_metadata table
// id of the group that has the permissions for this group. If this is not null then this group has inherited permissions.
addManyToOneRelationship(COLUMN_PERMISSION_CONTROLLING_GROUP, Group.class);
//addManyToOneRelationship(getGroupTypeColumnName(), GroupType.class);
addAttribute(COLUMN_IS_PERMISSION_CONTROLLING_GROUP, "Do children of this group get same permissions", true, true, Boolean.class);
addManyToOneRelationship(COLUMN_ALIAS_TO_GROUP, Group.class);
setNullable(COLUMN_ALIAS_TO_GROUP, true);
addManyToOneRelationship(COLUMN_HOME_FOLDER_ID,ICFile.class);
//indexes
addIndex("IDX_IC_GROUP_1", new String[]{ COLUMN_GROUP_TYPE, COLUMN_GROUP_ID});
addIndex("IDX_IC_GROUP_2", COLUMN_NAME);
addIndex("IDX_IC_GROUP_3", COLUMN_GROUP_ID);
addIndex("IDX_IC_GROUP_4", COLUMN_GROUP_TYPE);
addIndex("IDX_IC_GROUP_5", new String[]{ COLUMN_GROUP_ID, COLUMN_GROUP_TYPE});
addIndex("IDX_IC_GROUP_6", COLUMN_HOME_PAGE_ID);
addIndex("IDX_IC_GROUP_7", COLUMN_ABBREVATION);
addIndex("IDX_IC_GROUP_8", new String[]{ COLUMN_GROUP_ID, COLUMN_NAME, COLUMN_GROUP_TYPE});
addIndex("IDX_IC_GROUP_9", UNIQUE_ID_COLUMN_NAME);
addIndex("IDX_IC_GROUP_10", new String[]{ COLUMN_GROUP_TYPE, COLUMN_NAME});
}
public final String getEntityName() {
return ENTITY_NAME;
}
// public String getNameOfMiddleTable(IDOLegacyEntity entity1,IDOLegacyEntity entity2){
// return "ic_group_user";
// }
public void setDefaultValues() {
//DO NOT USE setColumn
initializeColumnValue(COLUMN_GROUP_TYPE, getGroupTypeValue());
initializeColumnValue(COLUMN_CREATED,IWTimestamp.getTimestampRightNow());
}
// public void insertStartData(){
// try {
// GroupTypeHome tghome = (GroupTypeHome)IDOLookup.getHome(GroupType.class);
// try{
// GroupType type = tghome.findByPrimaryKey(getGroupTypeKey());
// } catch(FinderException e){
// e.printStackTrace();
// try {
// GroupType type = tghome.create();
// type.setType(getGroupTypeKey());
// type.setDescription(getGroupTypeDescription());
// type.store();
// }
// catch (Exception ex) {
// ex.printStackTrace();
// }
// }
// }
// catch (RemoteException rmi){
// throw new EJBException(rmi);
// }
// }
// protected boolean doInsertInCreate(){
// return true;
// }
/**
* overwrite in extended classes
*/
public String getGroupTypeValue() {
return getGroupTypeHome().getGeneralGroupTypeString();
}
public String getGroupTypeKey() {
return getGroupTypeValue();
}
public String getGroupTypeDescription() {
return "";
}
/* ColumNames begin */
public static String getColumnNameGroupID() {
return COLUMN_GROUP_ID;
}
public static String getNameColumnName() {
return COLUMN_NAME;
}
public static String getGroupTypeColumnName() {
return COLUMN_GROUP_TYPE;
}
public static String getGroupDescriptionColumnName() {
return COLUMN_DESCRIPTION;
}
public static String getExtraInfoColumnName() {
return COLUMN_EXTRA_INFO;
}
public static String getColumnNameHomePageID() {
return COLUMN_HOME_PAGE_ID;
}
public static String getColumnNameShortName() {
return COLUMN_SHORT_NAME;
}
public static String getColumnNameAbbrevation() {
return COLUMN_ABBREVATION;
}
/* ColumNames end */
/* functions begin */
public String getName() {
return (String)getColumnValue(getNameColumnName());
}
public void setName(String name) {
setColumn(getNameColumnName(), name);
}
public String getGroupType() {
//try {
//was going to the database everytime!! I kill you tryggvi/gummi (eiki)
//return (String) ((GroupType) getColumnValue(getGroupTypeColumnName())).getPrimaryKey();
return getStringColumnValue(getGroupTypeColumnName());
//} catch (RemoteException ex) {
// throw new EJBException(ex);
//}
}
public void setGroupType(String groupType) {
setColumn(getGroupTypeColumnName(), groupType);
}
public void setGroupType(GroupType groupType) {
setColumn(getGroupTypeColumnName(), groupType);
}
public void setAliasID(int id) {
setColumn(COLUMN_ALIAS_TO_GROUP, id);
}
public void setAlias(Group alias) {
setColumn(COLUMN_ALIAS_TO_GROUP, alias);
}
public int getAliasID() {
return getIntColumnValue(COLUMN_ALIAS_TO_GROUP);
}
public Group getAlias() {
return (Group)getColumnValue(COLUMN_ALIAS_TO_GROUP);
}
/**
* This only returns true if the group is of the type alias and the id is bigger than 0
*/
public boolean isAlias() {
return ("alias".equals(getGroupType()) && ( getAliasID()>0 ));
}
public void setPermissionControllingGroupID(int id) {
setColumn(COLUMN_PERMISSION_CONTROLLING_GROUP, id);
}
public void setPermissionControllingGroup(Group controllingGroup) {
setColumn(COLUMN_PERMISSION_CONTROLLING_GROUP, controllingGroup);
}
public int getPermissionControllingGroupID() {
return getIntColumnValue(COLUMN_PERMISSION_CONTROLLING_GROUP);
}
public Group getPermissionControllingGroup() {
return (Group)getColumnValue(COLUMN_PERMISSION_CONTROLLING_GROUP);
}
public void setShortName(String shortName) {
setColumn(COLUMN_SHORT_NAME, shortName);
}
public void setAbbrevation(String abbr) {
setColumn(COLUMN_ABBREVATION, abbr);
}
public String getDescription() {
return (String)getColumnValue(getGroupDescriptionColumnName());
}
public void setDescription(String description) {
setColumn(getGroupDescriptionColumnName(), description);
}
public String getExtraInfo() {
return (String)getColumnValue(getExtraInfoColumnName());
}
public void setExtraInfo(String extraInfo) {
setColumn(getExtraInfoColumnName(), extraInfo);
}
public Timestamp getCreated() {
return ((Timestamp)getColumnValue(COLUMN_CREATED));
}
public void setCreated(Timestamp created) {
setColumn(this.COLUMN_CREATED, created);
}
public int getHomePageID() {
return getIntColumnValue(getColumnNameHomePageID());
}
public ICPage getHomePage() {
return (ICPage)getColumnValue(getColumnNameHomePageID());
}
public void setHomePageID(int pageID) {
setColumn(getColumnNameHomePageID(), pageID);
}
public void setHomePageID(Integer pageID) {
setColumn(getColumnNameHomePageID(), pageID);
}
public void setHomePage(ICPage page) {
setColumn(getColumnNameHomePageID(), page);
}
public int getHomeFolderID() {
return getIntColumnValue(COLUMN_HOME_FOLDER_ID);
}
public ICFile getHomeFolder() {
return (ICFile)getColumnValue(COLUMN_HOME_FOLDER_ID);
}
public void setHomeFolderID(int fileID) {
setColumn(COLUMN_HOME_FOLDER_ID, fileID);
}
public void setHomeFolderID(Integer fileID) {
setColumn(COLUMN_HOME_FOLDER_ID, fileID);
}
public void setHomeFolder(ICFile file) {
setHomeFolderID((Integer)file.getPrimaryKey());
}
public String getShortName() {
return getStringColumnValue(COLUMN_SHORT_NAME);
}
public String getAbbrevation() {
return getStringColumnValue(COLUMN_ABBREVATION);
}
public String getHomePageURL() {
return getMetaData(META_DATA_HOME_PAGE);
}
public void setHomePageURL(String homePage) {
setMetaData(META_DATA_HOME_PAGE, homePage );
}
public void setIsPermissionControllingGroup(boolean isControlling){
setColumn(COLUMN_IS_PERMISSION_CONTROLLING_GROUP,isControlling);
}
public boolean isPermissionControllingGroup(){
return getBooleanColumnValue(COLUMN_IS_PERMISSION_CONTROLLING_GROUP,false);
}
/**
* Gets a list of all the groups that this "group" is directly member of.
* @see com.idega.user.data.Group#getListOfAllGroupsContainingThis()
*/
public List getParentGroups() throws EJBException {
return getParentGroups(null, null);
}
/**
* Optimized version of getParentGroups() by Sigtryggur 22.06.2004
* Database access is minimized by passing a Map of cached groupParents and Map of cached groups to the method
*/
public List getParentGroups(Map cachedParents, Map cachedGroups) throws EJBException {
List theReturn = new ArrayList();
try {
Group parent = null;
Collection parents = getCollectionOfParents(cachedParents, cachedGroups);
Iterator parIter = parents.iterator();
while (parIter.hasNext()) {
parent = (Group)parIter.next();
if (parent != null && !theReturn.contains(parent)) {
theReturn.add(parent);
}
}
if (isUser()) {
try {
User user = getUserForGroup();
Group usersPrimaryGroup = null;
String key = String.valueOf(user.getPrimaryGroupID());
if (cachedGroups != null) {
if (cachedGroups.containsKey(key)) {
usersPrimaryGroup = (Group)cachedGroups.get(key);
}
else
{
usersPrimaryGroup = user.getPrimaryGroup();
cachedGroups.put(key, usersPrimaryGroup);
}
}
else {
usersPrimaryGroup = user.getPrimaryGroup();;
}
if (usersPrimaryGroup!=null && !theReturn.contains(usersPrimaryGroup)) {
theReturn.add(usersPrimaryGroup);
}
} catch (FinderException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
catch (Exception e) {
e.printStackTrace();
throw new EJBException(e.getMessage());
}
return theReturn;
}
private Collection getCollectionOfParents() throws FinderException {
return getCollectionOfParents(null, null);
}
private Collection getCollectionOfParents(Map cachedParents, Map cachedGroups) throws FinderException {
Collection col = null;
String key = this.getPrimaryKey().toString();
if (cachedParents!=null) {
if (cachedParents.containsKey(key)) {
col = (Collection)cachedParents.get(key);
}
else
{
col = ejbFindParentGroups(this.getID());
cachedParents.put(key, col);
}
}
else {
col = ejbFindParentGroups(this.getID());
}
Collection returnCol = new ArrayList();
Group parent = null;
Integer parentID = null;
Iterator iter = col.iterator();
while (iter.hasNext()) {
parentID = (Integer)iter.next();
key = parentID.toString();
if (cachedGroups != null) {
if (cachedGroups.containsKey(key)) {
parent = (Group)cachedGroups.get(key);
}
else
{
parent = getGroupHome().findByPrimaryKey(parentID);
cachedGroups.put(key, parent);
}
}
else {
parent = getGroupHome().findByPrimaryKey(parentID);
}
returnCol.add(parent);
}
return returnCol;
}
protected Collection getChildGroupRelationships() throws FinderException {
//null type is included as relation type for backwards compatability.
return this.getGroupRelationHome().findGroupsRelationshipsByRelatedGroup(this.getID(), RELATION_TYPE_GROUP_PARENT, null);
}
/**
* Returns the User instance representing the Group if the Group is of type UserGroupRepresentative
* @throws IDOLookupException
* @throws FinderException
**/
private User getUserForGroup() throws IDOLookupException, FinderException {
UserHome uHome = (UserHome)IDOLookup.getHome(User.class);
return uHome.findUserForUserGroup(this);
}
/**
* Finds all the GroupRelations that point to groups that "this" group is a direct parent for
* @return Collection of GroupRelations
*/
protected Collection getParentalGroupRelationships() throws FinderException {
//null type is included as relation type for backwards compatability.
return this.getGroupRelationHome().findGroupsRelationshipsContaining(this.getID(), RELATION_TYPE_GROUP_PARENT, null);
}
/**
* @deprecated
*/
protected List getListOfAllGroupsContaining(int group_id) throws EJBException {
try {
Group group = this.getGroupHome().findByPrimaryKey(new Integer(group_id));
return group.getParentGroups();
}
catch (Exception e) {
throw new EJBException(e.getMessage());
}
}
public Integer ejbCreateGroup() throws CreateException {
return (Integer)this.ejbCreate();
}
public void ejbPostCreateGroup() throws CreateException {
}
public Collection ejbFindGroupsByName(String name) throws FinderException {
return this.idoFindPKsBySQL("select * from " + this.getEntityName() + " where " + this.getNameColumnName() + " = '" + name + "'");
}
public Collection ejbFindGroupsByNameAndGroupTypes(String name, Collection groupTypes, boolean onlyReturnTypesInCollection) throws FinderException {
//String groupTypeValue = null;
String notString = null;
IDOQuery query = idoQuery();
query.append("select * from " + this.getEntityName() + " where " + this.getNameColumnName() + " = '" + name + "' and "+ this.getGroupTypeColumnName());
if (groupTypes != null && groupTypes.size() == 1) {
notString = onlyReturnTypesInCollection?" ":" !";
query.append(notString + "= '" + groupTypes.iterator().next() + "'");
} else {
notString = onlyReturnTypesInCollection?" ":" not ";
query.append(notString + "in (");
query.appendCommaDelimitedWithinSingleQuotes(groupTypes).append(")");
}
return this.idoFindPKsByQuery(query);
}
public Collection ejbFindGroupsByGroupTypeAndLikeName(String groupType, String partOfGroupName) throws FinderException {
return this.idoFindPKsBySQL("select * from " + this.getEntityName() + " where " + this.getGroupTypeColumnName() + " = '" + groupType + "' and "+ this.getNameColumnName() + " like '" + partOfGroupName + "' order by "+this.getNameColumnName());
}
public Collection ejbFindGroupsByAbbreviation(String abbreviation) throws FinderException {
return this.idoFindPKsBySQL("select * from " + this.getEntityName() + " where " + COLUMN_ABBREVATION + " = '" + abbreviation + "'");
}
public Collection ejbFindGroupsByNameAndDescription(String name, String description) throws FinderException {
Table table = new Table(this);
Column nameCol = new Column(table, getNameColumnName());
Column desc = new Column(table, getGroupDescriptionColumnName());
SelectQuery query = new SelectQuery(table);
query.addColumn(new WildCardColumn(table));
query.addCriteria(new MatchCriteria(nameCol, MatchCriteria.EQUALS, name));
query.addCriteria(new MatchCriteria(desc, MatchCriteria.EQUALS, description));
return this.idoFindPKsByQuery(query);
}
public Integer ejbFindGroupByPrimaryKey(Object primaryKey) throws FinderException {
return (Integer)this.ejbFindByPrimaryKey(primaryKey);
}
// private List getListOfAllGroupsContainingLegacy(int group_id)throws EJBException{
// String tableToSelectFrom = "IC_GROUP_TREE";
// StringBuffer buffer=new StringBuffer();
// buffer.append("select * from ");
// buffer.append(tableToSelectFrom);
// buffer.append(" where ");
// buffer.append("CHILD_IC_GROUP_ID");
// buffer.append("=");
// buffer.append(group_id);
// String SQLString=buffer.toString();
// Connection conn= null;
// Statement Stmt= null;
// Vector vector = new Vector();
// try
// {
// conn = getConnection(getDatasource());
// Stmt = conn.createStatement();
// ResultSet RS = Stmt.executeQuery(SQLString);
// while (RS.next()){
// IDOLegacyEntity tempobj=null;
// try{
// tempobj = (IDOLegacyEntity)Class.forName(this.getClass().getName()).newInstance();
// tempobj.findByPrimaryKey(RS.getInt(this.getIDColumnName()));
// }
// catch(Exception ex){
// System.err.println("There was an error in " + this.getClass().getName() +".getAllGroupsContainingThis(): "+ex.getMessage());
// }
// vector.addElement(tempobj);
// }
//
// RS.close();
//
// }
// catch(Exception e){
// throw new EJBException(e.getMessage());
// }
// finally{
// if(Stmt != null){
// try{
// Stmt.close();
// }
// catch(SQLException e){}
// }
// if (conn != null){
// freeConnection(getDatasource(),conn);
// }
// }
//
// if (vector != null){
// vector.trimToSize();
// return vector;
// //return (Group[]) vector.toArray((Object[])java.lang.reflect.Array.newInstance(this.getClass(),0));
// }
// else{
// return null;
// }
// }
//
//??
// public Group[] getAllGroupsContained()throws SQLException{
//
// List vector = this.getListOfAllGroupsContained();
//
// if(vector != null){
//
// return (Group[]) vector.toArray((Object[])java.lang.reflect.Array.newInstance(this.getClass(),0));
//
// }else{
//
// return new Group[0];
//
// }
//
// }
/**
* @return A list of groups (not users) under this group
*/
public List getChildGroups() throws EJBException {
List theReturn = new ArrayList();
try {
theReturn.addAll(ListUtil.convertCollectionToList(getGroupHome().findGroupsContained(this, getUserGroupTypeList(), false)));
return theReturn;
}
catch (FinderException e) {
e.printStackTrace();
return theReturn;
}
}
/**
* Gets the children of the containingGroup
* @param containingGroup
* @param groupTypes
* @param returnTypes
* @return
* @throws FinderException
*/
public Collection ejbFindGroupsContainedTemp(Group containingGroup, Collection groupTypes, boolean returnTypes) throws FinderException {
Table groupTable = new Table(ENTITY_NAME, "g");
Table groupRelTable = new Table(GroupRelationBMPBean.TABLE_NAME, "gr");
SelectQuery query = new SelectQuery(groupTable);
query.addColumn(new WildCardColumn(groupTable));
query.addJoin(groupTable, COLUMN_GROUP_ID, groupRelTable,GroupRelationBMPBean.RELATED_GROUP_ID_COLUMN);
if (groupTypes != null && !groupTypes.isEmpty()) {
if (groupTypes.size() == 1){
query.addCriteria(new MatchCriteria(groupTable, COLUMN_GROUP_TYPE, MatchCriteria.NOTEQUALS, groupTypes.iterator().next().toString()));
} else {
query.addCriteria(new InCriteria(groupTable, COLUMN_GROUP_TYPE, groupTypes, !returnTypes));
}
}
query.addCriteria(new MatchCriteria(groupRelTable, GroupRelationBMPBean.GROUP_ID_COLUMN, MatchCriteria.EQUALS, containingGroup.getPrimaryKey()));
query.addCriteria(new MatchCriteria(groupRelTable, GroupRelationBMPBean.RELATIONSHIP_TYPE_COLUMN, MatchCriteria.EQUALS, RELATION_TYPE_GROUP_PARENT));
String[] statuses = {GroupRelationBMPBean.STATUS_ACTIVE, GroupRelationBMPBean.STATUS_PASSIVE_PENDING};
query.addCriteria(new InCriteria(groupRelTable, GroupRelationBMPBean.STATUS_COLUMN, statuses));
query.addOrder(groupTable, COLUMN_NAME, true);
return idoFindPKsByQueryUsingLoadBalance(query, PREFETCH_SIZE);
//return idoFindPKsBySQL(query.toString());
}
public Collection ejbFindGroupsContained(Group containingGroup, Collection groupTypes, boolean returnTypes) throws FinderException {
String findGroupRelationsSQL = getGroupRelationHome().getFindRelatedGroupIdsInGroupRelationshipsContainingSQL(((Integer)containingGroup.getPrimaryKey()).intValue(), RELATION_TYPE_GROUP_PARENT);
SelectQuery query = idoSelectQuery();
Criteria theCriteria = null;
if (groupTypes != null && !groupTypes.isEmpty()) {
theCriteria = new InCriteria(idoQueryTable(),COLUMN_GROUP_TYPE,groupTypes,!returnTypes);
}
Criteria inCr = new InCriteria(idoQueryTable(),COLUMN_GROUP_ID,findGroupRelationsSQL);
if(theCriteria==null){
theCriteria = inCr;
} else {
theCriteria = new AND(theCriteria,inCr);
}
query.addCriteria(theCriteria);
query.addOrder(idoQueryTable(),this.COLUMN_NAME,true);
return idoFindPKsByQueryUsingLoadBalance(query, PREFETCH_SIZE);
//return idoFindPKsBySQL(query.toString());
}
/**
* Gets the children of the containingGroup
* @param containingGroup
* @param groupTypeProxy group type to return
* @param returnTypes
* @return
* @throws FinderException
*/
public Collection ejbFindGroupsContained(Group containingGroup, Group groupTypeProxy) throws FinderException {
String findGroupRelationsSQL = getGroupRelationHome().getFindRelatedGroupIdsInGroupRelationshipsContainingSQL(((Integer)containingGroup.getPrimaryKey()).intValue(), RELATION_TYPE_GROUP_PARENT);
SelectQuery query = idoSelectQuery();
query.addCriteria( new MatchCriteria(idoQueryTable(),COLUMN_GROUP_TYPE,MatchCriteria.LIKE,groupTypeProxy.getGroupTypeKey()));
query.addCriteria(new InCriteria(idoQueryTable(),COLUMN_GROUP_ID,findGroupRelationsSQL));
query.addOrder(idoQueryTable(),COLUMN_NAME,true);
return idoFindPKsByQueryIgnoringCacheAndUsingLoadBalance(query, (GenericEntity)groupTypeProxy, groupTypeProxy.getSelectQueryConstraints(), PREFETCH_SIZE);
//return idoFindPKsBySQL(query.toString());
}
public int ejbHomeGetNumberOfGroupsContained(Group containingGroup, Collection groupTypes, boolean returnTypes) throws FinderException, IDOException {
String relatedSQL = getGroupRelationHome().getFindRelatedGroupIdsInGroupRelationshipsContainingSQL(((Integer)containingGroup.getPrimaryKey()).intValue(), RELATION_TYPE_GROUP_PARENT);
if (groupTypes != null && !groupTypes.isEmpty()) {
IDOQuery query = idoQuery();
query.appendSelectCountIDFrom(this.getEntityName(), getIDColumnName());
query.appendWhere(this.COLUMN_GROUP_TYPE);
IDOQuery subQuery = idoQuery();
subQuery.appendCommaDelimitedWithinSingleQuotes(groupTypes);
if (returnTypes) {
query.appendIn(subQuery);
}
else {
query.appendNotIn(subQuery);
}
query.appendAnd();
query.append(this.COLUMN_GROUP_ID);
query.appendIn(relatedSQL);
return this.idoGetNumberOfRecords(query.toString());
}
else {
System.err.println("ejbHomeGetNumberOfGroupsContained :NO GROUP TYPES SUPPLIED!");
return 0;
}
}
public int ejbHomeGetNumberOfVisibleGroupsContained(Group containingGroup) throws FinderException, IDOException {
String relatedSQL = getGroupRelationHome().getFindRelatedGroupIdsInGroupRelationshipsContainingSQL(((Integer)containingGroup.getPrimaryKey()).intValue(), RELATION_TYPE_GROUP_PARENT);
String visibleGroupTypes = getGroupTypeHome().getVisibleGroupTypesSQLString();
IDOQuery query = idoQuery();
query.appendSelectCountIDFrom(this.getEntityName(), getIDColumnName());
query.appendWhere(this.COLUMN_GROUP_TYPE);
query.appendIn(visibleGroupTypes);
query.appendAnd();
query.append(this.COLUMN_GROUP_ID);
query.appendIn(relatedSQL);
return this.idoGetNumberOfRecords(query.toString());
}
public Collection ejbFindTopNodeGroupsContained(ICDomain containingDomain, Collection groupTypes, boolean returnTypes) throws FinderException {
String relationsSQL = this.getGroupDomainRelationHome().getFindRelatedGroupIdsInGroupDomainRelationshipsContainingSQL(((Integer)containingDomain.getPrimaryKey()).intValue(), getGroupDomainRelationTypeHome().getTopNodeRelationTypeString());
if (groupTypes != null && !groupTypes.isEmpty()) {
IDOQuery query = idoQuery();
query.appendSelectAllFrom(this.getEntityName());
query.appendWhere(this.COLUMN_GROUP_TYPE);
IDOQuery subQuery = idoQuery();
subQuery.appendCommaDelimitedWithinSingleQuotes(groupTypes);
if (returnTypes) {
query.appendIn(subQuery);
}
else {
query.appendNotIn(subQuery);
}
query.appendAnd();
query.append(this.COLUMN_GROUP_ID);
query.appendIn(relationsSQL);
query.appendOrderBy(this.COLUMN_NAME);
// System.out.println("[GroupBMPBean](ejbFindGroupsContained): "+query.toString());
return this.idoFindPKsBySQL(query.toString());
}
else {
return ListUtil.getEmptyList();
}
}
public int ejbHomeGetNumberOfTopNodeGroupsContained(ICDomain containingDomain, Collection groupTypes, boolean returnTypes) throws FinderException, IDOException {
String relationsSQL = getGroupDomainRelationHome().getFindRelatedGroupIdsInGroupDomainRelationshipsContainingSQL(((Integer)containingDomain.getPrimaryKey()).intValue(), getGroupDomainRelationTypeHome().getTopNodeRelationTypeString());
if (groupTypes != null && !groupTypes.isEmpty()) {
IDOQuery query = idoQuery();
query.appendSelectCountIDFrom(this.getEntityName(), getIDColumnName());
query.appendWhere(this.COLUMN_GROUP_TYPE);
IDOQuery subQuery = idoQuery();
subQuery.appendCommaDelimitedWithinSingleQuotes(groupTypes);
if (returnTypes) {
query.appendIn(subQuery);
}
else {
query.appendNotIn(subQuery);
}
query.appendAnd();
query.append(this.COLUMN_GROUP_ID);
query.appendIn(relationsSQL);
// System.out.println("[GroupBMPBean](ejbHomeGetNumberOfGroupsContained): "+query.toString());
return this.idoGetNumberOfRecords(query.toString());
}
else {
System.err.println("ejbHomeGetNumberOfTopNodeGroupsContained :NO GROUP TYPES SUPPLIED!");
return 0;
}
}
public int ejbHomeGetNumberOfTopNodeVisibleGroupsContained(ICDomain containingDomain) throws FinderException, IDOException {
String relatedSQL = getGroupDomainRelationHome().getFindRelatedGroupIdsInGroupDomainRelationshipsContainingSQL(((Integer)containingDomain.getPrimaryKey()).intValue(), getGroupDomainRelationTypeHome().getTopNodeRelationTypeString());
String visibleGroupTypes = getGroupTypeHome().getVisibleGroupTypesSQLString();
IDOQuery query = idoQuery();
query.appendSelectCountIDFrom(this.getEntityName(), getIDColumnName());
query.appendWhere(this.COLUMN_GROUP_TYPE);
query.appendIn(visibleGroupTypes);
query.appendAnd();
query.append(this.COLUMN_GROUP_ID);
query.appendIn(relatedSQL);
return this.idoGetNumberOfRecords(query.toString());
}
public Collection ejbFindTopNodeVisibleGroupsContained(ICDomain containingDomain) throws FinderException {
String relationsSQL = this.getGroupDomainRelationHome().getFindRelatedGroupIdsInGroupDomainRelationshipsContainingSQL(((Integer)containingDomain.getPrimaryKey()).intValue(), getGroupDomainRelationTypeHome().getTopNodeRelationTypeString());
String visibleGroupTypes = getGroupTypeHome().getVisibleGroupTypesSQLString();
IDOQuery query = idoQuery();
query.appendSelectAllFrom(this.getEntityName());
query.appendWhere(this.COLUMN_GROUP_TYPE);
query.appendIn(visibleGroupTypes);
query.appendAnd();
query.append(this.COLUMN_GROUP_ID);
query.appendIn(relationsSQL);
query.appendOrderBy(this.COLUMN_NAME);
return this.idoFindPKsBySQL(query.toString());
}
/**
* @todo change name to getGroupsContained();
*/
// private List getListOfAllGroupsContainedLegacy()throws EJBException{
// String tableToSelectFrom = "IC_GROUP_TREE";
// StringBuffer buffer=new StringBuffer();
// buffer.append("select CHILD_IC_GROUP_ID from ");
// buffer.append(tableToSelectFrom);
// buffer.append(" where ");
// buffer.append("IC_GROUP_ID");
// buffer.append("=");
// buffer.append(this.getID());
// String SQLString=buffer.toString();
// Connection conn= null;
// Statement Stmt= null;
// Vector vector = new Vector();
// try
// {
// conn = getConnection(getDatasource());
// Stmt = conn.createStatement();
// ResultSet RS = Stmt.executeQuery(SQLString);
// while (RS.next()){
//
// IDOLegacyEntity tempobj=null;
// try{
// tempobj = (IDOLegacyEntity)Class.forName(this.getClass().getName()).newInstance();
// tempobj.findByPrimaryKey(RS.getInt("CHILD_IC_GROUP_ID"));
// }
// catch(Exception ex){
// System.err.println("There was an error in " + this.getClass().getName() +".getAllGroupsContainingThis(): "+ex.getMessage());
//
// }
//
// vector.addElement(tempobj);
//
// }
// RS.close();
//
// }
// catch(Exception e){
// throw new EJBException(e.getMessage());
// }
// finally{
// if(Stmt != null){
// try{
// Stmt.close();
// }
// catch(SQLException sqle){}
// }
// if (conn != null){
// freeConnection(getDatasource(),conn);
// }
// }
//
// if (vector != null){
// vector.trimToSize();
// return vector;
// //return (Group[]) vector.toArray((Object[])java.lang.reflect.Array.newInstance(this.getClass(),0));
// }
// else{
// return null;
// }
//
//
// //return (Group[])this.findReverseRelated(this);
//
// }
/**
* @todo change implementation: let the database handle the filtering
*/
public List getChildGroups(String[] groupTypes, boolean returnSpecifiedGroupTypes) throws EJBException {
List theReturn = new ArrayList();
List types = null;
if (groupTypes != null && groupTypes.length > 0) {
types = ListUtil.convertStringArrayToList(groupTypes);
}
try {
return ListUtil.convertCollectionToList(getGroupHome().findGroupsContained(this, types, returnSpecifiedGroupTypes));
}
catch (FinderException e) {
e.printStackTrace();
return theReturn;
}
}
public List getChildGroupsIDs(String[] groupTypes, boolean returnSpecifiedGroupTypes) throws EJBException {
List theReturn = new ArrayList();
List types = null;
if (groupTypes != null && groupTypes.length > 0) {
types = ListUtil.convertStringArrayToList(groupTypes);
}
try {
return ListUtil.convertCollectionToList(getGroupHome().findGroupsContainedIDs(this, types, returnSpecifiedGroupTypes));
}
catch (FinderException e) {
e.printStackTrace();
return theReturn;
}
}
/**
* Returns collection of Childs that match the type of 'groupTypeProxy' and according to groupTypeProxy.getSelectQueryConstrains().
* The objects in the collection will be of the same class as 'groupTypeProxy' i.e. if groupTypeProxy implements User then it will be collection of User elements
*/
public Collection getChildGroups(Group groupTypeProxy) throws EJBException {
try {
return getGroupHome().findGroupsContained(this, groupTypeProxy);
}
catch (FinderException e) {
e.printStackTrace();
return ListUtil.getEmptyList();
}
}
public Collection getAllGroupsContainingUser(User user) throws EJBException {
return this.getListOfAllGroupsContaining(user.getGroupID());
}
/**
* Adds the group by id groupToAdd under this group
* @see com.idega.user.data.Group#addGroup(Group)
*/
public void addGroup(Group groupToAdd) throws EJBException {
this.addGroup(this.getGroupIDFromGroup(groupToAdd));
}
/**
* Adds the user by id under this group and changes his deleted status to false if needed.
* Also sets his primary group to this group if it is not set
* @see com.idega.user.data.Group#addGroup(User)
*/
public void addGroup(User userToAdd) throws EJBException {
this.addGroup(this.getGroupIDFromGroup(userToAdd));
boolean needsToStore= false;
if(userToAdd.getDeleted()){
needsToStore = true;
userToAdd.setDeleted(false);
}
if(userToAdd.getPrimaryGroupID()<0){
needsToStore = true;
userToAdd.setPrimaryGroup(this);
}
if(needsToStore){
userToAdd.store();
}
}
/**
* Adds the group by id groupToAdd under this group
* @see com.idega.user.data.Group#addGroup(Group)
*/
public void addGroup(Group groupToAdd, Timestamp time) throws EJBException {
this.addGroup(this.getGroupIDFromGroup(groupToAdd), time);
}
/**
* Adds the group by id groupId under this group
* @see com.idega.core.data.GenericGroup#addGroup(int,time)
*/
public void addGroup(int groupId,Timestamp time) throws EJBException {
try {
//GroupRelation rel = this.getGroupRelationHome().create();
//rel.setGroup(this);
//rel.setRelatedGroup(groupId);
//rel.store();
if(time!=null){
addUniqueRelation(groupId, RELATION_TYPE_GROUP_PARENT,time);
}
else{
addUniqueRelation(groupId, RELATION_TYPE_GROUP_PARENT);
}
}
catch (Exception e) {
throw new EJBException(e.getMessage());
}
}
/**
* Adds the group by id groupId under this group
* @see com.idega.core.data.GenericGroup#addGroup(int)
*/
public void addGroup(int groupId) throws EJBException {
addGroup(groupId,null);
}
public void addRelation(Group groupToAdd, String relationType) throws CreateException {
this.addRelation(this.getGroupIDFromGroup(groupToAdd), relationType);
}
public void addRelation(Group groupToAdd, GroupRelationType relationType) throws CreateException {
this.addRelation(this.getGroupIDFromGroup(groupToAdd), relationType);
}
public void addRelation(int relatedGroupId, GroupRelationType relationType) throws CreateException {
this.addRelation(relatedGroupId, relationType.getType());
}
public void addRelation(int relatedGroupId, String relationType) throws CreateException {
//try{
GroupRelation rel = this.getGroupRelationHome().create();
rel.setGroup(this);
rel.setRelatedGroup(relatedGroupId);
rel.setRelationshipType(relationType);
rel.setRelatedGroupType(rel.getRelatedGroup().getGroupType());
rel.store();
//}
//catch(Exception e){
// throw new EJBException(e.getMessage());
//}
}
/**
* Only adds a relation if one does not exist already
* @param relatedGroupId
* @param relationType
* @throws CreateException
* @throws RemoteException
*/
public void addUniqueRelation(int relatedGroupId, String relationType, Timestamp time) throws CreateException {
//try{
if (!hasRelationTo(relatedGroupId, relationType)) {
//System.out.println("hasRelationTo("+relatedGroupId+","+relationType+") IS FALSE");
GroupRelation rel = this.getGroupRelationHome().create();
rel.setGroup(this);
rel.setRelatedGroup(relatedGroupId);
rel.setRelationshipType(relationType);
if(time == null){
time = IWTimestamp.getTimestampRightNow();
}
rel.setInitiationDate(time);
rel.setRelatedGroupType(rel.getRelatedGroup().getGroupType());
rel.store();
}
//}
//catch(Exception e){
// throw new EJBException(e.getMessage());
//}
}
public void addUniqueRelation(int relatedGroupId, String relationType) throws CreateException {
addUniqueRelation(relatedGroupId, relationType, null);
}
/**
* Only adds a relation if one does not exist already
* @param relatedGroup
* @param relationType
* @throws CreateException
* @throws RemoteException
*/
public void addUniqueRelation(Group relatedGroup, String relationType) throws CreateException {
addUniqueRelation(((Integer) (relatedGroup.getPrimaryKey())).intValue(), relationType);
}
/**
* @deprecated use removeRelation(int relatedGroupId, String relationType, User performer)
*/
public void removeRelation(Group relatedGroup, String relationType) throws RemoveException {
int groupId = this.getGroupIDFromGroup(relatedGroup);
this.removeRelation(groupId, relationType);
}
/**
* @deprecated use removeRelation(int relatedGroupId, String relationType, User performer)
*/
public void removeRelation(int relatedGroupId, String relationType) throws RemoveException {
removeRelation(relatedGroupId, relationType,null);
}
/**
* @deprecated use removeRelation(int relatedGroupId, String relationType, User performer)
*/
public void removeRelation(Group relatedGroup, String relationType, User performer) throws RemoveException {
int groupId = this.getGroupIDFromGroup(relatedGroup);
this.removeRelation(groupId, relationType, performer);
}
public void removeRelation(int relatedGroupId, String relationType, User performer) throws RemoveException {
GroupRelation rel = null;
try {
//Group group = this.getGroupHome().findByPrimaryKey(relatedGroupId);
Collection rels;
rels = this.getGroupRelationHome().findGroupsRelationshipsContaining(this.getID(), relatedGroupId, relationType);
Iterator iter = rels.iterator();
while (iter.hasNext()) {
rel = (GroupRelation)iter.next();
if (performer == null) {
rel.remove();
} else {
rel.removeBy(performer);
}
}
}
catch (FinderException e) {
throw new RemoveException(e.getMessage());
}
}
/**
* Returns a collection of Group objects that are related by the relation type relationType with this Group
*/
public Collection getRelatedBy(GroupRelationType relationType) throws FinderException {
return getRelatedBy(relationType.getType());
}
/**
* Returns a collection of Group objects that are related by the relation type relationType with this Group
*/
public Collection getRelatedBy(String relationType) throws FinderException {
GroupRelation rel = null;
Collection theReturn = new ArrayList();
Collection rels = null;
rels = this.getGroupRelationHome().findGroupsRelationshipsContaining(this.getID(), relationType);
Iterator iter = rels.iterator();
while (iter.hasNext()) {
rel = (GroupRelation)iter.next();
Group g = rel.getRelatedGroup();
theReturn.add(g);
}
return theReturn;
}
/**
* Returns a collection of Group objects that are reverse related by the
* relation type relationType with this Group
*/
public Collection getReverseRelatedBy(String relationType) throws FinderException {
GroupRelation rel = null;
Collection theReturn = new ArrayList();
Collection rels = null;
rels = this.getGroupRelationHome().findGroupsRelationshipsByRelatedGroup(this.getID(), relationType);
Iterator iter = rels.iterator();
while (iter.hasNext()) {
rel = (GroupRelation)iter.next();
Group g = rel.getGroup();
theReturn.add(g);
}
return theReturn;
}
// private void addGroupLegacy(int groupId)throws EJBException{
// Connection conn= null;
// Statement Stmt= null;
// try{
// conn = getConnection(getDatasource());
// Stmt = conn.createStatement();
// String sql = "insert into IC_GROUP_TREE ("+getIDColumnName()+", CHILD_IC_GROUP_ID) values("+getID()+","+groupId+")";
// //System.err.println(sql);
// int i = Stmt.executeUpdate(sql);
// //System.err.println(sql);
// }catch (Exception ex) {
// ex.printStackTrace(System.out);
// }finally{
// if(Stmt != null){
// try{
// Stmt.close();
// }
// catch(SQLException sqle){}
// }
// if (conn != null){
// freeConnection(getDatasource(),conn);
// }
// }
// }
// private void removeGroupLegacy(int groupId, boolean AllEntries)throws EJBException{
// Connection conn= null;
// Statement Stmt= null;
// try{
// conn = getConnection(getDatasource());
// Stmt = conn.createStatement();
// String qry;
// if(AllEntries)//removing all in middle table
// qry = "delete from IC_GROUP_TREE where "+this.getIDColumnName()+"='"+this.getID()+"' OR CHILD_IC_GROUP_ID ='"+this.getID()+"'";
// else// just removing this particular one
// qry = "delete from IC_GROUP_TREE where "+this.getIDColumnName()+"='"+this.getID()+"' AND CHILD_IC_GROUP_ID ='"+groupId+"'";
// int i = Stmt.executeUpdate(qry);
// }catch (Exception ex) {
// ex.printStackTrace(System.out);
// }finally{
// if(Stmt != null){
// try{
// Stmt.close();
// }
// catch(SQLException sqle){}
// }
// if (conn != null){
// freeConnection(getDatasource(),conn);
// }
// }
// }
//
// /**
// * @deprecated moved to UserGroupBusiness
// */
// public static void addUserOld(int groupId, User user){
// //((com.idega.user.data.GroupHome)com.idega.data.IDOLookup.getHomeLegacy(Group.class)).findByPrimaryKeyLegacy(groupId).addGroup(user.getGroupID());
// throw new java.lang.UnsupportedOperationException("Method adduser moved to UserBusiness");
// }
// public void addUser(User user)throws RemoteException{
// this.addGroup(user.getGroupID());
// }
public void removeUser(User user, User currentUser) throws RemoveException{
// former: user.getGroupId() but this method is deprecated therefore: user.getId()
try {
this.removeGroup(user.getID(), currentUser, false);
}
catch (EJBException e) {
throw new RemoveException(e.getMessage());
}
}
public void removeUser(User user, User currentUser, Timestamp time) throws RemoveException{
// former: user.getGroupId() but this method is deprecated therefore: user.getId()
try{
this.removeGroup(user.getID(), currentUser, false, time);
}
catch (EJBException e) {
throw new RemoveException(e.getMessage());
}
}
// public Group findGroup(String groupName) throws SQLException{
//
// List group = EntityFinder.findAllByColumn(com.idega.data.GenericEntity.getStaticInstance(this.getClass().getName()),getNameColumnName(),groupName,getGroupTypeColumnName(),this.getGroupTypeValue());
//
// if(group != null){
//
// return (Group)group.get(0);
//
// }else{
//
// return null;
//
// }
//
// }
/**
* This finder returns a collection of all groups of the grouptype(s) that are defined in the groupTypes parameter
* It also returns the groups that are defined as topnodes in the ic_domain_group_relation table
* It excludes groups that have been deleted and don't have any active relations to parent groups
* If returnSpecifiedGroupTypes is set as false then it excludes the grouptype(s) defined in the groupTypes paremeter
* excluding user representative groups
* @return all groups of certain type(s) that have not been deleted
* @throws FinderException
*/
public Collection ejbFindAllGroups(String[] groupTypes, boolean returnSpecifiedGroupTypes) throws FinderException {
Table groupTable = new Table(this, "g");
Column idCol = new Column(groupTable, getColumnNameGroupID());
Table groupRelSubTable = new Table(GroupRelationBMPBean.TABLE_NAME, "gr");
Column relatedGroupIDSubCol = new Column(groupRelSubTable, GroupRelationBMPBean.RELATED_GROUP_ID_COLUMN);
//Column relationshipTypeSubCol = new Column(groupRelSubTable, GroupRelationBMPBean.RELATIONSHIP_TYPE_COLUMN);
Column groupRelationstatusSubCol = new Column(groupRelSubTable, GroupRelationBMPBean.STATUS_COLUMN);
SelectQuery firstSubQuery = new SelectQuery(groupRelSubTable);
firstSubQuery.addColumn(relatedGroupIDSubCol);
//subQuery.addCriteria(new MatchCriteria(relationshipTypeSubCol, MatchCriteria.EQUALS, RELATION_TYPE_GROUP_PARENT));
firstSubQuery.addCriteria(new InCriteria(groupRelationstatusSubCol, new String[]{GroupRelation.STATUS_ACTIVE, GroupRelation.STATUS_PASSIVE_PENDING}));
Table groupDomainRelSubTable = new Table(GroupDomainRelationBMPBean.TABLE_NAME, "gdr");
Column gdr_RelatedGroupIDSubCol = new Column(groupDomainRelSubTable, GroupDomainRelationBMPBean.RELATED_GROUP_ID_COLUMN);
Column gdr_relationshipTypeSubCol = new Column(groupDomainRelSubTable, GroupDomainRelationBMPBean.RELATIONSHIP_TYPE_COLUMN);
Column gdr_groupRelationstatusSubCol = new Column(groupDomainRelSubTable, GroupDomainRelationBMPBean.STATUS_COLUMN);
SelectQuery secondSubQuery = new SelectQuery(groupDomainRelSubTable);
secondSubQuery.addColumn(gdr_RelatedGroupIDSubCol);
secondSubQuery.addCriteria(new MatchCriteria(gdr_relationshipTypeSubCol, MatchCriteria.EQUALS, GroupDomainRelationTypeBMPBean.RELATION_TYPE_TOP_NODE));
secondSubQuery.addCriteria(new MatchCriteria(gdr_groupRelationstatusSubCol, MatchCriteria.IS, MatchCriteria.NULL));
InCriteria firstInCriteria = new InCriteria(idCol, firstSubQuery);
InCriteria secondInCriteria = new InCriteria(idCol, secondSubQuery);
SelectQuery query = new SelectQuery(groupTable);
query.addColumn(new WildCardColumn(groupTable));
if (groupTypes != null && groupTypes.length != 0) {
Column typeCol = new Column(groupTable, getGroupTypeColumnName());
if (groupTypes.length == 1){
query.addCriteria(new MatchCriteria(typeCol, returnSpecifiedGroupTypes?MatchCriteria.EQUALS:MatchCriteria.NOTEQUALS, groupTypes[0]));
} else {
query.addCriteria(new InCriteria(typeCol, groupTypes, !returnSpecifiedGroupTypes));
}
}
query.addCriteria(new OR(firstInCriteria, secondInCriteria));
query.addOrder(groupTable, getNameColumnName(), true);
return this.idoFindPKsByQuery(query);
}
// public Collection ejbFindAllGroups(String[] groupTypes, boolean returnSepcifiedGroupTypes) throws FinderException {
// if (groupTypes != null && groupTypes.length > 0) {
// String typeList = IDOUtil.getInstance().convertArrayToCommaseparatedString(groupTypes, true);
// return super.idoFindIDsBySQL("select * from " + getEntityName() + " where " + getGroupTypeColumnName() + ((returnSepcifiedGroupTypes) ? " in (" : " not in (") + typeList + ") order by " + getNameColumnName());
// }
// return super.idoFindAllIDsOrderedBySQL(getNameColumnName());
// }
/**
*
* @return all groups excluding user representative groups
* @throws FinderException
*/
public Collection ejbFindAll() throws FinderException {
// String[] types = {this.getGroupTypeValue()};
// return ejbFindAllGroups(types,true);
String theUserType = "ic_user_representative";
SelectQuery query = idoSelectQuery();
query.addCriteria(new MatchCriteria(idoQueryTable(),getGroupTypeColumnName(),MatchCriteria.NOTEQUALS,theUserType,true));
int prefetchSize = 10000;
return super.idoFindPKsByQueryUsingLoadBalance(query,prefetchSize);
}
/**
* @deprecated replaced with ejbFindAllGroups
*/
public static List getAllGroupsOld(String[] groupTypes, boolean returnSepcifiedGroupTypes) throws SQLException {
/*String typeList = "";
if (groupTypes != null && groupTypes.length > 0){
for(int g = 0; g < groupTypes.length; g++){
if(g>0){ typeList += ", "; }
typeList += "'"+groupTypes[g]+"'";
}
Group gr = (Group)com.idega.user.data.GroupBMPBean.getStaticInstance();
return EntityFinder.findAll(gr,"select * from "+gr.getEntityName()+" where "+com.idega.user.data.GroupBMPBean.getGroupTypeColumnName()+((returnSepcifiedGroupTypes)?" in (":" not in (")+typeList+") order by "+com.idega.user.data.GroupBMPBean.getNameColumnName());
}
return EntityFinder.findAllOrdered(com.idega.user.data.GroupBMPBean.getStaticInstance(),com.idega.user.data.GroupBMPBean.getNameColumnName());
*/
return null;
}
protected boolean identicalGroupExistsInDatabase() throws Exception {
// return SimpleQuerier.executeStringQuery("select * from "+this.getEntityName()+" where "+this.getGroupTypeColumnName()+" = '"+this.getGroupType()+"' and "+this.getNameColumnName()+" = '"+this.getName()+"'",this.getDatasource()).length > 0;
return false;
}
public void insert() throws SQLException {
try {
// if(!this.getName().equals("")){
if (identicalGroupExistsInDatabase()) {
throw new SQLException("group with same name and type already in database");
}
// }
super.insert();
}
catch (Exception ex) {
if (ex instanceof SQLException) {
throw (SQLException)ex;
}
else {
System.err.println(ex.getMessage());
ex.printStackTrace();
throw new SQLException(ex.getMessage());
}
}
}
// public boolean equals(IDOLegacyEntity entity){
// if(entity != null){
// if(entity instanceof Group){
// return this.equals((Group)entity);
// } else {
// return super.equals(entity);
// }
// }
// return false;
// }
protected boolean equals(Group group) {
if (group != null) {
try {
if (group.getPrimaryKey().equals(this.getPrimaryKey())) {
return true;
}
}
catch (Exception e) {
return false;
}
return false;
}
return false;
}
private GroupHome getGroupHome() {
return ((GroupHome)this.getEJBLocalHome());
}
private GroupDomainRelationHome getGroupDomainRelationHome() {
try {
return ((GroupDomainRelationHome)IDOLookup.getHome(GroupDomainRelation.class));
}
catch (IDOLookupException e) {
e.printStackTrace();
}
return null;
}
private GroupDomainRelationTypeHome getGroupDomainRelationTypeHome() {
try {
return ((GroupDomainRelationTypeHome)IDOLookup.getHome(GroupDomainRelationType.class));
}
catch (IDOLookupException e) {
e.printStackTrace();
}
return null;
}
public String ejbHomeGetGroupType() {
return this.getGroupTypeValue();
}
public String ejbHomeGetRelationTypeGroupParent() {
return RELATION_TYPE_GROUP_PARENT;
}
public Collection ejbFindGroups(String[] groupIDs) throws FinderException {
Collection toReturn = new ArrayList(0);
String sGroupList = "";
/* if (groupIDs != null && groupIDs.length > 0){
for(int g = 0; g < groupIDs.length; g++){
if(g>0){ sGroupList += ", "; }
sGroupList += groupIDs[g];
}
}*/
sGroupList = IDOUtil.getInstance().convertArrayToCommaseparatedString(groupIDs);
if (!sGroupList.equals("")) {
String sql = "SELECT * FROM " + getTableName() + " WHERE " + getIDColumnName() + " in (" + sGroupList + ")";
toReturn = super.idoFindPKsBySQL(sql);
}
return toReturn;
}
public Collection ejbFindGroupsByType(String type) throws FinderException {
StringBuffer sql = new StringBuffer("select ").append(getIDColumnName()).append(" from ");
sql.append(getEntityName());
sql.append(" where ");
sql.append(COLUMN_GROUP_TYPE);
sql.append(" = '");
sql.append(type);
sql.append("'");
return super.idoFindPKsBySQL(sql.toString());
}
public Collection ejbFindGroupsByMetaData(String key, String value) throws FinderException {
return super.idoFindPKsByMetaData(key, value);
}
public Integer ejbFindSystemUsersGroup() throws FinderException {
return new Integer(this.GROUP_ID_USERS);
}
private GroupTypeHome getGroupTypeHome() {
try {
return ((GroupTypeHome)IDOLookup.getHome(GroupType.class));
}
catch (IDOLookupException e) {
e.printStackTrace();
}
return null;
}
public Collection ejbFindGroupsRelationshipsByRelatedGroup(int groupID,String relationType,String orRelationType)throws FinderException{
String firstRelationTypeClause = GroupRelationBMPBean.getRelationTypeWhereClause(relationType);
String secondRelationTypeClause = GroupRelationBMPBean.getRelationTypeWhereClause(orRelationType);
String sql = "select * from "+GroupRelationBMPBean.TABLE_NAME+" where "+GroupRelationBMPBean.RELATED_GROUP_ID_COLUMN+"="+groupID
+" and ("+firstRelationTypeClause+" OR "+secondRelationTypeClause+") and ( "+GroupRelationBMPBean.STATUS_COLUMN+"='"+GroupRelation.STATUS_ACTIVE+"' OR "+GroupRelationBMPBean.STATUS_COLUMN+"='"+GroupRelation.STATUS_PASSIVE_PENDING+"' ) ";
return this.idoFindPKsBySQL(sql);
}
public Collection ejbFindParentGroups(int groupID)throws FinderException{
String sql = "select " + getIDColumnName() + " from "+GroupRelationBMPBean.TABLE_NAME+" where "+GroupRelationBMPBean.RELATED_GROUP_ID_COLUMN+"="+groupID
+" and ("+GroupRelationBMPBean.RELATIONSHIP_TYPE_COLUMN+"='GROUP_PARENT' OR "+ GroupRelationBMPBean.RELATIONSHIP_TYPE_COLUMN+" is null) and ( "+GroupRelationBMPBean.STATUS_COLUMN+"='"+GroupRelation.STATUS_ACTIVE+"' OR "+GroupRelationBMPBean.STATUS_COLUMN+"='"+GroupRelation.STATUS_PASSIVE_PENDING+"' ) ";
return this.idoFindPKsBySQL(sql);
}
private UserHome getUserHome() {
try {
return (UserHome)IDOLookup.getHome(User.class);
}
catch (IDOLookupException e) {
e.printStackTrace();
}
return null;
}
private List getUserGroupTypeList() {
if (userGroupTypeSingletonList == null) {
userGroupTypeSingletonList = new ArrayList();
userGroupTypeSingletonList.add(getUserHome().getGroupType());
}
return userGroupTypeSingletonList;
}
/**
* Method hasRelationTo.
* @param group
* @return boolean
* @throws RemoteException
*/
public boolean hasRelationTo(Group group) {
return hasRelationTo(((Integer)group.getPrimaryKey()).intValue());
}
/**
* This is bidirectional
*/
public boolean hasRelationTo(int groupId) {
int myId = ((Integer)this.getPrimaryKey()).intValue();
Collection relations = new ArrayList();
try {
relations = this.getGroupRelationHome().findGroupsRelationshipsContainingBiDirectional(myId, groupId);
}
catch (FinderException ex) {
ex.printStackTrace();
}
return !relations.isEmpty();
}
/**
* This is bidirectional
*/
public boolean hasRelationTo(int groupId, String relationType) {
int myId = ((Integer)this.getPrimaryKey()).intValue();
Collection relations = new ArrayList();
try {
relations = this.getGroupRelationHome().findGroupsRelationshipsContainingBiDirectional(myId, groupId, relationType);
}
catch (FinderException ex) {
ex.printStackTrace();
}
return !relations.isEmpty();
}
public Iterator getChildrenIterator() {
Iterator it = null;
Collection children = getChildren();
if (children != null) {
it = children.iterator();
}
return it;
}
public Collection getChildren() {
/**
* @todo: Change implementation this first part may not be needed. (Eiki,gummi)
*
*/
if (this.getID() == this.GROUP_ID_USERS) {
// String[] groupTypes = {"ic_user_representative"};
try {
String[] groupTypes = new String[1];
groupTypes[0] = ((GroupHome)IDOLookup.getHome(User.class)).getGroupType();
return this.getGroupHome().findGroups(groupTypes);
}
catch (Exception e) {
throw new RuntimeException(e.getMessage());
}
}
else {
return getChildGroups(); //only returns groups not users
}
}
public boolean getAllowsChildren() {
return true;
}
public ICTreeNode getChildAtIndex(int childIndex) {
try {
return ((GroupHome)this.getEJBLocalHome()).findByPrimaryKey(new Integer(childIndex));
}
catch (Exception e) {
throw new RuntimeException(e.getMessage());
}
}
public int getChildCount() {
if (this.getID() == this.GROUP_ID_USERS) {
try {
String[] groupTypes = new String[1];
groupTypes[0] = ((GroupHome)IDOLookup.getHome(User.class)).getGroupType();
return this.getGroupHome().findGroups(groupTypes).size();
}
catch (Exception e) {
throw new RuntimeException(e.getMessage());
}
}
else {
try {
// Collection types = this.getGroupTypeHome().findVisibleGroupTypes();//TODO optimize or cache
return this.getGroupHome().getNumberOfVisibleGroupsContained(this);
}
catch (FinderException e) {
throw new EJBException(e);
}
catch (IDOException idoex) {
throw new EJBException(idoex);
}
}
}
public int getIndex(ICTreeNode node) {
return node.getNodeID();
}
/**
* @todo reimplement
*/
public ICTreeNode getParentNode() {
ICTreeNode parent = null;
try {
parent = (ICTreeNode)this.getParentGroups().iterator().next();
}
catch (Exception e) {
}
return parent;
}
public boolean isLeaf() {
/**
* @todo reimplement
*/
return getChildCount() > 0;
}
public String getNodeName() {
return this.getName();
}
public String getNodeName(Locale locale) {
return this.getNodeName();
}
public String getNodeName(Locale locale, IWApplicationContext iwac){
return getNodeName(locale);
}
public int getNodeID() {
return ((Integer)this.getPrimaryKey()).intValue();
}
public int getSiblingCount() {
ICTreeNode parent = getParentNode();
if (parent != null) {
return parent.getChildCount();
}
else {
return 0;
}
}
/**
* @see com.idega.core.ICTreeNode#getNodeType()
*/
public int getNodeType(){
return -1;
}
public void store() {
super.store();
}
/**
* Gets if the group is of type "UserGroupRepresentative"
**/
public boolean isUser() {
return UserBMPBean.USER_GROUP_TYPE.equals(this.getGroupType());
}
public void addAddress(Address address) throws IDOAddRelationshipException {
this.idoAddTo(address);
}
public Collection getAddresses(AddressType addressType) throws IDOLookupException, IDOCompositePrimaryKeyException, IDORelationshipException {
String addressTypePrimaryKeyColumn = addressType.getEntityDefinition().getPrimaryKeyDefinition().getField().getSQLFieldName();
IDOEntityDefinition addressDefinition = IDOLookup.getEntityDefinitionForClass(Address.class);
String addressTableName = addressDefinition.getSQLTableName();
String addressPrimaryKeyColumn = addressDefinition.getPrimaryKeyDefinition().getField().getSQLFieldName();
String groupAddressMiddleTableName = addressDefinition.getMiddleTableNameForRelation(getEntityName());
IDOQuery query = idoQuery();
query.appendSelect().append("a.").append(addressPrimaryKeyColumn).appendFrom().append(addressTableName).append(" a, ");
query.append(groupAddressMiddleTableName).append(" iua ").appendWhere();
query.append("a.").append(addressPrimaryKeyColumn).appendEqualSign();
query.append("iua.").append(addressPrimaryKeyColumn);
query.appendAnd().append("a.");
query.append(addressTypePrimaryKeyColumn).appendEqualSign();
query.append(addressType.getPrimaryKey());
query.appendAnd().append("iua.");
query.append(COLUMN_GROUP_ID).appendEqualSign().append(getPrimaryKey());
return idoGetRelatedEntitiesBySQL(Address.class, query.toString());
}
public Collection getPhones() {
try {
return super.idoGetRelatedEntities(Phone.class);
}
catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("Error in getPhones() : " + e.getMessage());
}
}
public Collection getPhones(String phoneTypeID) {
try {
return super.idoGetRelatedEntities(Phone.class, PhoneBMPBean.getColumnNamePhoneTypeId(), phoneTypeID);
}
catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("Error in getPhones() : " + e.getMessage());
}
}
public Collection getEmails() {
try {
return super.idoGetRelatedEntities(Email.class);
}
catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("Error in getEmails() : " + e.getMessage());
}
}
public void addEmail(Email email) throws IDOAddRelationshipException {
this.idoAddTo(email);
}
public void addPhone(Phone phone) throws IDOAddRelationshipException {
this.idoAddTo(phone);
}
public void removeGroup(Group entityToRemoveFrom, User currentUser) throws EJBException {
int groupId = this.getGroupIDFromGroup(entityToRemoveFrom);
if ((groupId == -1) || (groupId == 0)) {
this.removeGroup(groupId, currentUser, true);
}
else {
this.removeGroup(groupId, currentUser, false);
}
}
protected int getGroupIDFromGroup(Group group) {
Integer groupID = ((Integer)group.getPrimaryKey());
if (groupID != null) {
return groupID.intValue();
}
else {
return -1;
}
}
public void removeGroup(User currentUser) throws EJBException {
this.removeGroup(-1, currentUser, true);
}
public void removeGroup(int relatedGroupId, User currentUser, boolean AllEntries, Timestamp time) throws EJBException {
try {
Collection rels = null;
if (AllEntries) {
rels = this.getGroupRelationHome().findGroupsRelationshipsUnder(this);
}
else {
rels = this.getGroupRelationHome().findGroupsRelationshipsContaining(this.getID(), relatedGroupId);
}
Iterator iter = rels.iterator();
while (iter.hasNext()) {
GroupRelation item = (GroupRelation)iter.next();
item.removeBy(currentUser,time);
}
}
catch (Exception e) {
throw new EJBException(e.getMessage());
}
}
public void removeGroup(int relatedGroupId, User currentUser, boolean AllEntries) throws EJBException {
removeGroup(relatedGroupId,currentUser,AllEntries,IWTimestamp.getTimestampRightNow());
}
protected GroupRelationHome getGroupRelationHome() {
try {
return ((GroupRelationHome)IDOLookup.getHome(GroupRelation.class));
}
catch (IDOLookupException e) {
e.printStackTrace();
}
return null;
}
public Object ejbFindByHomePageID(int pageID) throws FinderException {
return idoFindOnePKByQuery(idoQueryGetSelect().appendWhereEquals(getColumnNameHomePageID(),pageID));
}
public Integer ejbFindGroupByUniqueId(String uniqueIdString) throws FinderException {
return (Integer) idoFindOnePKByUniqueId(uniqueIdString);
}
public Integer ejbFindBoardGroupByClubIDAndLeagueID(Integer clubID, Integer leagueID) throws FinderException {
String sql = "select m.metadata_value as ic_group_id from ic_group_relation rel, ic_group div, ic_group_ic_metadata mg, ic_metadata m, ic_group_ic_metadata mg2, ic_metadata m2 "
+"where rel.IC_GROUP_ID = "+clubID
+"and rel.RELATIONSHIP_TYPE='GROUP_PARENT' "
+"and ( rel.GROUP_RELATION_STATUS='ST_ACTIVE' or rel.GROUP_RELATION_STATUS='PASS_PEND' ) "
+"and div.IC_GROUP_ID=rel.related_IC_GROUP_ID "
+"and div.group_type='iwme_club_division' "
+"and div.ic_group_id=mg.ic_group_id "
+"and mg.ic_metadata_id=m.ic_metadata_id "
+"and m.metadata_name='CLUBDIV_BOARD' "
+"and div.ic_group_id=mg2.ic_group_id "
+"and mg2.ic_metadata_id=m2.ic_metadata_id "
+"and m2.metadata_name='CLUBDIV_CONN' "
+"and m2.metadata_value in ('"+leagueID+"')";
return (Integer) this.idoFindOnePKBySQL(sql);
}
public SelectQuery getSelectQueryConstraints(){
return null;
}
} // Class Group