blob: 72063c4811b918d3345fbde40c4627962ced7936 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2001, 2005 IBM Corporation 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.wst.dtd.core.internal.emf.util;
public class DTDPathnameUtil {
static public String makePath(String parentPath, String type, String name, int cnt) {
String pn = null;
name = encode(name);
if ((name == null) && (cnt <= 0)) {
pn = type;
}
else if (cnt <= 0) {
pn = type + ":" + ((name == null) ? "" : name); //$NON-NLS-1$ //$NON-NLS-2$
}
else {
pn = type + ":" + ((name == null) ? "" : name) + ":" + cnt; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
}
if (parentPath != null) {
return parentPath + "." + pn; //$NON-NLS-1$
}
else {
return pn;
}
}
static public Object[] parsePathComponent(String path) {
/*
* This routine parse the first component of the path and returns the
* result in an arrray of Strings. result[0] = type (String) result[1] =
* name (String) result[2] = count (Integer) result[3] = the rest of
* the path (String)
*
* E.g. PathComponent result[0] result[1] result[2] result[3]
* ------------------------------------------------------------- type
* type <null> <null> <null> type.rest type <null> <null> rest
* type:name type name <null> <null> type:name.rest type name <null>
* rest type::n type <null> n <null> type::n.rest type <null> n rest
* type:name:n type name n <null> type:name:n.rest type name n rest
*/
Object[] result = new Object[4];
if (path == null)
return result;
int i = path.indexOf('.');
int length = path.length();
if (i < 0) {
i = length;
}
String type = null;
String name = null;
Integer n = null;
String rest = null;
// get the type
int j = path.indexOf(':');
if (j > i)
j = -1;
if (j < 0) {
type = path.substring(0, i);
}
else {
type = path.substring(0, j);
// get the name
int k = path.indexOf(':', j + 1);
if (k > i)
k = -1;
if (k < 0) {
name = path.substring(j + 1, i);
}
else {
name = path.substring(j + 1, k);
// get the count
try {
n = new Integer(path.substring(k + 1, i));
}
catch (Exception exc) {
}
if ((n != null) && (n.intValue() < 0)) {
n = null;
}
}
}
if ((name != null) && (name.length() == 0)) {
name = null;
}
if (i < length) {
rest = path.substring(i + 1);
}
result[0] = type;
result[1] = decode(name);
result[2] = n;
result[3] = rest;
return result;
}
static private String encode(String s) {
if (s == null)
return null;
StringBuffer o = new StringBuffer(s.length());
int len = s.length();
for (int i = 0; i < len; i++) {
char c = s.charAt(i);
if (Character.isLetterOrDigit(c) || (c == '-')) {
o.append(c);
}
else { // if ((c == '.') || (c == ':') || (c == '_') || ...)
// convert the character to a 4 digit hex code prefixed by "_"
String hex = Integer.toHexString(c);
int l = hex.length();
if (l == 1) {
o.append("_000"); //$NON-NLS-1$
o.append(hex);
}
else if (l == 2) {
o.append("_00"); //$NON-NLS-1$
o.append(hex);
}
else if (l == 3) {
o.append("_0"); //$NON-NLS-1$
o.append(hex);
}
else {
o.append('_');
o.append(hex);
}
}
} // for
return o.toString();
}
static private String decode(String s) {
if (s == null)
return null;
StringBuffer o = new StringBuffer(s.length());
int len = s.length();
for (int i = 0; i < len; i++) {
char c = s.charAt(i);
if (c != '_') {
o.append(c);
}
else { // next 4 characters are the hex code
String hex;
if (len > i + 4) {
hex = s.substring(i + 1, i + 5);
i += 4;
}
else {
hex = s.substring(i + 1);
i = len - 1;
}
o.append((char) Integer.parseInt(hex, 16));
}
} // for
return o.toString();
}
/**
* @generated
*/
protected static String makePathGen(String parentPath, String type, String name, int cnt) {
String pn = null;
name = encode(name);
if ((name == null) && (cnt <= 0)) {
pn = type;
}
else if (cnt <= 0) {
pn = type + ":" + ((name == null) ? "" : name); //$NON-NLS-1$ //$NON-NLS-2$
}
else {
pn = type + ":" + ((name == null) ? "" : name) + ":" + cnt; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
}
if (parentPath != null) {
return parentPath + "." + pn; //$NON-NLS-1$
}
else {
return pn;
}
}
/**
* @generated
*/
protected static Object[] parsePathComponentGen(String path) {
/*
* This routine parse the first component of the path and returns the
* result in an arrray of Strings. result[0] = type (String) result[1] =
* name (String) result[2] = count (Integer) result[3] = the rest of
* the path (String)
*
* E.g. PathComponent result[0] result[1] result[2] result[3]
* ------------------------------------------------------------- type
* type <null> <null> <null> type.rest type <null> <null> rest
* type:name type name <null> <null> type:name.rest type name <null>
* rest type::n type <null> n <null> type::n.rest type <null> n rest
* type:name:n type name n <null> type:name:n.rest type name n rest
*/
Object[] result = new Object[4];
if (path == null)
return result;
int i = path.indexOf('.');
int length = path.length();
if (i < 0) {
i = length;
}
String type = null;
String name = null;
Integer n = null;
String rest = null;
// get the type
int j = path.indexOf(':');
if (j > i)
j = -1;
if (j < 0) {
type = path.substring(0, i);
}
else {
type = path.substring(0, j);
// get the name
int k = path.indexOf(':', j + 1);
if (k > i)
k = -1;
if (k < 0) {
name = path.substring(j + 1, i);
}
else {
name = path.substring(j + 1, k);
// get the count
try {
n = new Integer(path.substring(k + 1, i));
}
catch (Exception exc) {
}
if ((n != null) && (n.intValue() < 0)) {
n = null;
}
}
}
if ((name != null) && (name.length() == 0)) {
name = null;
}
if (i < length) {
rest = path.substring(i + 1);
}
result[0] = type;
result[1] = decode(name);
result[2] = n;
result[3] = rest;
return result;
}
/**
* @generated
*/
protected static String encodeGen(String s) {
if (s == null)
return null;
StringBuffer o = new StringBuffer(s.length());
int len = s.length();
for (int i = 0; i < len; i++) {
char c = s.charAt(i);
if (Character.isLetterOrDigit(c) || (c == '-')) {
o.append(c);
}
else { // if ((c == '.') || (c == ':') || (c == '_') || ...)
// convert the character to a 4 digit hex code prefixed by "_"
String hex = Integer.toHexString(c);
int l = hex.length();
if (l == 1) {
o.append("_000"); //$NON-NLS-1$
o.append(hex);
}
else if (l == 2) {
o.append("_00"); //$NON-NLS-1$
o.append(hex);
}
else if (l == 3) {
o.append("_0"); //$NON-NLS-1$
o.append(hex);
}
else {
o.append('_');
o.append(hex);
}
}
} // for
return o.toString();
}
/**
* @generated
*/
protected static String decodeGen(String s) {
if (s == null)
return null;
StringBuffer o = new StringBuffer(s.length());
int len = s.length();
for (int i = 0; i < len; i++) {
char c = s.charAt(i);
if (c != '_') {
o.append(c);
}
else { // next 4 characters are the hex code
String hex;
if (len > i + 4) {
hex = s.substring(i + 1, i + 5);
i += 4;
}
else {
hex = s.substring(i + 1);
i = len - 1;
}
o.append((char) Integer.parseInt(hex, 16));
}
} // for
return o.toString();
}
}