package se.bjurr.sbcc; import static com.google.common.base.Optional.absent; import static com.google.common.base.Optional.fromNullable; import static com.google.common.base.Strings.isNullOrEmpty; import static com.google.common.collect.Lists.newArrayList; import static java.util.regex.Pattern.compile; import static se.bjurr.sbcc.SbccCommon.getBitbucketEmail; import static se.bjurr.sbcc.SbccCommon.getBitbucketName; import static se.bjurr.sbcc.SbccCommon.getBitbucketUser; import static se.bjurr.sbcc.SbccCommon.getBitbucketUserSlug; import java.util.List; import java.util.regex.Matcher; import com.atlassian.bitbucket.auth.AuthenticationContext; import com.google.common.base.Optional; import se.bjurr.sbcc.data.SbccChangeSet; public class SbccRenderer { public enum SBCCVariable { AUTHOR_EMAIL( new Resolver() { @Override public String resolve( AuthenticationContext authenticationContext, Optional<SbccChangeSet> sbccChangeSet) { if (sbccChangeSet.isPresent()) { return sbccChangeSet.get().getAuthor().getEmailAddress(); } return ""; } }), AUTHOR_NAME( new Resolver() { @Override public String resolve( AuthenticationContext authenticationContext, Optional<SbccChangeSet> sbccChangeSet) { if (sbccChangeSet.isPresent()) { return sbccChangeSet.get().getAuthor().getName(); } return ""; } }), BITBUCKET_EMAIL( new Resolver() { @Override public String resolve( AuthenticationContext authenticationContext, Optional<SbccChangeSet> sbccChangeSet) { return getBitbucketEmail(authenticationContext); } }), BITBUCKET_NAME( new Resolver() { @Override public String resolve( AuthenticationContext authenticationContext, Optional<SbccChangeSet> sbccChangeSet) { return getBitbucketName(authenticationContext); } }), BITBUCKET_USER( new Resolver() { @Override public String resolve( AuthenticationContext authenticationContext, Optional<SbccChangeSet> sbccChangeSet) { return getBitbucketUser(authenticationContext); } }), BITBUCKET_USER_SLUG( new Resolver() { @Override public String resolve( AuthenticationContext authenticationContext, Optional<SbccChangeSet> sbccChangeSet) { return getBitbucketUserSlug(authenticationContext); } }), COMMITTER_EMAIL( new Resolver() { @Override public String resolve( AuthenticationContext authenticationContext, Optional<SbccChangeSet> sbccChangeSet) { if (sbccChangeSet.isPresent()) { return sbccChangeSet.get().getCommitter().getEmailAddress(); } return ""; } }), COMMITTER_NAME( new Resolver() { @Override public String resolve( AuthenticationContext authenticationContext, Optional<SbccChangeSet> sbccChangeSet) { if (sbccChangeSet.isPresent()) { return sbccChangeSet.get().getCommitter().getName(); } return ""; } }), REGEXP( new Resolver() { @Override public List<String> resolveAll(String regexp, SbccChangeSet changeSet) { List<String> allMatches = newArrayList(); Matcher matcher = compile(regexp).matcher(changeSet.getMessage()); while (matcher.find()) { allMatches.add(matcher.group()); } return allMatches; } }); private Resolver resolver; private SBCCVariable(Resolver resolver) { this.resolver = resolver; } public String resolve( AuthenticationContext authenticationContext, Optional<SbccChangeSet> sbccChangeSet) { return this.resolver.resolve(authenticationContext, sbccChangeSet); } public List<String> resolveAll(String regexp, SbccChangeSet changeSet) { return this.resolver.resolveAll(regexp, changeSet); } } private static class Resolver { public String resolve( AuthenticationContext authenticationContext, Optional<SbccChangeSet> sbccChangeSet) { return ""; } public List<String> resolveAll(String regexp, SbccChangeSet changeSet) { return newArrayList(); }; } private final AuthenticationContext authenticationContext; private Optional<SbccChangeSet> sbccChangeSet = absent(); public SbccRenderer(AuthenticationContext authenticationContext) { this.authenticationContext = authenticationContext; } public void append(StringBuilder sb, String renderAndAppend) { sb.append(render(renderAndAppend)); } public String render(String string) { for (SBCCVariable variable : SBCCVariable.values()) { String resolved = variable.resolve(this.authenticationContext, this.sbccChangeSet); if (isNullOrEmpty(resolved)) { continue; } string = string.replaceAll("\\$\\{" + variable.name() + "\\}", resolved); } return string; } public List<String> renderAll( SbccRenderer.SBCCVariable variable, String regexp, SbccChangeSet sbccChangeSet, String toRender) { List<String> renderedList = newArrayList(); for (String resolved : variable.resolveAll(regexp, sbccChangeSet)) { renderedList.add( render( toRender.replaceAll( "\\$\\{" + SbccRenderer.SBCCVariable.REGEXP.name() + "\\}", resolved))); } return renderedList; } public void setSbccChangeSet(SbccChangeSet sbccChangeSet) { this.sbccChangeSet = fromNullable(sbccChangeSet); } }