package com.idega.builder.dynamicpagetrigger.data;
import java.rmi.RemoteException;
import java.util.Iterator;
import java.util.List;
import javax.ejb.EJBException;
import com.idega.builder.dynamicpagetrigger.business.DPTTriggerBusiness;
import com.idega.business.IBOLookup;
import com.idega.business.IBOLookupException;
import com.idega.core.builder.data.ICDynamicPageTrigger;
import com.idega.idegaweb.IWUserContext;
import com.idega.presentation.Page;
import com.idega.presentation.PresentationObject;
import com.idega.user.data.Group;
/**
* <p>Title: idegaWeb</p>
* <p>Description: </p>
* <p>Copyright: Copyright (c) 2003</p>
* <p>Company: idega Software</p>
* @author <a href="thomas@idega.is">Thomas Hilbig</a>
* @version 1.0
* Created on Jun 21, 2004
*/
public class DynamicPageTrigger implements ICDynamicPageTrigger {
private int rootPage = -1;
/**
* The variable _currentUserHasRelationToContainingDPTPage is set as null in the clone method
* because it should be set ones each time a DPT page is printed out. It is used to speed up
* accesscontroling so its only necessary to go ones through the users groups for eash page rendering
* to see if one of them matches the group attached to the DPT page tree (or root page).
*/
private Boolean currentUserHasRelationToContainingDPTPage = null;
private Object dptOwnerGroup = null;
public Boolean hasRelationTo(PresentationObject object, List[] permissionGroupLists, IWUserContext iwuc) {
Boolean hasRelationToPage = hasCurrentUserRelationToContainingDPTPage(object); //does not need iwuc because the value is set as null in the clone method in PresentationObject
String templateID = object.getTemplateId();
if(hasRelationToPage==null && templateID!=null) {
//Get ownergroup
Group relatedDPTPageGroup = (Group) getDPTPageRelationGroup(object, iwuc);
//check if user is in ownergroup
if(relatedDPTPageGroup != null) {
boolean isInOwnerGroup = false;
Object pk = relatedDPTPageGroup.getPrimaryKey().toString();
for (int i = 0; i < permissionGroupLists.length; i++) {
List groupIDs = permissionGroupLists[i];
for (Iterator iter = groupIDs.iterator(); iter.hasNext();) {
Object gr = iter.next();
isInOwnerGroup = pk.equals(gr);
if(isInOwnerGroup) {
break;
}
}
if(isInOwnerGroup) {
break;
}
}
hasRelationToPage = new Boolean(isInOwnerGroup);
setCurrentUserHasRelationToContainingDPTPage(object, hasRelationToPage);
}
}
return hasRelationToPage;
}
public Object clone() {
DynamicPageTrigger trigger = null;
try {
trigger = (DynamicPageTrigger)super.clone();
trigger.currentUserHasRelationToContainingDPTPage = null;
trigger.dptOwnerGroup = this.dptOwnerGroup;
trigger.rootPage = this.rootPage;
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return trigger;
}
public void setRootPage(String id) {
if(id != null){
this.rootPage = Integer.parseInt(id);
}else {
this.rootPage = -1;
}
}
public int getRootPage() {
return this.rootPage;
}
/**
*
* @return returns null if it has not been checked and set yet. It is set in the Accesscontrol class.
*/
private Boolean hasCurrentUserRelationToContainingDPTPage(PresentationObject object) {
Page page = object.getParentPage();
if (page != null) {
return hasCurrentUserRelationToContainingDPTPage(page);
}
return Boolean.FALSE;
}
/**
* @return Returns the DPT page relation group
* @see com.idega.presentation.Page#getDPTPageRelationGroup(IWUserContext)
*/
private Object getDPTPageRelationGroup(PresentationObject object, IWUserContext iwuc) {
Page parentPage = object.getParentPage();
if(parentPage!=null) {
return getDPTPageRelationGroup(parentPage, iwuc);
}
return null;
}
private void setCurrentUserHasRelationToContainingDPTPage(PresentationObject object, Boolean value) {
Page page = object.getParentPage();
if (page != null) {
setCurrentUserHasRelationToContainingDPTPage(page, value);
}
}
private Object getDPTPageRelationGroup(Page page, IWUserContext iwuc) {
DynamicPageTrigger pageDynamicPageTrigger = (DynamicPageTrigger) page.getDynamicPageTrigger();
int rootPageId = pageDynamicPageTrigger.getRootPage();
if(pageDynamicPageTrigger.dptOwnerGroup == null && rootPageId != -1) {
try {
Group gr = ((DPTTriggerBusiness)IBOLookup.getServiceInstance(iwuc.getApplicationContext(),DPTTriggerBusiness.class)).getOwnerGroupFromRootPageID(rootPageId);
pageDynamicPageTrigger.dptOwnerGroup = gr;
} catch (IBOLookupException e) {
e.printStackTrace();
} catch (RemoteException e) {
e.printStackTrace();
} catch (EJBException e) {
e.printStackTrace();
}
}
return pageDynamicPageTrigger.dptOwnerGroup;
}
private void setCurrentUserHasRelationToContainingDPTPage(Page page, Boolean value) {
DynamicPageTrigger pageDynamicPageTrigger = (DynamicPageTrigger) page.getDynamicPageTrigger();
pageDynamicPageTrigger.currentUserHasRelationToContainingDPTPage = value;
}
/**
*
* @return returns null if it has not been checked and set yet. It is set in the Accesscontrol class.
*/
private Boolean hasCurrentUserRelationToContainingDPTPage(Page page) {
DynamicPageTrigger pageDynamicPageTrigger = (DynamicPageTrigger) page.getDynamicPageTrigger();
return pageDynamicPageTrigger.currentUserHasRelationToContainingDPTPage;
}
}