/* Copyright (c) 2008 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.google.gdata.util.common.base;
import static com.google.gdata.util.common.base.Preconditions.checkNotNull;
import java.io.IOException;
/**
* An {@link Escaper} that converts literal text into a format safe for
* inclusion in a particular context (such as an XML document). Typically (but
* not always), the inverse process of "unescaping" the text is performed
* automatically by the relevant parser.
*
* <p>For example, an XML escaper would convert the literal string {@code
* "Foo<Bar>"} into {@code "Foo<Bar>"} to prevent {@code "<Bar>"} from
* being confused with an XML tag. When the resulting XML document is parsed,
* the parser API will return this text as the original literal string {@code
* "Foo<Bar>"}.
*
* <p><b>Note:</b> This class is similar to {@link CharEscaper} but with one
* very important difference. A CharEscaper can only process Java
* <a href="http://en.wikipedia.org/wiki/UTF-16">UTF16</a> characters in
* isolation and may not cope when it encounters surrogate pairs. This class
* facilitates the correct escaping of all Unicode characters.
*
* <p>As there are important reasons, including potential security issues, to
* handle Unicode correctly if you are considering implementing a new escaper
* you should favor using UnicodeEscaper wherever possible.
*
* <p>A {@code UnicodeEscaper} instance is required to be stateless, and safe
* when used concurrently by multiple threads.
*
* <p>Several popular escapers are defined as constants in the class {@link
* CharEscapers}. To create your own escapers extend this class and implement
* the {@link #escape(int)} method.
*
*
*/
public abstract class UnicodeEscaper implements Escaper {
/** The amount of padding (chars) to use when growing the escape buffer. */
private static final int DEST_PAD = 32;
/**
* Returns the escaped form of the given Unicode code point, or {@code null}
* if this code point does not need to be escaped. When called as part of an
* escaping operation, the given code point is guaranteed to be in the range
* {@code 0 <= cp <= Character#MAX_CODE_POINT}.
*
* <p>If an empty array is returned, this effectively strips the input
* character from the resulting text.
*
* <p>If the character does not need to be escaped, this method should return
* {@code null}, rather than an array containing the character representation
* of the code point. This enables the escaping algorithm to perform more
* efficiently.
*
* <p>If the implementation of this method cannot correctly handle a
* particular code point then it should either throw an appropriate runtime
* exception or return a suitable replacement character. It must never
* silently discard invalid input as this may constitute a security risk.
*
* @param cp the Unicode code point to escape if necessary
* @return the replacement characters, or {@code null} if no escaping was
* needed
*/
protected abstract char[] escape(int cp);
/**
* Scans a sub-sequence of characters from a given {@link CharSequence},
* returning the index of the next character that requires escaping.
*
* <p><b>Note:</b> When implementing an escaper, it is a good idea to override
* this method for efficiency. The base class implementation determines
* successive Unicode code points and invokes {@link #escape(int)} for each of
* them. If the semantics of your escaper are such that code points in the
* supplementary range are either all escaped or all unescaped, this method
* can be implemented more efficiently using {@link CharSequence#charAt(int)}.
*
* <p>Note however that if your escaper does not escape characters in the
* supplementary range, you should either continue to validate the correctness
* of any surrogate characters encountered or provide a clear warning to users
* that your escaper does not validate its input.
*
* <p>See {@link PercentEscaper} for an example.
*
* @param csq a sequence of characters
* @param start the index of the first character to be scanned
* @param end the index immediately after the last character to be scanned
* @throws IllegalArgumentException if the scanned sub-sequence of {@code csq}
* contains invalid surrogate pairs
*/
protected int nextEscapeIndex(CharSequence csq, int start, int end) {
int index = start;
while (index < end) {
int cp = codePointAt(csq, index, end);
if (cp < 0 || escape(cp) != null) {
break;
}
index += Character.isSupplementaryCodePoint(cp) ? 2 : 1;
}
return index;
}
/**
* Returns the escaped form of a given literal string.
*
* <p>If you are escaping input in arbitrary successive chunks, then it is not
* generally safe to use this method. If an input string ends with an
* unmatched high surrogate character, then this method will throw
* {@link IllegalArgumentException}. You should either ensure your input is
* valid <a href="http://en.wikipedia.org/wiki/UTF-16">UTF-16</a> before
* calling this method or use an escaped {@link Appendable} (as returned by
* {@link #escape(Appendable)}) which can cope with arbitrarily split input.
*
* <p><b>Note:</b> When implementing an escaper it is a good idea to override
* this method for efficiency by inlining the implementation of
* {@link #nextEscapeIndex(CharSequence, int, int)} directly. Doing this for
* {@link PercentEscaper} more than doubled the performance for unescaped
* strings (as measured by {@link CharEscapersBenchmark}).
*
* @param string the literal string to be escaped
* @return the escaped form of {@code string}
* @throws NullPointerException if {@code string} is null
* @throws IllegalArgumentException if invalid surrogate characters are
* encountered
*/
public String escape(String string) {
int end = string.length();
int index = nextEscapeIndex(string, 0, end);
return index == end ? string : escapeSlow(string, index);
}
/**
* Returns the escaped form of a given literal string, starting at the given
* index. This method is called by the {@link #escape(String)} method when it
* discovers that escaping is required. It is protected to allow subclasses
* to override the fastpath escaping function to inline their escaping test.
* See {@link CharEscaperBuilder} for an example usage.
*
* <p>This method is not reentrant and may only be invoked by the top level
* {@link #escape(String)} method.
*
* @param s the literal string to be escaped
* @param index the index to start escaping from
* @return the escaped form of {@code string}
* @throws NullPointerException if {@code string} is null
* @throws IllegalArgumentException if invalid surrogate characters are
* encountered
*/
protected final String escapeSlow(String s, int index) {
int end = s.length();
// Get a destination buffer and setup some loop variables.
char[] dest = DEST_TL.get();
int destIndex = 0;
int unescapedChunkStart = 0;
while (index < end) {
int cp = codePointAt(s, index, end);
if (cp < 0) {
throw new IllegalArgumentException(
"Trailing high surrogate at end of input");
}
char[] escaped = escape(cp);
if (escaped != null) {
int charsSkipped
没有合适的资源?快使用搜索试试~ 我知道了~
Oauth认证流程学习代码
共101个文件
class:48个
java:40个
xml:3个
5星 · 超过95%的资源 需积分: 10 9 下载量 179 浏览量
2013-10-30
00:10:41
上传
评论
收藏 259KB RAR 举报
温馨提示
http://write.blog.csdn.net/postedit/13510891使用源码
资源推荐
资源详情
资源评论
收起资源包目录
Oauth认证流程学习代码 (101个子文件)
proguard.cfg 1KB
AbstractOAuthProvider.class 9KB
OAuth.class 9KB
HttpParameters.class 7KB
AbstractOAuthConsumer.class 7KB
Preconditions.class 6KB
CommonsHttpOAuthProvider.class 5KB
UnicodeEscaper.class 4KB
PercentEscaper.class 4KB
UnicodeEscaper$2.class 3KB
SignatureBaseString.class 3KB
HttpRequestAdapter.class 3KB
RetrieveAccessTokenTask.class 3KB
HttpURLConnectionRequestAdapter.class 3KB
PrepareRequestTokenActivity.class 3KB
HmacSha1MessageSigner.class 3KB
OAuthRequestTokenTask.class 2KB
DefaultOAuthProvider.class 2KB
AuthorizationHeaderSigningStrategy.class 2KB
QueryStringSigningStrategy.class 2KB
OAuthMessageSigner.class 2KB
UrlStringRequestAdapter.class 2KB
MainActivity.class 1KB
OAuthProvider.class 1KB
CommonsHttpOAuthConsumer.class 1KB
PlainTextMessageSigner.class 1KB
HttpResponseAdapter.class 1KB
OAuthConsumer.class 1KB
HttpURLConnectionResponseAdapter.class 1KB
MainActivity$1.class 1KB
OAuthCommunicationException.class 1KB
DefaultOAuthConsumer.class 1KB
Constants.class 919B
OAuthNotAuthorizedException.class 831B
UnicodeEscaper$1.class 679B
OAuthException.class 671B
HttpRequest.class 650B
OAuthMessageSignerException.class 615B
R.class 552B
OAuthExpectationFailedException.class 455B
R$id.class 440B
R$string.class 436B
R$drawable.class 409B
R$layout.class 403B
OAuthProviderListener.class 400B
HttpResponse.class 384B
R$attr.class 349B
SigningStrategy.class 299B
Escaper.class 244B
.classpath 475B
commons-logging-1.1.1.jar 59KB
commons-codec-1.3.jar 46KB
json-20090211.jar 45KB
UnicodeEscaper.java 19KB
Preconditions.java 18KB
AbstractOAuthProvider.java 13KB
OAuth.java 10KB
OAuthProvider.java 10KB
PercentEscaper.java 10KB
AbstractOAuthConsumer.java 9KB
HttpParameters.java 8KB
OAuthConsumer.java 7KB
SignatureBaseString.java 4KB
Escaper.java 4KB
CommonsHttpOAuthProvider.java 3KB
DefaultOAuthProvider.java 2KB
QueryStringSigningStrategy.java 2KB
HmacSha1MessageSigner.java 2KB
OAuthMessageSigner.java 2KB
HttpRequestAdapter.java 2KB
AuthorizationHeaderSigningStrategy.java 2KB
RetrieveAccessTokenTask.java 2KB
HttpURLConnectionRequestAdapter.java 2KB
CommonsHttpOAuthConsumer.java 2KB
DefaultOAuthConsumer.java 2KB
OAuthProviderListener.java 1KB
PrepareRequestTokenActivity.java 1KB
OAuthRequestTokenTask.java 1KB
OAuthNotAuthorizedException.java 1KB
PlainTextMessageSigner.java 1KB
OAuthCommunicationException.java 1KB
HttpRequest.java 1KB
MainActivity.java 1KB
Constants.java 1KB
SigningStrategy.java 1KB
UrlStringRequestAdapter.java 990B
OAuthMessageSignerException.java 909B
OAuthExpectationFailedException.java 829B
R.java 807B
HttpURLConnectionResponseAdapter.java 788B
HttpResponseAdapter.java 774B
HttpResponse.java 448B
OAuthException.java 370B
icon.png 4KB
icon.png 3KB
icon.png 2KB
.project 849B
project.properties 563B
AndroidManifest.xml 1KB
main.xml 731B
共 101 条
- 1
- 2
资源评论
- winy_snow2014-07-14很不错,谢谢楼主分享。5分,5分!
- liriea2014-10-12还不错,有一定帮助
梁俊俊
- 粉丝: 32
- 资源: 13
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功