/* package whatever; // don't place package name! */
import java.util.*;
import java.lang.*;
import java.io.*;
import java.net.*;
/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
/*
* Copyright (C) 2007 The Android Open Source Project
*
* 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://w...content-available-to-author-only...e.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.
*/
public static class UriMatcher
{
public static final int NO_MATCH = -1;
/**
* Creates the root node of the URI tree.
*
* @param code the code to match for the root URI
*/
public UriMatcher(int code)
{
mCode = code;
mWhich = -1;
mChildren = new ArrayList<UriMatcher>();
mText = null;
}
private UriMatcher()
{
mCode = NO_MATCH;
mWhich = -1;
mChildren = new ArrayList<UriMatcher>();
mText = null;
}
/**
* Add a URI to match, and the code to return when this URI is
* matched. URI nodes may be exact match string, the token "*"
* that matches any text, or the token "#" that matches only
* numbers.
* <p>
* Starting from API level {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2},
* this method will accept a leading slash in the path.
*
* @param authority the authority to match
* @param path the path to match. * may be used as a wild card for
* any text, and # may be used as a wild card for numbers.
* @param code the code that is returned when a URI is matched
* against the given components. Must be positive.
*/
{
if (code < 0) {
}
if (path != null) {
// Strip leading slash if present.
if (path.length() > 0 && path.charAt(0) == '/') {
newPath = path.substring(1);
}
tokens = newPath.split("/");
}
int numTokens = tokens != null ? tokens.length : 0;
UriMatcher node = this;
for (int i = -1; i < numTokens; i++) {
String token
= i
< 0 ? authority
: tokens
[i
]; ArrayList<UriMatcher> children = node.mChildren;
int numChildren = children.size();
UriMatcher child;
int j;
for (j = 0; j < numChildren; j++) {
child = children.get(j);
if (token.equals(child.mText)) {
node = child;
break;
}
}
if (j == numChildren) {
// Child not found, create it
child = new UriMatcher();
if (token.equals("#")) {
child.mWhich = NUMBER;
} else if (token.equals("*")) {
child.mWhich = TEXT;
} else {
child.mWhich = EXACT;
}
child.mText = token;
node.mChildren.add(child);
node = child;
}
}
node.mCode = code;
}
/**
* Try to match against the path in a url.
*
* @param uri The url whose path we will match against.
*
* @return The code for the matched node (added using addURI),
* or -1 if there is no matched node.
*/
public int match(URI uri)
{
final String[] pathSegments
= uri.
getPath().
substring(1).
split("/");
final int li = pathSegments.length;
UriMatcher node = this;
if (li == 0 && uri.getAuthority() == null) {
return this.mCode;
}
for (int i=-1; i<li; i++) {
String u
= i
< 0 ? uri.
getAuthority() : pathSegments
[i
]; ArrayList<UriMatcher> list = node.mChildren;
if (list == null) {
break;
}
node = null;
int lj = list.size();
for (int j=0; j<lj; j++) {
UriMatcher n = list.get(j);
which_switch:
switch (n.mWhich) {
case EXACT:
if (n.mText.equals(u)) {
node = n;
}
break;
case NUMBER:
int lk = u.length();
for (int k=0; k<lk; k++) {
char c = u.charAt(k);
if (c < '0' || c > '9') {
break which_switch;
}
}
node = n;
break;
case TEXT:
node = n;
break;
}
if (node != null) {
break;
}
}
if (node == null) {
return NO_MATCH;
}
}
return node.mCode;
}
private static final int EXACT = 0;
private static final int NUMBER = 1;
private static final int TEXT = 2;
private int mCode;
private int mWhich;
private ArrayList<UriMatcher> mChildren;
}
public static final String PATH_FILE
= "file"; public static final String PATH_DRIVE
= "drive"; public static final String CONTENT_AUTHORITY
= "olexiimuraviov.ua.onespace_diplomaproject";
static UriMatcher buildUriMatcherWithout() {
UriMatcher mUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
// Bind uriMatcher int constants and uris
mUriMatcher.addURI(CONTENT_AUTHORITY, PATH_DRIVE, 1);
mUriMatcher.addURI(CONTENT_AUTHORITY, PATH_DRIVE + "/#", 2);
mUriMatcher.addURI(CONTENT_AUTHORITY, PATH_FILE, 3);
//
mUriMatcher.addURI(CONTENT_AUTHORITY, PATH_FILE + "/drive/#", 5);
mUriMatcher.addURI(CONTENT_AUTHORITY, PATH_FILE + "/file/*", 6);
mUriMatcher.addURI(CONTENT_AUTHORITY, PATH_FILE + "/drive/#/*", 7);
mUriMatcher.addURI(CONTENT_AUTHORITY, PATH_FILE + "/*", 4);
// Return the new matcher!
return mUriMatcher;
}
static UriMatcher buildUriMatcherWith() {
UriMatcher mUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
// Bind uriMatcher int constants and uris
mUriMatcher.addURI(CONTENT_AUTHORITY, PATH_DRIVE, 1);
mUriMatcher.addURI(CONTENT_AUTHORITY, PATH_DRIVE + "/#", 2);
mUriMatcher.addURI(CONTENT_AUTHORITY, PATH_FILE, 3);
mUriMatcher.addURI(CONTENT_AUTHORITY, PATH_FILE + "/*", 4);
mUriMatcher.addURI(CONTENT_AUTHORITY, PATH_FILE + "/drive/#", 5);
mUriMatcher.addURI(CONTENT_AUTHORITY, PATH_FILE + "/file/*", 6);
mUriMatcher.addURI(CONTENT_AUTHORITY, PATH_FILE + "/drive/#/*", 7);
// Return the new matcher!
return mUriMatcher;
}
{
UriMatcher without = buildUriMatcherWithout();
System.
out.
println("" + without.
match(new URI
("content://olexiimuraviov.ua.onespace_diplomaproject/file/drive/11/root"))); System.
out.
println("" + without.
match(new URI
("content://olexiimuraviov.ua.onespace_diplomaproject/file/file/11"))); System.
out.
println("" + without.
match(new URI
("content://olexiimuraviov.ua.onespace_diplomaproject/file/file/jk"))); System.
out.
println("" + without.
match(new URI
("content://olexiimuraviov.ua.onespace_diplomaproject/drive/1"))); System.
out.
println("" + without.
match(new URI
("content://olexiimuraviov.ua.onespace_diplomaproject/drive"))); System.
out.
println("" + without.
match(new URI
("content://olexiimuraviov.ua.onespace_diplomaproject/file/aaaa"))); System.
out.
println("========="); UriMatcher with = buildUriMatcherWith();
System.
out.
println("" + with.
match(new URI
("content://olexiimuraviov.ua.onespace_diplomaproject/file/drive/11/root"))); System.
out.
println("" + with.
match(new URI
("content://olexiimuraviov.ua.onespace_diplomaproject/file/file/11"))); System.
out.
println("" + with.
match(new URI
("content://olexiimuraviov.ua.onespace_diplomaproject/file/file/jk"))); System.
out.
println("" + with.
match(new URI
("content://olexiimuraviov.ua.onespace_diplomaproject/drive/1"))); System.
out.
println("" + with.
match(new URI
("content://olexiimuraviov.ua.onespace_diplomaproject/drive"))); System.
out.
println("" + with.
match(new URI
("content://olexiimuraviov.ua.onespace_diplomaproject/file/aaaa"))); }
}