/*
* Copyright 2014 Google Inc. All rights reserved.
*
* 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.samples.apps.iosched.provider;
import android.content.UriMatcher;
import android.net.Uri;
import android.util.Log;
import android.util.SparseArray;
import java.util.HashMap;
/**
* Provides methods to match a {@link android.net.Uri} to a {@link ScheduleUriEnum}.
* <p />
* All methods are thread safe, except {@link #buildUriMatcher()} and {@link #buildEnumsMap()},
* which is why they are called only from the constructor.
*/
public class ScheduleProviderUriMatcher {
/**
* All methods on a {@link UriMatcher} are thread safe, except {@code addURI}.
*/
private UriMatcher mUriMatcher;
private SparseArray<ScheduleUriEnum> mEnumsMap = new SparseArray<>();
/**
* This constructor needs to be called from a thread-safe method as it isn't thread-safe itself.
*/
public ScheduleProviderUriMatcher(){
mUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
buildUriMatcher();
}
private void buildUriMatcher() {
final String authority = ScheduleContract.CONTENT_AUTHORITY;
ScheduleUriEnum[] uris = ScheduleUriEnum.values();
for (int i = 0; i < uris.length; i++) {
mUriMatcher.addURI(authority, uris[i].path, uris[i].code);
}
buildEnumsMap();
}
private void buildEnumsMap() {
ScheduleUriEnum[] uris = ScheduleUriEnum.values();
for (int i = 0; i < uris.length; i++) {
mEnumsMap.put(uris[i].code, uris[i]);
}
}
/**
* Matches a {@code uri} to a {@link ScheduleUriEnum}.
*
* @return the {@link ScheduleUriEnum}, or throws new UnsupportedOperationException if no match.
*/
public ScheduleUriEnum matchUri(Uri uri){
final int code = mUriMatcher.match(uri);
try {
return matchCode(code);
} catch (UnsupportedOperationException e){
throw new UnsupportedOperationException("Unknown uri " + uri);
}
}
/**
* Matches a {@code code} to a {@link ScheduleUriEnum}.
*
* @return the {@link ScheduleUriEnum}, or throws new UnsupportedOperationException if no match.
*/
public ScheduleUriEnum matchCode(int code){
ScheduleUriEnum scheduleUriEnum = mEnumsMap.get(code);
if (scheduleUriEnum != null){
return scheduleUriEnum;
} else {
throw new UnsupportedOperationException("Unknown uri with code " + code);
}
}
}