/* * Copyright 2013 JBoss Inc * * Licensed 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.overlord.sramp.governance.services; import java.util.HashMap; import java.util.Map; import java.util.Properties; import javax.mail.Address; import javax.mail.Message; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import javax.naming.InitialContext; import javax.naming.NamingException; import javax.servlet.http.HttpServletRequest; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; import javax.ws.rs.core.Context; import org.apache.commons.lang.StringUtils; import org.overlord.dtgov.server.i18n.Messages; import org.overlord.sramp.atom.err.SrampAtomException; import org.overlord.sramp.client.SrampAtomApiClient; import org.overlord.sramp.client.query.ArtifactSummary; import org.overlord.sramp.client.query.QueryResultSet; import org.overlord.sramp.governance.Governance; import org.overlord.sramp.governance.GovernanceConstants; import org.overlord.sramp.governance.NotificationDestinations; import org.overlord.sramp.governance.SlashDecoder; import org.overlord.sramp.governance.SrampAtomApiClientFactory; import org.overlord.sramp.governance.ValueEntity; import org.overlord.sramp.governance.services.notification.NotificationResourceUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * The JAX-RS resource that handles notification specific tasks. * */ @Path("/notify") public class NotificationResource { private Session mailSession; private static Logger logger = LoggerFactory.getLogger(NotificationResource.class); private final Governance governance = new Governance(); /** * Constructor. * @throws NamingException */ public NotificationResource() { InitialContext context; try { String jndiEmailRef = governance.getJNDIEmailName(); context = new InitialContext(); Object o = context.lookup(jndiEmailRef); if (o instanceof Session) { mailSession = (Session) o; } else if (o instanceof Properties) { mailSession = Session.getInstance((Properties) o); } if (mailSession == null) { logger.error(Messages.i18n.format("NotificationResource.JndiLookupFailed", jndiEmailRef)); //$NON-NLS-1$ } } catch (NamingException e) { logger.error(e.getMessage(),e); } } /** * POST to email a notification about an artifact. * * @param environment * @param uuid * @throws SrampAtomException */ @POST @Path("email/{group}/{template}/{target}/{uuid}") @Produces("application/xml") public Map<String,ValueEntity> emailNotification(@Context HttpServletRequest request, @PathParam("group") String group, @PathParam("template") String template, @PathParam("target") String target, @PathParam("uuid") String uuid) throws Exception { Map<String, ValueEntity> results = new HashMap<String,ValueEntity>(); try { // 0. run the decoder on the arguments, after replacing * by % (this so parameters can // contain slashes (%2F) group = SlashDecoder.decode(group); template = SlashDecoder.decode(template); target = SlashDecoder.decode(target); uuid = SlashDecoder.decode(uuid); // 1. get the artifact from the repo SrampAtomApiClient client = SrampAtomApiClientFactory.createAtomApiClient(); QueryResultSet queryResultSet = client.buildQuery("/s-ramp[@uuid = ?]").parameter(uuid).query(); //$NON-NLS-1$ if (queryResultSet.size() == 0) { results.put(GovernanceConstants.STATUS, new ValueEntity("fail")); //$NON-NLS-1$ results.put(GovernanceConstants.MESSAGE, new ValueEntity("Could not obtain artifact from repository.")); //$NON-NLS-1$ return results; } ArtifactSummary artifactSummary = queryResultSet.iterator().next(); // 2. get the destinations for this group NotificationDestinations destinations = governance.getNotificationDestinations("email").get(group); //$NON-NLS-1$ if (destinations==null) { destinations = new NotificationDestinations(group, governance.getDefaultEmailFromAddress(), group + "@" + governance.getDefaultEmailDomain()); //$NON-NLS-1$ } // 3. send the email notification try { MimeMessage m = new MimeMessage(mailSession); Address from = new InternetAddress(destinations.getFromAddress()); Address[] to = new InternetAddress[destinations.getToAddresses().length]; for (int i=0; i<destinations.getToAddresses().length;i++) { to[i] = new InternetAddress(destinations.getToAddresses()[i]); } m.setFrom(from); m.setRecipients(Message.RecipientType.TO, to); String subject = NotificationResourceUtil.getNotificationSubject(template); if (StringUtils.isNotBlank(subject)) { subject = subject.replaceAll("\\$\\{uuid}", uuid); //$NON-NLS-1$ subject = subject.replaceAll("\\$\\{name}", artifactSummary.getName()); //$NON-NLS-1$ subject = subject.replaceAll("\\$\\{target}", target); //$NON-NLS-1$ m.setSubject(subject); } else { logger.warn(Messages.i18n.format("NotificationResource.subject.empty", template)); //$NON-NLS-1$ } m.setSentDate(new java.util.Date()); String content = NotificationResourceUtil.getNotificationBody(template); if (StringUtils.isNotBlank(content)) { content = content.replaceAll("\\$\\{uuid}", uuid); //$NON-NLS-1$ content = content.replaceAll("\\$\\{name}", artifactSummary.getName()); //$NON-NLS-1$ content = content.replaceAll("\\$\\{target}", target); //$NON-NLS-1$ content = content.replaceAll("\\$\\{dtgovurl}", governance.getDTGovUiUrl()); //$NON-NLS-1$ m.setContent(content, "text/plain"); //$NON-NLS-1$ } else { logger.warn(Messages.i18n.format("NotificationResource.body.empty", template)); //$NON-NLS-1$ } Transport.send(m); } catch (javax.mail.MessagingException e) { logger.error(e.getMessage(),e); } // 4. build the response results.put(GovernanceConstants.STATUS, new ValueEntity("success")); //$NON-NLS-1$ return results; } catch (Exception e) { logger.error(Messages.i18n.format("NotificationResource.EmailError", e.getMessage(), e)); //$NON-NLS-1$ throw new SrampAtomException(e); } } }