/******************************************************************************* * 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.model.util; import java.util.*; import org.jboss.tools.common.meta.XAttribute; import org.jboss.tools.common.meta.XChild; import org.jboss.tools.common.meta.XModelEntity; import org.jboss.tools.common.model.*; import javax.naming.*; public final class XModelObjectUtil { /* * Creates unused name for child if pathpart equals name */ public static String createNewChildName(String name, XModelObject parent) { if(parent.getChildByPath(name) == null) return name; int i = 0; while(parent.getChildByPath(name + (++i)) != null); return name + i; } public static String[] asStringArray(String s) { return asStringArray(s, ",;"); //$NON-NLS-1$ } public static String[] asStringArray(String s, String separator) { if(s == null || s.length() == 0) return new String[0]; StringTokenizer st = new StringTokenizer(s, separator); String[] result = new String[st.countTokens()]; for (int i = 0; i < result.length; i++) result[i] = st.nextToken().trim(); return result; } public static int[] asIntArray(String value) { String[] s = asStringArray(value); int[] result = new int[s.length]; for (int i = 0; i < s.length; i++) { try { result[i] = Integer.parseInt(s[i]); } catch (NumberFormatException e) { result[i] = 0; } } return result; } public static String[][] asParameters(String s) { String[] sx = asStringArray(s); String[][] res = new String[sx.length][]; for (int i = 0; i < sx.length; i++) { int d = sx[i].indexOf(' '); res[i] = (d < 0) ? new String[]{"", sx[i]} //$NON-NLS-1$ : new String[]{sx[i].substring(0, d), sx[i].substring(d + 1).trim()}; } return res; } public static String getExpandedValue(XModelObject object, String attr, Context context) { return expand(object.getAttributeValue(attr), object.getModel(), context, new Properties()); } public static String expand(String s, XModel model, Context context) { return expand(s, model, context, new Properties()); } public static String expand(String s, XModel model, Context context, Properties found) { if(s == null || s.indexOf('%') < 0) return s; StringBuffer sb = new StringBuffer(); expand(s, model, context, found, sb); return sb.toString(); } private static void expand(String s, XModel model, Context context, Properties found, StringBuffer result) { if(s.length() == 0) return; int i = s.indexOf('%'), j = s.indexOf('%', i + 1); if(j <= i) { result.append(s); } else { result.append(s.substring(0, i)); String q = s.substring(i + 1, j); s = s.substring(j + 1); String v = found.getProperty(q); if(v == null) { v = (model == null) ? null : model.getProperties().getProperty(q); if(v == null && model != null) { int d = q.lastIndexOf('.'); String op = (d < 0) ? q : q.substring(0, d); String oa = (d < 0) ? "value" : q.substring(d + 1); //$NON-NLS-1$ XModelObject o = model.getByPath(op); v = (o == null) ? null : o.getAttributeValue(oa); } v = (v == null) ? "" : expand(v, model, context, found); //$NON-NLS-1$ found.setProperty(q, v); } result.append(v); expand(s, model, context, found, result); } } public static Properties toProperties(XModelObject fs) { return toProperties(fs.getAttributeValue("info")); //$NON-NLS-1$ } public static Properties toProperties(String s) { Properties props = new Properties(); StringTokenizer st = new StringTokenizer(s, ","); //$NON-NLS-1$ while (st.hasMoreElements()) { String t = st.nextToken(); int i = t.indexOf('='); if (i < 0) { props.setProperty(t, ""); //$NON-NLS-1$ } else { String n = t.substring(0, i).trim(); String v = t.substring(i + 1).trim(); props.setProperty(n, v); } } return props; } public static String toString(Properties props) { Iterator it = props.entrySet().iterator(); String s = ""; //$NON-NLS-1$ while (it.hasNext()) { Map.Entry entry = (Map.Entry)it.next(); s += (s.length() > 0 ? "," : "") + entry.getKey() + "=" + entry.getValue(); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ } return s; } public static String getDocumentPublicID(XModelObject object) { XModelObject f = object; while(f != null && f.getFileType() != XModelObject.FILE) f = f.getParent(); if(f == null) return null; String r = f.getAttributeValue("publicId"); //$NON-NLS-1$ if(r != null) return r; r = f.getAttributeValue("xsi:schemaLocation"); //$NON-NLS-1$ return r; } public static String getXMLLocalPath(XAttribute attribute) { if(attribute == null) return null; String tag = attribute.getModelEntity().getXMLSubPath(); if(tag == null || tag.length() == 0) tag = attribute.getModelEntity().getName(); String attr = attribute.getXMLName(); if(attr == null || attr.length() == 0) attr = attribute.getName(); int t = attr.indexOf("#text"); //$NON-NLS-1$ if(t >= 0) attr = attr.substring(0, t) + "text()[1]"; //$NON-NLS-1$ String path = tag.replace('.', '/') + '/' + attr.replace('.', '/'); while(path.lastIndexOf('/') != path.indexOf('/')) path = path.substring(path.indexOf('/') + 1); if (t<0) path = path.replace('/','@'); return path; } private static Map<String, String> versionedChildEntities = new HashMap<String, String>(); /** * Returns child entity name of parent entity which is equal to entityRoot or differs from it * by digital suffix. * @param parent * @param entityRoot * @return */ public static String getVersionedChildEntity(XModelEntity parent, String entityRoot) { String key = parent.getName() + ":" + entityRoot; //$NON-NLS-1$ if(versionedChildEntities.containsKey(key)) { return versionedChildEntities.get(key); } XChild[] cs = parent.getChildren(); for (int i = 0; i < cs.length; i++) { String n = cs[i].getName(); if(n.equals(entityRoot)) { versionedChildEntities.put(key, n); return n; } if(!n.startsWith(entityRoot)) continue; String suff = n.substring(entityRoot.length()); if(Character.isDigit(suff.charAt(0))) { versionedChildEntities.put(key, n); return n; } } String result = "Unknown_Child_" + entityRoot + "_in_" + parent.getName(); //$NON-NLS-1$ //$NON-NLS-2$ versionedChildEntities.put(key, result); return result; } }