package com.idega.builder.dynamicpagetrigger.business;
import java.rmi.RemoteException;
import java.sql.SQLException;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Vector;
import javax.ejb.FinderException;
import com.idega.builder.business.BuilderLogic;
import com.idega.builder.business.IBPageFinder;
import com.idega.builder.business.IBPageHelper;
import com.idega.builder.business.IBXMLPage;
import com.idega.builder.business.PageTreeNode;
import com.idega.builder.business.XMLConstants;
import com.idega.builder.dynamicpagetrigger.data.DPTPermissionGroup;
import com.idega.builder.dynamicpagetrigger.data.DPTPermissionGroupHome;
import com.idega.builder.dynamicpagetrigger.data.PageLink;
import com.idega.builder.dynamicpagetrigger.data.PageLinkHome;
import com.idega.builder.dynamicpagetrigger.data.PageTriggerInfo;
import com.idega.builder.dynamicpagetrigger.util.DPTCrawlable;
import com.idega.builder.dynamicpagetrigger.util.KeyAndValue;
import com.idega.business.IBOLookup;
import com.idega.business.IBOLookupException;
import com.idega.business.IBOServiceBean;
import com.idega.core.accesscontrol.business.AccessControl;
import com.idega.core.builder.data.ICDomain;
import com.idega.core.builder.data.ICPage;
import com.idega.core.component.data.ICObject;
import com.idega.core.component.data.ICObjectInstance;
import com.idega.data.EntityFinder;
import com.idega.data.GenericEntity;
import com.idega.data.IDOAddRelationshipException;
import com.idega.data.IDOLookup;
import com.idega.data.IDOLookupException;
import com.idega.idegaweb.IWApplicationContext;
import com.idega.idegaweb.IWUserContext;
import com.idega.presentation.IWContext;
import com.idega.presentation.Page;
import com.idega.presentation.PresentationObject;
import com.idega.user.data.Group;
import com.idega.util.IWTimestamp;
/**
* Title: IW Project
* Description:
* Copyright: Copyright (c) 2001
* Company: idega
* @author <a href="gummi@idega.is">Gudmundur Agust Saemundsson</a>
* @version 1.0
*/
public class DPTTriggerBusinessBean extends IBOServiceBean implements DPTTriggerBusiness{
public static DPTTriggerBusiness getInstance(IWApplicationContext iwac) throws IBOLookupException{
return (DPTTriggerBusiness)IBOLookup.getServiceInstance(iwac,DPTTriggerBusiness.class);
}
public int createTriggerRule(ICObject source, int defaultTemplateId,int rootPageId, int[] objectInstanceIds, ICPage[] templatesAllowed) throws SQLException{
PageTriggerInfo pti = ((com.idega.builder.dynamicpagetrigger.data.PageTriggerInfoHome)com.idega.data.IDOLookup.getHomeLegacy(PageTriggerInfo.class)).createLegacy();
pti.setICObject(source);
pti.setDefaultTemplateId(defaultTemplateId);
pti.setRootPageId(rootPageId);
pti.insert();
if(objectInstanceIds != null){
for (int i = 0; i < objectInstanceIds.length; i++) {
pti.addTo(ICObjectInstance.class,objectInstanceIds[i]);
}
}
if(templatesAllowed != null){
for (int i = 0; i < templatesAllowed.length; i++) {
pti.addTo(ICPage.class,templatesAllowed[i].getID());
}
}
return pti.getID();
}
/*
public void deleteTriggerRule(PageTriggerInfo pti) throws SQLException{
pti.removeFrom(IBPage.class);
pti.removeFrom(ICObjectInstance.class);
// delete from pageLink where pti_id = thispti_id
pti.delete();
}
*/
public void addTemplateToRule(PageTriggerInfo pti, int ibPageId) throws SQLException{
pti.addTo(ICPage.class,ibPageId);
}
public void addTemplateToRule(ICPage ibp, int ptiId) throws SQLException{
ibp.addTo(PageTriggerInfo.class,ptiId);
}
public void addRuleToInstance(PageTriggerInfo pti, int objectInstanceId) throws SQLException{
pti.addTo(ICObjectInstance.class,objectInstanceId);
}
public void addRuleToInstance(ICObjectInstance icoi, int icoiID) throws SQLException{
icoi.addTo(PageTriggerInfo.class,icoiID);
}
public void removeTemplateFromRule(PageTriggerInfo pti, int ibPageId) throws SQLException{
pti.removeFrom(ICPage.class,ibPageId);
}
public void removeTemplateFromRule(ICPage ibp, int ptiId) throws SQLException{
ibp.removeFrom(PageTriggerInfo.class,ptiId);
}
public void removeRuleFromInstance(PageTriggerInfo pti, int objectInstanceId) throws SQLException{
pti.removeFrom(ICObjectInstance.class,objectInstanceId);
}
public void removeRuleFromInstance(ICObjectInstance icoi, int icoiID) throws SQLException{
icoi.removeFrom(PageTriggerInfo.class,icoiID);
}
// public PageLink createPageLink(IWContext iwc, PageTriggerInfo pti, String referencedDataId, String defaultLinkText, String standardParameters, Integer imageFileId, Integer onMouseOverImageFileId, Integer onClickImageFileId) throws SQLException {
//
// }
/**
*
* Creates new page tree using the information in pti, the PageTriggerInfo object,
* but creating a new DPTPermission group to be some kind of owner for the tree, that is
* users that are put into that group will get permissions for this new pagetree as set for
* for the template object. The user running this method is added automaticly to this group.
* @param iwc
* @param pti
* @param referencedDataId
* @param defaultLinkText
* @param ownerGroup
* @param standardParameters - depricated
* @param imageFileId - depricated
* @param onMouseOverImageFileId - depricated
* @param onClickImageFileId - depricated
* @return
* @throws Exception
*/
public PageLink createPageLink(IWContext iwc, PageTriggerInfo pti, String referencedDataId, String defaultLinkText, String standardParameters, Integer imageFileId, Integer onMouseOverImageFileId, Integer onClickImageFileId) throws Exception{
DPTPermissionGroup prGroup = ((DPTPermissionGroupHome)IDOLookup.getHome(DPTPermissionGroup.class)).create();
prGroup.setName(defaultLinkText);
prGroup.setDescription("This group is created for permission handling of a generated pagetree");
prGroup.store();
prGroup.addGroup(iwc.getCurrentUser());
return createPageLink(iwc,pti,referencedDataId,defaultLinkText,prGroup,standardParameters,imageFileId,onMouseOverImageFileId,onClickImageFileId);
}
/**
* @see #createPageLink(IWContext, PageTriggerInfo, String, String, String, Integer, Integer, Integer)
* The difference between this and #createPageLink(IWContext, PageTriggerInfo, String, String, String, Integer, Integer, Integer)
* is that here you can set an existing Group as the owner, but when using this one has to be sure that the group type of this group is
* cashed by the Login, otherwise permissions will NOT inherit from the template.
*
* This is mainly created to avoid problems while synchronizing between eGolf and Felix
*/
public PageLink createPageLink(IWContext iwc, PageTriggerInfo pti, String referencedDataId, String defaultLinkText, Group ownerGroup, String standardParameters, Integer imageFileId, Integer onMouseOverImageFileId, Integer onClickImageFileId) throws Exception {
if(ownerGroup==null) {
return createPageLink(iwc,pti,referencedDataId,defaultLinkText,standardParameters,imageFileId,onMouseOverImageFileId,onClickImageFileId);
}
PageLink pl = ((com.idega.builder.dynamicpagetrigger.data.PageLinkHome)com.idega.data.IDOLookup.getHomeLegacy(PageLink.class)).createLegacy();
pl.setPageTriggerInfoId(pti.getID());
pl.setReferencedDataId(referencedDataId);
pl.setDefaultLinkText(defaultLinkText);
if(standardParameters != null){
pl.setStandardParameters(standardParameters);
}
int pageId = createPage(iwc,pti.getDefaultTemplateId(), pti.getRootPageId(), defaultLinkText);
if(pageId == -1){
return (null);
}
pl.setPageId(pageId);
pl.setGroup(ownerGroup);
pl.store();
return pl;
}
public List getPageLinkRecords(ICObjectInstance instance) throws SQLException{
List listOfCopyRules = EntityFinder.findRelated(instance,(GenericEntity.getStaticInstance(PageLink.class)));
if (listOfCopyRules != null) {
List toReturn = new Vector();
Iterator iter = listOfCopyRules.iterator();
while (iter.hasNext()) {
PageTriggerInfo item = (PageTriggerInfo)iter.next();
List linkList = EntityFinder.findAllByColumn(GenericEntity.getStaticInstance(PageLink.class),com.idega.builder.dynamicpagetrigger.data.PageLinkBMPBean._COLUMNNAME_PAGE_TRIGGER_INFO_ID,item.getID());
if(linkList != null){
toReturn.addAll(linkList);
}
}
/*
IDOLegacyEntityComparator c = new IDOLegacyEntityComparator(com.idega.builder.dynamicpagetrigger.data.PageLinkBMPBean._COLUMNNAME_DEFAULT_LINK_TEXT);
Collections.sort(toReturn,c);
*/
return toReturn;
}
return null;
}
/*
public int triggerPage(){
}
*/
private int createPage(IWContext iwc, int dptTemplateId, int parentId, String name, int rootPageID) throws SQLException, RemoteException{
BuilderLogic instance = BuilderLogic.getInstance();
DPTCopySession cSession = (DPTCopySession)IBOLookup.getSessionInstance(iwc,DPTCopySession.class);
int id = createPageCollectingDPTCrowlable(iwc,dptTemplateId,parentId,name,rootPageID);
while(cSession.hasNextCollectedDPTCrawlable()){
KeyAndValue kv = cSession.nextCollectedDPTCrawlable();
String pageIDString = (String)kv.getKey();
DPTCrawlable item = (DPTCrawlable)kv.getValue();
int templateId = item.getLinkedDPTTemplateID();
String createdPage = (String)cSession.getNewValue(ICPage.class,Integer.toString(templateId));
if(createdPage == null){
String subpageName = item.getLinkedDPTPageName(iwc);
if(subpageName == null){
subpageName = "Untitled";
}
int newID = this.createPageCollectingDPTCrowlable(iwc,templateId, id, subpageName,((rootPageID!=-1)?rootPageID:id));
if(newID == -1){
return (-1);
}
instance.changeDPTCrawlableLinkedPageId(((PresentationObject)item).getICObjectInstanceID(),pageIDString,String.valueOf(newID));
} else {
instance.changeDPTCrawlableLinkedPageId(((PresentationObject)item).getICObjectInstanceID(),pageIDString,createdPage);
}
}
return id;
}
private int createPageCollectingDPTCrowlable(IWContext iwc, int dptTemplateId, int parentId, String name, int rootPageID) throws SQLException, RemoteException{
BuilderLogic instance = BuilderLogic.getInstance();
DPTCopySession cSession = (DPTCopySession)IBOLookup.getSessionInstance(iwc,DPTCopySession.class);
Map tree = PageTreeNode.getTree(iwc);
int id = IBPageHelper.getInstance().createNewPage(Integer.toString(parentId),name,IBPageHelper.DPT_PAGE,Integer.toString(dptTemplateId),tree,iwc);
if(id == -1){
return (-1);
} else if(rootPageID==-1) {
cSession.setRootPagePrimaryKey(new Integer(id));
}
try {
((com.idega.core.builder.data.ICPageHome)com.idega.data.IDOLookup.getHomeLegacy(ICPage.class)).findByPrimaryKeyLegacy(id);
}
catch(SQLException e) {
return (-1);
}
boolean copyPagePermission = false;
try {
copyPagePermission = ((DPTCopySession)IBOLookup.getSessionInstance(iwc,DPTCopySession.class)).doCopyPagePermissions();
} catch (IBOLookupException e2) {
e2.printStackTrace();
} catch (RemoteException e2) {
e2.printStackTrace();
}
if(copyPagePermission) {
copyPagePermissions(Integer.toString(dptTemplateId), Integer.toString(id));
}
cSession.setNewValue(ICPage.class,String.valueOf(dptTemplateId),String.valueOf(id));
IBXMLPage currentXMLPage = instance.getIBXMLPage(Integer.toString(id));
currentXMLPage.getPageRootElement().setAttribute(XMLConstants.DPT_ROOTPAGE_STRING,String.valueOf(((rootPageID!=-1)?rootPageID:id)));
currentXMLPage.store();
Page current = currentXMLPage.getPopulatedPage();
List children = current.getChildrenRecursive();
if(children != null){
String pageIDString = String.valueOf(id);
Iterator iter = children.iterator();
while (iter.hasNext()) {
Object item = iter.next();
if((item instanceof DPTCrawlable)&&!(((DPTCrawlable)item).getLinkedDPTTemplateID() == 0)){
cSession.collectDPTCrawlable(pageIDString,(DPTCrawlable)item);
}
}
}
return id;
}
private int createPage(IWContext iwc, int dptTemplateId, int parentId, String name) throws Exception{
DPTCopySession cSession = ((DPTCopySession)IBOLookup.getSessionInstance(iwc,DPTCopySession.class));
boolean sessionAlreadyStarted = cSession.isRunningSession();
if(!sessionAlreadyStarted) {
cSession.startCopySession();
}
int pageID = createPage(iwc, dptTemplateId, parentId, name,-1);
if(!sessionAlreadyStarted) {
cSession.endCopySession();
}
return pageID;
}
public void copyInstancePermissions( String oldInstanceID, String newInstanceID) throws SQLException{
AccessControl.copyObjectInstancePermissions(oldInstanceID,newInstanceID);
//
//
//
/**
* getTemplateGroups (linked to copyRule)
* copy group
* add templateGroup to new group
* set group to have same permission as templateGroup for new module id
*/
//
//
//
}
/**
* @deprecated not useful anymore. Only used in eProject
*/
public void copyPagePermissions( String oldPageID, String newPageID) throws SQLException{
AccessControl.copyPagePermissions(oldPageID,newPageID);
//
//
//
/**
* getTemplateGroups (linked to copyRule)
* copy group
* add templateGroup to new group
* set group to have same permission as templateGroup for new module id
*/
//
//
//
}
public List getDPTPermissionGroups(PageTriggerInfo pti) throws SQLException{
return EntityFinder.findRelated(pti, com.idega.core.data.GenericGroupBMPBean.getStaticInstance());
}
public static void createDPTPermissionGroup(PageTriggerInfo pti, String name, String description) throws IDOAddRelationshipException {
DPTPermissionGroup newGroup = ((com.idega.builder.dynamicpagetrigger.data.DPTPermissionGroupHome)com.idega.data.IDOLookup.getHomeLegacy(DPTPermissionGroup.class)).createLegacy();
newGroup.setName(name);
newGroup.setDescription(description);
newGroup.store();
pti.setRelatedGroup(newGroup);
}
protected BuilderLogic getBuilderLogic(){
return BuilderLogic.getInstance();
}
public boolean invalidatePageLink(IWContext iwc, PageLink l, int userId){
try {
l.setDeleted(true);
l.setDeletedBy(userId);
l.setDeletedWhen(IWTimestamp.getTimestampRightNow());
l.store();
ICDomain domain = getBuilderLogic().getCurrentDomain(iwc);
com.idega.builder.business.IBPageHelper.getInstance().deletePage(Integer.toString(l.getPageId()),true,PageTreeNode.getTree(iwc),userId, domain);
return true;
}
catch (Exception ex) {
ex.printStackTrace();
return false;
}
}
public boolean addObjectInstancToSubPages(ICObjectInstance objectTemplate,IWUserContext iwuc){
System.out.println("addObjectInstancToSubPages begins");
List pages = IBPageFinder.getAllPagesExtendingTemplate(objectTemplate.getIBPageID());
if(pages != null){
System.out.println("addObjectInstancToSubPages - pages != null");
Iterator iter = pages.iterator();
int counter = 1;
while (iter.hasNext()) {
System.out.println("-----------");
System.out.println("addObjectInstancToSubPages - addElementToPage : "+counter++);
ICPage item = (ICPage)iter.next();
IBPageHelper.getInstance().addElementToPage(item,objectTemplate.getID(),iwuc);
}
}else {
System.out.println("addObjectInstancToSubPages - pages == null");
}
System.out.println("addObjectInstancToSubPages ends");
return(true);
}
public boolean addObjectInstancToSubPages(int templateObjectInstanceID,IWUserContext iwuc) throws SQLException{
ICObjectInstance objinst = (ICObjectInstance)com.idega.data.IDOLookup.findByPrimaryKeyLegacy(ICObjectInstance.class,templateObjectInstanceID);
return addObjectInstancToSubPages(objinst,iwuc);
}
public Group getOwnerGroupFromRootPageID(int rootPageID) {
try {
PageLink pl = ((PageLinkHome)IDOLookup.getHome(PageLink.class)).findByRootPageID(rootPageID);
return pl.getGroup();
} catch (IDOLookupException e) {
e.printStackTrace();
} catch (FinderException e) {
e.printStackTrace();
}
return null;
}
}