/******************************************************************************* * 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.jsf.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.jsf.model.*; import org.jboss.tools.jsf.model.helpers.*; import org.jboss.tools.jst.web.model.ReferenceObject; public class GroupAdopt implements XAdoptManager, JSFConstants { public static boolean move_case = false; public boolean isAdoptable(XModelObject target, XModelObject object) { String entity = object.getModelEntity().getName(); if(ENT_PROCESS_ITEM_OUTPUT.equals(entity)) { if(move_case) { return canMoveCase(target, object); } return canBeOutputTarget(target); } if(ENT_PROCESS_ITEM.equals(entity)) { return canBeOutputTarget(target); } if(ENT_PROCESS_GROUP.equals(entity)) { return canBeOutputTarget(target); } if(ENT_NAVIGATION_RULE.equals(entity) || ENT_NAVIGATION_RULE_20.equals(entity)) { return canBeOutputTarget(target); } if(ENT_NAVIGATION_CASE.equals(entity) || ENT_NAVIGATION_CASE_20.equals(entity)) { return canBeOutputTarget(target); } return false; } private boolean canBeOutputTarget(XModelObject group) { String path = group.getAttributeValue("path"); //$NON-NLS-1$ if(path.length() == 0 || path.indexOf("*") >= 0) return false; //$NON-NLS-1$ return true; } private boolean canMoveCase(XModelObject target, XModelObject object) { XModelObject case_ = null; if(object instanceof ReferenceObjectImpl) { case_ = ((ReferenceObject)object).getReference(); } else { case_ = object; } XModelObject rule = null; if(target instanceof ReferenceGroupImpl) { rule = ((ReferenceGroupImpl)target).getReference(); } else { rule = target; } return (case_ != null && rule == null || rule != case_.getParent()); } public void adopt(XModelObject target, XModelObject object, Properties p) throws XModelException { String entity = object.getModelEntity().getName(); if(ENT_PROCESS_ITEM_OUTPUT.equals(entity)) { if(move_case) { moveOutput(object, target, p); } else { adoptOutput(object, target, p); } } else if(ENT_PROCESS_ITEM.equals(entity)) adoptItem(object, target, p); else if(ENT_PROCESS_GROUP.equals(entity)) adoptGroup(object, target, p); else if(ENT_NAVIGATION_RULE.equals(entity) || ENT_NAVIGATION_RULE_20.equals(entity)) adoptRule(object, target, p); else if(ENT_NAVIGATION_CASE.equals(entity) || ENT_NAVIGATION_CASE_20.equals(entity)) adoptCase(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 { source.getModel().changeObjectAttribute(source, ATT_TO_VIEW_ID, target.getAttributeValue(ATT_PATH)); } protected void adoptItem(XModelObject source, XModelObject target, Properties p) throws XModelException { ReferenceObject i = (ReferenceObject)source; adoptRule(i.getReference(), target, p); } protected void adoptRule(XModelObject source, XModelObject target, Properties p) throws XModelException { String path = target.getAttributeValue(ATT_PATH); String n = path; if(n.lastIndexOf('.') > 0) n = n.substring(0, n.lastIndexOf('.')); if(n.lastIndexOf('/') >= 0) n = n.substring(n.lastIndexOf('/') + 1); String caseEntity = source.getModelEntity().getChildren()[0].getName(); XModelObject cs = source.getModel().createModelObject(caseEntity, null); cs.setAttributeValue(ATT_TO_VIEW_ID, path); 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); } protected void adoptGroup(XModelObject source, XModelObject target, Properties p) throws XModelException { ReferenceGroupImpl g = (ReferenceGroupImpl)source; XModelObject[] os = g.getReferences(); if(os != null && os.length > 0) { adoptRule(os[os.length - 1], target, p); } else { JSFNavigationModel nm = (JSFNavigationModel)JSFProcessStructureHelper.instance.getParentFile(target); String path = g.getAttributeValue(ATT_PATH); int count = nm.getRuleCount(path); String pp = AddCaseToGroupHandler.revalidateGroupPath(path, g.getPathPart(), count); XModelObject gx = g.getParent().getChildByPath(pp); if(gx == null || gx == g) { g.setAttributeValue(ATT_NAME, pp); g.setAttributeValue("persistent", "false"); //$NON-NLS-1$ //$NON-NLS-2$ } else if(gx instanceof ReferenceGroupImpl && ((ReferenceGroupImpl)gx).getReferences().length == 0) { String shape = g.getAttributeValue("shape"); //$NON-NLS-1$ g.setAttributeValue("shape", gx.getAttributeValue("shape")); //$NON-NLS-1$ //$NON-NLS-2$ gx.setAttributeValue("shape", shape); //$NON-NLS-1$ gx.setAttributeValue("persistent", "false"); //$NON-NLS-1$ //$NON-NLS-2$ } adoptRule(nm.addRule(path), target, 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 ReferenceGroupImpl) { rule = ((ReferenceGroupImpl)target).getReference(); if(rule == null) { JSFNavigationModel nm = (JSFNavigationModel)JSFProcessStructureHelper.instance.getParentFile(target); String path = target.getAttributeValue(ATT_PATH); rule = nm.addRule(path); } } else { rule = target; } if(rule == null || source.getParent() == rule) return; DefaultRemoveHandler.removeFromParent(source); DefaultCreateHandler.addCreatedObject(rule, source, p); } }