/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.apache.stanbol.entityhub.core.site;
import java.util.Arrays;
import java.util.Dictionary;
import org.apache.stanbol.entityhub.servicesapi.model.ManagedEntityState;
import org.apache.stanbol.entityhub.servicesapi.model.MappingState;
import org.apache.stanbol.entityhub.servicesapi.site.EntityDereferencer;
import org.apache.stanbol.entityhub.servicesapi.site.EntitySearcher;
import org.apache.stanbol.entityhub.servicesapi.site.ReferencedSiteConfiguration;
import org.apache.stanbol.entityhub.servicesapi.yard.CacheStrategy;
import org.osgi.service.cm.ConfigurationException;
import org.osgi.service.component.ComponentFactory;
public class ReferencedSiteConfigurationImpl extends SiteConfigurationImpl implements ReferencedSiteConfiguration{
public ReferencedSiteConfigurationImpl(Dictionary<String,Object> config) throws ConfigurationException{
super(config);
}
@Override
protected void validateConfiguration() throws ConfigurationException {
super.validateConfiguration();
//check if all the Enumerated values are valid strings and convert them
//to enumeration instances
try {
setCacheStrategy(getCacheStrategy());
} catch (IllegalArgumentException e) {
throw new ConfigurationException(CACHE_STRATEGY,
String.format("Unknown CachStrategy (%s=%s) for Site %s! Valid values are %s ",
CACHE_STRATEGY,config.get(CACHE_STRATEGY),getId(),
Arrays.toString(CacheStrategy.values()),e));
}
//check that a cacheId is set if the CacheStrategy != none
if(CacheStrategy.none != getCacheStrategy() && getCacheId() == null){
throw new ConfigurationException(CACHE_ID,
String.format("The CacheID (%s) MUST NOT be NULL nor empty if the the CacheStrategy != %s",
CACHE_ID,CacheStrategy.none));
}
//check that a accessUri and an entity dereferencer is set if the
//cacheStrategy != CacheStrategy.all
if(CacheStrategy.all != getCacheStrategy()){
if(getAccessUri() == null){
throw new ConfigurationException(ACCESS_URI,
String.format("An AccessUri (%s) MUST be configured if the CacheStrategy != %s",
ACCESS_URI,CacheStrategy.all));
}
if(getEntityDereferencerType() == null){
throw new ConfigurationException(ENTITY_DEREFERENCER_TYPE,
String.format("An EntityDereferencer (%s) MUST be configured if the CacheStrategy != %s",
ENTITY_DEREFERENCER_TYPE,CacheStrategy.all));
}
}
}
@Override
public final String getAccessUri() {
Object accessUri = config.get(ACCESS_URI);
return accessUri == null || accessUri.toString().isEmpty() ? null : accessUri.toString();
}
/**
*
* @param uri
* @throws UnsupportedOperationException in case this configuration is {@link #readonly}
* @see #getAccessUri()
*/
public final void setAccessUri(String uri) throws UnsupportedOperationException{
if(uri == null || uri.isEmpty()){
config.remove(ACCESS_URI);
} else {
config.put(ACCESS_URI, uri);
}
}
@Override
public final String getCacheId() {
Object id = config.get(CACHE_ID);
return id == null || id.toString().isEmpty() ?
null : id.toString();
}
/**
*
* @param id
* @throws UnsupportedOperationException in case this configuration is {@link #readonly}
* @see #getCacheId()
*/
public final void setCacheId(String id) throws UnsupportedOperationException {
if(id == null || id.isEmpty()){
config.remove(CACHE_ID);
} else {
config.put(CACHE_ID, id);
}
}
@Override
public final CacheStrategy getCacheStrategy() {
Object cacheStrategy = config.get(CACHE_STRATEGY);
if(cacheStrategy == null){
return null;
} else if(cacheStrategy instanceof CacheStrategy){
return (CacheStrategy)cacheStrategy;
} else {
return CacheStrategy.valueOf(cacheStrategy.toString());
}
}
/**
*
* @param strategy
* @throws UnsupportedOperationException in case this configuration is {@link #readonly}
* @see #getCacheStrategy()
*/
public final void setCacheStrategy(CacheStrategy strategy) throws UnsupportedOperationException {
if(strategy == null){
config.remove(CACHE_STRATEGY);
} else {
config.put(CACHE_STRATEGY, strategy);
}
}
@Override
public final String getEntityDereferencerType() {
Object dereferencer = config.get(ENTITY_DEREFERENCER_TYPE);
return dereferencer == null ||dereferencer.toString().isEmpty() ?
null : dereferencer.toString();
}
/**
* Setter for the type of the {@link EntityDereferencer} to be used by
* this site or <code>null</code> to remove the current configuration. <p>
* Note that the {@link EntityDereferencer} is only initialised of a valid
* {@link #getAccessUri() access URI} is configured. If the dereferencer is
* set to <code>null</code> dereferencing Entities will not be supported by
* this site. Entities might still be available form a local
* {@link #getCacheId() cache}.
* @param entityDereferencerType the key (OSGI name) of the component used
* to dereference Entities. This component must have an {@link ComponentFactory}
* and provide the {@link EntityDereferencer} service-
* @throws UnsupportedOperationException in case this configuration is {@link #readonly}
* @see #getEntityDereferencerType()
*/
public final void setEntityDereferencerType(String entityDereferencerType) throws UnsupportedOperationException {
if(entityDereferencerType == null){
config.remove(entityDereferencerType);
} else {
config.put(ENTITY_DEREFERENCER_TYPE, entityDereferencerType);
}
}
@Override
public String getEntitySearcherType() {
Object type = config.get(ENTITY_SEARCHER_TYPE);
return type == null || type.toString().isEmpty() ? null : type.toString();
}
/**
* Setter for the type of the {@link EntitySearcher} used to query for
* Entities by accessing a external service available at
* {@link #getQueryUri()}. <p>
* Note that the {@link EntitySearcher} will only be initialised of the
* {@link #getQueryUri() Query URI} is defined.
* @param entitySearcherType The string representing the {@link EntitySearcher}
* (the name of the OSGI component) or <code>null</code> to remove this
* configuration. The referenced component MUST have an {@link ComponentFactory}
* and provide the {@link EntitySearcher} service.
* @throws UnsupportedOperationException in case this configuration is {@link #readonly}
* @see #getEntitySearcherType()
*/
public final void setEntitySearcherType(String entitySearcherType) throws UnsupportedOperationException {
if(entitySearcherType == null){
config.remove(ENTITY_SEARCHER_TYPE);
} else {
config.put(ENTITY_SEARCHER_TYPE, entitySearcherType);
}
}
@Override
public String getQueryUri() {
Object uri = config.get(QUERY_URI);
return uri == null || uri.toString().isEmpty() ? null : uri.toString();
}
/**
* Setter for the uri of the remote service used to query for entities. If
* set to <code>null</code> this indicates that no such external service is
* available for this referenced site
* @param queryUri the uri of the external service used to query for entities
* or <code>null</code> if none.
* @throws UnsupportedOperationException in case this configuration is {@link #readonly}
* @see #getQueryUri()
*/
public final void setQueryUri(String queryUri) throws UnsupportedOperationException {
if(queryUri == null || queryUri.isEmpty()){
config.remove(QUERY_URI);
} else {
config.put(QUERY_URI, queryUri);
}
}
}