IDEMPIERE-1749 Add window event validator for AD_Window

This commit is contained in:
Heng Sin Low 2014-02-12 09:31:14 -05:00
parent 51b70dfa33
commit 410c9a1131
9 changed files with 436 additions and 30 deletions

View File

@ -16,6 +16,7 @@ Import-Package: javax.activation;version="1.1.1",
org.compiere.css, org.compiere.css,
org.osgi.framework;version="1.5.0", org.osgi.framework;version="1.5.0",
org.osgi.service.event;version="1.3.0", org.osgi.service.event;version="1.3.0",
org.osgi.util.tracker;version="1.5.0",
org.slf4j;version="1.6.1", org.slf4j;version="1.6.1",
org.slf4j.helpers;version="1.6.1", org.slf4j.helpers;version="1.6.1",
org.slf4j.spi;version="1.6.1" org.slf4j.spi;version="1.6.1"
@ -31,6 +32,7 @@ Export-Package: fi.jawsy.jawwa.zk.atmosphere,
org.adempiere.webui.acct, org.adempiere.webui.acct,
org.adempiere.webui.action, org.adempiere.webui.action,
org.adempiere.webui.adwindow, org.adempiere.webui.adwindow,
org.adempiere.webui.adwindow.validator,
org.adempiere.webui.apps, org.adempiere.webui.apps,
org.adempiere.webui.apps.form, org.adempiere.webui.apps.form,
org.adempiere.webui.apps.graph, org.adempiere.webui.apps.graph,

View File

@ -13,6 +13,7 @@
*****************************************************************************/ *****************************************************************************/
package org.adempiere.webui; package org.adempiere.webui;
import org.adempiere.webui.adwindow.validator.WindowValidatorManager;
import org.osgi.framework.BundleActivator; import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext; import org.osgi.framework.BundleContext;
@ -30,6 +31,8 @@ public class WebUIActivator implements BundleActivator {
@Override @Override
public void start(BundleContext context) throws Exception { public void start(BundleContext context) throws Exception {
bundleContext = context; bundleContext = context;
WindowValidatorManager validatorMgr = new WindowValidatorManager();
validatorMgr.start(context);
} }
/* (non-Javadoc) /* (non-Javadoc)
@ -38,6 +41,7 @@ public class WebUIActivator implements BundleActivator {
@Override @Override
public void stop(BundleContext context) throws Exception { public void stop(BundleContext context) throws Exception {
bundleContext = null; bundleContext = null;
WindowValidatorManager.getInstance().stop(context);
} }
public static BundleContext getBundleContext() { public static BundleContext getBundleContext() {

View File

@ -33,6 +33,7 @@ import org.compiere.model.MQuery;
import org.compiere.model.MRole; import org.compiere.model.MRole;
import org.compiere.model.MToolBarButton; import org.compiere.model.MToolBarButton;
import org.compiere.model.MToolBarButtonRestrict; import org.compiere.model.MToolBarButtonRestrict;
import org.compiere.model.MWindow;
import org.compiere.model.X_AD_ToolBarButton; import org.compiere.model.X_AD_ToolBarButton;
import org.compiere.util.CCache; import org.compiere.util.CCache;
import org.compiere.util.Env; import org.compiere.util.Env;
@ -66,6 +67,7 @@ public class ADWindow extends AbstractUIPart
private List<String> windowToolbarRestrictList = null; private List<String> windowToolbarRestrictList = null;
private List<String> windowToolbarAdvancedList = null; private List<String> windowToolbarAdvancedList = null;
private String adWindowUUID;
/** /**
* *
@ -90,6 +92,7 @@ public class ADWindow extends AbstractUIPart
this.ctx = ctx; this.ctx = ctx;
this.adWindowId = adWindowId; this.adWindowId = adWindowId;
this.adWindowUUID = MWindow.get(ctx, adWindowId).getAD_Window_UU();
windowNo = SessionManager.getAppDesktop().registerWindow(this); windowNo = SessionManager.getAppDesktop().registerWindow(this);
this.query = query; this.query = query;
try { try {
@ -103,6 +106,7 @@ public class ADWindow extends AbstractUIPart
private void init() private void init()
{ {
windowContent = new ADWindowContent(ctx, windowNo, adWindowId); windowContent = new ADWindowContent(ctx, windowNo, adWindowId);
windowContent.setADWindow(this);
_title = windowContent.getTitle(); _title = windowContent.getTitle();
image = windowContent.getImage(); image = windowContent.getImage();
} }
@ -222,6 +226,14 @@ public class ADWindow extends AbstractUIPart
} }
return windowToolbarAdvancedList; return windowToolbarAdvancedList;
} }
public int getAD_Window_ID() {
return adWindowId;
}
public String getAD_Window_UU() {
return adWindowUUID;
}
/** /**
* *

View File

@ -67,7 +67,7 @@ public class ADWindowContent extends AbstractADWindowContent
private Div contentArea; private Div contentArea;
public ADWindowContent(Properties ctx, int windowNo, int adWindowId) public ADWindowContent(Properties ctx, int windowNo, int adWindowId)
{ {
super(ctx, windowNo, adWindowId); super(ctx, windowNo, adWindowId);
} }
@ -226,9 +226,9 @@ public class ADWindowContent extends AbstractADWindowContent
* generated serial id * generated serial id
*/ */
private static final long serialVersionUID = 6104341168705201721L; private static final long serialVersionUID = 6104341168705201721L;
private ADWindowContent content; private AbstractADWindowContent content;
protected ADWindowVlayout(ADWindowContent content) { protected ADWindowVlayout(AbstractADWindowContent content) {
super(); super();
this.content = content; this.content = content;
} }
@ -240,5 +240,5 @@ public class ADWindowContent extends AbstractADWindowContent
SessionManager.getSessionApplication().getKeylistener().removeEventListener(Events.ON_CTRL_KEY, content); SessionManager.getSessionApplication().getKeylistener().removeEventListener(Events.ON_CTRL_KEY, content);
} catch (Exception e){} } catch (Exception e){}
} }
} }
} }

View File

@ -38,6 +38,9 @@ import org.adempiere.webui.LayoutUtils;
import org.adempiere.webui.WArchive; import org.adempiere.webui.WArchive;
import org.adempiere.webui.WRequest; import org.adempiere.webui.WRequest;
import org.adempiere.webui.WZoomAcross; import org.adempiere.webui.WZoomAcross;
import org.adempiere.webui.adwindow.validator.WindowValidatorEvent;
import org.adempiere.webui.adwindow.validator.WindowValidatorEventType;
import org.adempiere.webui.adwindow.validator.WindowValidatorManager;
import org.adempiere.webui.apps.AEnv; import org.adempiere.webui.apps.AEnv;
import org.adempiere.webui.apps.BusyDialogTemplate; import org.adempiere.webui.apps.BusyDialogTemplate;
import org.adempiere.webui.apps.HelpWindow; import org.adempiere.webui.apps.HelpWindow;
@ -861,6 +864,8 @@ public abstract class AbstractADWindowContent extends AbstractUIPart implements
private Div mask; private Div mask;
protected ADWindow adwindow;
/** /**
* @see ToolbarListener#onLock() * @see ToolbarListener#onLock()
*/ */
@ -1716,14 +1721,38 @@ public abstract class AbstractADWindowContent extends AbstractUIPart implements
SessionManager.getAppDesktop().showWindow(new HelpWindow(gridWindow), "center"); SessionManager.getAppDesktop().showWindow(new HelpWindow(gridWindow), "center");
} }
/** @Override
* @see ToolbarListener#onNew()
*/
public void onNew() public void onNew()
{
final Callback<Boolean> postCallback = new Callback<Boolean>() {
@Override
public void onCallback(Boolean result) {
if (result) {
WindowValidatorEvent event = new WindowValidatorEvent(adwindow, WindowValidatorEventType.AFTER_NEW.getName());
WindowValidatorManager.getInstance().fireWindowValidatorEvent(event, null);
}
}
};
Callback<Boolean> preCallback = new Callback<Boolean>() {
@Override
public void onCallback(Boolean result) {
if (result) {
onNewCallback(postCallback);
}
}
};
WindowValidatorEvent event = new WindowValidatorEvent(adwindow, WindowValidatorEventType.BEFORE_NEW.getName());
WindowValidatorManager.getInstance().fireWindowValidatorEvent(event, preCallback);
}
private void onNewCallback(final Callback<Boolean> postCallback)
{ {
if (!adTabbox.getSelectedGridTab().isInsertRecord()) if (!adTabbox.getSelectedGridTab().isInsertRecord())
{ {
logger.warning("Insert Record disabled for Tab"); logger.warning("Insert Record disabled for Tab");
if (postCallback != null)
postCallback.onCallback(false);
return; return;
} }
@ -1757,26 +1786,59 @@ public abstract class AbstractADWindowContent extends AbstractUIPart implements
{ {
adTabbox.getSelectedTabpanel().getGridView().onEditCurrentRow(); adTabbox.getSelectedTabpanel().getGridView().onEditCurrentRow();
} }
if (postCallback != null)
postCallback.onCallback(true);
} }
else else
{ {
logger.severe("Could not create new record"); logger.severe("Could not create new record");
if (postCallback != null)
postCallback.onCallback(false);
} }
focusToActivePanel(); focusToActivePanel();
} }
else
{
if (postCallback != null)
postCallback.onCallback(result);
}
} }
}); });
} }
// Elaine 2008/11/19 @Override
/**
* @see ToolbarListener#onCopy()
*/
public void onCopy() public void onCopy()
{
final Callback<Boolean> postCallback = new Callback<Boolean>() {
@Override
public void onCallback(Boolean result) {
if (result) {
WindowValidatorEvent event = new WindowValidatorEvent(adwindow, WindowValidatorEventType.AFTER_COPY.getName());
WindowValidatorManager.getInstance().fireWindowValidatorEvent(event, null);
}
}
};
Callback<Boolean> preCallback = new Callback<Boolean>() {
@Override
public void onCallback(Boolean result) {
if (result) {
onCopyCallback(postCallback);
}
}
};
WindowValidatorEvent event = new WindowValidatorEvent(adwindow, WindowValidatorEventType.BEFORE_COPY.getName());
WindowValidatorManager.getInstance().fireWindowValidatorEvent(event, preCallback);
}
// Elaine 2008/11/19
private void onCopyCallback(Callback<Boolean> postCallback)
{ {
if (!adTabbox.getSelectedGridTab().isInsertRecord()) if (!adTabbox.getSelectedGridTab().isInsertRecord())
{ {
logger.warning("Insert Record disabled for Tab"); logger.warning("Insert Record disabled for Tab");
if (postCallback != null)
postCallback.onCallback(false);
return; return;
} }
@ -1793,10 +1855,15 @@ public abstract class AbstractADWindowContent extends AbstractUIPart implements
toolbar.enableIgnore(true); toolbar.enableIgnore(true);
toolbar.enablePrint(adTabbox.getSelectedGridTab().isPrinted()); toolbar.enablePrint(adTabbox.getSelectedGridTab().isPrinted());
toolbar.enableReport(true); toolbar.enableReport(true);
if (postCallback != null)
postCallback.onCallback(true);
} }
else else
{ {
logger.severe("Could not create new record"); logger.severe("Could not create new record");
if (postCallback != null)
postCallback.onCallback(false);
} }
focusToActivePanel(); focusToActivePanel();
} }
@ -1878,10 +1945,32 @@ public abstract class AbstractADWindowContent extends AbstractUIPart implements
LayoutUtils.openEmbeddedWindow(toolbar, findWindow, "after_start"); LayoutUtils.openEmbeddedWindow(toolbar, findWindow, "after_start");
} }
/** @Override
* @see ToolbarListener#onIgnore() public void onIgnore()
*/ {
public void onIgnore() final Callback<Boolean> postCallback = new Callback<Boolean>() {
@Override
public void onCallback(Boolean result) {
if (result) {
WindowValidatorEvent event = new WindowValidatorEvent(adwindow, WindowValidatorEventType.AFTER_IGNORE.getName());
WindowValidatorManager.getInstance().fireWindowValidatorEvent(event, null);
}
}
};
Callback<Boolean> preCallback = new Callback<Boolean>() {
@Override
public void onCallback(Boolean result) {
if (result) {
onIgnoreCallback(postCallback);
}
}
};
WindowValidatorEvent event = new WindowValidatorEvent(adwindow, WindowValidatorEventType.BEFORE_IGNORE.getName());
WindowValidatorManager.getInstance().fireWindowValidatorEvent(event, preCallback);
}
private void onIgnoreCallback(Callback<Boolean> postCallback)
{ {
IADTabpanel dirtyTabpanel = adTabbox.getDirtyADTabpanel(); IADTabpanel dirtyTabpanel = adTabbox.getDirtyADTabpanel();
boolean newrecod = adTabbox.getSelectedGridTab().isNew(); boolean newrecod = adTabbox.getSelectedGridTab().isNew();
@ -1912,15 +2001,19 @@ public abstract class AbstractADWindowContent extends AbstractUIPart implements
focusToActivePanel(); focusToActivePanel();
updateToolbar(); updateToolbar();
if (postCallback != null)
postCallback.onCallback(true);
} }
/** /**
* @see ToolbarListener#onSave() * @see ToolbarListener#onSave()
*/ */
@Override
public void onSave() public void onSave()
{ {
final IADTabpanel dirtyTabpanel = adTabbox.getDirtyADTabpanel(); final IADTabpanel dirtyTabpanel = adTabbox.getDirtyADTabpanel();
onSave(true, false, new Callback<Boolean>() { onSave(true, false, new Callback<Boolean>() {
@Override @Override
public void onCallback(Boolean result) public void onCallback(Boolean result)
{ {
@ -1941,7 +2034,35 @@ public abstract class AbstractADWindowContent extends AbstractUIPart implements
}); });
} }
public void onSavePayment() private void onSave(final boolean onSaveEvent, final boolean onNavigationEvent, final Callback<Boolean> callback) {
final Callback<Boolean> postCallback = new Callback<Boolean>() {
@Override
public void onCallback(Boolean result) {
if (result) {
WindowValidatorEvent event = new WindowValidatorEvent(adwindow, WindowValidatorEventType.AFTER_SAVE.getName());
WindowValidatorManager.getInstance().fireWindowValidatorEvent(event, callback);
} else {
callback.onCallback(result);
}
}
};
Callback<Boolean> preCallback = new Callback<Boolean>() {
@Override
public void onCallback(Boolean result) {
if (result) {
onSaveCallback(onSaveEvent, onNavigationEvent, postCallback);
} else if (callback != null) {
callback.onCallback(result);
}
}
};
WindowValidatorEvent event = new WindowValidatorEvent(adwindow, WindowValidatorEventType.BEFORE_SAVE.getName());
WindowValidatorManager.getInstance().fireWindowValidatorEvent(event, preCallback);
}
public void onSavePayment()
{ {
onSave(false, false, new Callback<Boolean>() { onSave(false, false, new Callback<Boolean>() {
@ -1956,7 +2077,7 @@ public abstract class AbstractADWindowContent extends AbstractUIPart implements
/** /**
* @param onSaveEvent * @param onSaveEvent
*/ */
private void onSave(final boolean onSaveEvent, final boolean onNavigationEvent, final Callback<Boolean> callback) private void onSaveCallback(final boolean onSaveEvent, final boolean onNavigationEvent, final Callback<Boolean> callback)
{ {
final boolean wasChanged = toolbar.isSaveEnable(); final boolean wasChanged = toolbar.isSaveEnable();
IADTabpanel dirtyTabpanel = adTabbox.getDirtyADTabpanel(); IADTabpanel dirtyTabpanel = adTabbox.getDirtyADTabpanel();
@ -2106,13 +2227,37 @@ public abstract class AbstractADWindowContent extends AbstractUIPart implements
}); });
} }
/** @Override
* @see ToolbarListener#onDelete() public void onDelete()
*/ {
public void onDelete() final Callback<Boolean> postCallback = new Callback<Boolean>() {
@Override
public void onCallback(Boolean result) {
if (result) {
WindowValidatorEvent event = new WindowValidatorEvent(adwindow, WindowValidatorEventType.AFTER_DELETE.getName());
WindowValidatorManager.getInstance().fireWindowValidatorEvent(event, null);
}
}
};
Callback<Boolean> preCallback = new Callback<Boolean>() {
@Override
public void onCallback(Boolean result) {
if (result) {
onDeleteCallback(postCallback);
}
}
};
WindowValidatorEvent event = new WindowValidatorEvent(adwindow, WindowValidatorEventType.BEFORE_DELETE.getName());
WindowValidatorManager.getInstance().fireWindowValidatorEvent(event, preCallback);
}
private void onDeleteCallback(final Callback<Boolean> postCallback)
{ {
if (adTabbox.getSelectedGridTab().isReadOnly()) if (adTabbox.getSelectedGridTab().isReadOnly())
{ {
if (postCallback != null)
postCallback.onCallback(false);
return; return;
} }
@ -2120,7 +2265,7 @@ public abstract class AbstractADWindowContent extends AbstractUIPart implements
final int[] indices = adTabbox.getSelectedGridTab().getSelection(); final int[] indices = adTabbox.getSelectedGridTab().getSelection();
if (indices.length > 0 && adTabbox.getSelectedTabpanel().isGridView()) if (indices.length > 0 && adTabbox.getSelectedTabpanel().isGridView())
{ {
onDeleteSelected(); onDeleteSelected(postCallback);
return; return;
} }
@ -2136,17 +2281,21 @@ public abstract class AbstractADWindowContent extends AbstractUIPart implements
adTabbox.getSelectedTabpanel().dynamicDisplay(0); adTabbox.getSelectedTabpanel().dynamicDisplay(0);
focusToActivePanel(); focusToActivePanel();
MRecentItem.publishChangedEvent(Env.getAD_User_ID(ctx)); MRecentItem.publishChangedEvent(Env.getAD_User_ID(ctx));
} }
if (postCallback != null)
postCallback.onCallback(result);
} }
}); });
} }
// Elaine 2008/12/01 // Elaine 2008/12/01
private void onDeleteSelected() private void onDeleteSelected(final Callback<Boolean> postCallback)
{ {
if (adTabbox.getSelectedGridTab().isReadOnly() || !adTabbox.getSelectedTabpanel().isGridView()) if (adTabbox.getSelectedGridTab().isReadOnly() || !adTabbox.getSelectedTabpanel().isGridView())
{ {
if (postCallback != null)
postCallback.onCallback(false);
return; return;
} }
@ -2176,18 +2325,43 @@ public abstract class AbstractADWindowContent extends AbstractUIPart implements
adTabbox.getSelectedTabpanel().dynamicDisplay(0); adTabbox.getSelectedTabpanel().dynamicDisplay(0);
statusBar.setStatusLine(Msg.getMsg(Env.getCtx(), "Deleted")+": "+count, false); statusBar.setStatusLine(Msg.getMsg(Env.getCtx(), "Deleted")+": "+count, false);
} }
if (postCallback != null)
postCallback.onCallback(result);
} }
}); });
} else { } else {
statusBar.setStatusLine(Msg.getMsg(Env.getCtx(), "Selected")+": 0", false); statusBar.setStatusLine(Msg.getMsg(Env.getCtx(), "Selected")+": 0", false);
if (postCallback != null)
postCallback.onCallback(false);
} }
} }
// //
/** @Override
* @see ToolbarListener#onPrint() public void onPrint() {
*/ final Callback<Boolean> postCallback = new Callback<Boolean>() {
public void onPrint() { @Override
public void onCallback(Boolean result) {
if (result) {
WindowValidatorEvent event = new WindowValidatorEvent(adwindow, WindowValidatorEventType.AFTER_PRINT.getName());
WindowValidatorManager.getInstance().fireWindowValidatorEvent(event, null);
}
}
};
Callback<Boolean> preCallback = new Callback<Boolean>() {
@Override
public void onCallback(Boolean result) {
if (result) {
onPrintCallback(postCallback);
}
}
};
WindowValidatorEvent event = new WindowValidatorEvent(adwindow, WindowValidatorEventType.BEFORE_PRINT.getName());
WindowValidatorManager.getInstance().fireWindowValidatorEvent(event, preCallback);
}
private void onPrintCallback(final Callback<Boolean> postCallback) {
//Get process defined for this tab //Get process defined for this tab
final int AD_Process_ID = adTabbox.getSelectedGridTab().getAD_Process_ID(); final int AD_Process_ID = adTabbox.getSelectedGridTab().getAD_Process_ID();
//log.info("ID=" + AD_Process_ID); //log.info("ID=" + AD_Process_ID);
@ -2207,15 +2381,27 @@ public abstract class AbstractADWindowContent extends AbstractUIPart implements
int table_ID = adTabbox.getSelectedGridTab().getAD_Table_ID(); int table_ID = adTabbox.getSelectedGridTab().getAD_Table_ID();
int record_ID = adTabbox.getSelectedGridTab().getRecord_ID(); int record_ID = adTabbox.getSelectedGridTab().getRecord_ID();
ProcessModalDialog dialog = new ProcessModalDialog(AbstractADWindowContent.this, getWindowNo(), AD_Process_ID,table_ID, record_ID, true); final ProcessModalDialog dialog = new ProcessModalDialog(AbstractADWindowContent.this, getWindowNo(), AD_Process_ID,table_ID, record_ID, true);
if (dialog.isValid()) { if (dialog.isValid()) {
dialog.setWidth("500px"); dialog.setWidth("500px");
dialog.setBorder("normal"); dialog.setBorder("normal");
getComponent().getParent().appendChild(dialog); getComponent().getParent().appendChild(dialog);
showBusyMask(dialog); showBusyMask(dialog);
LayoutUtils.openOverlappedWindow(getComponent(), dialog, "middle_center"); LayoutUtils.openOverlappedWindow(getComponent(), dialog, "middle_center");
if (postCallback != null) {
dialog.addEventListener(DialogEvents.ON_WINDOW_CLOSE, new EventListener<Event>() {
@Override
public void onEvent(Event event) throws Exception {
postCallback.onCallback(dialog.isCancel());
}
});
}
dialog.focus(); dialog.focus();
} else if (postCallback != null) {
postCallback.onCallback(result);
} }
} else if (postCallback != null) {
postCallback.onCallback(result);
} }
} }
}; };
@ -2924,6 +3110,14 @@ public abstract class AbstractADWindowContent extends AbstractUIPart implements
return boolChanges; return boolChanges;
} }
public void setADWindow(ADWindow adwindow) {
this.adwindow = adwindow;
}
public ADWindow getADWindow() {
return adwindow;
}
private void clearTitleRelatedContext() { private void clearTitleRelatedContext() {
// IDEMPIERE-1328 // IDEMPIERE-1328
// clear the values for the tab header // clear the values for the tab header

View File

@ -0,0 +1,7 @@
package org.adempiere.webui.adwindow.validator;
import org.adempiere.util.Callback;
public interface WindowValidator {
public void onWindowEvent(WindowValidatorEvent event, Callback<Boolean> callback);
}

View File

@ -0,0 +1,21 @@
package org.adempiere.webui.adwindow.validator;
import org.adempiere.webui.adwindow.ADWindow;
public class WindowValidatorEvent {
private ADWindow window;
private String name;
public WindowValidatorEvent(ADWindow window, String name) {
this.window = window;
this.name = name;
}
public ADWindow getWindow() {
return this.window;
}
public String getName() {
return this.name;
}
}

View File

@ -0,0 +1,26 @@
package org.adempiere.webui.adwindow.validator;
public enum WindowValidatorEventType {
BEFORE_IGNORE("beforeIgnore"),
AFTER_IGNORE("afterIgnore"),
BEFORE_NEW("beforeNew"),
AFTER_NEW("afterNew"),
BEFORE_PRINT("beforePrint"),
AFTER_PRINT("afterPrint"),
BEFORE_DELETE("beforeDelete"),
AFTER_DELETE("afterDelete"),
BEFORE_SAVE("beforeSave"),
AFTER_SAVE("afterSave"),
BEFORE_COPY("beforeCopy"),
AFTER_COPY("afterCopy");
private String name;
private WindowValidatorEventType(String name) {
this.name = name;
}
public String getName() {
return name;
}
}

View File

@ -0,0 +1,140 @@
package org.adempiere.webui.adwindow.validator;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.adempiere.util.Callback;
import org.adempiere.webui.adwindow.ADWindow;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceReference;
import org.osgi.util.tracker.ServiceTracker;
import org.osgi.util.tracker.ServiceTrackerCustomizer;
public class WindowValidatorManager implements BundleActivator, ServiceTrackerCustomizer<WindowValidator, WindowValidator> {
private static WindowValidatorManager instance = null;
private BundleContext context;
private Map<String, List<WindowValidator>> validatorMap = new HashMap<String, List<WindowValidator>>();
private List<WindowValidator> globalValidators = new ArrayList<WindowValidator>();
private ServiceTracker<WindowValidator, WindowValidator> serviceTracker;
@Override
public WindowValidator addingService(
ServiceReference<WindowValidator> reference) {
WindowValidator service = context.getService(reference);
String uuid = (String) reference.getProperty("AD_Window_UU");
if (uuid == null || "*".equals(uuid))
globalValidators.add(service);
List<WindowValidator> list = validatorMap.get(uuid);
if (list == null) {
list = new ArrayList<WindowValidator>();
validatorMap.put(uuid, list);
}
list.add(service);
return service;
}
@Override
public void modifiedService(ServiceReference<WindowValidator> reference,
WindowValidator service) {
}
@Override
public void removedService(ServiceReference<WindowValidator> reference,
WindowValidator service) {
String uuid = (String) reference.getProperty("AD_Window_UU");
if (uuid == null || "*".equals(uuid)) {
globalValidators.remove(service);
} else {
List<WindowValidator> list = validatorMap.get(uuid);
if (list != null) {
list.remove(service);
}
}
}
@Override
public void start(BundleContext context) throws Exception {
this.context = context;
serviceTracker = new ServiceTracker<WindowValidator, WindowValidator>(context, WindowValidator.class.getName(), this);
serviceTracker.open();
instance = this;
}
@Override
public void stop(BundleContext context) throws Exception {
serviceTracker.close();
this.context = null;
instance = null;
}
public static WindowValidatorManager getInstance() {
return instance;
}
public void fireWindowValidatorEvent(WindowValidatorEvent event, Callback<Boolean> callback) {
ADWindow window = event.getWindow();
String uuid = window.getAD_Window_UU();
List<WindowValidator> list = validatorMap.get(uuid);
int listSize = list != null ? list.size() : 0;
WindowValidator[] validators = new WindowValidator[listSize+globalValidators.size()];
int index = -1;
if (listSize > 0) {
for(WindowValidator validator : list) {
index++;
validators[index] = validator;
}
}
for(WindowValidator validator : globalValidators) {
index++;
validators[index] = validator;
}
ChainCallback chain = new ChainCallback(event, validators, callback);
chain.start();
}
private static class ChainCallback implements Callback<Boolean> {
private Callback<Boolean> callback;
private WindowValidator[] validators;
private WindowValidatorEvent event;
private int index = -1;
public ChainCallback(WindowValidatorEvent event, WindowValidator[] validators, Callback<Boolean> callback) {
this.event = event;
this.validators = validators;
this.callback = callback;
}
public void start() {
index = 0;
if (index < validators.length)
validators[index].onWindowEvent(event, this);
else if (callback != null)
callback.onCallback(true);
}
@Override
public void onCallback(Boolean result) {
if (result) {
if (index < validators.length-1) {
index++;
validators[index].onWindowEvent(event, this);
} else if (callback != null){
callback.onCallback(result);
}
} else if (callback != null){
callback.onCallback(result);
}
}
}
}