001: package org.tigris.scarab.actions.base;
002:
003: /* ================================================================
004: * Copyright (c) 2000-2002 CollabNet. All rights reserved.
005: *
006: * Redistribution and use in source and binary forms, with or without
007: * modification, are permitted provided that the following conditions are
008: * met:
009: *
010: * 1. Redistributions of source code must retain the above copyright
011: * notice, this list of conditions and the following disclaimer.
012: *
013: * 2. Redistributions in binary form must reproduce the above copyright
014: * notice, this list of conditions and the following disclaimer in the
015: * documentation and/or other materials provided with the distribution.
016: *
017: * 3. The end-user documentation included with the redistribution, if
018: * any, must include the following acknowlegement: "This product includes
019: * software developed by Collab.Net <http://www.Collab.Net/>."
020: * Alternately, this acknowlegement may appear in the software itself, if
021: * and wherever such third-party acknowlegements normally appear.
022: *
023: * 4. The hosted project names must not be used to endorse or promote
024: * products derived from this software without prior written
025: * permission. For written permission, please contact info@collab.net.
026: *
027: * 5. Products derived from this software may not use the "Tigris" or
028: * "Scarab" names nor may "Tigris" or "Scarab" appear in their names without
029: * prior written permission of Collab.Net.
030: *
031: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
032: * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
033: * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
034: * IN NO EVENT SHALL COLLAB.NET OR ITS CONTRIBUTORS BE LIABLE FOR ANY
035: * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
036: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
037: * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
038: * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
039: * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
040: * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
041: * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
042: *
043: * ====================================================================
044: *
045: * This software consists of voluntary contributions made by many
046: * individuals on behalf of Collab.Net.
047: */
048:
049: import java.util.Iterator;
050: import java.util.List;
051: import java.util.ArrayList;
052:
053: // Turbine Stuff
054: import org.apache.turbine.TemplateContext;
055: import org.apache.turbine.RunData;
056:
057: // Scarab Stuff
058: import org.tigris.scarab.om.IssueManager;
059: import org.tigris.scarab.om.Issue;
060: import org.tigris.scarab.om.ActivitySet;
061: import org.tigris.scarab.tools.ScarabRequestTool;
062: import org.tigris.scarab.tools.ScarabLocalizationTool;
063:
064: /**
065: * Base class for actions which modify issues. Has a method to check
066: * for collisions between different changes.
067: *
068: * @author <a href="mailto:jmcnally@collab.net">John McNally</a>
069: * @version $Id: BaseModifyIssue.java 8885 2004-01-31 18:51:40Z dep4b $
070: */
071: public class BaseModifyIssue extends RequireLoginFirstAction {
072: protected boolean isCollision(RunData data, TemplateContext context)
073: throws Exception {
074: boolean isCollision = false;
075: ScarabRequestTool scarabR = getScarabRequestTool(context);
076: ScarabLocalizationTool l10n = getLocalizationTool(context);
077: long modTimestamp = data.getParameters().getLong("mod_ts");
078:
079: String id = data.getParameters().getString("id");
080: if (id == null) {
081: List issues = scarabR.getIssues();
082: List conflictIssues = new ArrayList(issues.size());
083: Iterator iter = issues.iterator();
084: while (iter.hasNext()) {
085: Issue issue = (Issue) iter.next();
086: long lastModTime = issue.getModifiedDate().getTime();
087: boolean isSingleCollision = modTimestamp < lastModTime;
088: if (isSingleCollision) {
089: isCollision = true;
090: scarabR.setAlertMessage(l10n
091: .get("MultiIssueChangeCollision"));
092: ActivitySet lastActivitySet = issue
093: .getLastActivitySet();
094: ArrayList objs = new ArrayList(2);
095: objs.add(issue);
096: objs.add(lastActivitySet);
097: conflictIssues.add(objs);
098: }
099: }
100: context.put("lastActivities", conflictIssues);
101: } else {
102: Issue issue = IssueManager.getIssueById(id);
103: List conflictIssues = new ArrayList(1);
104: long lastModTime = issue.getModifiedDate().getTime();
105: isCollision = modTimestamp < lastModTime;
106: if (isCollision) {
107: scarabR.setAlertMessage(l10n
108: .get("IssueChangeCollision"));
109: ActivitySet lastActivitySet = issue
110: .getLastActivitySet();
111: ArrayList objs = new ArrayList(2);
112: objs.add(issue);
113: objs.add(lastActivitySet);
114: conflictIssues.add(objs);
115: context.put("lastActivities", conflictIssues);
116: }
117: }
118: return isCollision;
119: }
120: }
|