diff options
Diffstat (limited to 'jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/synchronization/FC2PFTransformer.java')
-rw-r--r-- | jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/synchronization/FC2PFTransformer.java | 983 |
1 files changed, 0 insertions, 983 deletions
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/synchronization/FC2PFTransformer.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/synchronization/FC2PFTransformer.java deleted file mode 100644 index e2a9fb08e..000000000 --- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/synchronization/FC2PFTransformer.java +++ /dev/null @@ -1,983 +0,0 @@ -/******************************************************************************* - * 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; - } -} |