How to obtain the current portlet instance?
ebephil Sep 7, 2009 9:56 AMHi,
as the title says, I am looking for a way to get the current org.jboss.portal.core.model.instance.Instance from within a portlet.
The goal is to store preferences on instance level (in the EDIT mode for example). By digging through the Admin portlet I figured out how to do that. What I could not figure out however is how to obtain the current instance to perform the setProperties() call on. The admin portlet iterates a list of all instances, while I just want to edit the current instance of the portlet.
Currently, I am deriving the name of the instance from the window name, but that's just an ugly hack as it only works if portlet instances are created in a certain way (that is, if their name ends with 'Instance').
I did find some posts regarding instance preferences, but none of them seemed to answer my question.
I am aware that this is outside the scope of the JSR-168 spec and internal JBoss APIs could change at any time.
I am using JBoss Portal 2.7.2 on top of JBoss 4.2.3, using PortletBridge 1.0.0.CR2 RichFaces 3.3.1.
Thanks in advance
Phil
PS: I attached my existing code, maybe it helps clarifying my problem. My main concern is the getCurrentInstance() method.
 // This is the part I am trying to implement properly
 private Instance getCurrentInstance() {
 PortalNodeImpl currentNode = Navigation.getCurrentNode();
 Navigation.getPortalRuntimeContext().
 return getInstanceContainer().getDefinition(
 currentNode.getName().replaceAll("Window", "Instance"));
 }
 // this works perfectly fine, at least when used with the right portlet instance
 public boolean writePref(String prefKey, String newPrefValue) {
 Instance currentInstance = getCurrentInstance();
 if (null == currentInstance) {
 logger.error("<-- writePref() Current Instance is null, stopping.");
 return false;
 }
 try {
 List<PropertyChange> changeList = new ArrayList<PropertyChange>();
 PropertyChange change = PropertyChange.newUpdate(prefKey,
 newPrefValue);
 changeList.add(change);
 PropertyChange[] changeArray = changeList
 .toArray(new PropertyChange[changeList.size()]);
 logger.info("--> save()", " setting properties");
 currentInstance.setProperties(changeArray);
 } catch (PortletInvokerException e) {
 logger.error(e.toString());
 return false;
 } catch (Exception e) {
 logger.error(e.toString());
 return false;
 } catch (Throwable t) {
 logger.error(t.toString());
 return false;
 }
 return true;
 }
