001 /*
002 * Copyright 2005 The Apache Software Foundation.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016 package org.vafer.jdeb.utils;
017
018 import java.io.IOException;
019 import java.io.InputStream;
020 import java.io.OutputStream;
021 import java.text.ParseException;
022
023
024 /**
025 * Simple utils functions.
026 *
027 * ATTENTION: don't use outside of jdeb
028 *
029 * @author Torsten Curdt <tcurdt@vafer.org>
030 */
031 public final class Utils {
032
033 public static int copy( final InputStream pInput, final OutputStream pOutput ) throws IOException {
034 final byte[] buffer = new byte[2048];
035 int count = 0;
036 int n = 0;
037 while (-1 != (n = pInput.read(buffer))) {
038 pOutput.write(buffer, 0, n);
039 count += n;
040 }
041 return count;
042 }
043
044 public static String toHex( final byte[] pBytes ) {
045 final StringBuffer sb = new StringBuffer();
046
047 for (int i = 0; i < pBytes.length; ++i) {
048 sb.append(Integer.toHexString((pBytes[i]>>4) & 0x0f));
049 sb.append(Integer.toHexString(pBytes[i] & 0x0f));
050 }
051
052 return sb.toString();
053 }
054
055 public static String stripPath( final int p, final String s ) {
056
057 if (p <= 0) {
058 return s;
059 }
060
061 int x = 0;
062 for (int i=0 ; i<p; i++) {
063 x = s.indexOf('/', x);
064 if (x < 0) {
065 return s;
066 }
067 }
068
069 return s.substring(x+1);
070 }
071
072 public static String stripLeadingSlash( final String s ) {
073 if (s == null) {
074 return s;
075 }
076 if (s.length() == 0) {
077 return s;
078 }
079 if (s.charAt(0) == '/') {
080 return s.substring(1);
081 }
082 return s;
083 }
084
085
086 /**
087 * Substitute the variables in the given expression with the
088 * values from the resolver
089 *
090 * @param pVariables
091 * @param pExpression
092 * @return
093 */
094 public static String replaceVariables(final VariableResolver pResolver, final String pExpression, final String pOpen, final String pClose) throws ParseException {
095
096 final char[] s = pExpression.toCharArray();
097
098 final char[] open = pOpen.toCharArray();
099 final char[] close = pClose.toCharArray();
100
101 final StringBuffer out = new StringBuffer();
102 StringBuffer sb = new StringBuffer();
103 char[] watch = open;
104 int w = 0;
105 for (int i = 0; i < s.length; i++) {
106 char c = s[i];
107
108 if (c == watch[w]) {
109 w++;
110 if (watch.length == w) {
111 // found the full token to watch for
112
113 if (watch == open) {
114 // found open
115 out.append(sb);
116 sb = new StringBuffer();
117 // search for close
118 watch = close;
119 } else if (watch == close) {
120 // found close
121 final String variable = (String) pResolver.get(sb.toString());
122 if (variable != null) {
123 out.append(variable);
124 } else {
125 throw new ParseException("Unknown variable " + sb, i);
126 }
127 sb = new StringBuffer();
128 // search for open
129 watch = open;
130 }
131 w = 0;
132 }
133 } else {
134
135 if (w > 0) {
136 sb.append(watch, 0, w);
137 }
138
139 sb.append(c);
140
141 w = 0;
142 }
143 }
144
145 if (watch == close) {
146 out.append(open);
147 }
148 out.append(sb);
149
150 return out.toString();
151 }
152
153 }