001 /* 002 * Licensed to the Apache Software Foundation (ASF) under one 003 * or more contributor license agreements. See the NOTICE file 004 * distributed with this work for additional information 005 * regarding copyright ownership. The ASF licenses this file 006 * to you under the Apache License, Version 2.0 (the "License"); 007 * you may not use this file except in compliance with the License. 008 * You may obtain a copy of the License at 009 * 010 * http://www.apache.org/licenses/LICENSE-2.0 011 * 012 * Unless required by applicable law or agreed to in writing, software 013 * distributed under the License is distributed on an "AS IS" BASIS, 014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 015 * See the License for the specific language governing permissions and 016 * limitations under the License. 017 */ 018 /* 019 * $Id: Util.java 1225577 2011-12-29 15:54:35Z mrglavas $ 020 */ 021 022 package org.apache.xalan.xsltc.compiler.util; 023 024 import java.util.StringTokenizer; 025 026 import org.apache.bcel.generic.Type; 027 import org.apache.xalan.xsltc.compiler.Constants; 028 import org.apache.xml.utils.XML11Char; 029 030 /** 031 * @author Jacek Ambroziak 032 * @author Santiago Pericas-Geertsen 033 */ 034 public final class Util { 035 private static char filesep; 036 037 static { 038 String temp = System.getProperty("file.separator", "/"); 039 filesep = temp.charAt(0); 040 } 041 042 public static String noExtName(String name) { 043 final int index = name.lastIndexOf('.'); 044 return name.substring(0, index >= 0 ? index : name.length()); 045 } 046 047 /** 048 * Search for both slashes in order to support URLs and 049 * files. 050 */ 051 public static String baseName(String name) { 052 int index = name.lastIndexOf('\\'); 053 if (index < 0) { 054 index = name.lastIndexOf('/'); 055 } 056 057 if (index >= 0) 058 return name.substring(index + 1); 059 else { 060 int lastColonIndex = name.lastIndexOf(':'); 061 if (lastColonIndex > 0) 062 return name.substring(lastColonIndex + 1); 063 else 064 return name; 065 } 066 } 067 068 /** 069 * Search for both slashes in order to support URLs and 070 * files. 071 */ 072 public static String pathName(String name) { 073 int index = name.lastIndexOf('/'); 074 if (index < 0) { 075 index = name.lastIndexOf('\\'); 076 } 077 return name.substring(0, index + 1); 078 } 079 080 /** 081 * Replace all illegal Java chars by '_'. 082 */ 083 public static String toJavaName(String name) { 084 if (name.length() > 0) { 085 final StringBuffer result = new StringBuffer(); 086 087 char ch = name.charAt(0); 088 result.append(Character.isJavaIdentifierStart(ch) ? ch : '_'); 089 090 final int n = name.length(); 091 for (int i = 1; i < n; i++) { 092 ch = name.charAt(i); 093 result.append(Character.isJavaIdentifierPart(ch) ? ch : '_'); 094 } 095 return result.toString(); 096 } 097 return name; 098 } 099 100 public static Type getJCRefType(String signature) { 101 return Type.getType(signature); 102 } 103 104 public static String internalName(String cname) { 105 return cname.replace('.', filesep); 106 } 107 108 public static void println(String s) { 109 System.out.println(s); 110 } 111 112 public static void println(char ch) { 113 System.out.println(ch); 114 } 115 116 public static void TRACE1() { 117 System.out.println("TRACE1"); 118 } 119 120 public static void TRACE2() { 121 System.out.println("TRACE2"); 122 } 123 124 public static void TRACE3() { 125 System.out.println("TRACE3"); 126 } 127 128 /** 129 * Replace a certain character in a string with a new substring. 130 */ 131 public static String replace(String base, char ch, String str) { 132 return (base.indexOf(ch) < 0) ? base : 133 replace(base, String.valueOf(ch), new String[] { str }); 134 } 135 136 public static String replace(String base, String delim, String[] str) { 137 final int len = base.length(); 138 final StringBuffer result = new StringBuffer(); 139 140 for (int i = 0; i < len; i++) { 141 final char ch = base.charAt(i); 142 final int k = delim.indexOf(ch); 143 144 if (k >= 0) { 145 result.append(str[k]); 146 } 147 else { 148 result.append(ch); 149 } 150 } 151 return result.toString(); 152 } 153 154 /** 155 * Replace occurances of '.', '-', '/' and ':' 156 */ 157 public static String escape(String input) { 158 return replace(input, ".-/:", 159 new String[] { "$dot$", "$dash$", "$slash$", "$colon$" }); 160 } 161 162 public static String getLocalName(String qname) { 163 final int index = qname.lastIndexOf(':'); 164 return (index > 0) ? qname.substring(index + 1) : qname; 165 } 166 167 public static String getPrefix(String qname) { 168 final int index = qname.lastIndexOf(':'); 169 return (index > 0) ? qname.substring(0, index) : 170 Constants.EMPTYSTRING; 171 } 172 173 /** 174 * Checks if the string is a literal (i.e. not an AVT) or not. 175 */ 176 public static boolean isLiteral(String str) { 177 final int length = str.length(); 178 for (int i = 0; i < length - 1; i++) { 179 if (str.charAt(i) == '{' && str.charAt(i + 1) != '{') { 180 return false; 181 } 182 } 183 return true; 184 } 185 186 /** 187 * Checks if the string is valid list of qnames 188 */ 189 public static boolean isValidQNames(String str) { 190 if ((str != null) && (!str.equals(Constants.EMPTYSTRING))) { 191 final StringTokenizer tokens = new StringTokenizer(str); 192 while (tokens.hasMoreTokens()) { 193 if (!XML11Char.isXML11ValidQName(tokens.nextToken())) { 194 return false; 195 } 196 } 197 } 198 return true; 199 } 200 201 } 202