package com.idega.user.data;
import java.rmi.RemoteException;
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.event.GroupCreatedEvent;
import com.idega.idegaweb.IWApplicationContext;
import com.idega.util.CoreConstants;
import com.idega.util.IWTimestamp;
import com.idega.util.ListUtil;
import com.idega.util.StringUtil;
import com.idega.util.expression.ELUtil;
/**
* Title: IW Core Description: Copyright: Copyright (c) 2001-2003 idega software
* Company: idega.is
*
* @author <a href="mailto:gummi@idega.is">Gudmundur Agust Saemundsson</a>,
* @version 1.0
*/
public class GroupBMPBean extends com.idega.core.data.GenericGroupBMPBean implements Group, ICTreeNode, MetaDataCapable, UniqueIDCapable {
private static final long serialVersionUID = -5276962419455614341L;
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 COLUMN_GROUP_MODERATOR_ID = "GROUP_MODERATOR_ID";
static final String META_DATA_HOME_PAGE = "homepage";
private static List<String> userGroupTypeSingletonList;
@Override
public final void initializeAttributes() {
addAttribute(getIDColumnName());
addAttribute(getNameColumnName(), "Group name", true, true, "java.lang.String");
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);
//addAttribute(COLUMN_GROUP_MODERATOR_ID,"Moderator Id", true,true, Integer.class);
addManyToOneRelationship(COLUMN_GROUP_MODERATOR_ID, User.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 });
}
@Override
public final String getEntityName() {
return ENTITY_NAME;
}
// public String getNameOfMiddleTable(IDOLegacyEntity entity1,IDOLegacyEntity
// entity2){
// return "ic_group_user";
// }
@Override
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
*/
@Override
public String getGroupTypeValue() {
return getGroupTypeHome().getGeneralGroupTypeString();
}
@Override
public String getGroupTypeKey() {
return getGroupTypeValue();
}
@Override
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 */
@Override
public String getName() {
return (String) getColumnValue(getNameColumnName());
}
@Override
public void setName(String name) {
setColumn(getNameColumnName(), name);
}
@Override
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);
// }
}
@Override
public void setGroupType(String groupType) {
setColumn(getGroupTypeColumnName(), groupType);
}
@Override
public void setGroupType(GroupType groupType) {
setColumn(getGroupTypeColumnName(), groupType);
}
@Override
public void setAliasID(int id) {
setColumn(COLUMN_ALIAS_TO_GROUP, id);
}
@Override
public void setAlias(Group alias) {
setColumn(COLUMN_ALIAS_TO_GROUP, alias);
}
@Override
public int getAliasID() {
return getIntColumnValue(COLUMN_ALIAS_TO_GROUP);
}
@Override
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
*/
@Override
public boolean isAlias() {
return ("alias".equals(getGroupType()) && (getAliasID() > 0));
}
@Override
public void setPermissionControllingGroupID(int id) {
setColumn(COLUMN_PERMISSION_CONTROLLING_GROUP, id);
}
@Override
public void setPermissionControllingGroup(Group controllingGroup) {
setColumn(COLUMN_PERMISSION_CONTROLLING_GROUP, controllingGroup);
}
@Override
public int getPermissionControllingGroupID() {
return getIntColumnValue(COLUMN_PERMISSION_CONTROLLING_GROUP);
}
@Override
public Group getPermissionControllingGroup() {
return (Group) getColumnValue(COLUMN_PERMISSION_CONTROLLING_GROUP);
}
@Override
public void setShortName(String shortName) {
setColumn(COLUMN_SHORT_NAME, shortName);
}
@Override
public void setAbbrevation(String abbr) {
setColumn(COLUMN_ABBREVATION, abbr);
}
@Override
public String getDescription() {
return (String) getColumnValue(getGroupDescriptionColumnName());
}
@Override
public void setDescription(String description) {
setColumn(getGroupDescriptionColumnName(), description);
}
@Override
public String getExtraInfo() {
return (String) getColumnValue(getExtraInfoColumnName());
}
@Override
public void setExtraInfo(String extraInfo) {
setColumn(getExtraInfoColumnName(), extraInfo);
}
@Override
public Timestamp getCreated() {
return ((Timestamp) getColumnValue(COLUMN_CREATED));
}
@Override
public void setCreated(Timestamp created) {
setColumn(GroupBMPBean.COLUMN_CREATED, created);
}
@Override
public int getHomePageID() {
return getIntColumnValue(getColumnNameHomePageID());
}
@Override
public ICPage getHomePage() {
return (ICPage) getColumnValue(getColumnNameHomePageID());
}
@Override
public void setHomePageID(int pageID) {
setColumn(getColumnNameHomePageID(), pageID);
}
@Override
public void setHomePageID(Integer pageID) {
setColumn(getColumnNameHomePageID(), pageID);
}
@Override
public void setHomePage(ICPage page) {
setColumn(getColumnNameHomePageID(), page);
}
@Override
public int getHomeFolderID() {
return getIntColumnValue(COLUMN_HOME_FOLDER_ID);
}
@Override
public ICFile getHomeFolder() {
return (ICFile) getColumnValue(COLUMN_HOME_FOLDER_ID);
}
@Override
public void setHomeFolderID(int fileID) {
setColumn(COLUMN_HOME_FOLDER_ID, fileID);
}
@Override
public void setHomeFolderID(Integer fileID) {
setColumn(COLUMN_HOME_FOLDER_ID, fileID);
}
@Override
public void setHomeFolder(ICFile file) {
setHomeFolderID((Integer) file.getPrimaryKey());
}
@Override
public String getShortName() {
return getStringColumnValue(COLUMN_SHORT_NAME);
}
@Override
public String getAbbrevation() {
return getStringColumnValue(COLUMN_ABBREVATION);
}
@Override
public String getHomePageURL() {
return getMetaData(META_DATA_HOME_PAGE);
}
@Override
public void setHomePageURL(String homePage) {
setMetaData(META_DATA_HOME_PAGE, homePage);
}
@Override
public void setIsPermissionControllingGroup(boolean isControlling) {
setColumn(COLUMN_IS_PERMISSION_CONTROLLING_GROUP, isControlling);
}
@Override
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()
*/
@Override
public List<Group> 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
*/
@Override
public List<Group> getParentGroups(Map<String, Collection<Integer>> cachedParents, Map<String, Group> cachedGroups) throws EJBException {
List<Group> theReturn = new ArrayList<Group>();
try {
Group parent = null;
Collection<Group> parents = getCollectionOfParents(cachedParents, cachedGroups);
for (Iterator<Group> parIter = parents.iterator(); parIter.hasNext();) {
parent = 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 = 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) {
e1.printStackTrace();
}
}
}
catch (Exception e) {
e.printStackTrace();
throw new EJBException(e.getMessage());
}
return theReturn;
}
private Collection<Group> getCollectionOfParents(Map<String, Collection<Integer>> cachedParents, Map<String, Group> cachedGroups) throws FinderException {
Collection<Integer> col = null;
String key = this.getPrimaryKey().toString();
if (cachedParents != null) {
if (cachedParents.containsKey(key)) {
col = cachedParents.get(key);
}
else {
col = ejbFindParentGroups(this.getID());
cachedParents.put(key, col);
}
}
else {
col = ejbFindParentGroups(this.getID());
}
Collection<Group> returnCol = new ArrayList<Group>();
Group parent = null;
Integer parentID = null;
for (Iterator<Integer> iter = col.iterator(); iter.hasNext();) {
parentID = iter.next();
key = parentID.toString();
if (cachedGroups != null) {
if (cachedGroups.containsKey(key)) {
parent = 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<GroupRelation> 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
*/
@Deprecated
@Override
protected List<Group> 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 " + GroupBMPBean.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 " + GroupBMPBean.getNameColumnName() + " = '" + name + "' and " + GroupBMPBean.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 " + GroupBMPBean.getGroupTypeColumnName() + " = '" + groupType + "' and " + GroupBMPBean.getNameColumnName() + " like '" + partOfGroupName + "' order by " + GroupBMPBean.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);
}
/**
* @return A list of groups (not users) under this group
*/
@Override
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);
}
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(), GroupBMPBean.COLUMN_NAME, true);
return idoFindPKsByQueryUsingLoadBalance(query, PREFETCH_SIZE);
}
/**
* 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);
}
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(GroupBMPBean.COLUMN_GROUP_TYPE);
IDOQuery subQuery = idoQuery();
subQuery.appendCommaDelimitedWithinSingleQuotes(groupTypes);
if (returnTypes) {
query.appendIn(subQuery);
}
else {
query.appendNotIn(subQuery);
}
query.appendAnd();
query.append(GroupBMPBean.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(GroupBMPBean.COLUMN_GROUP_TYPE);
query.appendIn(visibleGroupTypes);
query.appendAnd();
query.append(GroupBMPBean.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(GroupBMPBean.COLUMN_GROUP_TYPE);
IDOQuery subQuery = idoQuery();
subQuery.appendCommaDelimitedWithinSingleQuotes(groupTypes);
if (returnTypes) {
query.appendIn(subQuery);
}
else {
query.appendNotIn(subQuery);
}
query.appendAnd();
query.append(GroupBMPBean.COLUMN_GROUP_ID);
query.appendIn(relationsSQL);
query.appendOrderBy(GroupBMPBean.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(GroupBMPBean.COLUMN_GROUP_TYPE);
IDOQuery subQuery = idoQuery();
subQuery.appendCommaDelimitedWithinSingleQuotes(groupTypes);
if (returnTypes) {
query.appendIn(subQuery);
}
else {
query.appendNotIn(subQuery);
}
query.appendAnd();
query.append(GroupBMPBean.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(GroupBMPBean.COLUMN_GROUP_TYPE);
query.appendIn(visibleGroupTypes);
query.appendAnd();
query.append(GroupBMPBean.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(GroupBMPBean.COLUMN_GROUP_TYPE);
query.appendIn(visibleGroupTypes);
query.appendAnd();
query.append(GroupBMPBean.COLUMN_GROUP_ID);
query.appendIn(relationsSQL);
query.appendOrderBy(GroupBMPBean.COLUMN_NAME);
return this.idoFindPKsBySQL(query.toString());
}
/**
*
* @todo change implementation: let the database handle the filtering
*
*/
@Override
public List<Group> getChildGroups(String[] groupTypes, boolean returnSpecifiedGroupTypes) throws EJBException {
List<Group> theReturn = new ArrayList<Group>();
List<String> 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;
}
}
@Override
public List<Integer> getChildGroupsIDs(String[] groupTypes, boolean returnSpecifiedGroupTypes) throws EJBException {
List<Integer> theReturn = new ArrayList<Integer>();
List<String> 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
*/
@Override
public Collection<Group> getChildGroups(Group groupTypeProxy) throws EJBException {
try {
return getGroupHome().findGroupsContained(this, groupTypeProxy);
}
catch (FinderException e) {
e.printStackTrace();
return ListUtil.getEmptyList();
}
}
@Override
public Collection<Group> 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)
*/
@Override
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)
*/
@Override
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)
*/
@Override
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)
*/
@Override
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)
*/
@Override
public void addGroup(int groupId) throws EJBException {
addGroup(groupId, null);
}
@Override
public void addRelation(Group groupToAdd, String relationType) throws CreateException {
this.addRelation(this.getGroupIDFromGroup(groupToAdd), relationType);
}
@Override
public void addRelation(Group groupToAdd, GroupRelationType relationType) throws CreateException {
this.addRelation(this.getGroupIDFromGroup(groupToAdd), relationType);
}
@Override
public void addRelation(int relatedGroupId, GroupRelationType relationType) throws CreateException {
this.addRelation(relatedGroupId, relationType.getType());
}
@Override
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
*/
@Override
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());
// }
}
@Override
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
*/
@Override
public void addUniqueRelation(Group relatedGroup, String relationType) throws CreateException {
addUniqueRelation(((Integer) (relatedGroup.getPrimaryKey())).intValue(), relationType);
}
/**
* @deprecated use removeRelation(int relatedGroupId, String relationType,
* User performer)
*/
@Override
@Deprecated
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)
*/
@Override
@Deprecated
public void removeRelation(int relatedGroupId, String relationType) throws RemoveException {
removeRelation(relatedGroupId, relationType, null);
}
/**
* @deprecated use removeRelation(int relatedGroupId, String relationType,
* User performer)
*/
@Override
@Deprecated
public void removeRelation(Group relatedGroup, String relationType, User performer) throws RemoveException {
int groupId = this.getGroupIDFromGroup(relatedGroup);
this.removeRelation(groupId, relationType, performer);
}
@Override
public void removeRelation(int relatedGroupId, String relationType, User performer) throws RemoveException {
GroupRelation rel = null;
try {
// Group group = this.getGroupHome().findByPrimaryKey(relatedGroupId);
Collection<GroupRelation> rels = this.getGroupRelationHome().findGroupsRelationshipsContaining(this.getID(), relatedGroupId, relationType);
Iterator<GroupRelation> iter = rels.iterator();
while (iter.hasNext()) {
rel = 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
*/
@Override
public Collection<Group> 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
*/
@Override
public Collection<Group> getRelatedBy(String relationType) throws FinderException {
GroupRelation rel = null;
Collection<Group> theReturn = new ArrayList<Group>();
Collection<GroupRelation> rels = null;
rels = this.getGroupRelationHome().findGroupsRelationshipsContaining(this.getID(), relationType);
Iterator<GroupRelation> iter = rels.iterator();
while (iter.hasNext()) {
rel = iter.next();
Group g = rel.getRelatedGroup();
theReturn.add(g);
}
return theReturn;
}
@Override
public Collection<Group> getRelated(Collection<String> relationTypes){
GroupRelation rel = null;
Collection<Group> theReturn = new ArrayList<Group>();
Collection<GroupRelation> rels = null;
rels = this.getGroupRelationHome().findGroupsRelationshipsContaining(this.getID(), relationTypes);
Iterator<GroupRelation> iter = rels.iterator();
while (iter.hasNext()) {
rel = 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
*/
@Override
public Collection<Group> getReverseRelatedBy(String relationType) throws FinderException {
GroupRelation rel = null;
Collection<Group> theReturn = new ArrayList<Group>();
Collection<GroupRelation> rels = null;
rels = this.getGroupRelationHome().findGroupsRelationshipsByRelatedGroup(this.getID(), relationType);
Iterator<GroupRelation> iter = rels.iterator();
while (iter.hasNext()) {
rel = iter.next();
Group g = rel.getGroup();
theReturn.add(g);
}
return theReturn;
}
@Override
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());
}
}
@Override
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());
}
}
/**
* 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<Group> 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
*/
@Deprecated
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;
}
@Override
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;
}
@Override
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(GroupBMPBean.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<Integer> 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<String> getUserGroupTypeList() {
if (userGroupTypeSingletonList == null) {
userGroupTypeSingletonList = new ArrayList<String>();
userGroupTypeSingletonList.add(getUserHome().getGroupType());
}
return userGroupTypeSingletonList;
}
/**
* Method hasRelationTo.
*
* @param group
* @return boolean
* @throws RemoteException
*/
@Override
public boolean hasRelationTo(Group group) {
return hasRelationTo(((Integer) group.getPrimaryKey()).intValue());
}
/**
* This is bidirectional
*/
@Override
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
*/
@Override
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();
}
@Override
public Iterator getChildrenIterator() {
Iterator it = null;
Collection children = getChildren();
if (children != null) {
it = children.iterator();
}
return it;
}
@Override
public Collection getChildren() {
/**
* @todo: Change implementation this first part may not be needed.
* (Eiki,gummi)
*
*/
if (this.getID() == GroupBMPBean.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
}
}
@Override
public boolean getAllowsChildren() {
return true;
}
@Override
public ICTreeNode getChildAtIndex(int childIndex) {
try {
return ((GroupHome) this.getEJBLocalHome()).findByPrimaryKey(new Integer(childIndex));
}
catch (Exception e) {
throw new RuntimeException(e.getMessage());
}
}
@Override
public int getChildCount() {
if (this.getID() == GroupBMPBean.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);
}
}
}
@Override
public int getIndex(ICTreeNode node) {
return node.getNodeID();
}
/**
* @todo reimplement
*/
@Override
public ICTreeNode getParentNode() {
ICTreeNode parent = null;
try {
parent = this.getParentGroups().iterator().next();
}
catch (Exception e) {
}
return parent;
}
@Override
public boolean isLeaf() {
/**
* @todo reimplement
*/
return getChildCount() > 0;
}
@Override
public String getNodeName() {
return this.getName();
}
@Override
public String getNodeName(Locale locale) {
return this.getNodeName();
}
@Override
public String getNodeName(Locale locale, IWApplicationContext iwac) {
return getNodeName(locale);
}
@Override
public int getNodeID() {
return ((Integer) this.getPrimaryKey()).intValue();
}
@Override
public int getSiblingCount() {
ICTreeNode parent = getParentNode();
if (parent != null) {
return parent.getChildCount();
}
else {
return 0;
}
}
/**
* @see com.idega.core.ICTreeNode#getNodeType()
*/
@Override
public int getNodeType() {
return -1;
}
@Override
public void store() {
String id = getId();
super.store();
if (StringUtil.isEmpty(id)) {
GroupCreatedEvent groupCreatedEvent = new GroupCreatedEvent(this);
ELUtil.getInstance().publishEvent(groupCreatedEvent);
}
}
/**
* Gets if the group is of type "UserGroupRepresentative"
*/
@Override
public boolean isUser() {
return UserBMPBean.USER_GROUP_TYPE.equals(this.getGroupType());
}
@Override
public void addAddress(Address address) throws IDOAddRelationshipException {
this.idoAddTo(address);
}
@Override
public Collection getAddresses(AddressType addressType) throws IDOLookupException, IDOCompositePrimaryKeyException, IDORelationshipException {
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);
if (addressType != null) {
String addressTypePrimaryKeyColumn = addressType.getEntityDefinition().getPrimaryKeyDefinition().getField().getSQLFieldName();
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());
}
@Override
public Collection getPhones() {
try {
return super.idoGetRelatedEntities(Phone.class);
}
catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("Error in getPhones() : " + e.getMessage());
}
}
@Override
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());
}
}
@Override
public Collection getEmails() {
try {
return super.idoGetRelatedEntities(Email.class);
}
catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("Error in getEmails() : " + e.getMessage());
}
}
@Override
public void addEmail(Email email) throws IDOAddRelationshipException {
this.idoAddTo(email);
}
@Override
public void addPhone(Phone phone) throws IDOAddRelationshipException {
this.idoAddTo(phone);
}
@Override
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 {
// just removing this particular one
this.removeGroup(groupId, currentUser, false);
}
}
protected int getGroupIDFromGroup(Group group) {
if (group == null || group.getPrimaryKey() == null) {
return -1;
}
Integer groupID = null;
String primaryKey = group.getPrimaryKey().toString();
try {
groupID = Integer.valueOf(primaryKey);
} catch (NumberFormatException e) {
getLogger().warning(
"Failed to convert " + primaryKey +
" to " + Integer.class.getSimpleName());
}
if (groupID != null) {
return groupID.intValue();
} else {
return -1;
}
}
@Override
public void removeGroup(User currentUser) throws EJBException {
this.removeGroup(-1, currentUser, true);
}
@Override
public void removeGroup(int relatedGroupId, User currentUser,
boolean allEntries, Timestamp time) throws EJBException {
try {
Collection<GroupRelation> rels = null;
if (allEntries) {
rels = getGroupRelationHome().findGroupsRelationshipsUnder(this);
} else {
rels = getGroupRelationHome().findGroupsRelationshipsContaining(this.getID(), relatedGroupId);
}
for (Iterator<GroupRelation> iter = rels.iterator(); iter.hasNext();) {
iter.next().removeBy(currentUser, time);
}
}
catch (Exception e) {
throw new EJBException(e.getMessage());
}
}
@Override
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);
}
@Override
public SelectQuery getSelectQueryConstraints() {
return null;
}
@Override
public String getId() {
Object primaryKey = getPrimaryKey();
return primaryKey == null ? null : primaryKey.toString();
}
public Collection ejbFindAllByNamePhrase(String phrase, Locale locale) throws FinderException {
IDOQuery query = idoQuery("select ").append(getIDColumnName()).append(" from ").append(getEntityName()).appendWhere().append("lower(");
query.append(getNameColumnName()).append(")").appendLike().appendSingleQuote().append(CoreConstants.PERCENT).append(phrase.toLowerCase(locale));
query.append(CoreConstants.PERCENT).appendSingleQuote().appendGroupBy(getIDColumnName());
return idoFindPKsByQuery(query);
}
@Override
public void setModerator(User moderator){
setColumn(COLUMN_GROUP_MODERATOR_ID, moderator);
}
@Override
public User getModerator(){
return (User) getColumnValue(COLUMN_GROUP_MODERATOR_ID);
}
/**
* Gets groups by criterias mentioned above and orders by them descending
* <br/>Criterias: <br/>
* <ul>
* <li>Groups amount in group.</li>
* <li>Users amount in group.</li>
* </ul>
* @param amount the maximum number of groups that will be returned if less than or equals 0 returns all maches.
* @param types group types that will be returned if empty groups of all types will be returned.
* @return
*/
public Collection<Integer> getMostPopularGroups(Collection<String> types,int amount) throws FinderException{
// something like this:
// SELECT r.IC_GROUP_ID, count(*) num FROM ic_group g, IC_GROUP_RELATION r WHERE (g.IC_GROUP_ID = r.IC_GROUP_ID)
// AND (r.RELATIONSHIP_TYPE = 'GROUP_PARENT') AND (g.GROUP_TYPE IN ('social', 'ic_user_representative')) GROUP BY
// r.IC_GROUP_ID ORDER BY num DESC
IDOQuery query = idoQuery("SELECT r.").append(GroupRelationBMPBean.GROUP_ID_COLUMN).append(", count(*) num FROM ")
.append(ENTITY_NAME).append(" g, ").append(GroupRelationBMPBean.TABLE_NAME).append(" r WHERE (g.")
.append(COLUMN_GROUP_ID).append(" = ").append("r.").append(GroupRelationBMPBean.GROUP_ID_COLUMN)
.append(") AND (r.").append(GroupRelationBMPBean.RELATIONSHIP_TYPE_COLUMN).append(" = 'GROUP_PARENT')");
if(!ListUtil.isEmpty(types)){
StringBuilder typeStrings = new StringBuilder("'");
Iterator <String> iter = types.iterator();
for(;true;){
String type = iter.next();
typeStrings.append(type);
if(iter.hasNext()){
typeStrings.append(CoreConstants.JS_STR_PARAM_SEPARATOR);
}else{
typeStrings.append("', 'ic_user_representative'");
break;
}
}
query.append(" AND (g.").append(COLUMN_GROUP_TYPE).append(" IN (").append(typeStrings).append("))");
}
query.append(" GROUP BY r.").append(GroupRelationBMPBean.GROUP_ID_COLUMN).append(" ORDER BY num DESC");
if(amount > 0){
return this.idoFindPKsByQuery(query, amount);
}
return this.idoFindPKsByQuery(query);
}
/**
* Gets groups and returns them ordered by modification date descendant
* @param amount the maximum number of groups that will be returned if less than or equals 0 returns all maches.
* @param types group types that will be returned if empty groups of all types will be returned.
* @return
*/
public Collection<Integer> getGroups(Collection<String> types,int amount) throws FinderException{
IDOQuery query = idoQuery("SELECT g.").append(COLUMN_GROUP_ID).append(" FROM ").append(GroupBMPBean.ENTITY_NAME).append(" g ");
if(!ListUtil.isEmpty(types)){
StringBuilder typeStrings = new StringBuilder("'");
Iterator <String> iter = types.iterator();
for(;true;){
String type = iter.next();
typeStrings.append(type);
if(iter.hasNext()){
typeStrings.append(CoreConstants.JS_STR_PARAM_SEPARATOR);
}else{
typeStrings.append(CoreConstants.QOUTE_SINGLE_MARK);
break;
}
}
query.append(" WHERE (g.").append(COLUMN_GROUP_TYPE).append(" IN (").append(typeStrings).append("))");
}
query.append(" ORDER BY g.").append(COLUMN_CREATED).append(" DESC");
if(amount > 0){
return this.idoFindPKsByQuery(query, amount);
}
return this.idoFindPKsByQuery(query);
}
/**Searches by:
* name,
* description
* @param request the request by which result will be searched
* @param amount the maximum number of groups that will be returned if less than or equals 0 returns all maches.
* @param types group types that will be returned if empty groups of all types will be returned.
* @return
*/
public Collection<Group> getGroupsBySearchRequest(String request,
Collection<String> types, int amount) throws FinderException {
if(!request.startsWith(CoreConstants.PERCENT)){
request = CoreConstants.PERCENT + request;
}
if(!request.endsWith(CoreConstants.PERCENT)){
request = request + CoreConstants.PERCENT;
}
IDOQuery query = idoQuery("SELECT g.").append(COLUMN_GROUP_ID).append(" FROM ").append(GroupBMPBean.ENTITY_NAME);
query.append(" g WHERE ").append("((g.").append(COLUMN_NAME).append(" LIKE '").append(request).append("') OR (g.").append(COLUMN_DESCRIPTION)
.append(" LIKE '").append(request).append("'))");
if(!ListUtil.isEmpty(types)){
StringBuilder typeStrings = new StringBuilder("'");
Iterator <String> iter = types.iterator();
for(;true;){
String type = iter.next();
typeStrings.append(type);
if(iter.hasNext()){
typeStrings.append(CoreConstants.JS_STR_PARAM_SEPARATOR);
}else{
typeStrings.append(CoreConstants.QOUTE_SINGLE_MARK);
break;
}
}
query.append(" AND (g.").append(COLUMN_GROUP_TYPE).append(" IN (").append(typeStrings).append("))");
}
query.append(" AND (g.").append(COLUMN_GROUP_TYPE).append(" != 'ic_user_representative')");
query.append(" ORDER BY g.").append(COLUMN_CREATED).append(" DESC");
if(amount > 0){
return this.idoFindPKsByQuery(query, amount);
}
return this.idoFindPKsByQuery(query);
}
} // Class Group