/* * $Id: ICObjectBMPBean.java,v 1.25 2008/11/17 08:40:07 laddi Exp $ * Created in 2001 by Tryggvi Larusson * * Copyright (C) 2001-2006 Idega Software hf. All Rights Reserved. * * This software is the proprietary information of Idega hf. * Use is subject to license terms. */ package com.idega.core.component.data; import java.sql.SQLException; import java.text.Collator; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.List; import java.util.Vector; import javax.ejb.FinderException; import com.idega.core.file.data.ICFile; import com.idega.data.GenericEntity; import com.idega.data.IDOEntity; import com.idega.data.IDOException; import com.idega.data.IDOLookup; import com.idega.data.IDOLookupException; import com.idega.data.query.CountColumn; import com.idega.data.query.MatchCriteria; import com.idega.data.query.SelectQuery; import com.idega.data.query.Table; import com.idega.data.query.WildCardColumn; import com.idega.exception.IWBundleDoesNotExist; import com.idega.idegaweb.IWBundle; import com.idega.idegaweb.IWMainApplication; import com.idega.presentation.PresentationObject; import com.idega.repository.data.RefactorClassRegistry; /** * <p> * This is a bean implementation for the ICObject entity and is backed by the IC_OBJECT * table in the SQL database.<br/> * The purpose of this entity is to serve as a component registry for an idegaWeb * application. This table can hold a registry of different components such as * Elements,Blocks and JSF UIComponents.<br/> * This table is updated and synchronized with the IWBundle system, i.e. that every * time the application starts it updates the IC_OBJECT table with all components * registered in all idegaWeb bundles installed in the web-application. * </p> * Last modified: $Date: 2008/11/17 08:40:07 $ by $Author: laddi $ * * @author <a href="mailto:tryggvil@idega.com">Tryggvi Larusson</a> * @version $Revision: 1.25 $ */ public class ICObjectBMPBean extends GenericEntity implements ICObject { private static final long serialVersionUID = -7531187796468485951L; public static final String COMPONENT_TYPE_ELEMENT = "iw.element"; public static final String COMPONENT_TYPE_BLOCK = "iw.block"; public static final String COMPONENT_TYPE_APPLICATION = "iw.application"; public static final String COMPONENT_TYPE_APPLICATION_COMPONENT = "iw.application.component"; public static final String COMPONENT_TYPE_DATA = "iw.data"; public static final String COMPONENT_TYPE_HOME = "iw.home"; public static final String COMPONENT_TYPE_PROPERTYHANDLER = "iw.propertyhandler"; public static final String COMPONENT_TYPE_INPUTHANDLER = "iw.inputhandler"; public static final String COMPONENT_TYPE_SEARCH_PLUGIN = "iw.searchplugin"; public static final String COMPONENT_TYPE_JSFUICOMPONENT = "jsf.uicomponent"; private static final String object_type_column_name = "OBJECT_TYPE"; public static final String class_name_column_name = "CLASS_NAME"; private final static String BUNDLE_COLUMN_NAME = "BUNDLE"; private final static String class_value_column_name = "CLASS_VALUE"; private final static String icon_file = "ICON_FILE"; private final static String icon_uri = "ICON_URI"; private static final String COLUMN_OBJECT_NAME = "OBJECT_NAME"; private static final String WIDGET = "WIDGET"; private static final String BLOCK = "BLOCK"; private static final String COLUMN_DESCRIPTION = "description"; private static boolean allCached = true; private static int totalObjectsRegistered = -1; //private static Collection cachedList; public ICObjectBMPBean() { super(); } public ICObjectBMPBean(int id) throws SQLException { super(id); } @Override public void initializeAttributes() { //par1: column name, par2: visible column name, par3-par4: editable/showable, par5 ... addAttribute(getIDColumnName()); addAttribute(getColumnObjectName(), "Name", true, true, java.lang.String.class); addAttribute(getClassNameColumnName(), "Class Name", true, true, java.lang.String.class); addAttribute(getObjectTypeColumnName(), "Class Name", true, true, java.lang.String.class, "one-to-many", ICObjectType.class); addAttribute(getBundleColumnName(), "Bundle", true, true, java.lang.String.class, 1000); addManyToOneRelationship(getColumnClassValue(), "Class File", ICFile.class); addManyToOneRelationship(getColumnIcon(), "Icon", ICFile.class); addAttribute(getWidgetColumnName(),"Widget",true,true,Boolean.class); addAttribute(getBlockColumnName(),"Block",true,true,Boolean.class); addAttribute(getIconURIColumnName(),"Icon URI",true,true,String.class); addAttribute(COLUMN_DESCRIPTION, "Description", String.class, 4000); //addAttribute("settings_url","Sl?? stillingas??u",true,true,"java.lang.String"); //addAttribute("class_value","Klasi sj?lfur",true,true,"java.sql.Blob"); //addAttribute("small_icon_image_id","Icon 16x16 (.gif)",false,false,"java.lang.Integer","many-to-one","com.idega.data.genericentity.Image"); //addAttribute("small_icon_image_id","Icon 16x16 (.gif)",false,false,java.lang.Integer.class); //addAttribute("image_id","MyndN?mer",false,false,"java.lang.Integer","one-to-many","com.idega.projects.golf.entity.ImageEntity"); if(allCached){ getEntityDefinition().setBeanCachingActiveByDefault(true,true); getEntityDefinition().setUseFinderCollectionPrefetch(true); } } private String getColumnObjectName() { return COLUMN_OBJECT_NAME; } public static String getObjectTypeColumnName() { return object_type_column_name; } public static String getClassNameColumnName() { return class_name_column_name; } public static String getColumnClassValue() { return class_value_column_name; } public static String getColumnIcon() { return icon_file; } public static String getWidgetColumnName() { return WIDGET; } public static String getBlockColumnName() { return BLOCK; } public static String getIconURIColumnName() { return icon_uri; } private static List componentList; public static List getAvailableComponentTypes() { try { ICObjectTypeHome gtHome = (ICObjectTypeHome) IDOLookup.getHome(ICObjectType.class); List list = new Vector(gtHome.findAll()); return list; } catch (IDOLookupException e) { e.printStackTrace(); } catch (FinderException e1) { e1.printStackTrace(); } return getAvailableComponentTypesOld(); } private static List getAvailableComponentTypesOld() { if (componentList == null) { componentList = new Vector(); componentList.add(com.idega.core.component.data.ICObjectBMPBean.COMPONENT_TYPE_ELEMENT); componentList.add(com.idega.core.component.data.ICObjectBMPBean.COMPONENT_TYPE_BLOCK); componentList.add(com.idega.core.component.data.ICObjectBMPBean.COMPONENT_TYPE_APPLICATION); componentList.add(com.idega.core.component.data.ICObjectBMPBean.COMPONENT_TYPE_APPLICATION_COMPONENT); componentList.add(com.idega.core.component.data.ICObjectBMPBean.COMPONENT_TYPE_DATA); componentList.add(com.idega.core.component.data.ICObjectBMPBean.COMPONENT_TYPE_HOME); componentList.add(com.idega.core.component.data.ICObjectBMPBean.COMPONENT_TYPE_PROPERTYHANDLER); componentList.add(com.idega.core.component.data.ICObjectBMPBean.COMPONENT_TYPE_SEARCH_PLUGIN); } return componentList; } public static ICObject getICObject(String className) { try { /*List l = EntityFinder.findAllByColumn(getStaticInstance(ICObject.class), getClassNameColumnName(), className); return (ICObject) l.get(0);*/ ICObjectHome home = (ICObjectHome)IDOLookup.getHome(ICObject.class); return home.findByClassName(className); } catch (Exception e) { return null; } } /*public static void removeICObject(String className) { try { ICObject instance = (ICObject) com.idega.data.GenericEntity.getStaticInstance(ICObject.class); instance.deleteMultiple(getClassNameColumnName(), className); } catch (Exception e) { } }*/ @Override public void insertStartData() throws Exception { /*ICObject obj = ((com.idega.core.data.ICObjectHome)com.idega.data.IDOLookup.getHomeLegacy(ICObject.class)).createLegacy(); obj.setName("Table"); obj.setObjectClass(Table.class); obj.setObjectType("iw.element"); obj.insert(); obj = ((com.idega.core.data.ICObjectHome)com.idega.data.IDOLookup.getHomeLegacy(ICObject.class)).createLegacy(); obj.setName("Image"); obj.setObjectClass(com.idega.presentation.Image.class); obj.setObjectType("iw.element"); obj.insert(); obj = ((com.idega.core.data.ICObjectHome)com.idega.data.IDOLookup.getHomeLegacy(ICObject.class)).createLegacy(); obj.setName("NewsModule"); obj.setObjectClass(NewsReader.class); obj.setObjectType("iw.block"); obj.insert(); obj = ((com.idega.core.data.ICObjectHome)com.idega.data.IDOLookup.getHomeLegacy(ICObject.class)).createLegacy(); obj.setName("TextModule"); obj.setObjectClass(TextReader.class); obj.setObjectType("iw.block"); obj.insert(); obj = ((com.idega.core.data.ICObjectHome)com.idega.data.IDOLookup.getHomeLegacy(ICObject.class)).createLegacy(); obj.setName("LoginModule"); obj.setObjectClass(Login.class); obj.setObjectType("iw.block"); obj.insert();*/ } @Override public String getEntityName() { return "IC_OBJECT"; } @Override public void setDefaultValues() { //setColumn("image_id",1); //setColumn("small_icon_image_id",1); //setObjectType("iw.block"); } @Override public Boolean isWidget() { return getBooleanColumnValue(getWidgetColumnName()); } @Override public void setIsWidget(Boolean isWidget) { setColumn(getWidgetColumnName(), isWidget); } @Override public Boolean isBlock() { return getBooleanColumnValue(getBlockColumnName()); } @Override public void setIsBlock(Boolean isBlock) { setColumn(getBlockColumnName(), isBlock); } @Override public String getIconURI() { return getStringColumnValue(getIconURIColumnName()); } @Override public void setIconURI(String iconURI) { setColumn(getIconURIColumnName(), iconURI); } @Override public String getDescription() { return getStringColumnValue(COLUMN_DESCRIPTION); } @Override public void setDescripton(String description) { setColumn(COLUMN_DESCRIPTION, description); } @Override public String getName() { return getStringColumnValue(getColumnObjectName()); } @Override public void setName(String object_name) { setColumn(getColumnObjectName(), object_name); } @Override public String getClassName() { return getStringColumnValue(getClassNameColumnName()); } @Override public void setClassName(String className) { setColumn(getClassNameColumnName(), className); } @Override public Class getObjectClass() throws ClassNotFoundException { String className = getClassName(); if (className != null) { return RefactorClassRegistry.forName(className); } else { //throw new ClassNotFoundException("Class NULL not found"); return null; } } @Override public void setObjectClass(Class c) { setClassName(c.getName()); } @Override public PresentationObject getNewInstance() throws ClassNotFoundException, IllegalAccessException, InstantiationException { return (PresentationObject) getObjectClass().newInstance(); } @Override public String getObjectType() { return getStringColumnValue(getObjectTypeColumnName()); } @Override public void setObjectType(String objectType) { setColumn(getObjectTypeColumnName(), objectType); } @Override public String getBundleIdentifier() { return getStringColumnValue(getBundleColumnName()); } @Override public void setBundleIdentifier(String bundleIdentifier) { setColumn(getBundleColumnName(), bundleIdentifier); } @Override public void setBundle(IWBundle bundle) { setBundleIdentifier(bundle.getBundleIdentifier()); } @Override public IWBundle getBundle(IWMainApplication iwma)throws IWBundleDoesNotExist { return iwma.getBundle(getBundleIdentifier()); } public static String getBundleColumnName() { return BUNDLE_COLUMN_NAME; } private int getNumberOfICObjects() { if (totalObjectsRegistered <= 0) { Table table = new Table(this); SelectQuery query = new SelectQuery(table); query.addColumn(new CountColumn(table, getIDColumnName())); try { totalObjectsRegistered = idoGetNumberOfRecords(query); } catch (IDOException e) { e.printStackTrace(); } return -1; } return totalObjectsRegistered; } public Collection ejbFindAll() throws FinderException { if (allCached) { SelectQuery query = idoSelectQuery(); Collection cachedList=new ArrayList(); Collection cachedEntitiesList = getCachedEntities(); int totalObjectsRegistered = getNumberOfICObjects(); if (cachedEntitiesList == null || cachedEntitiesList.isEmpty() || cachedEntitiesList.size() < totalObjectsRegistered || totalObjectsRegistered <= 0) { cachedList = idoFindPKsByQuery(query); } else{ for (Iterator iter = cachedEntitiesList.iterator(); iter.hasNext();) { ICObject obj = (ICObject) iter.next(); cachedList.add(obj.getPrimaryKey()); } } return cachedList; } else{ return idoFindAllIDsBySQL(); } } public Collection ejbFindAllByObjectType(String type) throws FinderException { //return super.idoFindPKsByQuery(super.idoQueryGetSelect().appendWhere().appendEqualsQuoted(this.getObjectTypeColumnName(), type)); if(allCached){ Collection allPKs = ejbFindAll(); Collection newPKs = new ArrayList(); ICObjectHome home = (ICObjectHome) getEJBLocalHome(); for (Iterator iter = allPKs.iterator(); iter.hasNext();) { Object pk = iter.next(); ICObject ico = home.findByPrimaryKey(pk); if(ico.getObjectType().equals(type)){ newPKs.add(pk); } } return newPKs; } else{ Table table = new Table(this); SelectQuery query = new SelectQuery(table); query.addColumn(new WildCardColumn()); query.addCriteria(new MatchCriteria(table,ICObjectBMPBean.getObjectTypeColumnName(),MatchCriteria.EQUALS,type,true)); return idoFindPKsByQuery(query); //return idoFindPKsByQueryIgnoringCacheAndUsingLoadBalance(query,10000); } } public Collection ejbFindAllByObjectTypeOrdered(String type) throws FinderException { if(allCached){ Collection allPKs = ejbFindAll(); Collection newPKs = new ArrayList(); ICObjectHome home = (ICObjectHome) getEJBLocalHome(); for (Iterator iter = allPKs.iterator(); iter.hasNext();) { Object pk = iter.next(); ICObject ico = home.findByPrimaryKey(pk); if(ico.getObjectType().equals(type)){ newPKs.add(pk); } } return newPKs; } else{ //return super.idoFindPKsByQuery(super.idoQueryGetSelect().appendWhere().appendEqualsQuoted(this.getObjectTypeColumnName(), type)); Table table = new Table(this); SelectQuery query = new SelectQuery(table); query.addColumn(new WildCardColumn()); query.addCriteria(new MatchCriteria(table,ICObjectBMPBean.getObjectTypeColumnName(),MatchCriteria.EQUALS,type,true)); query.addOrder(table,ICObjectBMPBean.getObjectTypeColumnName(),true); //return idoFindPKsByQuery(query); return idoFindPKsByQuery(query); } } public Collection ejbFindAllByObjectTypeAndBundle(String type, String bundle) throws FinderException { if(allCached){ Collection allPKs = ejbFindAll(); Collection newPKs = new ArrayList(); ICObjectHome home = (ICObjectHome) getEJBLocalHome(); for (Iterator iter = allPKs.iterator(); iter.hasNext();) { Object pk = iter.next(); ICObject ico = home.findByPrimaryKey(pk); String objectType = ico.getObjectType(); String bundleIdentifier = ico.getBundleIdentifier(); if(objectType!=null && bundleIdentifier !=null){ if(objectType.equals(type)&&bundleIdentifier.equals(bundle)){ newPKs.add(pk); } } } return newPKs; } else{ Table table = new Table(this); SelectQuery query = new SelectQuery(table); query.addColumn(new WildCardColumn()); query.addCriteria(new MatchCriteria(table,ICObjectBMPBean.getObjectTypeColumnName(),MatchCriteria.EQUALS,type,true)); query.addCriteria(new MatchCriteria(table,ICObjectBMPBean.getBundleColumnName(),MatchCriteria.EQUALS,bundle,true)); /* IDOQuery query = super.idoQueryGetSelect().appendWhere().appendEqualsQuoted(this.getObjectTypeColumnName(), type) .appendAndEqualsQuoted(this.getBundleColumnName(),bundle); */ //System.out.println(query.toString()); //return super.idoFindPKsByQuery(query); return idoFindPKsByQuery(query); } } public Collection ejbFindAllByBundle(String bundle) throws FinderException{ if(allCached){ Collection allPKs = ejbFindAll(); Collection newPKs = new ArrayList(); ICObjectHome home = (ICObjectHome) getEJBLocalHome(); for (Iterator iter = allPKs.iterator(); iter.hasNext();) { Object pk = iter.next(); ICObject ico = home.findByPrimaryKey(pk); if(ico.getBundleIdentifier().equals(bundle)){ newPKs.add(pk); } } return newPKs; } else{ //return super.idoFindPKsByQuery(super.idoQueryGetSelect().appendWhere().appendEqualsQuoted(this.getBundleColumnName(), bundle)); Table table = new Table(this); SelectQuery query = new SelectQuery(table); query.addColumn(new WildCardColumn()); query.addCriteria(new MatchCriteria(table,ICObjectBMPBean.getBundleColumnName(),MatchCriteria.EQUALS,bundle,true)); //return idoFindPKsByQuery(query); return idoFindPKsByQuery(query); } } public Object ejbFindByClassName(String className) throws FinderException { Object o = null; if (allCached) { try { o = findByClassNameFromCache(className); } catch(Exception e) { } } if (o == null) { o = findByClassNameFromDatabase(className); } return o; } private Object findByClassNameFromDatabase(String className) throws FinderException { Table table = new Table(this); SelectQuery query = new SelectQuery(table); query.addColumn(new WildCardColumn()); query.addCriteria(new MatchCriteria(table,ICObjectBMPBean.getClassNameColumnName(),MatchCriteria.EQUALS,className,true)); return idoFindOnePKByQuery(query); } private Object findByClassNameFromCache(String className) throws FinderException { Collection allPKs = ejbFindAll(); ICObjectHome home = (ICObjectHome) getEJBLocalHome(); for (Iterator iter = allPKs.iterator(); iter.hasNext();) { Object pk = iter.next(); ICObject ico = home.findByPrimaryKey(pk); if(ico.getClassName().equals(className)){ return pk; } } throw new FinderException("Object "+className+" not found"); } public Collection ejbFindAllBlocksByBundle(String bundle) throws FinderException { return ejbFindAllByObjectTypeAndBundle(COMPONENT_TYPE_BLOCK, bundle); } public Collection ejbFindAllBlocks() throws FinderException { return ejbFindAllByObjectType(COMPONENT_TYPE_BLOCK); } public Collection ejbFindAllElementsByBundle(String bundle) throws FinderException { return ejbFindAllByObjectTypeAndBundle(COMPONENT_TYPE_ELEMENT, bundle); } public Collection ejbFindAllElements() throws FinderException { return ejbFindAllByObjectType(COMPONENT_TYPE_ELEMENT); } @Override public int compareTo(IDOEntity obj) { if (obj instanceof ICObject) { return Collator.getInstance().compare(this.getName(), ((ICObject)obj).getName()); } return super.compareTo(obj); } @Override public int getID(){ return super.getID(); } }