/*
* $Id: BuilderLogic.java,v 1.190.2.1 2007/01/12 19:31:48 idegaweb Exp $ Copyright
* (C) 2001 Idega hf. All Rights Reserved. This software is the proprietary
* information of Idega hf. Use is subject to license terms.
*/
package com.idega.builder.business;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
import java.util.Map;
import java.util.Set;
import java.util.Vector;
import javax.ejb.FinderException;
import javax.faces.component.UIComponent;
import com.idega.builder.presentation.IBAddModuleWindow;
import com.idega.builder.presentation.IBAddRegionLabelWindow;
import com.idega.builder.presentation.IBCopyModuleWindow;
import com.idega.builder.presentation.IBCutModuleWindow;
import com.idega.builder.presentation.IBDeleteModuleWindow;
import com.idega.builder.presentation.IBLockRegionWindow;
import com.idega.builder.presentation.IBObjectControl;
import com.idega.builder.presentation.IBPasteModuleWindow;
import com.idega.builder.presentation.IBPermissionWindow;
import com.idega.builder.presentation.IBPropertiesWindow;
import com.idega.core.accesscontrol.business.AccessControl;
import com.idega.core.accesscontrol.business.AccessController;
import com.idega.core.builder.data.ICDomain;
import com.idega.core.builder.data.ICPage;
import com.idega.core.builder.data.ICPageHome;
import com.idega.core.component.business.ICObjectBusiness;
import com.idega.core.component.data.ICObject;
import com.idega.core.component.data.ICObjectInstance;
import com.idega.core.data.GenericGroup;
import com.idega.core.view.ViewManager;
import com.idega.core.view.ViewNode;
import com.idega.data.IDOLookup;
import com.idega.data.IDOLookupException;
import com.idega.event.EventLogic;
import com.idega.idegaweb.IWApplicationContext;
import com.idega.idegaweb.IWBundle;
import com.idega.idegaweb.IWMainApplication;
import com.idega.idegaweb.IWProperty;
import com.idega.idegaweb.IWPropertyList;
import com.idega.idegaweb.IWUserContext;
import com.idega.idegaweb.block.presentation.Builderaware;
import com.idega.presentation.CSSSpacer;
import com.idega.presentation.HtmlPage;
import com.idega.presentation.HtmlPageRegion;
import com.idega.presentation.IFrameContainer;
import com.idega.presentation.IWContext;
import com.idega.presentation.Image;
import com.idega.presentation.Layer;
import com.idega.presentation.Page;
import com.idega.presentation.PresentationObject;
import com.idega.presentation.PresentationObjectContainer;
import com.idega.presentation.Script;
import com.idega.presentation.Table;
import com.idega.presentation.text.Link;
import com.idega.presentation.text.Text;
import com.idega.repository.data.Instantiator;
import com.idega.repository.data.Singleton;
import com.idega.repository.data.SingletonRepository;
import com.idega.util.FileUtil;
import com.idega.util.StringHandler;
import com.idega.util.reflect.PropertyCache;
import com.idega.xml.XMLAttribute;
import com.idega.xml.XMLElement;
/**
* <p>
* This class is the main "buisiness logic" class for the Builder.<br>
* All interface actions are sent to this class and this class manages other helper classes such as PageCacher,IBXMLReader,IBXMLWriter etc.
* </p>
*
* @author <a href="tryggvi@idega.is">Tryggvi Larusson </a>
* @version 1.0
*/
public class BuilderLogic implements Singleton {
public static final String IC_OBJECT_INSTANCE_ID_PARAMETER = BuilderConstants.IC_OBJECT_INSTANCE_ID_PARAMETER;
public static final String IB_PARENT_PARAMETER = "ib_parent_par";
public static final String IB_LABEL_PARAMETER = "ib_label";
public static final String IB_LIBRARY_NAME = "ib_library_name";
public static final String IB_CONTROL_PARAMETER = "ib_control_par";
public static final String ACTION_DELETE = "ACTION_DELETE";
public static final String ACTION_EDIT = "ACTION_EDIT";
public static final String ACTION_ADD = "ACTION_ADD";
public static final String ACTION_MOVE = "ACTION_MOVE";
public static final String ACTION_LOCK_REGION = "ACTION_LOCK";
public static final String ACTION_UNLOCK_REGION = "ACTION_UNLOCK";
public static final String ACTION_PERMISSION = "ACTION_PERMISSION";
public static final String ACTION_LABEL = "ACTION_LABEL";
public static final String ACTION_COPY = "ACTION_COPY";
public static final String ACTION_PASTE = "ACTION_PASTE";
public static final String ACTION_PASTE_ABOVE = "ACTION_PASTE_ABOVE";
public static final String ACTION_LIBRARY = "ACTION_LIBRARY";
public static final String IW_BUNDLE_IDENTIFIER = "com.idega.builder";
/**
*This is the key that holds the page in the builder session
**/
private static final String SESSION_PAGE_KEY = "ib_page_id";
public static final String SESSION_OBJECT_STATE = BuilderConstants.SESSION_OBJECT_STATE;
public static final String PRM_HISTORY_ID = BuilderConstants.PRM_HISTORY_ID;
public static final String IMAGE_ID_SESSION_ADDRESS = "ib_image_id";
public static final String IMAGE_IC_OBJECT_INSTANCE_SESSION_ADDRESS = "ic_object_id_image";
private static final String IB_APPLICATION_RUNNING_SESSION = "ib_application_running";
//private static final String DEFAULT_PAGE = "1";
public static final String CLIPBOARD = "user_clipboard";
private static Instantiator instantiator = new Instantiator() { public Object getInstance() { return new BuilderLogic();}};
public String PAGE_FORMAT_IBXML="IBXML";
public String PAGE_FORMAT_HTML="HTML";
public String PAGE_FORMAT_JSP_1_2="JSP_1_2";
private String[] pageFormats = {this.PAGE_FORMAT_IBXML,this.PAGE_FORMAT_HTML,this.PAGE_FORMAT_JSP_1_2};
private BuilderLogic() {
// empty
}
public static BuilderLogic getInstance() {
return (BuilderLogic) SingletonRepository.getRepository().getInstance(BuilderLogic.class, instantiator);
}
public static void unload() {
SingletonRepository.getRepository().unloadInstance(BuilderLogic.class);
}
public boolean updatePage(int id) {
String theID = Integer.toString(id);
CachedBuilderPage xml = getPageCacher().getCachedBuilderPage(theID);
xml.store();
getPageCacher().flagPageInvalid(theID);
return (true);
}
public CachedBuilderPage getCachedBuilderPage(String key) {
return getPageCacher().getCachedBuilderPage(key);
}
public IBXMLPage getIBXMLPage(String pageKey) {
return getPageCacher().getIBXML(pageKey);
}
public Page getPage(String pageKey, IWContext iwc) {
return getPageCacher().getComponentBasedPage(pageKey).getPage(iwc);
}
/*
public Page getPage(int id, boolean builderview, IWContext iwc) {
try {
boolean permissionview = false;
if (iwc.isParameterSet("ic_pm") && iwc.isSuperAdmin()) {
permissionview = true;
}
Page page = getPageCacher().getPage(Integer.toString(id), iwc);
if (builderview && iwc.hasEditPermission(page)) {
return (BuilderLogic.getInstance().getBuilderTransformed(Integer.toString(id), page, iwc));
}
else if (permissionview) {
int groupId = -1906;
String bla = iwc.getParameter("ic_pm");
if (bla != null) {
try {
groupId = Integer.parseInt(bla);
}
catch (NumberFormatException ex) {
}
}
page = getPageCacher().getPage(Integer.toString(id));
return (BuilderLogic.getInstance().getPermissionTransformed(groupId, Integer.toString(id), page, iwc));
}
else {
return (page);
}
}
catch (Exception e) {
e.printStackTrace();
Page theReturn = new Page();
theReturn.add("Page invalid");
return (theReturn);
}
}*/
/**
* *
*/
public Page getBuilderTransformed(String pageKey, Page page, IWContext iwc) {
IWBundle iwb = getBuilderBundle();
page.addStyleSheetURL(iwb.getVirtualPathWithFileNameString("style/builder.css"));
page.addScriptSource(iwb.getVirtualPathWithFileNameString("javascript/prototype.js"));
page.addScriptSource(iwb.getVirtualPathWithFileNameString("javascript/effects.js"));
page.addScriptSource(iwb.getVirtualPathWithFileNameString("javascript/dragdrop.js"));
page.addScriptSource(iwb.getVirtualPathWithFileNameString("javascript/controls.js"));
//if we want to use Sortable (javascript from the DnD library) someday
page.setID("DnDPage");
//Begin with transforming the objects on a normal Page object (constructed from IBXML)
List list = page.getChildren();
if (list != null) {
ListIterator iter = list.listIterator();
PresentationObjectContainer parent = page;
while (iter.hasNext()) {
int index = iter.nextIndex();
UIComponent item = (UIComponent) iter.next();
transformObject(page,pageKey, item, index, parent, "-1", iwc);
}
}
XMLElement pasted = (XMLElement) iwc.getSessionAttribute(CLIPBOARD);
boolean clipboardEmpty = true;
if (pasted != null) {
clipboardEmpty = false;
}
//"-1" is identified as the top page object (parent)
if (page.getIsExtendingTemplate()) {
if (!page.isLocked()) {
Layer marker = getLabelMarker("page");
page.add(marker);
marker.add(getAddIcon(Integer.toString(-1), iwc, null));
if (!clipboardEmpty){
marker.add(getPasteIcon(Integer.toString(-1),null, iwc));
}
Script drop = new Script();
drop.addFunction("",getModuleToRegionDroppableScript(marker.getID(),getCurrentIBPage(iwc),"-1","","moduleContainer","regionLabelHover",getBuilderBundle().getResourcesVirtualPath()+"/services/IWBuilderWS.jws"));
page.add(drop);
}
if(page instanceof HtmlPage){
HtmlPage hPage = (HtmlPage)page;
Set regions = hPage.getRegionIds();
for (Iterator iter = regions.iterator(); iter.hasNext();) {
String regionKey = (String) iter.next();
Layer marker = getLabelMarker(regionKey);
hPage.add(marker,regionKey);
marker.add(getAddIcon(regionKey, iwc, regionKey));
if (!clipboardEmpty){
marker.add(getPasteIcon(regionKey,regionKey, iwc));
}
Script drop = new Script();
drop.addFunction("",getModuleToRegionDroppableScript(marker.getID(),getCurrentIBPage(iwc),regionKey,regionKey,"moduleContainer","regionLabelHover",getBuilderBundle().getResourcesVirtualPath()+"/services/IWBuilderWS.jws"));
page.add(drop);
}
}
}
else {
boolean mayAddButtonsInPage=true;
CachedBuilderPage iPage = this.getCachedBuilderPage(pageKey);
if(iPage.getPageFormat().equals("HTML")){
mayAddButtonsInPage=false;
if(page instanceof HtmlPage){
HtmlPage hPage = (HtmlPage)page;
Set regions = hPage.getRegionIds();
for (Iterator iter = regions.iterator(); iter.hasNext();) {
String regionKey = (String) iter.next();
Text regionText = new Text(regionKey);
regionText.setFontColor("red");
hPage.add(regionText,regionKey);
}
}
}
if(mayAddButtonsInPage){
Layer marker = getLabelMarker("page");
marker.add(getAddIcon(Integer.toString(-1), iwc, null));
if ((!clipboardEmpty)){
marker.add(getPasteIcon(Integer.toString(-1), null, iwc));
}
page.add(marker);
}
if (page.getIsTemplate()){
if (page.isLocked()){
page.add(getLockedIcon(Integer.toString(-1), iwc, null));
}
else{
page.add(getUnlockedIcon(Integer.toString(-1), iwc));
}
}
}
return (page);
}
public Layer getLabelMarker(String label) {
Layer marker = new Layer(Layer.DIV);
marker.add(new CSSSpacer());
marker.setStyleClass("regionLabel");
if(label!=null){
marker.add(label);
}
return marker;
}
public Page getPermissionTransformed(int groupId, Page page, IWContext iwc) {
List groupIds = new Vector();
groupIds.add(Integer.toString(groupId));
try {
List groups = AccessControl.getPermissionGroups(((com.idega.core.data.GenericGroupHome) com.idega.data.IDOLookup.getHomeLegacy(GenericGroup.class)).findByPrimaryKeyLegacy(groupId));
if (groups != null) {
Iterator iter = groups.iterator();
while (iter.hasNext()) {
com.idega.core.data.GenericGroup item = (GenericGroup) iter.next();
groupIds.add(Integer.toString(item.getID()));
}
}
}
catch (Exception ex) {
// empty block
}
List list = page.getChildren();
if (list != null) {
ListIterator iter = list.listIterator();
while (iter.hasNext()) {
int index = iter.nextIndex();
Object item = iter.next();
if (item instanceof PresentationObject) {
filterForPermission(groupIds, (PresentationObject) item, page, index, iwc);
}
}
}
return page;
}
private void filterForPermission(List groupIds, PresentationObject obj, PresentationObjectContainer parentObject, int index, IWContext iwc) {
if (!iwc.hasViewPermission(groupIds, obj)) {
System.err.println(obj + ": removed");
parentObject.getChildren().remove(index);
parentObject.getChildren().add(index, PresentationObject.NULL_CLONE_OBJECT);
}
else if (obj.isContainer()) {
if (obj instanceof Table) {
Table tab = (Table) obj;
int cols = tab.getColumns();
int rows = tab.getRows();
for (int x = 1; x <= cols; x++) {
for (int y = 1; y <= rows; y++) {
PresentationObjectContainer moc = tab.containerAt(x, y);
if (moc != null) {
List l = moc.getChildren();
if (l != null) {
ListIterator iterT = l.listIterator();
while (iterT.hasNext()) {
int index2 = iterT.nextIndex();
Object itemT = iterT.next();
if (itemT instanceof PresentationObject) {
filterForPermission(groupIds, (PresentationObject) itemT, moc, index2, iwc);
}
}
}
}
}
}
}
else {
List list = obj.getChildren();
if (list != null) {
ListIterator iter = list.listIterator();
while (iter.hasNext()) {
int index2 = iter.nextIndex();
PresentationObject item = (PresentationObject) iter.next();
filterForPermission(groupIds, item, (PresentationObjectContainer) obj, index2, iwc);
}
}
}
}
}
private void processImageSet(String pageKey, String instanceId, int imageID, IWMainApplication iwma) {
setProperty(pageKey, instanceId, "image_id", Integer.toString(imageID), iwma);
}
private void transformObject(Page currentPage,String pageKey, UIComponent obj, int index, PresentationObjectContainer parent, String parentKey, IWContext iwc) {
XMLElement pasted = (XMLElement) iwc.getSessionAttribute(CLIPBOARD);
boolean clipboardEmpty = (pasted == null);
//We can either be working with pure UIComponents or PresentationObjects
boolean isPresentationObject = obj instanceof PresentationObject;
//Some very special cases, added the boolean to make it faster
if (isPresentationObject && obj instanceof Image) {
obj = transformImage(pageKey, obj, iwc);
}
else if ( isPresentationObject && ((PresentationObject)obj).isContainer()) {
if (obj instanceof Table) {
transformTable(currentPage, pageKey, obj, iwc, clipboardEmpty);
}
else {
List list = obj.getChildren();
if (list != null && !list.isEmpty()) {
ListIterator iter = list.listIterator();
while (iter.hasNext()) {
int index2 = iter.nextIndex();
UIComponent item = (UIComponent) iter.next();
/**
* If parent is Table
*/
if (index == -1) {
transformObject(currentPage,pageKey, item, index2, (PresentationObjectContainer) obj, parentKey, iwc);
}
else {
String newParentKey = null;
//Ugly Hack of handling the regions inside HTML template based pages. This needs to change.
//TODO: Remove this instanceof case, to make that possible then the getICObjectInstanceID
// method needs to be changed to return String
if(obj instanceof HtmlPageRegion){
HtmlPageRegion region = (HtmlPageRegion)obj;
//newParentKey is normally an ICObjectInstanceId or -1 to mark the top page
//but here we make a workaround.
newParentKey = region.getRegionId();
}
else{
newParentKey = getInstanceId(obj);
}
transformObject(currentPage,pageKey, item, index2, (PresentationObjectContainer) obj, newParentKey, iwc);
}
}
}
if (index != -1) {
//Page curr = getPageCacher().getPage(getCurrentIBPage(iwc), iwc);
Page curr = getPageCacher().getComponentBasedPage(getCurrentIBPage(iwc)).getNewPage(iwc);
PresentationObjectContainer container = ((PresentationObjectContainer) obj);
String instanceId = getInstanceId(obj);
if (curr.getIsExtendingTemplate()) {
if (container.getBelongsToParent()) {
if (!container.isLocked()) {
Layer marker = getLabelMarker(container.getLabel());
container.add(marker);
marker.add(getAddIcon(instanceId, iwc, container.getLabel()));
if (!clipboardEmpty){
marker.add(getPasteIcon(instanceId,container.getLabel(), iwc));
}
Script drop = new Script();
drop.addFunction("",getModuleToRegionDroppableScript(marker.getID(),getCurrentIBPage(iwc),instanceId,container.getLabel(),"moduleContainer","regionLabelHover",getBuilderBundle().getResourcesVirtualPath()+"/services/IWBuilderWS.jws"));
container.add(drop);
}
}
else {
Layer marker = getLabelMarker(container.getLabel());
container.add(marker);
marker.add(getAddIcon(instanceId, iwc, container.getLabel()));
if (!clipboardEmpty){
marker.add(getPasteIcon(instanceId,container.getLabel(), iwc));
}
if (curr.getIsTemplate()) {
marker.add(getLabelIcon(instanceId, iwc, container.getLabel()));
if (container.isLocked()){
marker.add(getLockedIcon(instanceId, iwc, container.getLabel()));
}
else{
marker.add(getUnlockedIcon(instanceId, iwc));
Script drop = new Script();
drop.addFunction("",getModuleToRegionDroppableScript(marker.getID(),getCurrentIBPage(iwc),instanceId,container.getLabel(),"moduleContainer","regionLabelHover",getBuilderBundle().getResourcesVirtualPath()+"/services/IWBuilderWS.jws"));
container.add(drop);
}
}
}
}
else {
Layer marker = getLabelMarker(container.getLabel());
container.add(marker);
marker.add(getAddIcon(instanceId, iwc, container.getLabel()));
if (!clipboardEmpty){
marker.add(getPasteIcon(instanceId,container.getLabel(), iwc));
}
if (curr.getIsTemplate()) {
marker.add(getLabelIcon(instanceId, iwc, container.getLabel()));
if (container.isLocked()){
marker.add(getLockedIcon(instanceId, iwc, container.getLabel()));
}
else{
marker.add(getUnlockedIcon(instanceId, iwc));
Script drop = new Script();
drop.addFunction("",getModuleToRegionDroppableScript(marker.getID(),getCurrentIBPage(iwc),instanceId,container.getLabel(),"moduleContainer","regionLabelHover",getBuilderBundle().getResourcesVirtualPath()+"/services/IWBuilderWS.jws"));
container.add(drop);
}
}
}
}
}
}
if ( (isPresentationObject && ((PresentationObject) obj).getUseBuilderObjectControl()) || !isPresentationObject ) {
if (index != -1) {
//parent.remove(obj);
//parent.add(new IBObjectControl(obj,parent,parentKey,iwc,index));
parent.set(index, new IBObjectControl(obj, parent, parentKey, iwc, index));
}
}
}
/**
* @param currentPage
* @param pageKey
* @param obj
* @param iwc
* @param clipboardEmpty
*/
protected void transformTable(Page currentPage, String pageKey, UIComponent obj, IWContext iwc, boolean clipboardEmpty) {
Table tab = (Table) obj;
int cols = tab.getColumns();
int rows = tab.getRows();
for (int x = 1; x <= cols; x++) {
for (int y = 1; y <= rows; y++) {
PresentationObjectContainer moc = tab.containerAt(x, y);
String newParentKey = tab.getICObjectInstanceID() + "." + x + "." + y;
if (moc != null) {
transformObject(currentPage,pageKey, moc, -1, tab, newParentKey, iwc);
}
//Page currentPage = PageCacher.getPage(getCurrentIBPage(iwc), iwc);
if (currentPage.getIsExtendingTemplate()) {
if (tab.getBelongsToParent()) {
if (!tab.isLocked(x, y)) {
Layer marker = getLabelMarker(tab.getLabel(x, y));
tab.add(marker, x, y);
PresentationObject addIcon = getAddIcon(newParentKey, iwc, tab.getLabel(x, y));
marker.add(addIcon);
if (!clipboardEmpty){
marker.add(getPasteIcon(newParentKey,tab.getLabel(x, y), iwc));
}
Script drop = new Script();
drop.addFunction("",getModuleToRegionDroppableScript(marker.getID(),getCurrentIBPage(iwc),newParentKey,tab.getLabel(x,y),"moduleContainer","regionLabelHover",getBuilderBundle().getResourcesVirtualPath()+"/services/IWBuilderWS.jws"));
tab.add(drop,x,y);
}
}
else {
Layer marker = getLabelMarker(tab.getLabel(x, y));
tab.add(marker, x, y);
PresentationObject addIcon = getAddIcon(newParentKey, iwc, tab.getLabel(x, y));
marker.add(addIcon);
if (!clipboardEmpty) {
marker.add(getPasteIcon(newParentKey,tab.getLabel(x, y), iwc));
}
if (currentPage.getIsTemplate()) {
marker.add(getLabelIcon(newParentKey, iwc, tab.getLabel(x, y)));
if (tab.isLocked(x, y)){
marker.add(getLockedIcon(newParentKey, iwc, tab.getLabel(x, y)));
}
else{
marker.add(getUnlockedIcon(newParentKey, iwc));
}
}
//always add the drop area
Script drop = new Script();
drop.addFunction("",getModuleToRegionDroppableScript(marker.getID(),getCurrentIBPage(iwc),newParentKey,tab.getLabel(x,y),"moduleContainer","regionLabelHover",getBuilderBundle().getResourcesVirtualPath()+"/services/IWBuilderWS.jws"));
tab.add(drop,x,y);
}
}
else {
Layer marker = getLabelMarker(tab.getLabel(x, y));
tab.add(marker, x, y);
PresentationObject addIcon = getAddIcon(newParentKey, iwc, tab.getLabel(x, y));
marker.add(addIcon);
if (!clipboardEmpty) {
marker.add(getPasteIcon(newParentKey, tab.getLabel(x,y) ,iwc));
}
if (currentPage.getIsTemplate()) {
marker.add(getLabelIcon(newParentKey, iwc, tab.getLabel(x, y)));
if (tab.isLocked(x, y)){
marker.add(getLockedIcon(newParentKey, iwc, tab.getLabel(x, y)));
}
else{
marker.add(getUnlockedIcon(newParentKey, iwc));
}
Script drop = new Script();
drop.addFunction("",getModuleToRegionDroppableScript(marker.getID(),getCurrentIBPage(iwc),newParentKey,tab.getLabel(x,y),"moduleContainer","regionLabelHover",getBuilderBundle().getResourcesVirtualPath()+"/services/IWBuilderWS.jws"));
tab.add(drop,x,y);
}
}
}
}
}
/**
* @param pageKey
* @param obj
* @param iwc
* @return
*/
protected UIComponent transformImage(String pageKey, UIComponent obj, IWContext iwc) {
Image imageObj = (Image) obj;
boolean useBuilderObjectControl = imageObj.getUseBuilderObjectControl();
int ICObjectIntanceID = imageObj.getICObjectInstanceID();
String sessionID = "ic_" + ICObjectIntanceID;
String session_image_id = (String) iwc.getSessionAttribute(sessionID);
if (session_image_id != null) {
int image_id = Integer.parseInt(session_image_id);
/**
* @todo Change this so that id is done in a more appropriate place,
* i.e. set the image_id permanently on the image
*/
processImageSet(pageKey, Integer.toString(ICObjectIntanceID), image_id, iwc.getIWMainApplication());
iwc.removeSessionAttribute(sessionID);
imageObj.setImageID(image_id);
}
IBImageInserter inserter = null;
inserter = (new IBClassesFactory()).createImageInserterImpl();
inserter.setHasUseBox(false);
String width = imageObj.getWidth();
String height = imageObj.getHeight();
inserter.limitImageWidth(false);
if (width != null) {
inserter.setWidth(width);
}
if (height != null) {
inserter.setHeight(height);
}
int image_id = imageObj.getImageID(iwc);
if (image_id != -1) {
inserter.setImageId(image_id);
}
inserter.setImSessionImageName(sessionID);
inserter.setWindowToReload(true);
//inserter.maintainSessionParameter();
obj = (PresentationObject) inserter;
((PresentationObject)obj).setICObjectInstanceID(ICObjectIntanceID);
((PresentationObject)obj).setUseBuilderObjectControl(useBuilderObjectControl);
return obj;
}
public ICPage getCurrentIBPageEntity(IWContext iwc) throws Exception {
String sID = getCurrentIBPage(iwc);
//if(sID!=null){
return ((com.idega.core.builder.data.ICPageHome) com.idega.data.IDOLookup.getHomeLegacy(ICPage.class)).findByPrimaryKeyLegacy(Integer.parseInt(sID));
//}
}
/**
* Returns the current IBPageID that the user has requested
*/
public int getCurrentIBPageID(IWContext iwc) {
String theReturn = getCurrentIBPage(iwc);
return Integer.parseInt(theReturn);
}
public String getPageKeyByURIAndServerName(String requestURI,String serverName){
try{
return getPageKeyByURI(requestURI);
}
catch(NumberFormatException nfe){
//nothing printed out here
}
catch(Exception e){
e.printStackTrace();
}
String theReturn = String.valueOf(getStartPageIdByServerName(serverName));
if (theReturn == null) {
return Integer.toString(getCurrentDomain().getStartPageID());
}
return theReturn;
}
/**
* Tries to find the uri in the cache of builder pages
* @param requestURI
* @return
*/
public String getPageKeyByURICached(String pageUri){
Iterator iter = getPageCacher().getPageCacheMap().values().iterator();
while(iter.hasNext()){
CachedBuilderPage page = (CachedBuilderPage)iter.next();
String cachedPageUri = page.getURI();
if(cachedPageUri!=null){
if(cachedPageUri.equals(pageUri)){
return page.getPageKey();
}
}
}
return null;
}
public String getPageKeyByURI(String requestURI){
//String requestURI = iwc.getRequestURI();
//if (requestURI.startsWith(iwc.getIWMainApplication().getBuilderPagePrefixURI())) {
int indexOfPage = requestURI.indexOf("/pages/");
//if (indexOfPage != -1) {
//boolean pageISNumber = true;
String iPageId = null;
//try {
String uriWithoutPages = requestURI;
//this string will be tried to convert to a number
String uriForNumberParse = requestURI;
if(indexOfPage!=-1){
uriWithoutPages = requestURI.substring(indexOfPage + 6);
uriForNumberParse = requestURI.substring(indexOfPage + 7);
}
int lastSlash = uriForNumberParse.lastIndexOf(StringHandler.SLASH);
if (lastSlash == -1) {
iPageId = uriForNumberParse;
}
else {
iPageId = uriForNumberParse.substring(0, lastSlash);
}
try{
Integer.parseInt(iPageId);
return iPageId;
}
catch(NumberFormatException nfe){
//the string is not a number:
//try to find the page in the cache first:
String pageKey = getPageKeyByURICached(uriWithoutPages);
if(pageKey!=null){
return pageKey;
}
//if it isn't found in the cache try the database:
try {
ICPageHome pageHome = (ICPageHome)IDOLookup.getHome(ICPage.class);
//TODO: change - here domainId is hardcoded to -1
int domainId=-1;
ICPage page = pageHome.findByUri(uriWithoutPages,domainId);
return page.getPageKey();
}
catch (IDOLookupException e) {
// empty
}
catch(FinderException fe){
// empty
}
}
//return pageID;
//}
//catch (NumberFormatException e) {
// pageISNumber = false;
//}
//if (pageISNumber) {
// return pageID;
//}
//}
//}
throw new RuntimeException("Page Key Can not be found from URI '"+requestURI+"'");
}
/**
* Returns the key for the ICPage that the user has requested
*/
public String getCurrentIBPage(IWContext iwc) {
String theReturn = null;
String requestURI = iwc.getRequestURI();
if(IWMainApplication.useNewURLScheme){
//if (requestURI.startsWith(iwc.getIWMainApplication().getBuilderPagePrefixURI())) {
/*int indexOfPage = requestURI.indexOf("/pages/");
if (indexOfPage != -1) {
boolean pageISNumber = true;
String pageID = null;
try {
String subString = requestURI.substring(indexOfPage + 7);
int lastSlash = subString.indexOf("/");
if (lastSlash == -1) {
pageID = subString;
}
else {
pageID = subString.substring(0, lastSlash);
}
Integer.parseInt(pageID);
}
catch (NumberFormatException e) {
pageISNumber = false;
}
if (pageISNumber) {
return pageID;
}
}*/
try{
return getPageKeyByURI(requestURI);
}
catch(NumberFormatException nfe){
//nothing printed out
}
catch(RuntimeException re){
//nothing printed out
//this can come from getPageKeyByURI() for old style systems with /servlet/IBMainSerlet uri
}
catch(Exception e){
e.printStackTrace();
}
}
// normal page check
if (iwc.isParameterSet(BuilderConstants.IB_PAGE_PARAMETER)) {
theReturn = iwc.getParameter(BuilderConstants.IB_PAGE_PARAMETER);
}
// session page check
else if (iwc.getSessionAttribute(SESSION_PAGE_KEY) != null) {
theReturn = (String) iwc.getSessionAttribute(SESSION_PAGE_KEY);
}
// otherwise use startpage
else {
theReturn = String.valueOf(getInstance().getStartPageIdByServerName(iwc,iwc.getServerName()));
}
if (theReturn == null) {
return Integer.toString(getCurrentDomain(iwc).getStartPageID());
}
return theReturn;
}
/**
* Sets the IBpage Id to use in the builder session.
* @param iwc
* @param pageKey
*/
public void setCurrentIBPage(IWContext iwc,String pageKey){
//This method only sets the session variant
iwc.setSessionAttribute(SESSION_PAGE_KEY,pageKey);
}
/**
* Sets the source and pageFormat for current page and stores to the datastore
* @param iwc IWContext to get the current page
* @param pageFormat
* @param stringSourceMarkup
*/
public boolean setPageSource(IWContext iwc,String pageFormat,String stringSourceMarkup){
String pageKey = getCurrentIBPage(iwc);
return setPageSource(pageKey,pageFormat,stringSourceMarkup);
}
/**
* Sets the source and pageFormat for the page with key pageKey and stores to the datastore
* @param pageKey
* @param pageFormat
* @param stringSourceMarkup
*/
public boolean setPageSource(String pageKey,String pageFormat,String stringSourceMarkup){
try{
getPageCacher().storePage(pageKey,pageFormat,stringSourceMarkup);
return true;
}
catch(Exception e){
e.printStackTrace();
return false;
}
}
/**
* Gets the source code (IBXML,HTML) as a String for the current page
* @param iwc IWContext to get the current page
* @param pageFormat
* @param stringSourceMarkup
*/
public String getPageSource(IWContext iwc){
String pageKey = getCurrentIBPage(iwc);
return getPageSource(pageKey);
}
/**
* Gets the source code (IBXML,HTML) as a String for the page with key pageKey
* @param iwc IWContext to get the current page
* @param pageFormat
* @param stringSourceMarkup
*/
public String getPageSource(String pageKey){
return getCachedBuilderPage(pageKey).toString();
}
CachedBuilderPage getCurrentCachedBuilderPage(IWContext iwc) {
String key = getCurrentIBPage(iwc);
if (key != null) {
return (getCachedBuilderPage(key));
}
return null;
}
IBXMLPage getCurrentIBXMLPage(IWContext iwc) {
return (IBXMLPage)getCurrentCachedBuilderPage(iwc);
}
public ICDomain getCurrentDomain(){
IWApplicationContext iwac = IWMainApplication.getDefaultIWApplicationContext();
return getCurrentDomain(iwac);
}
public ICDomain getCurrentDomain(IWApplicationContext iwac) {
try {
return iwac.getDomain();
}
catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e.getMessage());
}
}
public ICDomain getCurrentDomainByServerName(String serverName){
IWApplicationContext iwac = IWMainApplication.getDefaultIWApplicationContext();
return getCurrentDomainByServerName(iwac,serverName);
}
public ICDomain getCurrentDomainByServerName(IWApplicationContext iwac,String serverName) {
try {
return iwac.getDomainByServerName(serverName);
}
catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e.getMessage());
}
}
/**
* Returns the real properties set for the property if the property is set
* with the specified keys Returns the selectedValues[] if nothing found
*/
public String[] getPropertyValues(IWMainApplication iwma, String pageKey, String instanceId, String propertyName, String[] selectedValues, boolean returnSelectedValueIfNothingFound) {
IBXMLPage xml = getIBXMLPage(pageKey);
return IBPropertyHandler.getInstance().getPropertyValues(iwma, xml, instanceId, propertyName, selectedValues, returnSelectedValueIfNothingFound);
//return XMLWriter.getPropertyValues(xml,ObjectInstanceId,propertyName);
}
public boolean removeProperty(IWMainApplication iwma, String pageKey, String instanceId, String propertyName, String[] values) {
IBXMLPage xml = getIBXMLPage(pageKey);
if (XMLWriter.removeProperty(iwma, xml, instanceId, propertyName, values)) {
xml.store();
return true;
}
return false;
}
/**
* Returns the first property if there is an array of properties set
*/
public String getProperty(String pageKey, String instanceId, String propertyName) {
IBXMLPage xml = getIBXMLPage(pageKey);
return XMLWriter.getProperty(xml, instanceId, propertyName);
}
/**
* Returns true if properties changed, or error, else false
*/
public boolean setProperty(String pageKey, String instanceId, String propertyName, String propertyValue, IWMainApplication iwma) {
String[] values = {propertyValue};
return setProperty(pageKey, instanceId, propertyName, values, iwma);
}
/**
* Returns true if properties changed, or error, else false
*/
public boolean setProperty(String pageKey, String instanceId, String propertyName, String[] propertyValues, IWMainApplication iwma) {
try {
IBXMLPage xml = getIBXMLPage(pageKey);
boolean allowMultivalued = isPropertyMultivalued(propertyName, instanceId, iwma);
if (XMLWriter.setProperty(iwma, xml, instanceId, propertyName, propertyValues, allowMultivalued)) {
xml.store();
return (true);
}
return (false);
}
catch (Exception e) {
e.printStackTrace(System.err);
return (false);
}
}
/**
* Returns true if properties changed, or error, else false
*/
public boolean isPropertySet(String pageKey, String instanceId, String propertyName, IWMainApplication iwma) {
try {
IBXMLPage xml = getIBXMLPage(pageKey);
return XMLWriter.isPropertySet(iwma, xml, instanceId, propertyName);
}
catch (Exception e) {
e.printStackTrace(System.err);
return (false);
}
}
// add by Aron 20.sept 2001 01:49
public boolean deleteModule(String pageKey, String parentObjectInstanceID, String instanceId) {
IBXMLPage xml = getIBXMLPage(pageKey);
try {
int objectInstanceId = Integer.parseInt(instanceId);
PresentationObject Block = ICObjectBusiness.getInstance().getNewObjectInstance(objectInstanceId);
if (Block != null) {
if (Block instanceof Builderaware) {
((Builderaware) Block).deleteBlock(Integer.parseInt(instanceId));
}
}
}
catch (NumberFormatException ex) {
//its a UIComponent
}
catch (Exception ex) {
ex.printStackTrace();
}
if (XMLWriter.deleteModule(xml, parentObjectInstanceID, instanceId)) {
xml.store();
return (true);
}
return (false);
}
/**
* *
*/
public boolean copyModule(IWUserContext iwc, String pageKey, String instanceId) {
IBXMLPage xml = getIBXMLPage(pageKey);
XMLElement element = xml.copyModule(instanceId);
if (element == null) {
return false;
}
XMLElement el = (XMLElement) element.clone();
iwc.setSessionAttribute(CLIPBOARD, el);
return (true);
}
/**
* *
*/
public boolean pasteModuleIntoRegion(IWUserContext iwc, String pageKey, String regionId, String regionLabel) {
IBXMLPage xml = getIBXMLPage(pageKey);
XMLElement element = (XMLElement) iwc.getSessionAttribute(CLIPBOARD);
if (element == null) {
return (false);
}
XMLElement toPaste = (XMLElement) element.clone();
if (XMLWriter.pasteElementLastIntoParentOrRegion(xml, pageKey, regionId, regionLabel,toPaste)) {
xml.store();
return (true);
}
return (false);
}
public boolean pasteModule(IWUserContext iwc, String pageKey, String parentID) {
return pasteModuleIntoRegion(iwc,pageKey,parentID,null);
}
/**
* *
*/
public boolean pasteModuleAbove(IWUserContext iwc,String pageKey, String parentID, String objectID) {
IBXMLPage xml = getIBXMLPage(pageKey);
System.out.println("pageKey = " + pageKey);
System.out.println("parentID = " + parentID);
System.out.println("objectID = " + objectID);
XMLElement element = (XMLElement) iwc.getSessionAttribute(CLIPBOARD);
if (element == null) {
return (false);
}
XMLElement toPaste = (XMLElement) element.clone();
if (XMLWriter.pasteElementAbove(xml, pageKey, parentID, objectID, toPaste)) {
xml.store();
return (true);
}
return (false);
}
public boolean pasteModuleBelow(IWUserContext iwc, String pageKey, String parentID, String objectID) {
IBXMLPage xml = getIBXMLPage(pageKey);
XMLElement element = (XMLElement) iwc.getSessionAttribute(CLIPBOARD);
if (element == null) {
return (false);
}
XMLElement toPaste = (XMLElement) element.clone();
if (XMLWriter.pasteElementBelow(xml, pageKey, parentID, objectID, toPaste)) {
xml.store();
return (true);
}
return (false);
}
/**
* Copies, cuts and then pastes the module as the last item in a region
* @param instanceId
* @param formerParentId
* @param pageKey
* @param regionId
* @param regionLabel
* @return
* @throws Exception
*/
public boolean moveModuleIntoRegion(String instanceId, String formerParentId, String pageKey, String regionId, String regionLabel) throws Exception {
boolean returner = false;
if("null".equals(regionLabel)){
regionLabel = null;
}
IBXMLPage page = getIBXMLPage(pageKey);
//find
XMLElement moduleXML = XMLWriter.findModule(page,instanceId);
XMLElement parentXML = XMLWriter.findModule(page,formerParentId);
XMLElement moduleXMLCopy = (XMLElement)moduleXML.clone();
if(moduleXML!=null && parentXML!=null){
//remove
try {
returner = XMLWriter.removeElement(parentXML,moduleXML,false);
}
catch (Exception e) {
e.printStackTrace();
throw new Exception(e.getMessage());
}
if(returner){
returner = XMLWriter.insertElementLastIntoParentOrRegion(page, pageKey, regionId, regionLabel,moduleXMLCopy);
}
if(!returner){
return false;
}
return page.store();
}
return returner;
}
/**
* Copies, cuts and then pastes the module below another module
* @param objectId
* @param pageKey
* @param formerParentId
* @param newParentId
* @param objectIdToPasteBelow
* @return
* @throws Exception
*/
public boolean moveModule(String instanceId, String pageKey, String formerParentId, String newParentId, String instanceIdToPasteBelow) throws Exception{
// System.out.println("pageKey = " + pageKey);
// System.out.println("parentID = " + formerParentId);
// System.out.println("instanceId = " + instanceId);
// System.out.println("newparentID = " + newParentId);
// System.out.println("instanceIdToPasteBelow = " +objectIdToPasteBelow);
boolean returner = false;
//find the XMLElement
//remove it from the page
//insert it after the object we dropped on
IBXMLPage page = getIBXMLPage(pageKey);
//find
XMLElement moduleXML = XMLWriter.findModule(page,instanceId);
XMLElement parentXML = XMLWriter.findModule(page,formerParentId);
XMLElement moduleXMLCopy = (XMLElement)moduleXML.clone();
if(moduleXML!=null && parentXML!=null){
//remove
try {
returner = XMLWriter.removeElement(parentXML,moduleXML,false);
}
catch (Exception e) {
e.printStackTrace();
throw new Exception(e.getMessage());
}
if(!returner) {
return false;
//insert
}
returner = XMLWriter.insertElementBelow(page,newParentId,moduleXMLCopy,instanceIdToPasteBelow);
if(!returner){
return false;
}
return page.store();
}
return false;
}
public boolean lockRegion(String pageKey, String parentObjectInstanceID) {
IBXMLPage xml = getIBXMLPage(pageKey);
if (XMLWriter.lockRegion(xml, parentObjectInstanceID)) {
xml.store();
if (parentObjectInstanceID.equals("-1")) {
if (xml.getType().equals(CachedBuilderPage.TYPE_TEMPLATE)) {
List extend = xml.getUsingTemplate();
if (extend != null) {
Iterator i = extend.iterator();
while (i.hasNext()) {
lockRegion((String) i.next(), parentObjectInstanceID);
}
}
}
}
return true;
}
return (false);
}
public boolean unlockRegion(String pageKey, String parentObjectInstanceID, String label) {
IBXMLPage xml = getIBXMLPage(pageKey);
if (XMLWriter.unlockRegion(xml, parentObjectInstanceID)) {
xml.store();
if (parentObjectInstanceID.equals("-1")) {
if (xml.getType().equals(CachedBuilderPage.TYPE_TEMPLATE)) {
List extend = xml.getUsingTemplate();
if (extend != null) {
Iterator i = extend.iterator();
while (i.hasNext()) {
String child = (String) i.next();
unlockRegion(child, parentObjectInstanceID, null);
}
}
}
}
labelRegion(pageKey, parentObjectInstanceID, label);
return true;
}
return (false);
}
/**
* *
*/
public boolean addNewModule(String pageKey, String parentObjectInstanceID, int newICObjectID, String label) {
IBXMLPage xml = getIBXMLPage(pageKey);
//TODO add handling for generic UIComponent adding
if (XMLWriter.addNewModule(xml, pageKey, parentObjectInstanceID, newICObjectID, label)) {
xml.store();
return (true);
}
return (false);
}
/**
* *
*/
public boolean addNewModule(String pageKey, String parentObjectInstanceID, ICObject newObjectType, String label) {
IBXMLPage xml = getIBXMLPage(pageKey);
if (XMLWriter.addNewModule(xml, pageKey, parentObjectInstanceID, newObjectType, label)) {
xml.store();
return true;
}
return false;
}
public Class getObjectClass(int icObjectInstanceID) {
try {
ICObjectInstance instance = ((com.idega.core.component.data.ICObjectInstanceHome) com.idega.data.IDOLookup.getHomeLegacy(ICObjectInstance.class)).findByPrimaryKeyLegacy(icObjectInstanceID);
return instance.getObject().getObjectClass();
}
catch (Exception e) {
e.printStackTrace();
}
return null;
}
private boolean isPropertyMultivalued(String propertyName, String instanceId, IWMainApplication iwma) throws Exception {
try {
Class c = null;
IWBundle iwb = null;
if ("-1".equals(instanceId)) {
c = com.idega.presentation.Page.class;
iwb = iwma.getBundle(PresentationObject.IW_BUNDLE_IDENTIFIER);
}
else {
ICObjectInstance instance = ((com.idega.core.component.data.ICObjectInstanceHome) com.idega.data.IDOLookup.getHomeLegacy(ICObjectInstance.class)).findByPrimaryKeyLegacy(Integer.parseInt(instanceId));
c = instance.getObject().getObjectClass();
iwb = instance.getObject().getBundle(iwma);
}
//IWPropertyList complist = iwb.getComponentList();
IWPropertyList component = iwb.getComponentPropertyList(c.getName());
IWPropertyList methodlist = component.getPropertyList(IBPropertyHandler.METHODS_KEY);
if (methodlist == null) {
return (false);
}
IWPropertyList method = methodlist.getPropertyList(propertyName);
if (method == null) {
return (false);
}
IWProperty prop = method.getIWProperty(IBPropertyHandler.METHOD_PROPERTY_ALLOW_MULTIVALUED);
if (prop != null) {
boolean value = prop.getBooleanValue();
return value;
}
return false;
}
catch (Exception e) {
//e.printStackTrace(System.err);
return false;
}
}
public boolean setTemplateId(String pageKey, String id) {
IBXMLPage xml = getIBXMLPage(pageKey);
if (XMLWriter.setAttribute(xml, "-1", XMLConstants.TEMPLATE_STRING, id)) {
xml.store();
return true;
}
return (false);
}
/**
* *
*/
public PresentationObject getPasteIcon(String parentKey,String regionLabel, IWContext iwc) {
Image pasteImage = getBuilderBundle().getImage("paste.gif", "Paste component");
Link link = new Link(pasteImage);
link.setStyleClass("regionButton");
link.setWindowToOpen(IBPasteModuleWindow.class);
link.addParameter(BuilderConstants.IB_PAGE_PARAMETER, getCurrentIBPage(iwc));
link.addParameter(IB_CONTROL_PARAMETER, ACTION_PASTE);
link.addParameter(IB_PARENT_PARAMETER, parentKey);
if(regionLabel!=null){
link.addParameter(IB_LABEL_PARAMETER , regionLabel);
}
return (link);
}
/**
* *
*/
public boolean labelRegion(String pageKey, String parentObjectInstanceID, String label) {
IBXMLPage xml = getIBXMLPage(pageKey);
if (XMLWriter.labelRegion(xml, parentObjectInstanceID, label)) {
xml.store();
return true;
}
return (false);
}
public String getCurrentIBPageURL(IWContext iwc) {
String sPageId = getCurrentIBPage(iwc);
int pageId = Integer.parseInt(sPageId);
return getIBPageURL(iwc,pageId);
}
/**
* *
*/
public String getIBPageURL(IWApplicationContext iwc, int ib_page_id) {
String pageKey = Integer.toString(ib_page_id);
return getIBPageURL(iwc,pageKey);
}
public String getIBPageURL(IWApplicationContext iwc, String pageKey) {
if(IWMainApplication.useNewURLScheme){
//String pageKey = Integer.toString(ib_page_id);
String pageUri = getPageCacher().getCachedBuilderPage(pageKey).getPageUri();
if(pageUri!=null){
String returnUrl = iwc.getIWMainApplication().getBuilderPagePrefixURI()+pageUri;
//clean out the potential double slash:
return StringHandler.removeMultipleSlashes(returnUrl);
}
return iwc.getIWMainApplication().getBuilderPagePrefixURI()+pageKey+"/";
}
StringBuffer url = new StringBuffer();
url.append(iwc.getIWMainApplication().getBuilderPagePrefixURI());
int ib_page_id = Integer.parseInt(pageKey);
if (ib_page_id > 0) {
url.append("?");
url.append(BuilderConstants.IB_PAGE_PARAMETER);
url.append("=");
url.append(ib_page_id);
}
return url.toString();
}
/**
* *
*/
public String getIFrameContentURL(IWContext iwc, int ICObjectInstanceId) {
String src = iwc.getIWMainApplication().getIFrameContentURI() + "?" + IC_OBJECT_INSTANCE_ID_PARAMETER + "=" + ICObjectInstanceId;
String query = iwc.getQueryString();
if (query != null && !query.equals("")) {
src += ("&" + query);
}
return src;
}
/**
* Changes the name of the current page.
*
* @param name
* The new name for the page
* @param iwc
* The IdegeWeb Context object
*/
public void changeName(String name, IWContext iwc) {
CachedBuilderPage xml = getCurrentCachedBuilderPage(iwc);
if (xml != null) {
if (!xml.getName().equals(name)) {
xml.setName(name);
java.util.Map tree = PageTreeNode.getTree(iwc);
if (tree != null) {
String currentId = getCurrentIBPage(iwc);
if (currentId != null) {
Integer id = new Integer(currentId);
PageTreeNode node = (PageTreeNode) tree.get(id);
if (node != null) {
node.setNodeName(name);
}
}
}
}
}
}
/**
* Changes the template id for the current page.
*
* @param newTemplateId
* The new template id for the current page.
* @param iwc
* The IdegeWeb Context object @todo make this work for templates!
*/
public void changeTemplateId(String newTemplateId, IWContext iwc) {
IBXMLPage xml = getCurrentIBXMLPage(iwc);
if (xml != null) {
if (xml.getType().equals(CachedBuilderPage.TYPE_PAGE)) {
//int newId = Integer.parseInt(templateId);
String oldId = xml.getTemplateKey();
if (!newTemplateId.equals(oldId)) {
xml.setTemplateKey(newTemplateId);
String currentPageId = getCurrentIBPage(iwc);
setTemplateId(currentPageId, newTemplateId);
//if (newId > 0)
getCachedBuilderPage(newTemplateId).addPageUsingThisTemplate(currentPageId);
//if (oldId > 0)
getCachedBuilderPage(oldId).removePageAsUsingThisTemplate(currentPageId);
}
}
}
}
/**
* *
*/
public void startBuilderSession(IWUserContext iwuc) {
iwuc.setSessionAttribute(IB_APPLICATION_RUNNING_SESSION, Boolean.TRUE);
}
/**
* *
*/
public void endBuilderSession(IWUserContext iwuc) {
iwuc.removeSessionAttribute(IB_APPLICATION_RUNNING_SESSION);
}
/**
* *
*/
public boolean isBuilderApplicationRunning(IWUserContext iwuc) {
return !(iwuc.getSessionAttribute(IB_APPLICATION_RUNNING_SESSION) == null);
}
/**
* *
*/
public PresentationObject getIFrameContent(int instanceId, IWContext iwc) {
PresentationObject obj = EventLogic.getPopulatedObjectInstance(instanceId, iwc);
PresentationObject iframeContent = null;
if (obj instanceof IFrameContainer && obj != null) {
iframeContent = ((IFrameContainer) obj).getIFrameContent();
}
return iframeContent;
}
/**
* *
*/
public void changeDPTCrawlableLinkedPageId(int moduleId, String currentPageID, String newLinkedPageId) {
IBXMLPage page = getIBXMLPage(currentPageID);
XMLElement element = new XMLElement(XMLConstants.CHANGE_PAGE_LINK);
XMLAttribute id = new XMLAttribute(XMLConstants.LINK_ID_STRING, Integer.toString(moduleId));
XMLAttribute newPageLink = new XMLAttribute(XMLConstants.LINK_TO, newLinkedPageId);
element.setAttribute(id);
element.setAttribute(newPageLink);
XMLWriter.addNewElement(page, "-1", element);
page.store();
getPageCacher().flagPageInvalid(currentPageID);
}
/**
* *
*/
public int getStartPageId(IWApplicationContext iwac) {
ICDomain domain = getCurrentDomain(iwac);
return domain.getStartPageID();
}
/**
* *
*/
public String getStartPageKey(IWApplicationContext iwac) {
int id = getStartPageId(iwac);
return Integer.toString(id);
}
/**
* *
*/
public int getStartPageIdByServerName(String serverName) {
ICDomain domain = getCurrentDomainByServerName(serverName);
return domain.getStartPageID();
}
/**
* *
*/
public int getStartPageIdByServerName(IWApplicationContext iwac,String serverName) {
ICDomain domain = getCurrentDomainByServerName(iwac,serverName);
return domain.getStartPageID();
}
/**
* *
*/
public String getCurrentPageHtml(IWContext iwc) {
String ibpage = getCurrentIBPage(iwc);
ICDomain domain = getCurrentDomain(iwc);
StringBuffer url = new StringBuffer(domain.getURL());
// url.append(IWMainApplication.BUILDER_SERVLET_URL);
// url.append(iwc.getApplication().getBuilderServletURI());
// url.append("?");
// url.append(IB_PAGE_PARAMETER);
// url.append("=");
url.append(this.getIBPageURL(iwc, Integer.parseInt(ibpage)));
if (url.toString().indexOf("http") == -1) {
url.insert(0, "http://");
}
String html = FileUtil.getStringFromURL(url.toString());
return (html);
}
/**
* Invalidates cache for all pages and the cached page tree
*/
public void clearAllCachedPages() {
System.out.println("Clearing all BuilderPageTree Cache");
PageTreeNode.clearTree(IWMainApplication.getDefaultIWApplicationContext());
System.out.println("Clearing all BuilderPage Cache");
getPageCacher().flagAllPagesInvalid();
}
/**
* Invalidates all caches for a page with key pageKey
* @param pageKey
*/
public void invalidatePage(String pageKey){
getPageCacher().flagPageInvalid(pageKey);
}
private PageCacher pageCacher;
/**
* Return the singleton instance of PageCacher
* @return
*/
public PageCacher getPageCacher(){
if(this.pageCacher==null){
setPageCacher(new PageCacher());
}
return this.pageCacher;
}
public void setPageCacher(PageCacher pageCacherInstance){
this.pageCacher=pageCacherInstance;
}
private IBPageHelper ibPageHelper;
/**
* Return the singleton instance of IBPageHelper
* @return
*/
public synchronized IBPageHelper getIBPageHelper(){
if(this.ibPageHelper==null){
setIBPageHelper(new IBPageHelper());
}
return this.ibPageHelper;
}
public void setIBPageHelper(IBPageHelper ibPageHelper){
this.ibPageHelper=ibPageHelper;
}
/**
* Return an array of the document formats that the Builder supports.
* ('IBXML','HTML','JSP_1_2')
* @return
*/
public String[] getPageFormatsSupported(){
return this.pageFormats;
}
/**
* <p>
* Returns a map with pageFormat as key and descripton as value
* </p>
* @return
*/
public Map getPageFormatsSupportedAndDescription(){
Map map = new HashMap();
map.put(this.PAGE_FORMAT_IBXML,"Builder (IBXML)");
map.put(this.PAGE_FORMAT_HTML,"HTML");
map.put(this.PAGE_FORMAT_JSP_1_2,"JSP 1.2");
return map;
}
/**
* gets the default page format:
* @return
*/
public String getDefaultPageFormat(){
return this.PAGE_FORMAT_IBXML;
}
/**
*
*/
public PresentationObject getAddIcon(String parentKey, IWContext iwc, String label){
Image addImage = getBuilderBundle().getImage("add.gif", "Add new component");
Link link = new Link(addImage);
link.setStyleClass("regionButton");
link.setWindowToOpen(IBAddModuleWindow.class);
link.addParameter(BuilderConstants.IB_PAGE_PARAMETER, getCurrentIBPage(iwc));
link.addParameter(BuilderLogic.IB_CONTROL_PARAMETER, BuilderLogic.ACTION_ADD);
link.addParameter(BuilderLogic.IB_PARENT_PARAMETER, parentKey);
link.addParameter(BuilderLogic.IB_LABEL_PARAMETER, label);
if(label!=null){
link.setToolTip(label);
}
return link;
}
/**
*
*/
public PresentationObject getLockedIcon(String parentKey, IWContext iwc, String label){
Image lockImage = getBuilderBundle().getImage("las_close.gif", "Unlock region");
Link link = new Link(lockImage);
link.setStyleClass("regionButton");
link.setWindowToOpen(IBLockRegionWindow.class);
link.addParameter(BuilderConstants.IB_PAGE_PARAMETER, getCurrentIBPage(iwc));
link.addParameter(BuilderLogic.IB_CONTROL_PARAMETER, BuilderLogic.ACTION_UNLOCK_REGION);
link.addParameter(BuilderLogic.IB_PARENT_PARAMETER, parentKey);
link.addParameter(BuilderLogic.IB_LABEL_PARAMETER, label);
if(label!=null){
link.setToolTip(label);
}
return (link);
}
/**
*
*/
public PresentationObject getUnlockedIcon(String parentKey, IWContext iwc){
Image lockImage = getBuilderBundle().getImage("las_open.gif", "Lock region");
Link link = new Link(lockImage);
link.setStyleClass("regionButton");
link.setWindowToOpen(IBLockRegionWindow.class);
link.addParameter(BuilderConstants.IB_PAGE_PARAMETER, getCurrentIBPage(iwc));
link.addParameter(BuilderLogic.IB_CONTROL_PARAMETER, BuilderLogic.ACTION_LOCK_REGION);
link.addParameter(BuilderLogic.IB_PARENT_PARAMETER, parentKey);
return (link);
}
/**
*
*/
public PresentationObject getLabelIcon(String parentKey, IWContext iwc, String label){
Image labelImage = getBuilderBundle().getImage("label.gif", "Put label on region");
Link link = new Link(labelImage);
link.setStyleClass("regionButton");
link.setWindowToOpen(IBAddRegionLabelWindow.class);
link.addParameter(BuilderConstants.IB_PAGE_PARAMETER, getCurrentIBPage(iwc));
link.addParameter(BuilderLogic.IB_CONTROL_PARAMETER, BuilderLogic.ACTION_LABEL);
link.addParameter(BuilderLogic.IB_PARENT_PARAMETER, parentKey);
link.addParameter(BuilderLogic.IB_LABEL_PARAMETER, label);
if(label!=null){
link.setToolTip(label);
}
return (link);
}
public PresentationObject getCutIcon(String key, String parentKey, IWContext iwc){
Image cutImage = getBuilderBundle().getImage("cut_16.gif", "Cut component",16,16);
Link link = new Link(cutImage);
link.setStyleClass("moduleButton");
link.setWindowToOpen(IBCutModuleWindow.class);
link.addParameter(BuilderConstants.IB_PAGE_PARAMETER, getCurrentIBPage(iwc));
link.addParameter(BuilderLogic.IB_CONTROL_PARAMETER, BuilderLogic.ACTION_COPY);
link.addParameter(BuilderLogic.IB_PARENT_PARAMETER, parentKey);
link.addParameter(BuilderLogic.IC_OBJECT_INSTANCE_ID_PARAMETER, key);
return link;
}
/**
*
*/
public PresentationObject getCopyIcon(String key, String parentKey, IWContext iwc){
Image copyImage = getBuilderBundle().getImage("copy_16.gif", "Copy component",16,16);
//copyImage.setAttribute("style","z-index: 0;");
Link link = new Link(copyImage);
link.setStyleClass("moduleButton");
link.setWindowToOpen(IBCopyModuleWindow.class);
link.addParameter(BuilderConstants.IB_PAGE_PARAMETER, getCurrentIBPage(iwc));
link.addParameter(BuilderLogic.IB_CONTROL_PARAMETER, BuilderLogic.ACTION_COPY);
link.addParameter(BuilderLogic.IB_PARENT_PARAMETER, parentKey);
link.addParameter(BuilderLogic.IC_OBJECT_INSTANCE_ID_PARAMETER, key);
return (link);
}
public PresentationObject getDeleteIcon(String key, String parentKey, IWContext iwc){
Image deleteImage = getBuilderBundle().getImage("del_16.gif", "Delete component",16,16);
Link link = new Link(deleteImage);
link.setStyleClass("moduleButton");
link.setWindowToOpen(IBDeleteModuleWindow.class);
link.addParameter(BuilderConstants.IB_PAGE_PARAMETER, getCurrentIBPage(iwc));
link.addParameter(BuilderLogic.IB_CONTROL_PARAMETER, BuilderLogic.ACTION_DELETE);
link.addParameter(BuilderLogic.IB_PARENT_PARAMETER, parentKey);
link.addParameter(BuilderLogic.IC_OBJECT_INSTANCE_ID_PARAMETER, key);
return link;
}
public PresentationObject getPermissionIcon(String key, IWContext iwc){
Image editImage = getBuilderBundle().getImage("lock_16.gif", "Set permissions",16,16);
Link link = new Link(editImage);
link.setStyleClass("moduleButton");
link.setWindowToOpen(IBPermissionWindow.class);
link.addParameter(BuilderConstants.IB_PAGE_PARAMETER, getCurrentIBPage(iwc));
link.addParameter(BuilderLogic.IB_CONTROL_PARAMETER, BuilderLogic.ACTION_PERMISSION);
link.addParameter(IBPermissionWindow._PARAMETERSTRING_IDENTIFIER, key);
link.addParameter(
IBPermissionWindow._PARAMETERSTRING_PERMISSION_CATEGORY,
AccessController.CATEGORY_OBJECT_INSTANCE);
return link;
}
public PresentationObject getEditIcon(String key, IWContext iwc){
Image editImage = getBuilderBundle().getImage("prefs_16.gif", "Properties",16,16);
Link link = new Link(editImage);
link.setStyleClass("moduleButton");
link.setWindowToOpen(IBPropertiesWindow.class);
link.addParameter(BuilderConstants.IB_PAGE_PARAMETER, getCurrentIBPage(iwc));
link.addParameter(BuilderLogic.IB_CONTROL_PARAMETER, BuilderLogic.ACTION_EDIT);
link.addParameter(BuilderLogic.IC_OBJECT_INSTANCE_ID_PARAMETER, key);
return link;
}
/**
*
*/
public PresentationObject getPasteAboveIcon(String key, String parentKey, IWContext iwc)
{
Image pasteImage = getBuilderBundle().getImage("paste_16.gif", "Paste above component",16,16);
//copyImage.setAttribute("style","z-index: 0;");
Link link = new Link(pasteImage);
link.setStyleClass("moduleButton");
link.setWindowToOpen(IBPasteModuleWindow.class);
link.addParameter(BuilderConstants.IB_PAGE_PARAMETER, getCurrentIBPage(iwc));
link.addParameter(BuilderLogic.IB_CONTROL_PARAMETER, BuilderLogic.ACTION_PASTE_ABOVE);
link.addParameter(BuilderLogic.IB_PARENT_PARAMETER, parentKey);
link.addParameter(BuilderLogic.IC_OBJECT_INSTANCE_ID_PARAMETER, key);
return (link);
}
public ViewNode getBuilderPageRootViewNode(){
String BUILDER_PAGE_VIEW_ID="pages";
return ViewManager.getInstance(IWMainApplication.getDefaultIWMainApplication()).getApplicationRoot().getChild(BUILDER_PAGE_VIEW_ID);
}
public String getInstanceId(UIComponent object) {
if(object instanceof PresentationObject){
int icObjectInstanceId = ((PresentationObject)object).getICObjectInstanceID();
if(icObjectInstanceId!=-1){
return Integer.toString(icObjectInstanceId);
}
}
//set from the xml
return object.getId();
}
/**
* Gets a copy of a UIComponent by its instanceId (component.getId()) if it is found in the current pages ibxml
* @param component
* @return A reset copy of the component from ibxml
*/
public UIComponent getCopyOfUIComponentFromIBXML(UIComponent component) {
String instanceId = getInstanceId(component);
UIComponent newComponent = null;
try {
newComponent = (UIComponent) component.getClass().newInstance();
newComponent.setId(instanceId);
PropertyCache.getInstance().setAllCachedPropertiesOnInstance(instanceId, newComponent);
}
catch (Exception e) {
e.printStackTrace();
return component;
}
return newComponent;
}
/**
* @param containerId
* @return
*/
public String getDraggableScript(String containerId, String handleId) {
// return " new Draggable('"+containerId+"',{handle:'"+handleAndMenuLayer.getID()+"',revert:true});";
return " new Draggable('"+containerId+"',{handle:'"+handleId+"',revert:true, " +
"endeffect: function(element, top_offset, left_offset) { " +
//" new Effect.Opacity(element, {duration:0.2, from:0.7, to:1.0}); " +
" new Effect.Pulsate(element,{duration:1.5});" +
"}});";
}
public String getModuleToModuleDroppableScript(String contentLayerId, String droppableId, String acceptableStyleClasses, String hoverStyleClass, String webServiceURI) {
//TODO make an external script (as much as possible)
return "Droppables.add('"+droppableId+"',{accept:['"+acceptableStyleClasses+"'],hoverclass:'"+hoverStyleClass+"'," +
"onDrop: " +
"function(element) { \n" +
" var elementContainerId = element.id; \n" +
" var dropTargetId = '"+contentLayerId+"'; \n" +
" var dropTarget = $(dropTargetId); \n" +
" var elementInstanceId = $('instanceId_'+elementContainerId).value; \n" +
" var dropTargetInstanceId = $('instanceId_'+dropTargetId).value \n;" +
" var currentPageKey = $('pageId_'+dropTargetId).value; \n" +
" var formerParentId = $('parentId_'+elementContainerId).value; \n" +
" var newParentId = $('parentId_'+dropTargetId).value; \n" +
" var webServiceURI = '"+webServiceURI+"'\n"+
" var query = 'method=moveModule&objectId='+elementInstanceId+'&pageKey='+currentPageKey+'&formerParentId='+formerParentId+'&newParentId='+newParentId+'&objectIdToPasteBelow='+dropTargetInstanceId; \n" +
//" alert(query);" +
" new Ajax.Request(webServiceURI+'?'+query, { \n" +
" onComplete: function(request) { \n" +
" if(request.responseText.indexOf('iwbuilder-ok')>=0){ \n" +
" $('parentId_'+elementContainerId).value = newParentId; " +
" dropTarget.parentNode.insertBefore(element,dropTarget); \n" +
" element.parentNode.insertBefore(dropTarget,element); \n" +
" $('parentId_'+elementContainerId).value = newParentId; \n" +
" }else { alert(request.responseText); } \n" +
" }, method: 'GET',asynchronous: true})" +
//OLD WAY that did not work for droppables within droppables after one drag.
// " var elementHandleId = 'handle_'+elementContainerId;" +
// " var scriptLayer = $('script_'+elementContainerId);" +
// " var scriptLayerId = scriptLayer.id;" +
//Copy the moduleContainer layer
//" new Insertion['After']($('"+contentLayerId+"'), '<div class=moduleContainer id='+elementContainerId+' >'+element.innerHTML+' </div>');" +
//get rid of the old
//" Element.remove(element); " +
//" element = null;" +
//Copy the script layer also!
//" new Insertion['After']($(elementContainerId), '<div class=script id='+scriptLayerId+' >'+scriptLayer.innerHTML+' </div>');" +
"}});";
}
public String getModuleToRegionDroppableScript(String regionMarkerId, String pageKey, String regionId, String regionLabel, String acceptableStyleClasses, String hoverStyleClass, String webServiceURI) {
return "Droppables.add('"+regionMarkerId+"',{accept:['"+acceptableStyleClasses+"'],hoverclass:'"+hoverStyleClass+"'," +
"onDrop: " +
"function(element) { \n" +
" var elementContainerId = element.id; \n" +
" var dropTargetId = '"+regionMarkerId+"'; \n" +
" var dropTarget = $(dropTargetId); \n" +
" var elementInstanceId = $('instanceId_'+elementContainerId).value; \n" +
" var currentPageKey = '"+pageKey+"' \n" +
" var formerParentId = $('parentId_'+elementContainerId).value; \n" +
" var regionId = '"+regionId+"'; \n" +
" var regionLabel = '"+regionLabel+"'\n" +
" var webServiceURI = '"+webServiceURI+"'\n"+
" var query = 'method=moveModuleIntoRegion&instanceId='+elementInstanceId+'&formerParentId='+formerParentId+'&pageKey='+currentPageKey+'®ionId='+regionId+'®ionLabel='+regionLabel; \n" +
" new Ajax.Request(webServiceURI+'?'+query, { \n" +
" onComplete: function(request) { \n" +
" if(request.responseText.indexOf('iwbuilder-ok')>=0){ \n" +
" dropTarget.parentNode.insertBefore(element,dropTarget); \n" +
" $('parentId_'+elementContainerId).value = regionId; " +
" }else { alert(request.responseText); } \n" +
" }, method: 'GET',asynchronous: true}) " +
"}});";
}
public IWBundle getBuilderBundle(){
return IWMainApplication.getDefaultIWMainApplication().getBundle(IW_BUNDLE_IDENTIFIER);
}
}