package com.jakeapp.violet.actions.project.interact; import javax.inject.Inject; import org.apache.log4j.Logger; import com.jakeapp.availablelater.AvailableLaterObject; import com.jakeapp.jake.fss.HashValue; import com.jakeapp.jake.ics.UserId; import com.jakeapp.violet.context.ProjectModel; import com.jakeapp.violet.di.IUserIdFactory; import com.jakeapp.violet.model.JakeObject; import com.jakeapp.violet.model.LogEntry; import com.jakeapp.violet.protocol.msg.IMessageMarshaller; import com.jakeapp.violet.protocol.msg.PokeMessage; /** * Announces a <code>List</code> of <code>JakeObject</code>s. */ public class AnnounceAction extends AvailableLaterObject<Void> { private static final Logger log = Logger.getLogger(AnnounceAction.class); private String why; private JakeObject what; private ProjectModel model; private boolean delete; @Inject private IMessageMarshaller messageMarshaller; @Inject private IUserIdFactory userids; public AnnounceAction(ProjectModel model, JakeObject what, String why, boolean delete) { this.why = why; this.what = what; this.model = model; this.delete = delete; } /** * {@inheritDoc} */ @Override public Void calculate() throws Exception { HashValue hash = null; if (!delete) { hash = model.getFss().calculateHashOverFile(what.getRelPath()); } LogEntry le = new LogEntry(null, null, model.getUser(), what, why, hash.toString(), true); this.model.getLog().add(le); for (UserId u : this.model.getIcs().getUsersService().getUsers()) { notifyUser(le, u); } return null; } private void notifyUser(LogEntry le, UserId u) { PokeMessage msg = PokeMessage.createPokeMessage(model.getProjectid(), userids.get(model.getUserid()), le); try { model.getIcs().getMsgService() .sendMessage(u, messageMarshaller.serialize(msg)); } catch (Exception e) { // notifying is best-effort, not critical log.debug("notifying " + u + " failed."); } } }