package eu.doppel_helix.netbeans.mantisintegration.issue;
import biz.futureware.mantisconnect.CustomFieldValueForIssueData;
import biz.futureware.mantisconnect.IssueData;
import eu.doppel_helix.netbeans.mantisintegration.issue.serialization.IssueInfo;
import eu.doppel_helix.netbeans.mantisintegration.repository.MantisRepository;
import java.rmi.RemoteException;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.SwingUtilities;
import javax.xml.rpc.ServiceException;
import org.netbeans.modules.bugtracking.spi.IssueScheduleInfo;
import org.netbeans.modules.bugtracking.spi.IssueScheduleProvider;
import org.netbeans.modules.bugtracking.spi.RepositoryInfo;
public class MantisScheduleProvider implements IssueScheduleProvider<MantisIssue> {
private static final Logger LOG = Logger.getLogger(MantisScheduleProvider.class.getName());
@Override
public void setSchedule(final MantisIssue i, IssueScheduleInfo scheduleInfo) {
IssueInfo ii = i.getMantisRepository().getIssueInfosHandler().getIssueInfo(i.getId());
if(ii == null) {
ii = new IssueInfo(i.getId());
}
if(scheduleInfo != null) {
ii.setScheduleDate(scheduleInfo.getDate());
ii.setScheduleLength(scheduleInfo.getInterval());
} else {
ii.setScheduleDate(null);
ii.setScheduleLength(0);
}
i.getMantisRepository().getIssueInfosHandler().putIssueInfo(ii);
RepositoryInfo ri = i.getMantisRepository().getInfo();
String dateField = ri.getValue(MantisRepository.PROP_SCHEDULE_DATE_FIELD);
String lengthField = ri.getValue(MantisRepository.PROP_SCHEDULE_LENGTH_FIELD);
boolean dateFieldFound = false;
boolean lengthFieldFound = false;
final IssueData id = i.getIssueData();
CustomFieldValueForIssueData[] cfvfids = id.getCustom_fields();
for (CustomFieldValueForIssueData cfvfid : cfvfids) {
if (dateField != null
&& dateField.equalsIgnoreCase(cfvfid.getField().getName())) {
if(scheduleInfo != null && scheduleInfo.getDate() != null) {
cfvfid.setValue(Long.toString(scheduleInfo.getDate().getTime() / 1000));
} else {
cfvfid.setValue(null);
}
dateFieldFound = true;
} else if (lengthField != null
&& lengthField.equalsIgnoreCase(cfvfid.getField().getName())) {
if(scheduleInfo != null && scheduleInfo.getInterval() != 0) {
cfvfid.setValue(Integer.toString(scheduleInfo.getInterval()));
} else {
cfvfid.setValue(null);
}
lengthFieldFound = true;
}
}
if (dateField != null && (!dateFieldFound)) {
LOG.log(Level.WARNING, String.format(
"Mantis-Custom Field for schedule date was not found: %s",
dateField));
}
if (lengthField != null && (!lengthFieldFound)) {
LOG.log(Level.WARNING, String.format(
"Mantis-Custom Field for schedule length was not found: %s",
dateField));
}
Runnable updater = new Runnable() {
@Override
public void run() {
try {
MantisRepository mr = i.getMantisRepository();
mr.updateIssue(i, id);
} catch (ServiceException |RemoteException ex) {
LOG.log(Level.WARNING, "Failed to update issue", ex);
}
}
};
if(SwingUtilities.isEventDispatchThread()) {
i.getMantisRepository().getRequestProcessor().execute(updater);
} else {
updater.run();
}
}
@Override
public Date getDueDate(MantisIssue i) {
return null;
}
@Override
public IssueScheduleInfo getSchedule(MantisIssue i) {
IssueInfo ii = i.getMantisRepository().getIssueInfosHandler().getIssueInfo(i.getId());
Date scheduleDate = null;
int scheduleLength = 0;
if (ii != null && ii.getScheduleLength() != 0 && ii.getScheduleDate()
!= null) {
scheduleDate = ii.getScheduleDate();
scheduleLength = ii.getScheduleLength();
}
RepositoryInfo ri = i.getMantisRepository().getInfo();
String dateField = ri.getValue(MantisRepository.PROP_SCHEDULE_DATE_FIELD);
String lengthField = ri.getValue(MantisRepository.PROP_SCHEDULE_LENGTH_FIELD);
boolean dateFieldFound = false;
boolean lengthFieldFound = false;
CustomFieldValueForIssueData[] cfvfids = i.getCustom_fields();
for(CustomFieldValueForIssueData cfvfid: cfvfids) {
if(dateField != null && dateField.equalsIgnoreCase(cfvfid.getField().getName())) {
Date extractedDate = extractDate(cfvfid);
if(extractedDate != null) {
scheduleDate = extractedDate;
}
dateFieldFound = true;
} else if (lengthField != null && lengthField.equalsIgnoreCase(cfvfid.getField().getName())) {
int extractedScheduleLength = extractInt(cfvfid);
if(extractedScheduleLength > 0) {
scheduleLength = extractedScheduleLength;
}
lengthFieldFound = true;
}
}
if (dateField != null && (!dateFieldFound)) {
LOG.log(Level.WARNING, String.format(
"Mantis-Custom Field for schedule date was not found: %s",
dateField));
}
if (lengthField != null && (!lengthFieldFound)) {
LOG.log(Level.WARNING, String.format(
"Mantis-Custom Field for schedule length was not found: %s",
dateField));
}
if(scheduleDate == null || scheduleLength == 0) {
return null;
} else {
return new IssueScheduleInfo(scheduleDate, scheduleLength);
}
}
private Date extractDate(CustomFieldValueForIssueData cfvfid) {
if (cfvfid.getValue() == null || "".equals(cfvfid.getValue())) {
return null;
} else {
try {
long secondsSinceEpoch = Long.parseLong(cfvfid.getValue());
return new Date(secondsSinceEpoch * 1000);
} catch (NumberFormatException ex) {
LOG.log(Level.WARNING, String.format(
"Mantis-Custom Field was not parsable as a datefield: %s (ID: %d)",
cfvfid.getField().getName(), cfvfid.getField().getId()), ex);
return null;
}
}
}
private Integer extractInt(CustomFieldValueForIssueData cfvfid) {
if (cfvfid.getValue() == null || "".equals(cfvfid.getValue())) {
return 0;
} else {
try {
return Integer.parseInt(cfvfid.getValue());
} catch (NumberFormatException ex) {
LOG.log(Level.WARNING, String.format(
"Mantis-Custom Field was not parsable as an integer: %s (ID: %d)",
cfvfid.getField().getName(), cfvfid.getField().getId()), ex);
return 0;
}
}
}
}