/*
* Copyright (C) 2015 Orange
*
* This software is distributed under the terms and conditions of the 'GNU GENERAL PUBLIC LICENSE
* Version 2' license which can be found in the file 'LICENSE.txt' in this package distribution or
* at 'http://www.gnu.org/licenses/gpl-2.0-standalone.html'.
*/
package com.orange.cepheus.broker;
import com.orange.ngsi.model.EntityId;
import org.springframework.stereotype.Component;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Predicate;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
/**
* Handle patterns of entityId
*/
@Component
public class Patterns {
/**
* Cache of compiled patterns
*/
private Map<String, Pattern> cachedPatterns = new ConcurrentHashMap<>();
/**
* Compile (or get from cache) the patter corresponding to the entity id
* @param entityId the entity id
* @return the pattern, or null if entity id is not a pattern
* @throws PatternSyntaxException
*/
public Pattern getPattern(final EntityId entityId) throws PatternSyntaxException {
if (!entityId.getIsPattern()) {
return null;
}
String id = entityId.getId();
Pattern pattern = cachedPatterns.get(id);
if (pattern == null) {
pattern = Pattern.compile(id);
cachedPatterns.put(id, pattern);
}
return pattern;
}
/**
* @return TRUE if the type is not null or empty
*/
public boolean hasType(final EntityId entityId) {
final String type = entityId.getType();
return type != null && !"".equals(type);
}
/**
* construct the predicate to filter on entityId
* @param searchEntityId the entity id to search
* @return the predicate to filter on entityId
*/
public Predicate<EntityId> getFilterEntityId(EntityId searchEntityId) {
final boolean searchType = hasType(searchEntityId);
final Pattern pattern = getPattern(searchEntityId);
Predicate<EntityId> filterEntityId = entityId -> {
// Match by type if any
if (!searchType) {
if (hasType(entityId)) {
return false;
}
} else if (!searchEntityId.getType().equals(entityId.getType())) {
return false;
}
// Match pattern if any
if (pattern != null) {
// Match two patterns by equality
if (entityId.getIsPattern()) {
return searchEntityId.getId().equals(entityId.getId());
}
return pattern.matcher(entityId.getId()).find();
} else {
if (entityId.getIsPattern()) {
return getPattern(entityId).matcher(searchEntityId.getId()).find();
}
// Match two ids by equality
return searchEntityId.getId().equals(entityId.getId());
}
};
return filterEntityId;
}
}