/******************************************************************************* * Copyright (c) 2007 Exadel, Inc. and Red Hat, Inc. * Distributed under license by Red Hat, Inc. All rights reserved. * This program is 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: * Exadel, Inc. and Red Hat, Inc. - initial API and implementation ******************************************************************************/ package org.jboss.tools.seam.pages.xml.model.handlers; import java.util.*; import org.jboss.tools.common.meta.*; import org.jboss.tools.common.meta.action.impl.handlers.DefaultCreateHandler; import org.jboss.tools.common.meta.action.impl.handlers.DefaultRemoveHandler; import org.jboss.tools.common.model.*; import org.jboss.tools.common.model.util.FindObjectHelper; import org.jboss.tools.common.model.util.XModelObjectUtil; import org.jboss.tools.jst.web.model.ReferenceObject; import org.jboss.tools.seam.pages.xml.model.SeamPagesConstants; import org.jboss.tools.seam.pages.xml.model.helpers.SeamPagesDiagramStructureHelper; public class PageAdopt implements XAdoptManager, SeamPagesConstants { public static boolean move_case = false; public boolean isAdoptable(XModelObject target, XModelObject object) { String entity = object.getModelEntity().getName(); if(ENT_DIAGRAM_ITEM_OUTPUT.equals(entity)) { if(move_case) { return canMoveCase(target, object); } return canBeOutputTarget(target); } if(ENT_DIAGRAM_ITEM.equals(entity)) { return canDrawCustomLink(target, object) || canBeOutputTarget(target); } if(entity.startsWith(ENT_SEAM_PAGE)) { return canBeOutputTarget(target); } return false; } private boolean canBeOutputTarget(XModelObject group) { String type = group.getAttributeValue(ATTR_TYPE); if(TYPE_EXCEPTION.equals(type)) { //Exception cannot be the target return false; } String path = group.getAttributeValue(ATTR_PATH); if(path == null) path = group.getAttributeValue(ATTR_VIEW_ID); if(path == null) return false; if(path.length() == 0 || path.indexOf("*") >= 0) return false; return true; } private boolean canDrawCustomLink(XModelObject target, XModelObject source) { if(!(source instanceof ReferenceObject)) { return false; } ReferenceObject i = (ReferenceObject)source; if(i.getReference() != null) { //only virtual items can be sources of custom links. return false; } String sourcePath = source.getAttributeValue(ATTR_PATH); if(!isEL(sourcePath)) { return false; } if(!(target instanceof ReferenceObject)) { return false; } ReferenceObject j = (ReferenceObject)target; if(j.getReference() == null) { //only real items can be targets of custom links return false; } String type = target.getAttributeValue(ATTR_TYPE); if(TYPE_EXCEPTION.equals(type)) { //Exception cannot be the target return false; } String path = target.getAttributeValue(ATTR_PATH); if(path == null) path = target.getAttributeValue(ATTR_VIEW_ID); if(path == null) return false; return true; } public static boolean isEL(String path) { if(path.indexOf('{') < 0) { return false; } return true; } private boolean canMoveCase(XModelObject target, XModelObject object) { XModelObject case_ = null; if(object instanceof ReferenceObject) { case_ = ((ReferenceObject)object).getReference(); } else { case_ = object; } XModelObject rule = null; if(target instanceof ReferenceObject) { rule = ((ReferenceObject)target).getReference(); } else { rule = target; } if(case_ == null || case_.getParent().getModelEntity().getName().startsWith(ENT_EXCEPTION)) { return false; } return (rule == null || !case_.getPath().startsWith(rule.getPath())); } public void adopt(XModelObject target, XModelObject object, Properties p) throws XModelException { String entity = object.getModelEntity().getName(); if(ENT_DIAGRAM_ITEM_OUTPUT.equals(entity)) { if(move_case) { moveOutput(object, target, p); } else { adoptOutput(object, target, p); } } else if(ENT_DIAGRAM_ITEM.equals(entity)) { if(canDrawCustomLink(target, object)) { drawCustomLink(target, object); } else { adoptItem(object, target, p); } } else if(entity.startsWith(ENT_SEAM_PAGE)) { adoptSeamPage(object, target, p); } } protected void adoptOutput(XModelObject source, XModelObject target, Properties p) throws XModelException { ReferenceObject i = (ReferenceObject)source; adoptCase(i.getReference(), target, p); } protected void adoptCase(XModelObject source, XModelObject target, Properties p) throws XModelException { //TODO provide that source is redirect or render source.getModel().changeObjectAttribute(source, ATTR_VIEW_ID, target.getAttributeValue(ATTR_PATH)); } protected void adoptItem(XModelObject source, XModelObject target, Properties p) throws XModelException { ReferenceObject i = (ReferenceObject)source; if(i.getReference() == null) { String path = i.getAttributeValue(ATTR_PATH); if(isEL(path)) { //do not create rule for EL. return; } XModelObject rule = createRule(target, path); adoptSeamPage(rule, target, p); } else { adoptSeamPage(i.getReference(), target, p); } } protected void adoptSeamPage(XModelObject source, XModelObject target, Properties p) throws XModelException { String path = target.getAttributeValue(ATTR_PATH); if(source != null && source.getModelEntity().getName().startsWith(ENT_EXCEPTION)) { XModelObject redirect = source.getChildByPath("target"); if(redirect != null) { redirect.getModel().editObjectAttribute(redirect, ATTR_VIEW_ID, path); return; } } // String n = path; // if(n.lastIndexOf('.') > 0) n = n.substring(0, n.lastIndexOf('.')); // if(n.lastIndexOf('/') >= 0) n = n.substring(n.lastIndexOf('/') + 1); XModelObject cs = source.getModel().createModelObject(XModelObjectUtil.getVersionedChildEntity(source.getModelEntity(), ENT_NAVIGATION_RULE), null); XModelObject redirect = source.getModel().createModelObject(XModelObjectUtil.getVersionedChildEntity(cs.getModelEntity(), "SeamPageRedirect"), null); redirect.setAttributeValue(ATTR_VIEW_ID, path); cs.addChild(redirect); //TODO // cs.setAttributeValue(ATT_FROM_OUTCOME, n); // int i = 0; // while (source.getChildByPath(cs.getPathPart()) != null) // cs.setAttributeValue(ATT_FROM_OUTCOME, n + (++i)); DefaultCreateHandler.addCreatedObject(source, cs, p); } void moveOutput(XModelObject source, XModelObject target, Properties p) throws XModelException { ReferenceObject i = (ReferenceObject)source; moveCase(i.getReference(), target, p); } void moveCase(XModelObject source, XModelObject target, Properties p) throws XModelException { XModelObject rule = null; if(target instanceof ReferenceObject) { rule = ((ReferenceObject)target).getReference(); if(rule == null) { String path = target.getAttributeValue(ATTR_PATH); rule = createRule(target, path); } } else { rule = target; } if(rule == null || source.getParent() == rule) return; source = source.getParent(); if(source.getModelEntity().getName().startsWith(ENT_RULE)) { //no! source = source.getParent(); } DefaultRemoveHandler.removeFromParent(source); DefaultCreateHandler.addCreatedObject(rule, source, p); } XModelObject createRule(XModelObject o, String path) throws XModelException { XModelObject file = SeamPagesDiagramStructureHelper.instance.getParentFile(o); XModelObject pages = file.getChildByPath(FOLDER_PAGES); String childEntity = pages.getModelEntity().getChildren()[0].getName(); XModelObject rule = pages.getModel().createModelObject(childEntity, null); rule.setAttributeValue(ATTR_VIEW_ID, path); DefaultCreateHandler.addCreatedObject(pages, rule, FindObjectHelper.IN_EDITOR_ONLY); return rule; } void drawCustomLink(XModelObject target, XModelObject source) throws XModelException { ReferenceObject j = (ReferenceObject)target; String viewId = j.getReference().getAttributeValue(ATTR_VIEW_ID); XModelObject output = target.getModel().createModelObject(ENT_DIAGRAM_ITEM_OUTPUT, null); output.setAttributeValue(ATTR_ID, viewId); output.setAttributeValue(ATTR_PATH, viewId); String name = XModelObjectUtil.createNewChildName("output", source); output.setAttributeValue(ATTR_NAME, name); output.setAttributeValue(ATTR_SUBTYPE, SUBTYPE_CUSTOM); output.setAttributeValue(ATTR_TARGET, target.getPathPart()); DefaultCreateHandler.addCreatedObject(source, output, FindObjectHelper.IN_EDITOR_ONLY); } }