package org.zstack.tag;
import org.zstack.core.db.SimpleQuery;
import org.zstack.core.db.SimpleQuery.Op;
import org.zstack.header.tag.SystemTagInventory;
import org.zstack.header.tag.SystemTagVO;
import org.zstack.header.tag.SystemTagVO_;
import org.zstack.utils.TagUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import static org.zstack.utils.StringDSL.s;
/**
*/
public class PatternedSystemTag extends SystemTag {
public PatternedSystemTag(String tagFormat, Class resourceClass) {
super(tagFormat, resourceClass);
}
@Override
protected String useTagFormat() {
return TagUtils.tagPatternToSqlPattern(tagFormat);
}
@Override
protected Op useOp() {
return Op.LIKE;
}
@Override
public boolean isMatch(String tag) {
return TagUtils.isMatch(tagFormat, tag);
}
@Override
public void delete(String resourceUuid, Class resourceClass) {
tagMgr.deleteSystemTagUseLike(useTagFormat(), resourceUuid, resourceClass.getSimpleName(), false);
}
public void delete(String resourceUuid, String tagFormat) {
tagMgr.deleteSystemTagUseLike(tagFormat, resourceUuid, resourceClass.getSimpleName(), false);
}
@Override
public void delete(String resourceUuid) {
tagMgr.deleteSystemTagUseLike(useTagFormat(), resourceUuid, resourceClass.getSimpleName(), false);
}
@Override
public void deleteInherentTag(String resourceUuid) {
tagMgr.deleteSystemTagUseLike(useTagFormat(), resourceUuid, resourceClass.getSimpleName(), true);
}
public void deleteInherentTag(String resourceUuid, String tagFormat) {
tagMgr.deleteSystemTagUseLike(tagFormat, resourceUuid, resourceClass.getSimpleName(), true);
}
@Override
public void deleteInherentTag(String resourceUuid, Class resourceClass) {
tagMgr.deleteSystemTagUseLike(useTagFormat(), resourceUuid, resourceClass.getSimpleName(), true);
}
public Map<String, String> getTokensByTag(String tag) {
return TagUtils.parseIfMatch(tagFormat, tag);
}
public String getTokenByTag(String tag, String tokenName) {
Map<String, String> tokens = getTokensByTag(tag);
if (tokens == null) {
return null;
}
return tokens.get(tokenName);
}
public Map<String, String> getTokensByResourceUuid(String resourceUuid, Class resourceClass) {
String tag = getTag(resourceUuid, resourceClass);
if (tag == null) {
return null;
}
return TagUtils.parseIfMatch(tagFormat, tag);
}
public List<Map<String, String>> getTokensOfTagsByResourceUuid(String resourceUuid) {
return getTokensOfTagsByResourceUuid(resourceUuid, resourceClass);
}
public List<Map<String, String>> getTokensOfTagsByResourceUuid(String resourceUuid, Class resourceClass) {
List<Map<String, String>> res = new ArrayList<>();
List<String> tags = getTags(resourceUuid, resourceClass);
for (String tag : tags) {
res.add(TagUtils.parseIfMatch(tagFormat, tag));
}
return res;
}
public Map<String, String> getTokensByResourceUuid(String resourceUuid) {
return getTokensByResourceUuid(resourceUuid, resourceClass);
}
public String getTokenByResourceUuid(String resourceUuid, Class resourceClass, String tokenName) {
Map<String, String> tokens = getTokensByResourceUuid(resourceUuid, resourceClass);
if (tokens == null) {
return null;
}
return tokens.get(tokenName);
}
public String getTokenByResourceUuid(String resourceUuid, String tokenName) {
return getTokenByResourceUuid(resourceUuid, resourceClass, tokenName);
}
public String instantiateTag(Map tokens) {
return s(tagFormat).formatByMap(tokens);
}
public SystemTagInventory getTagInventory(String resourceUuid) {
SimpleQuery<SystemTagVO> q = dbf.createQuery(SystemTagVO.class);
q.add(SystemTagVO_.resourceUuid, Op.EQ, resourceUuid);
q.add(SystemTagVO_.resourceType, Op.EQ, getResourceClass().getSimpleName());
q.add(SystemTagVO_.tag, Op.LIKE, useTagFormat());
SystemTagVO vo = q.find();
return vo == null ? null : SystemTagInventory.valueOf(vo);
}
}