/******************************************************************************* * 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.common.meta.action.impl; import java.util.*; import org.w3c.dom.*; import org.jboss.tools.common.meta.XModelEntity; import org.jboss.tools.common.meta.action.*; import org.jboss.tools.common.meta.impl.*; import org.jboss.tools.common.model.XModelObjectConstants; import org.jboss.tools.common.model.plugin.ModelPlugin; public class XActionListImpl extends XActionItemImpl implements XActionList { private XActionItem[] items; private short groupfactor = 0; private Element element = null; public XActionListImpl() {} public void setElement(Element element) { this.element = element; if(element != null) super.load(element); } public XActionItem getByPath(String path) { if(path == null) return getItem(path); // why? return findItem(path); } public boolean isLoaded() { return (element == null); } public void validate() { if(isLoaded()) return; synchronized(this) { if(element == null) return; load(element); element = null; } } public void print(String off) { XActionItem[] is = (XActionItem[])getActionItems(); for (int i = 0; i < is.length; i++) { XActionItemImpl item = (XActionItemImpl)is[i]; if(item instanceof XActionListImpl) ((XActionListImpl)item).print(off + " "); //$NON-NLS-1$ } } public XActionItem[] getActionItems() { return items; } public short getGroupFactor() { return groupfactor; } public XActionItem getItem(String name) { if(name == null) { ModelPlugin.getDefault().logWarning("XActionListImpl.getItem: name=null"); //$NON-NLS-1$ } for (int i = 0; i < items.length; i++) { if(items[i].getName().equals(name)) return items[i]; } return null; } public XActionItem findItem(String path) { if(path == null || path.length() == 0) return null; StringTokenizer st = new StringTokenizer(path, "./"); //$NON-NLS-1$ XActionItem item = this; while(st.hasMoreTokens() && item != null) { String part = st.nextToken(); item = item.getItem(part); } return item; } public XAction getAction(String path) { XActionItem item = findItem(path); return (item instanceof XAction) ? (XAction)item : null; } public void load(Element el) { super.load(el); groupfactor = (short)XMetaDataLoader.getInt(el, "group", 0); //$NON-NLS-1$ NodeList ns = el.getChildNodes(); List<XActionItem> list = new ArrayList<XActionItem>(); for (int i = 0; i < ns.getLength(); i++) { Node n = ns.item(i); if(n.getNodeType() != Node.ELEMENT_NODE) continue; Element ei = (Element)n; String tag = ei.getNodeName(); if(XMODEL_ACTION_ITEM.equals(tag)) { String kind = ei.getAttribute("kind"); //$NON-NLS-1$ XActionItemImpl item = (kind.equals("list")) //$NON-NLS-1$ ? (XActionItemImpl) new XActionListImpl() : (XActionItemImpl) new XActionImpl(); item.setParent(this); item.load(ei); list.add(item); } else if(XMODEL_ACTION_ITEM_REF.equals(tag)) { String entityName = ei.getAttribute(XMetaDataConstants.ENTITY); String attrName = ei.getAttribute(NAME); String defaultPath = (getPath() == null) ? attrName : getPath() + XModelObjectConstants.SEPARATOR + attrName; String path = ei.hasAttribute("path") //$NON-NLS-1$ ? ei.getAttribute("path") //$NON-NLS-1$ : defaultPath; XModelEntity entity = getMetaModel().getEntity(entityName); if(entity != null) { XActionItem item = ((XActionListImpl)entity.getActionList()).findItem(path); if(item != null) { list.add(item.copy(Acceptor.DEFAULT)); } } } } items = list.toArray(new XActionItem[list.size()]); } public void merge(XActionListImpl ext) { validate(); XActionItem[] ext_items = ext.getActionItems(); Set<String> set = new HashSet<String>(); ArrayList<XActionItem> l = new ArrayList<XActionItem>(); for (int i = 0; i < items.length; i++) set.add(items[i].getName()); for (int i = 0; i < ext_items.length; i++) { String n = ext_items[i].getName(); if(!set.contains(n)) { ((XActionItemImpl)ext_items[i]).setParent(this); l.add(ext_items[i]); } else { XActionItem item = getItem(n); if((item instanceof XActionListImpl) && (ext_items[i] instanceof XActionListImpl)) { ((XActionListImpl)item).merge((XActionListImpl)ext_items[i]); } } } if(l.size() == 0) return; XActionItem[] nc = new XActionItem[items.length + l.size()]; for (int i = 0; i < items.length; i++) nc[i] = items[i]; for (int i = 0; i < l.size(); i++) nc[items.length + i] = l.get(i); items = nc; } public XActionItem copy(XActionItem.Acceptor acceptor) { if(!acceptor.accepts(this)) return null; XActionListImpl item = (XActionListImpl)super.copy(acceptor); item.groupfactor = groupfactor; ArrayList<XActionItem> l = new ArrayList<XActionItem>(); for (int i = 0; i < items.length; i++) { XActionItem ic = items[i].copy(acceptor); if(ic != null) l.add(ic); } item.items = l.toArray(new XActionItem[l.size()]); return item; } protected XActionItemImpl createInstance() { return new XActionListImpl(); } public void addActionItem(XActionItem item) { for (int i = 0; i < items.length; i++) if(items[i].getName().equals(item.getName())) return; XActionItem[] is = new XActionItem[items.length + 1]; System.arraycopy(items, 0, is, 0, items.length); is[items.length] = item; items = is; } }