/** * Copyright (C) 2011 Brian Ferris <bdferris@onebusaway.org> * * 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 org.onebusaway.users.impl.validation; import org.onebusaway.users.services.validation.KeyValidationProvider; import org.onebusaway.users.services.validation.KeyValidationService; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; class KeyValidationServiceImpl implements KeyValidationService { private static Set<String> _keys = new HashSet<String>() { private static final long serialVersionUID = 1L; { add("TEST"); add("org.onebusaway.iphone"); add("org.onebusaway.nokia"); add("edu.washington.cs.cse403b"); } }; private Map<String, KeyValidationProvider> _providers = new HashMap<String, KeyValidationProvider>(); private String _defaultProviderId; public void setDefaultProviderId(String defaultId) { _defaultProviderId = defaultId; } public void setProviders(Collection<KeyValidationProvider> providers) { for (KeyValidationProvider provider : providers) addProvider(provider); } public void addProvider(KeyValidationProvider provider) { if (_providers.containsKey(provider.getId())) throw new IllegalStateException("duplicate provider: " + provider.getId()); _providers.put(provider.getId(), provider); } /**** * {@link KeyValidationService} Interface ****/ @Override public String generateKeyWithDefaultProvider(String value, String... arguments) { return generateKey(_defaultProviderId, value, arguments); } @Override public String generateKey(String providerId, String value, String... arguments) { KeyValidationProvider provider = _providers.get(providerId); if (provider == null) throw new IllegalStateException("no api key validation provider with id=" + providerId); return providerId + "_" + provider.generateKey(value, arguments); } @Override public boolean isValidKey(String key, String... arguments) { if (_keys.contains(key)) return true; int index = key.indexOf('_'); if (index == -1) return false; String providerId = key.substring(0, index); String subKey = key.substring(index + 1); KeyValidationProvider provider = _providers.get(providerId); if (provider == null) return false; return provider.isValidKey(subKey,arguments); } @Override public Map<String, String> getKeyInfo(String key, String... arguments) { Map<String,String> info = new HashMap<String, String>(); info.put("key",key); if (_keys.contains(key)) { info.put("builtin","true"); return info; } int index = key.indexOf('_'); if (index == -1) { info.put("malformed","true"); return info; } String providerId = key.substring(0, index); String subKey = key.substring(index + 1); KeyValidationProvider provider = _providers.get(providerId); if (provider == null) { info.put("malformed","true"); return info; } provider.getKeyInfo(info,subKey,arguments); return info; } }