/******************************************************************************* * 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.model.impl; import java.util.Iterator; import java.util.List; import org.eclipse.core.runtime.Assert; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EStructuralFeature; 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.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.PageflowElement; import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink; import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage; import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage; import org.eclipse.jst.jsf.facesconfig.ui.pageflow.synchronization.FC2PFTransformer; import org.eclipse.jst.jsf.facesconfig.ui.pageflow.synchronization.TransformUtil; /** * The reference element represents a mapping from pageflow page to one or more * navigation rules/cases's view IDs (fromViewID or toViewID). * * @author hmeng */ public class PageReferenceElement extends ReferenceElement { /** * @param pageflowElement */ public PageReferenceElement(PageflowElement pageflowElement) { super(pageflowElement); } /** * @param pageflowElement * @param facesConfigObject */ public PageReferenceElement(PageflowElement pageflowElement, EObject facesConfigObject) { super(pageflowElement, facesConfigObject); } public void add(EObject object) { Assert.isTrue(object instanceof FromViewIdType || object instanceof ToViewIdType); super.add(object); } public void update() { outer: for (Iterator nodes = getData().iterator(); nodes.hasNext();) { Object next = nodes.next(); if (next instanceof FromViewIdType) { if (!TransformUtil.isValidFacesConfigElement((EObject) next)) { nodes.remove(); continue; } List links = ((PageflowPage) pageflowElement).getOutlinks(); for (int i = 0; i < links.size(); i++) { PageflowLink link = (PageflowLink) links.get(i); if (!link.getFCElements().isEmpty() && TransformUtil .isValidFacesConfigElement((NavigationCaseType) ((PageflowLink) links .get(i)).getFCElements().getData() .get(0))) { NavigationRuleType rule = (NavigationRuleType) ((NavigationCaseType) ((PageflowLink) links .get(i)).getFCElements().getData().get(0)) .eContainer(); if (rule == null || rule.getFromViewId() == next) { // There navigation case // matching this end. continue outer; } } } // No case contains this end. nodes.remove(); } else if (next instanceof ToViewIdType) { if (!TransformUtil.isValidFacesConfigElement((EObject) next)) { nodes.remove(); continue; } // Verify this is case end. List links = ((PageflowPage) pageflowElement).getInlinks(); for (int i = 0; i < links.size(); i++) { PageflowLink link = (PageflowLink) links.get(i); if (!link.getFCElements().isEmpty() && TransformUtil .isValidFacesConfigElement((NavigationCaseType) link .getFCElements().getData().get(0))) { if (((NavigationCaseType) ((PageflowLink) links.get(i)) .getFCElements().getData().get(0)) .getToViewId() == next) { // There navigation case // matching this end. continue outer; } } } // No case contains this end. nodes.remove(); } } } public Object get(int eFeature) { Object result = null; switch (eFeature) { case PageflowPackage.PF_PAGE__COMMENT: if (!isEmpty()) { for (int i = 0, n = getData().size(); i < n; i++) { NavigationRuleType rule = null; if ((rule = resolveRuleFromFCElement(getData().get(i))) != null) { List descriptions = rule.getDescription(); if (descriptions.size() > 0) { result = ((DescriptionType) descriptions.get(0)) .getTextContent(); break; } } } } break; case PageflowPackage.PF_PAGE__LARGEICON: if (!isEmpty()) { for (int i = 0, n = getData().size(); i < n; i++) { NavigationRuleType rule = null; if ((rule = resolveRuleFromFCElement(getData().get(i))) != null) { List icons = rule.getIcon(); if (icons.size() > 0) { result = ((IconType) icons.get(0)).getLargeIcon() != null ? ((IconType) icons .get(0)).getLargeIcon().getTextContent() : null; break; } } } } break; case PageflowPackage.PF_PAGE__NAME: // To see if it is in navigation rule. if (!isEmpty() && !isEndOnly()) { for (int i = 0, n = getData().size(); i < n; i++) { NavigationRuleType rule = null; if ((rule = resolveRuleFromFCElement(getData().get(i))) != null) { List displaynames = rule.getDisplayName(); if (displaynames.size() > 0) { result = ((DisplayNameType) displaynames.get(0)) .getTextContent(); break; } } } } break; case PageflowPackage.PF_PAGE__PATH: if (!isEmpty()) { for (int i = 0, n = getData().size(); i < n; i++) { if (getData().get(i) instanceof FromViewIdType) { result = ((FromViewIdType) getData().get(i)) .getTextContent(); break; } } if (result == null && getData().get(0) instanceof ToViewIdType) { result = ((ToViewIdType) getData().get(0)).getTextContent(); } } break; case PageflowPackage.PF_PAGE__SMALLICON: if (!isEmpty()) { for (int i = 0, n = getData().size(); i < n; i++) { NavigationRuleType rule = null; if ((rule = resolveRuleFromFCElement(getData().get(i))) != null) { List icons = rule.getIcon(); if (icons.size() > 0) { result = ((IconType) icons.get(0)).getSmallIcon() != null ? ((IconType) icons .get(0)).getSmallIcon().getTextContent() : null; break; } } } } break; } return result; } private NavigationRuleType resolveRuleFromFCElement(Object object) { if (object instanceof FromViewIdType) { return (NavigationRuleType) ((FromViewIdType) object).eContainer(); } return null; } private NavigationRuleType resolveRuleFromPFElement(Object object) { if (object instanceof PageflowLink) { NavigationCaseType caseType = (NavigationCaseType) ((PageflowLink) object) .getFCElements().getData().get(0); return (NavigationRuleType) caseType.eContainer(); } return null; } public void set(EStructuralFeature eFeature, Object newVal) { switch (eFeature.getFeatureID()) { case PageflowPackage.PF_PAGE__COMMENT: { DescriptionType description = null; String newValue = (String) newVal; if (!isEmpty()) { for (int i = 0, n = getData().size(); i < n; i++) { NavigationRuleType rule = null; if ((rule = resolveRuleFromFCElement(getData().get(i))) != null) { rule.getDescription().clear(); description = FacesConfigFactory.eINSTANCE .createDescriptionType(); description.setTextContent(newValue); rule.getDescription().add(description); } } } break; } case PageflowPackage.PF_PAGE__LARGEICON: { LargeIconType oldLargeIcon = null; LargeIconType newLargeIconType = null; IconType icon = null; String newValue = (String) newVal; if (!isEmpty()) { for (int i = 0, n = getData().size(); i < n; i++) { NavigationRuleType rule = null; if ((rule = resolveRuleFromFCElement(getData().get(i))) != null) { List icons = rule.getIcon(); if (newValue == null || newValue.length() == 0) { if (icons.size() > 0) { if (((IconType) icons.get(0)).getLargeIcon() != null) { ((IconType) icons.get(0)) .setLargeIcon(null); } } } else { if (icons.size() == 0) { icon = FacesConfigFactory.eINSTANCE .createIconType(); newLargeIconType = FacesConfigFactory.eINSTANCE .createLargeIconType(); newLargeIconType.setTextContent(newValue); icon.setLargeIcon(newLargeIconType); icons.add(icon); } else if (((IconType) icons.get(0)).getLargeIcon() == null) { newLargeIconType = FacesConfigFactory.eINSTANCE .createLargeIconType(); newLargeIconType.setTextContent(newValue); icon = ((IconType) icons.get(0)); icon.setLargeIcon(newLargeIconType); } else { oldLargeIcon = ((IconType) icons.get(0)) .getLargeIcon(); oldLargeIcon.setTextContent(newValue); } } } } } break; } case PageflowPackage.PF_PAGE__NAME: DisplayNameType newDisplayNameType = null; String newName = (String) newVal; if (!isEmpty()) { for (int i = 0, n = getData().size(); i < n; i++) { NavigationRuleType rule = null; if ((rule = resolveRuleFromFCElement(getData().get(i))) != null) { rule.getDisplayName().clear(); if (newName != null && newName.length() > 0) { newDisplayNameType = FacesConfigFactory.eINSTANCE .createDisplayNameType(); newDisplayNameType.setTextContent(newName); rule.getDisplayName().add(newDisplayNameType); } } } } break; case PageflowPackage.PF_PAGE__PATH: { Object oldPath = null; Object newPath = null; String newValue = (String) newVal; if (!isEmpty()) { for (int i = 0, n = getData().size(); i < n; i++) { if (getData().get(i) instanceof FromViewIdType) { oldPath = getData().get(i); ((FromViewIdType) oldPath).setTextContent(newValue); } else if (getData().get(i) instanceof ToViewIdType) { oldPath = getData().get(i); ((ToViewIdType) oldPath).setTextContent(newValue); } } } // Create new fromViewID or toViewID node as needed. else if (newValue != null && !"*".equals(newValue)) { //$NON-NLS-1$ if (((PageflowPage) pageflowElement).getOutlinks().size() > 0) { List links = ((PageflowPage) pageflowElement).getOutlinks(); for (int i = 0, n = links.size(); i < n; i++) { PageflowLink link = (PageflowLink) links.get(i); NavigationRuleType rule = resolveRuleFromPFElement(link); newPath = FC2PFTransformer.createRLFromViewID(newValue); rule.setFromViewId((FromViewIdType) newPath); add((EObject) newPath); } links = ((PageflowPage) pageflowElement).getInlinks(); for (int i = 0, n = links.size(); i < n; i++) { PageflowLink link = (PageflowLink) links.get(i); NavigationCaseType caseType = (NavigationCaseType) link .getFCElements().getData().get(0); newPath = FC2PFTransformer.createFCToViewID(newValue); caseType.setToViewId((ToViewIdType) newPath); add((EObject) newPath); } } } break; } case PageflowPackage.PF_PAGE__SMALLICON: { SmallIconType oldSmallicon = null; SmallIconType newSmallIconType = null; IconType icon = null; String newValue = (String) newVal; if (!isEmpty()) { for (int i = 0, n = getData().size(); i < n; i++) { NavigationRuleType rule = null; if ((rule = resolveRuleFromFCElement(getData().get(i))) != null) { List icons = rule.getIcon(); if (newValue == null || newValue.length() == 0) { if (icons.size() > 0) { if (((IconType) icons.get(0)).getSmallIcon() != null) { ((IconType) icons.get(0)) .setSmallIcon(null); } } } else { if (icons.size() == 0) { icon = FacesConfigFactory.eINSTANCE .createIconType(); newSmallIconType = FacesConfigFactory.eINSTANCE .createSmallIconType(); newSmallIconType.setTextContent(newValue); icon.setSmallIcon(newSmallIconType); icons.add(icon); } else if (((IconType) icons.get(0)).getSmallIcon() == null) { newSmallIconType = FacesConfigFactory.eINSTANCE .createSmallIconType(); newSmallIconType.setTextContent(newValue); icon = ((IconType) icons.get(0)); icon.setSmallIcon(newSmallIconType); } else { oldSmallicon = ((IconType) icons.get(0)) .getSmallIcon(); oldSmallicon.setTextContent(newValue); } } } } } break; } } } /** * @return true if none of the data are from view id's */ public boolean isEndOnly() { for (int i = 0, n = getData().size(); i < n; i++) { if (getData().get(i) instanceof FromViewIdType) { return false; } } return true; } }