Skip to content
This repository has been archived by the owner on Nov 9, 2017. It is now read-only.

Commit

Permalink
rhbz1120457 - enable email notification on language team permission c…
Browse files Browse the repository at this point in the history
…hange
  • Loading branch information
Patrick Huang committed Dec 3, 2014
1 parent b6a9598 commit f613e6d
Show file tree
Hide file tree
Showing 17 changed files with 926 additions and 13 deletions.
100 changes: 100 additions & 0 deletions functional-test/src/test/resources/conf/standalone.xml
Expand Up @@ -14,6 +14,7 @@
<extension module="org.jboss.as.jsf" />
<extension module="org.jboss.as.logging" />
<extension module="org.jboss.as.mail" />
<extension module="org.jboss.as.messaging"/>
<extension module="org.jboss.as.naming" />
<extension module="org.jboss.as.pojo" />
<extension module="org.jboss.as.remoting" />
Expand Down Expand Up @@ -134,6 +135,10 @@
<stateful default-access-timeout="5000" cache-ref="simple" />
<singleton default-access-timeout="5000" />
</session-bean>
<mdb>
<resource-adapter-ref resource-adapter-name="hornetq-ra"/>
<bean-instance-pool-ref pool-name="mdb-strict-max-pool"/>
</mdb>
<pools>
<bean-instance-pools>
<strict-max-pool name="slsb-strict-max-pool" max-pool-size="20"
Expand Down Expand Up @@ -230,6 +235,98 @@
<smtp-server outbound-socket-binding-ref="mail-smtp" />
</mail-session>
</subsystem>
<subsystem xmlns="urn:jboss:domain:messaging:1.2">
<hornetq-server>
<persistence-enabled>true</persistence-enabled>
<security-enabled>false</security-enabled>
<journal-type>NIO</journal-type>
<journal-file-size>102400</journal-file-size>
<journal-min-files>2</journal-min-files>
<connectors>
<netty-connector name="netty" socket-binding="messaging"/>
<netty-connector name="netty-throughput" socket-binding="messaging-throughput">
<param key="batch-delay" value="50"/>
</netty-connector>
<in-vm-connector name="in-vm" server-id="0"/>
</connectors>
<acceptors>
<netty-acceptor name="netty" socket-binding="messaging"/>
<netty-acceptor name="netty-throughput" socket-binding="messaging-throughput">
<param key="batch-delay" value="50"/>
<param key="direct-deliver" value="false"/>
</netty-acceptor>
<in-vm-acceptor name="in-vm" server-id="0"/>
</acceptors>
<security-settings>
<security-setting match="#">
<permission type="send" roles="guest"/>
<permission type="consume" roles="guest"/>
<permission type="createNonDurableQueue" roles="guest"/>
<permission type="deleteNonDurableQueue" roles="guest"/>
</security-setting>
</security-settings>
<address-settings>
<!--default for catch all-->
<address-setting match="#">
<dead-letter-address>jms.queue.DLQ</dead-letter-address>
<expiry-address>jms.queue.ExpiryQueue</expiry-address>
<redelivery-delay>5000</redelivery-delay>
<max-delivery-attempts>2</max-delivery-attempts>
<max-size-bytes>10485760</max-size-bytes>
<address-full-policy>BLOCK</address-full-policy>
<message-counter-history-day-limit>10</message-counter-history-day-limit>
</address-setting>
</address-settings>
<jms-connection-factories>
<connection-factory name="InVmConnectionFactory">
<connectors>
<connector-ref connector-name="in-vm"/>
</connectors>
<entries>
<entry name="java:/ConnectionFactory"/>
</entries>
</connection-factory>
<!-- if we want to enable remote access to the queue
<connection-factory name="RemoteConnectionFactory">
<connectors>
<connector-ref connector-name="netty"/>
</connectors>
<entries>
<entry name="java:jboss/exported/jms/RemoteConnectionFactory"/>
</entries>
</connection-factory>
-->
<pooled-connection-factory name="hornetq-ra">
<transaction mode="xa"/>
<connectors>
<connector-ref connector-name="netty"/>
</connectors>
<entries>
<entry name="java:/JmsXA"/>
</entries>
</pooled-connection-factory>
</jms-connection-factories>

<jms-destinations>
<jms-queue name="MailsQueue">
<entry name="jms/queue/MailsQueue"/>
<durable>true</durable>
</jms-queue>
<jms-queue name="DLQ">
<entry name="jms/queue/DLQ"/>
<durable>true</durable>
</jms-queue>
<!-- if we want to enable remote access to the queue
<jms-queue name="TestQueue">
<entry name="java:jboss/exported/jms/queue/TestQueue" />
</jms-queue>
-->
<!--<jms-topic name="MetricsTopic">
<entry name="java:jboss/topic/MetricsTopic"/>
</jms-topic>-->
</jms-destinations>
</hornetq-server>
</subsystem>
<subsystem xmlns="urn:jboss:domain:naming:1.2">
<bindings>
<simple name="java:global/zanata/security/auth-policy-names/internal"
Expand Down Expand Up @@ -361,6 +458,9 @@
port="${jboss.http.port,env.JBOSS_HTTP_PORT:8180}" />
<socket-binding name="https"
port="${jboss.https.port,env.JBOSS_HTTPS_PORT:8543}" />
<socket-binding name="messaging" port="${jboss.messaging.port,env.JBOSS_MESSAGING_PORT:5445}"/>
<socket-binding name="messaging-group" port="0" multicast-address="${jboss.messaging.group.address:231.7.7.7}" multicast-port="${jboss.messaging.group.port:9876}"/>
<socket-binding name="messaging-throughput" port="${jboss.messaging.throughput.port,env.JBOSS_MESSAGING_THROUGHPUT_PORT:5455}"/>
<socket-binding name="osgi-http" interface="management"
port="${jboss.osgi.port,env.JBOSS_OSGI_PORT:8190}" />
<socket-binding name="remoting"
Expand Down
11 changes: 11 additions & 0 deletions zanata-war/pom.xml
Expand Up @@ -1848,6 +1848,17 @@
<scope>provided</scope>
</dependency>

<dependency>
<groupId>org.jboss.spec.javax.jms</groupId>
<artifactId>jboss-jms-api_1.1_spec</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.jboss.spec.javax.ejb</groupId>
<artifactId>jboss-ejb-api_3.1_spec</artifactId>
<scope>provided</scope>
</dependency>

<!-- needed by H2 triggers -->
<dependency>
<groupId>com.h2database</groupId>
Expand Down
Expand Up @@ -122,6 +122,8 @@ public class ApplicationConfiguration implements Serializable {

private Optional<String> openIdProvider; // Cache the OpenId provider

private String serverPath;

@Create
public void load() {
log.info("Reloading configuration");
Expand Down Expand Up @@ -236,18 +238,21 @@ public String getRegisterPath() {

public String getServerPath() {
String configuredValue = databaseBackedConfig.getServerHost();
if (configuredValue != null) {
serverPath = configuredValue;
}
// Try to determine a server path if one is not configured
if (configuredValue == null) {
if (serverPath == null) {
HttpServletRequest request =
ServletContexts.instance().getRequest();
if (request != null) {
configuredValue =
serverPath =
request.getScheme() + "://" + request.getServerName()
+ ":" + request.getServerPort()
+ request.getContextPath();
}
}
return configuredValue;
return serverPath;
}

public String getDocumentFileStorageLocation() {
Expand Down
@@ -0,0 +1,93 @@
package org.zanata.email;

import java.util.List;
import javax.mail.internet.InternetAddress;

import org.zanata.events.LanguageTeamPermissionChangedEvent;
import org.zanata.i18n.Messages;
import com.google.common.base.Optional;
import com.google.common.collect.Lists;
import com.googlecode.totallylazy.collections.PersistentMap;
import lombok.RequiredArgsConstructor;

/**
* @author Patrick Huang <a
* href="mailto:pahuang@redhat.com">pahuang@redhat.com</a>
*/
@RequiredArgsConstructor
public class LanguageTeamPermissionChangeEmailStrategy extends EmailStrategy {
private final LanguageTeamPermissionChangedEvent changedEvent;
private final Messages msgs;

@Override
public String getSubject(Messages msgs) {
return msgs.format("jsf.email.languageteam.permission.Subject",
changedEvent.getLanguage());
}

@Override
public String getBodyResourceName() {
return "org/zanata/email/templates/language_team_permission_changed.vm";
}

@Override
public Optional<InternetAddress[]> getReplyToAddress() {
return Optional.of(Addresses.getReplyTo(
changedEvent.getChangedByEmail(),
changedEvent.getChangedByName()));
}

@Override
public PersistentMap<String, Object> makeContext(
PersistentMap<String, Object> genericContext,
InternetAddress[] toAddresses) {
PersistentMap<String, Object> context = super.makeContext(
genericContext, toAddresses);
List<String> oldPermissions = Lists.newArrayList();
if (changedEvent.numOfGrantedOldPermissions() == 0) {
oldPermissions
.add(
msgs.get("jsf.email.languageteam.permission.old.notInTeam"));
} else {
transformPermissionToDescription(
changedEvent.getOldPermission(), oldPermissions);
}

List<String> newPermissions = Lists.newArrayList();
if (changedEvent.numOfGrantedNewPermissions() == 0) {
newPermissions.add(msgs
.get("jsf.email.languageteam.permission.new.notInTeam"));
} else {
transformPermissionToDescription(
changedEvent.getNewPermission(), newPermissions);
}

return context
.insert("language", changedEvent.getLanguage())
.insert("changedByName", changedEvent.getChangedByName())
.insert("changedByEmail", changedEvent.getChangedByEmail())
.insert("oldPermissions", oldPermissions)
.insert("newPermissions", newPermissions)
.insert("toName", toAddresses[0].getPersonal());
}

private void transformPermissionToDescription(
List<Boolean> permissionList, List<String> permissionDescriptions) {
if (changedEvent.translatorPermissionOf(
permissionList)) {
permissionDescriptions.add(
msgs.get("jsf.email.languageteam.permission.isTranslator"));
}
if (changedEvent.reviewerPermissionOf(
permissionList)) {
permissionDescriptions.add(
msgs.get("jsf.email.languageteam.permission.isReviewer"));
}
if (changedEvent.coordinatorPermissionOf(
permissionList)) {
permissionDescriptions
.add(
msgs.get("jsf.email.languageteam.permission.isCoordinator"));
}
}
}
@@ -0,0 +1,104 @@
package org.zanata.events;

import java.io.Serializable;
import java.util.List;

import lombok.Getter;
import lombok.ToString;

import org.zanata.common.LocaleId;
import org.zanata.model.HLocaleMember;
import org.zanata.model.HPerson;

import com.google.common.collect.ImmutableList;
import com.google.common.collect.Iterables;

/**
* @author Patrick Huang <a
* href="mailto:pahuang@redhat.com">pahuang@redhat.com</a>
*/
@Getter
@ToString
public class LanguageTeamPermissionChangedEvent implements Serializable {
public static final String LANGUAGE_TEAM_PERMISSION_CHANGED =
"languageTeamPermissionChanged";
private static final long serialVersionUID = -1L;

private final LocaleId language;
private final String name;
private final String email;
private final String changedByName;
private final String changedByEmail;
private List<Boolean> oldPermission = ImmutableList.of(false, false, false);
private List<Boolean> newPermission = ImmutableList.of(false, false, false);

public LanguageTeamPermissionChangedEvent(HPerson person, LocaleId language,
HPerson doneByPerson) {
name = person.getName();
email = person.getEmail();
this.language = language;
changedByName = doneByPerson.getName();
changedByEmail = doneByPerson.getEmail();
}

public LanguageTeamPermissionChangedEvent joiningTheTeam(
boolean isTranslator, boolean isReviewer, boolean isCoordinator) {
return this.oldPermission(false, false, false)
.newPermission(isTranslator, isReviewer, isCoordinator);
}

public LanguageTeamPermissionChangedEvent updatingPermissions(
HLocaleMember oldMembership, boolean isTranslator,
boolean isReviewer, boolean isCoordinator) {
return this.oldPermission(oldMembership.isTranslator(),
oldMembership.isReviewer(), oldMembership.isCoordinator())
.newPermission(isTranslator, isReviewer, isCoordinator);
}

private LanguageTeamPermissionChangedEvent oldPermission(
boolean isTranslator, boolean isReviewer, boolean isCoordinator) {
oldPermission =
ImmutableList.of(isTranslator, isReviewer, isCoordinator);
return this;
}

private LanguageTeamPermissionChangedEvent newPermission(
boolean isTranslator, boolean isReviewer, boolean isCoordinator) {
newPermission =
ImmutableList.of(isTranslator, isReviewer, isCoordinator);
return this;
}

public int numOfGrantedOldPermissions() {
return Iterables.frequency(oldPermission, Boolean.TRUE);
}

public int numOfGrantedNewPermissions() {
return Iterables.frequency(newPermission, Boolean.TRUE);
}

public boolean translatorPermissionOf(List<Boolean> permissionList) {
return getPermission(permissionList, Permission.translator);
}

public boolean reviewerPermissionOf(List<Boolean> permissionList) {
return getPermission(permissionList, Permission.reviewer);
}

public boolean coordinatorPermissionOf(List<Boolean> permissionList) {
return getPermission(permissionList, Permission.coordinator);
}

private static Boolean getPermission(List<Boolean> permissionList,
Permission permission) {
return permissionList.get(permission.ordinal());
}

public boolean isPermissionChanged() {
return !oldPermission.equals(newPermission);
}

private static enum Permission {
translator, reviewer, coordinator
}
}

0 comments on commit f613e6d

Please sign in to comment.