blob: e2a9fb08e15b6de87fe8b84967bceedaebf7b192 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2006 Sybase, Inc. and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Sybase, Inc. - initial API and implementation
*******************************************************************************/
package org.eclipse.jst.jsf.facesconfig.ui.pageflow.synchronization;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.eclipse.core.runtime.Assert;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.notify.Notifier;
import org.eclipse.emf.common.notify.impl.AdapterImpl;
import org.eclipse.emf.common.util.TreeIterator;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.InternalEObject;
import org.eclipse.emf.ecore.impl.ENotificationImpl;
import org.eclipse.jst.jsf.facesconfig.emf.DescriptionType;
import org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType;
import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType;
import org.eclipse.jst.jsf.facesconfig.emf.FromViewIdType;
import org.eclipse.jst.jsf.facesconfig.emf.IconType;
import org.eclipse.jst.jsf.facesconfig.emf.LargeIconType;
import org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType;
import org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType;
import org.eclipse.jst.jsf.facesconfig.emf.SmallIconType;
import org.eclipse.jst.jsf.facesconfig.emf.ToViewIdType;
import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow;
import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement;
import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowFactory;
import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink;
import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode;
import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage;
import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageReferenceElement;
import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.ReferenceElement;
import org.eclipse.jst.jsf.facesconfig.ui.pageflow.util.PageflowModelManager;
import org.eclipse.jst.jsf.facesconfig.ui.pageflow.util.PageflowTransform;
import org.eclipse.jst.jsf.facesconfig.ui.util.WebrootUtil;
/**
* Update and synchronize pageflow from faces-config or vice-versa.
*
* @author hmeng
*
*/
public class FC2PFTransformer extends AdapterImpl {
// For code debug.
private static final boolean DEBUG = false;
/**
* the first notification event type after the defaults
*/
public static final int MY_NOTIFICATION_TYPE = Notification.EVENT_TYPE_COUNT + 1;
/**
* the first notification event type after MY_NOTIFICATION_TYPE
*/
public static final int MY_NOTIFICATION_TYPE1 = MY_NOTIFICATION_TYPE + 1;
/**
* The listener is active.
*/
private boolean listenToNotify;
/**
* Avoid redundent event.
*/
private boolean isInEvent;
boolean pageflowChanged = false;
/**
* Perform operations batched.
*/
boolean needBatchOperations = false;
/**
* Catches
*/
private Map mapPaths2PF = new HashMap();
private Map mapCases2Links = new HashMap();
/**
* The pageflow model.
*/
private Pageflow pageflow;
/**
* The faces-config model.
*/
FacesConfigType facesConfig;
/**
* Default constructor
*/
public FC2PFTransformer() {
super();
// TODO Auto-generated constructor stub
}
/**
* @param listenToNotify
*/
public void setListenToNotify(boolean listenToNotify) {
this.listenToNotify = listenToNotify;
}
private void postEMFChanged() {
startFCNotify();
// Refresh all facesConfig?
facesConfig.eNotify(new ENotificationImpl(
(InternalEObject) facesConfig, Notification.REMOVE,
FacesConfigPackage.FACES_CONFIG_TYPE__NAVIGATION_RULE, null,
null));
List rules;
rules = facesConfig.getNavigationRule();
for (int i = 0; i < rules.size(); i++) {
((NavigationRuleType) rules.get(i)).eNotify(new ENotificationImpl(
(InternalEObject) rules.get(i), Notification.REMOVE,
FacesConfigPackage.NAVIGATION_RULE_TYPE__NAVIGATION_CASE,
null, null));
}
}
/**
* Set notify adapters.
*
*/
private void startFCNotify() {
TreeIterator iterator = facesConfig.eAllContents();
while (iterator.hasNext()) {
EObject object = (EObject) iterator.next();
object.eSetDeliver(true);
}
facesConfig.eSetDeliver(true);
}
/**
* Set not notify adapters
*
* @return
*/
private TreeIterator stopFCNotify() {
TreeIterator iterator = facesConfig.eAllContents();
// Stop the listener
while (iterator.hasNext()) {
EObject object = (EObject) iterator.next();
object.eSetDeliver(false);
}
facesConfig.eSetDeliver(false);
return iterator;
}
/**
* For performance issue, we are going to update DOM only after the EMF
* modifications are done.
*/
boolean isNeedBatchOperations() {
return needBatchOperations;
}
/**
* @param enable
*/
public void setNeedBatchOperations(boolean enable) {
this.needBatchOperations = enable;
if (!enable) {
isInEvent = true;
postEMFChanged();
isInEvent = false;
} else {
stopFCNotify();
}
}
private void updateFacesRule(NavigationRuleType navigationRule,
PageflowPage pageSource) {
FacesConfigFactory factory = FacesConfigFactory.eINSTANCE;
if (pageSource.getComment() != null) {
DescriptionType description = factory.createDescriptionType();
description.setTextContent(pageSource.getComment());
navigationRule.getDescription().clear();
navigationRule.getDescription().add(description);
}
// set the navigation rule's icon
if (pageSource.getLargeicon() != null
|| pageSource.getSmallicon() != null) {
IconType icon = factory.createIconType();
if (pageSource.getLargeicon() != null) {
LargeIconType largeicon = factory.createLargeIconType();
largeicon.setTextContent(pageSource.getLargeicon());
icon.setLargeIcon(largeicon);
}
if (pageSource.getSmallicon() != null) {
SmallIconType smallicon = factory.createSmallIconType();
smallicon.setTextContent(pageSource.getSmallicon());
icon.setSmallIcon(smallicon);
}
navigationRule.getIcon().clear();
navigationRule.getIcon().add(icon);
}
if (pageSource.getName() != null) {
DisplayNameType displayName = factory.createDisplayNameType();
displayName.setTextContent(pageSource.getName());
navigationRule.getDisplayName().clear();
navigationRule.getDisplayName().add(displayName);
}
}
/**
* TODO: If we cache the case's properties in a link, then we can restore
* them.
*
* @param navigationCase
* @param link
*/
// TODO: not used, dead?
// private void updateFacesCase(NavigationCaseType navigationCase,
// PageflowLink link) {
// FacesConfigFactory factory = FacesConfigFactory.eINSTANCE;
// if (link.getComment() != null) {
// DescriptionType description = factory.createDescriptionType();
// description.setTextContent(link.getComment());
// navigationCase.getDescription().clear();
// navigationCase.getDescription().add(description);
// }
// // set the navigation rule's icon
// if (link.getLargeicon() != null || link.getSmallicon() != null) {
// IconType icon = factory.createIconType();
// if (link.getLargeicon() != null) {
// LargeIconType largeicon = factory.createLargeIconType();
// largeicon.setTextContent(link.getLargeicon());
// icon.setLargeIcon(largeicon);
// }
//
// if (link.getSmallicon() != null) {
// SmallIconType smallicon = factory.createSmallIconType();
// smallicon.setTextContent(link.getSmallicon());
// icon.setSmallIcon(smallicon);
// }
// navigationCase.getIcon().clear();
// navigationCase.getIcon().add(icon);
// }
// if (link.getFromaction() != null) {
// FromActionType fromAction = factory.createFromActionType();
// fromAction.setTextContent(link.getFromaction());
// navigationCase.setFromAction(fromAction);
// }
// if (link.getOutcome() != null) {
// FromOutcomeType fromOutcome = factory.createFromOutcomeType();
// fromOutcome.setTextContent(link.getOutcome());
// navigationCase.setFromOutcome(fromOutcome);
// }
// }
private void createFacesCase(PageflowLink link, PageflowPage source,
PageflowPage target_) {
NavigationRuleType rule = FacesConfigFactory.eINSTANCE
.createNavigationRuleType();
FromViewIdType from = FacesConfigFactory.eINSTANCE
.createFromViewIdType();
from.setTextContent((source).getPath());
rule.setFromViewId(from);
NavigationCaseType navCase = FacesConfigFactory.eINSTANCE
.createNavigationCaseType();
ToViewIdType toView = FacesConfigFactory.eINSTANCE.createToViewIdType();
toView.setTextContent((target_).getPath());
navCase.setToViewId(toView);
rule.getNavigationCase().add(navCase);
facesConfig.getNavigationRule().add(rule);
updateFacesRule(rule, source);
source.getFCElements().add(from);
target_.getFCElements().add(toView);
link.getFCElements().add(navCase);
mapCases2Links.put(navCase, link);
}
private void removePageflowPage(PageflowPage source) {
Assert.isTrue(source.getOutlinks().size() == 0
&& source.getInlinks().size() == 0);
pageflow.getNodes().remove(source);
}
void removeCase(NavigationCaseType navCase) {
NavigationRuleType rule = (NavigationRuleType) navCase.eContainer();
(rule).getNavigationCase().remove(navCase);
if (rule.getNavigationCase().size() == 0) {
facesConfig.getNavigationRule().remove(rule);
}
}
/**
* Remove a link in pageflow model.
*
* @param pLink
*/
private void removeLink(PageflowLink pLink) {
// Link
PageflowPage source = (PageflowPage) pLink.getSource();
PageflowPage target_ = (PageflowPage) pLink.getTarget();
pLink.getPageflow().getLinks().remove(pLink);
source.getOutlinks().remove(pLink);
target_.getInlinks().remove(pLink);
// Navigation case
pLink.getFCElements().clear();
cleanPage(source);
cleanPage(target_);
}
/**
* Remove a link in pageflow model.
*
* @param pLink
*/
void changePFLinkStart(PageflowLink pLink, String newValue) {
PageflowPage newPage = null;
if ((newPage = getValidPFPageInCache(newValue)) != null) {
if (newValue.equals(((PageflowPage) pLink.getSource()).getPath())) {
return;
}
} else if ((newPage = TransformUtil.findPage(newValue, pageflow)) == null) {
return;
}
// remove old case
NavigationCaseType caseType = (NavigationCaseType) pLink
.getFCElements().getData().get(0);
//NavigationRuleType rule = (NavigationRuleType) caseType.eContainer();
removeCase(caseType);
// create new rule / case
NavigationCaseType newCase = FacesConfigFactory.eINSTANCE
.createNavigationCaseType();
ToViewIdType toView = FacesConfigFactory.eINSTANCE.createToViewIdType();
toView.setTextContent(caseType.getToViewId().getTextContent());
newCase.setToViewId(toView);
NavigationRuleType newRule = FacesConfigFactory.eINSTANCE
.createNavigationRuleType();
FromViewIdType fromView = FacesConfigFactory.eINSTANCE
.createFromViewIdType();
fromView.setTextContent(newValue);
newRule.setFromViewId(fromView);
newRule.getNavigationCase().add(newCase);
facesConfig.getNavigationRule().add(newRule);
// update
// updateNode(rule, newRule);
updateNode(caseType, newCase);
pLink.getFCElements().clear();
pLink.getFCElements().add(newCase);
pLink.setSource(newPage);
updatePageflowElements(pageflow, newCase);
}
private void updateNode(EObject old, EObject newOne) {
if (old instanceof NavigationRuleType) {
((NavigationRuleType) newOne).getDescription().clear();
((NavigationRuleType) newOne).getDescription().addAll(
((NavigationRuleType) old).getDescription());
((NavigationRuleType) newOne).getDisplayName().clear();
((NavigationRuleType) newOne).getDisplayName().addAll(
((NavigationRuleType) old).getDisplayName());
((NavigationRuleType) newOne).getDescription().clear();
((NavigationRuleType) newOne).getIcon().clear();
((NavigationRuleType) newOne).getIcon().addAll(
((NavigationRuleType) old).getIcon());
} else if (old instanceof NavigationCaseType) {
((NavigationCaseType) newOne).getDescription().clear();
((NavigationCaseType) newOne).getDescription().addAll(
((NavigationCaseType) old).getDescription());
((NavigationCaseType) newOne).getDisplayName().clear();
((NavigationCaseType) newOne).getDisplayName().addAll(
((NavigationCaseType) old).getDisplayName());
((NavigationCaseType) newOne).getDescription().clear();
((NavigationCaseType) newOne).getIcon().clear();
((NavigationCaseType) newOne).getIcon().addAll(
((NavigationCaseType) old).getIcon());
((NavigationCaseType) newOne)
.setFromAction(((NavigationCaseType) old).getFromAction());
((NavigationCaseType) newOne)
.setFromOutcome(((NavigationCaseType) old).getFromOutcome());
}
}
void changePFLinkEnd(PageflowLink pLink, String newValue) {
PageflowPage newPage = null;
if ((newPage = getValidPFPageInCache(newValue)) != null) {
if (newValue.equals(((PageflowPage) pLink.getSource()).getPath())) {
return;
}
} else if ((newPage = TransformUtil.findPage(newValue, pageflow)) == null) {
return;
}
// remove old case
NavigationCaseType caseType = (NavigationCaseType) pLink
.getFCElements().getData().get(0);
ToViewIdType toView = caseType.getToViewId(); // FacesConfigFactory.eINSTANCE.createToViewIdType();
if (toView == null) {
toView = FacesConfigFactory.eINSTANCE.createToViewIdType();
}
toView.setTextContent(newValue);
caseType.setToViewId(toView);
pLink.setTarget(newPage);
updatePageflowElements(pageflow, caseType);
}
void removeLink(NavigationCaseType caseType) {
PageflowLink link = (PageflowLink) mapCases2Links.get(caseType);
if (link != null) {
removeLink(link);
}
}
void addLink(PageflowPage source, PageflowPage target_, PageflowLink value) {
if (source != null && target_ != null && value != null) {
createFacesCase(value, source, target_);
}
}
private void cleanPage(PageflowPage source) {
if (source.getInlinks().size() == 0 && source.getOutlinks().size() == 0) {
removePageflowPage(source);
}
source.update();
}
void refreshPFAdapter(EObject object) {
TreeIterator content = object.eAllContents();
while (content.hasNext()) {
Object next = content.next();
adapt((EObject) next);
}
adapt(object);
}
void refreshFCAdapter(EObject object) {
List rules = facesConfig.getNavigationRule();
if (rules != null) {
for (int i = 0; i < rules.size(); i++) {
NavigationRuleType rule = (NavigationRuleType) rules.get(i);
adapt(rule);
TreeIterator children = rule.eAllContents();
while (children.hasNext()) {
adapt((EObject) children.next());
}
}
}
adapt(facesConfig);
}
/**
* @param facesConfig
*/
public void setFacesConfig(FacesConfigType facesConfig) {
this.facesConfig = facesConfig;
refreshFCAdapter(facesConfig);
}
/**
* @param pageflow
*/
public void setPageflow(Pageflow pageflow) {
this.pageflow = pageflow;
pageflow.eAdapters().add(this);
refreshPFAdapter(pageflow);
}
/**
* Install compatible synchronization adapter for particular object.
*
* @param object
*/
public void adapt(EObject object) {
if (object != null && !isAdapted(object)) {
if (object instanceof PageflowElement) {
object.eAdapters().add(new PF2FCSynchronizer(this));
} else {
object.eAdapters().add(new FC2PFSynchronizer(this));
}
}
}
/**
* Remove the synchronization adapter.
*
* @param object
*/
public void unAdapt(EObject object) {
Iterator adapters = object.eAdapters().iterator();
while (adapters.hasNext()) {
Object adapter = adapters.next();
if (adapter instanceof FC2PFSynchronizer
|| adapter instanceof PF2FCSynchronizer) {
adapters.remove();
}
}
}
/**
* @param object
* @return true if this transformer adapts object
*/
public boolean isAdapted(EObject object) {
if (object != null) {
Iterator adapters = object.eAdapters().iterator();
while (adapters.hasNext()) {
Object adapter = adapters.next();
if (adapter instanceof FC2PFSynchronizer
|| adapter instanceof PF2FCSynchronizer) {
return true;
}
}
}
return false;
}
/**
* clear the internal maps
*/
public void clearCaches() {
mapPaths2PF.clear();
mapCases2Links.clear();
}
/**
* dispose of this object.
*/
public void dispose() {
clearCaches();
Pageflow pageFlow = getPageflow();
if (pageFlow != null)
{
pageFlow.dispose();
}
}
public Notifier getTarget() {
return null;
}
public boolean isAdapterForType(Object type) {
return false;
}
public void setTarget(Notifier newTarget) {
// do nothing
}
/**
* @param caseType
* @return the from view id in caseType
*/
public static FromViewIdType getSource(NavigationCaseType caseType) {
if (caseType.eContainer() instanceof NavigationRuleType) {
NavigationRuleType rule = (NavigationRuleType) caseType
.eContainer();
return rule.getFromViewId();
}
return null;
}
private PageflowPage getOrCreateStartPage(NavigationCaseType navCase) {// FromViewIdType
PageflowPage startPageflowNode = null;
String path = "*"; //$NON-NLS-1$
NavigationRuleType rule = (NavigationRuleType) navCase.eContainer();
FromViewIdType source = getSource(navCase);
if (source != null) {
path = source.getTextContent();
}
if (getValidPFPageInCache(path) == null) {
startPageflowNode = TransformUtil.findPage(path, pageflow);
if (startPageflowNode == null) {
// not exist or is "*"
if (DEBUG)
System.out.println("Create new start page"); //$NON-NLS-1$
startPageflowNode = createPFPage(path);
pageflowChanged = true;
}
mapPaths2PF.put(path, startPageflowNode);
PageflowTransform.getInstance().updatePageflowSourcePage(
startPageflowNode, rule);
} else {
startPageflowNode = (PageflowPage) mapPaths2PF.get(path);
}
if (source != null) {
ReferenceElement element = new PageReferenceElement(
startPageflowNode);
element.add(source);
startPageflowNode
.setReferenceLink(element.resolveReferenceString());
startPageflowNode.getFCElements().add(source);
}
return startPageflowNode;
}
/**
* Search for an existing pageflow page matching to navigation case's
* target, if there is no such page existing, create one.
*
* @param navCase
* @return
*/
private PageflowPage getOrCreateEndPage(NavigationCaseType navCase) {
PageflowPage endPageflowNode = null;
ToViewIdType target_ = navCase.getToViewId();
if (target_ != null) {
String path = target_.getTextContent();
if (getValidPFPageInCache(path) == null) {
endPageflowNode = TransformUtil.findPage(path, pageflow);
if (endPageflowNode == null) {
endPageflowNode = createPFPage(path);
if (DEBUG)
System.out.println("Create new end page"); //$NON-NLS-1$
pageflowChanged = true;
}
mapPaths2PF.put(path, endPageflowNode);
PageflowTransform.getInstance().updatePageflowTargetPage(
endPageflowNode, navCase);
} else {
endPageflowNode = (PageflowPage) mapPaths2PF.get(path);
}
if (target_ != null) {
ReferenceElement element = new PageReferenceElement(
endPageflowNode);
element.add(target_);
endPageflowNode.setReferenceLink(element
.resolveReferenceString());
endPageflowNode.getFCElements().add(target_);
}
}
return endPageflowNode;
}
/**
* Return a valid cached pageflow node.
*
* @param key
* @return
*/
private PageflowPage getValidPFPageInCache(Object key) {
EObject element = (EObject) mapPaths2PF.get(key);
if (!TransformUtil.isValidPageflowElement(element)
|| !(element instanceof PageflowPage)
|| !((PageflowPage) element).getPath().equals(key)) {
mapPaths2PF.remove(key);
element = null;
}
return (PageflowPage) element;
}
/**
* Return a valid cached pageflow link.
*
* @param caseType
* @return
*/
private PageflowLink getValidPFLinkInCache(EObject caseType) {
PageflowLink link = (PageflowLink) mapCases2Links.get(caseType);
if (!TransformUtil.isValidLink(link)) {
mapCases2Links.remove(caseType);
link = null;
}
return link;
}
/**
* Update pageflow model elements against faces-config navigation case.
* @param pageflow_
* @param caseFC
* @return true if the pageflow was changed
*/
public boolean updatePageflowElements(Pageflow pageflow_,
NavigationCaseType caseFC) {
this.pageflowChanged = false;
this.pageflow = pageflow_;
ToViewIdType target_ = caseFC.getToViewId();
if (target_ == null) {
return false;
}
PageflowPage start = null, end = null;
// start page
start = getOrCreateStartPage(caseFC);
String action = null;
// action
if (caseFC.getFromAction() != null) {
action = caseFC.getFromAction().getTextContent();
}
// from outcome
String fromOutCome = null;
if (caseFC.getFromOutcome() != null) {
fromOutCome = caseFC.getFromOutcome().getTextContent();
}
// end page
end = getOrCreateEndPage(caseFC);
// link
// Is there a link in pageflow model?
PageflowLink link = null;
if ((link = findUnmappedLink(start, end, caseFC)) == null) {
if (end != null) {
if (DEBUG)
System.out.println("Create new link"); //$NON-NLS-1$
link = createPFLink(start, end, action, fromOutCome);
pageflowChanged = true;
}
}
if (link != null) {
link.getFCElements().clear();
link.getFCElements().add(caseFC);
mapCases2Links.put(caseFC, link);
}
adapt(start);
adapt(end);
adapt(caseFC);
adapt(link);
return pageflowChanged;
}
private boolean cleanPageflowNavigationRule(Pageflow pageflow_) {
boolean dirty = false;
List links = pageflow_.getLinks();
Iterator linksIterator = links.iterator();
while (linksIterator.hasNext()) {
PageflowLink link = (PageflowLink) linksIterator.next();
if (link.getFCElements().isEmpty()) {
linksIterator.remove();
if (link.getSource() != null) {
link.getSource().getOutlinks().remove(link);
}
if (link.getTarget() != null) {
link.getTarget().getInlinks().remove(link);
}
dirty = true;
}
}
return dirty;
}
/**
* merge the two navigation rules list between pageflow and face-config
* file. merge rule: 1. if the from-view-id, from-action, and from-outcome
* are same, they are the same navigation case, then the navigation case in
* face-config file should be updated by one in the pageflow. 2. otherwise
* the new navigation case should be created.
*
* FIXME: Not merge, only update page flow from faces-config.
*
* @param rulesFC -
* navigation rules in faces-config.
* @param navigationRulesInPageflow -
* navigation rules in pageflow model.
*
* @return boolean - whether add a new rule or not.
*/
private boolean updateNavigationRulesInPageflowFromFacesConfig(List rulesFC) {
boolean isNew = false;
// if the faces-config file is empty, the links should be removed.
if (rulesFC == null || rulesFC.isEmpty()) {
for (Iterator iterLink = pageflow.getLinks().iterator(); iterLink
.hasNext();) {
PageflowLink link = (PageflowLink) iterLink.next();
link.getSource().getOutlinks().remove(link);
link.getTarget().getInlinks().remove(link);
}
pageflow.getLinks().clear();
} else {
// Rule - Cases
for (Iterator iterRulesFC = rulesFC.iterator(); iterRulesFC
.hasNext();) {
NavigationRuleType ruleFC = (NavigationRuleType) iterRulesFC
.next();
List casesFC = ruleFC.getNavigationCase();
for (Iterator iterCasesFC = casesFC.iterator(); iterCasesFC
.hasNext();) {
NavigationCaseType navigationCaseFC = (NavigationCaseType) iterCasesFC
.next();
isNew |= updatePageflowElements(pageflow, navigationCaseFC);
}
}
}
isNew |= cleanPageflowNavigationRule(pageflow);
return isNew;
}
/**
* Find a pageflow link that is not linked to a faces-config element. Since
* user might edit faces-config file with other editor, so the path is not
* always valid, here we still try to match link and navigation case. TODO:
* should we always resolve mapping from referenceLink on PageflowElement?
*/
private PageflowLink findUnmappedLink(PageflowPage start, PageflowPage end,
NavigationCaseType caseFC) {
List links = start.getOutlinks();
for (int i = 0, n = links.size(); i < n; i++) {
PageflowLink link = (PageflowLink) links.get(i);
if (link.getSource() == start && link.getTarget() == end) {
link.update();
if (link.getFCElements().isEmpty()
|| link.getFCElements().getData().get(0) == caseFC) {
return link;
}
}
}
return null;
}
/**
* create a new PFLink object according to fromOutcome attribute
*
* @param fromOutcome -
* PFLink's fromOutcome attribute
* @return - new PFLink object
*/
public PageflowLink createPFLink(String fromOutcome) {
PageflowLink link = null;
link = PageflowModelManager.getFactory().createPFLink();
if (fromOutcome != null && fromOutcome.length() > 0) {
link.setOutcome(fromOutcome.trim());
}
pageflow.getLinks().add(link);
return link;
}
/**
* create a new PFLink object according to fromOutcome attribute
* @param start
* @param target_
* @param action
*
* @param fromOutcome -
* PFLink's fromOutcome attribute
* @return - new PFLink object
*/
public PageflowLink createPFLink(PageflowNode start, PageflowNode target_,
String action, String fromOutcome) {
Assert.isTrue(start != null && target_ != null);
PageflowLink link = null;
link = createPFLink(fromOutcome);
link.setFromaction(action);
link.setSource(start);
link.setTarget(target_);
start.getOutlinks().add(link);
target_.getInlinks().add(link);
return link;
}
/**
* Create a new PFPage according to from-view-id
*
* @param fromViewID -
* page's from-view-id
* @return the page flow page
*/
public PageflowPage createPFPage(String fromViewID) {
PageflowPage page = PageflowFactory.eINSTANCE.createPFPage();
if (fromViewID != null && fromViewID.length() > 0) {
page.setPath(fromViewID.trim());
page.setName(WebrootUtil.getPageNameFromWebPath(fromViewID.trim()));
}
this.pageflow.getNodes().add(page);
return page;
}
/**
* update pageflow model according to the face-config model
*
* @author sfshi
* @return true if new rules were added
*/
public boolean updatePageflowModelFromEMF() {
if (pageflow != null && facesConfig != null) {
List navigationRulesInFacesconfig = facesConfig.getNavigationRule();
clearCaches();
// if add new one, we can relayout the current pageflow.
return updateNavigationRulesInPageflowFromFacesConfig(navigationRulesInFacesconfig);
}
return false;
}
void refreshLink(NavigationCaseType caseType) {
PageflowLink link = getValidPFLinkInCache(caseType);
if (link != null) {
removeLink(link);
}
// update pageflow
if (TransformUtil.isValidFacesConfigElement(caseType)) {
updatePageflowElements(pageflow, caseType);
}
}
public void notifyChanged(Notification msg) {
int type = msg.getEventType();
switch (type) {
case MY_NOTIFICATION_TYPE:
setNeedBatchOperations(true);
break;
case MY_NOTIFICATION_TYPE1:
setNeedBatchOperations(false);
}
}
/**
* @return true if is listening to notifications and not
* currently in an event
*/
public boolean isListenToNotify() {
return listenToNotify && !isInEvent;
}
/**
* @return true if in event
*/
// public boolean isInEvent() {
// return isInEvent;
// }
/**
* @param isInEvent
*/
public void setInEvent(boolean isInEvent) {
this.isInEvent = isInEvent;
}
/**
* @return the faces config model
*/
public FacesConfigType getFacesConfig() {
return facesConfig;
}
/**
* @return the root page flow
*/
public Pageflow getPageflow() {
return pageflow;
}
/**
* @param value
* @return a new fromViewId with the text content set to value
*/
public static FromViewIdType createRLFromViewID(String value) {
FromViewIdType fromView = FacesConfigFactory.eINSTANCE
.createFromViewIdType();
fromView.setTextContent(value);
return fromView;
}
/**
* @param value
* @return a new to view with the text content set to value
*/
public static ToViewIdType createFCToViewID(String value) {
ToViewIdType toView = FacesConfigFactory.eINSTANCE.createToViewIdType();
toView.setTextContent(value);
return toView;
}
}