Skip to content

Commit 4589e07

Browse files
committed
Merge pull request #11 from junichi11/feature-schedule
Support for schedule
2 parents e114301 + f8e40c6 commit 4589e07

6 files changed

Lines changed: 124 additions & 6 deletions

File tree

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ This plugin provides support for GitHub Issue Tracker.
1212
- Search issues with issue number or keywords
1313
- Create a new label
1414
- Create a new milestone
15+
- Set a schedule for an issue
1516

1617
## Usage
1718

pom.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,5 +151,6 @@
151151
<li>Search issues with issue number or keywords</li>
152152
<li>Create a new label</li>
153153
<li>Create a new milestone</li>
154+
<li>Set a schedule for an issue</li>
154155
&lt;/ul&gt;</description>
155156
</project>

src/main/java/com/junichi11/netbeans/modules/github/issues/GitHubIssuesConfig.java

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,14 @@
4141
*/
4242
package com.junichi11.netbeans.modules.github.issues;
4343

44+
import com.junichi11.netbeans.modules.github.issues.issue.GitHubIssue;
4445
import com.junichi11.netbeans.modules.github.issues.query.GitHubQuery;
4546
import com.junichi11.netbeans.modules.github.issues.repository.GitHubRepository;
4647
import com.junichi11.netbeans.modules.github.issues.utils.StringUtils;
48+
import java.text.DateFormat;
49+
import java.text.ParseException;
50+
import java.text.SimpleDateFormat;
51+
import java.util.Date;
4752
import java.util.prefs.BackingStoreException;
4853
import java.util.prefs.Preferences;
4954
import org.openide.util.Exceptions;
@@ -56,8 +61,12 @@
5661
public final class GitHubIssuesConfig {
5762

5863
private static final GitHubIssuesConfig INSTANCE = new GitHubIssuesConfig();
64+
private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy/MM/dd"); // NOI18N
5965
private static final String QUERY = "query"; // NOI18N
6066
private static final String QUERY_PARAMS = "query.params"; // NOI18N
67+
private static final String SCHEDULE = "schedule"; // NOI18N
68+
private static final String SCHEDULE_DUE_DATE = "schedule.due"; // NOI18N
69+
private static final String SCHEDULE_INTERVAL = "schedule.interval"; // NOI18N
6170

6271
private GitHubIssuesConfig() {
6372
}
@@ -125,7 +134,80 @@ public void removeQuery(GitHubRepository repository, GitHubQuery query) {
125134
}
126135
}
127136

137+
public void setScheduleDueDate(GitHubRepository repository, GitHubIssue issue, Date dueDate) {
138+
Preferences preferences = getPreferences(repository);
139+
String id = issue.getID();
140+
if (StringUtils.isEmpty(id)) {
141+
return;
142+
}
143+
preferences.node(SCHEDULE).node(id).put(SCHEDULE_DUE_DATE, DATE_FORMAT.format(dueDate));
144+
}
145+
146+
public Date getScheduleDueDate(GitHubRepository repository, GitHubIssue issue) {
147+
Preferences preferences = getPreferences(repository);
148+
String id = issue.getID();
149+
if (StringUtils.isEmpty(id)) {
150+
return null;
151+
}
152+
String dateString = preferences.node(SCHEDULE).node(id).get(SCHEDULE_DUE_DATE, null);
153+
if (StringUtils.isEmpty(dateString)) {
154+
return null;
155+
}
156+
try {
157+
return DateFormat.getDateInstance().parse(dateString);
158+
} catch (ParseException ex) {
159+
Exceptions.printStackTrace(ex);
160+
}
161+
return null;
162+
}
163+
164+
public void setScheduleInterval(GitHubRepository repository, GitHubIssue issue, int interval) {
165+
Preferences preferences = getPreferences(repository);
166+
String id = issue.getID();
167+
if (StringUtils.isEmpty(id)) {
168+
return;
169+
}
170+
preferences.node(SCHEDULE).node(id).putInt(SCHEDULE_INTERVAL, interval);
171+
}
172+
173+
public int getScheduleInterval(GitHubRepository repository, GitHubIssue issue) {
174+
Preferences preferences = getPreferences(repository);
175+
String id = issue.getID();
176+
if (StringUtils.isEmpty(id)) {
177+
return -1;
178+
}
179+
return preferences.node(SCHEDULE).node(id).getInt(SCHEDULE_INTERVAL, -1);
180+
}
181+
182+
public void removeSchedule(GitHubRepository repository, GitHubIssue issue) {
183+
Preferences preferences = getPreferences(repository);
184+
String id = issue.getID();
185+
if (StringUtils.isEmpty(id)) {
186+
return;
187+
}
188+
preferences = preferences.node(SCHEDULE).node(id);
189+
try {
190+
preferences.removeNode();
191+
} catch (BackingStoreException ex) {
192+
Exceptions.printStackTrace(ex);
193+
}
194+
}
195+
196+
public void removeRepository(GitHubRepository repository) {
197+
Preferences preferences = getPreferences(repository);
198+
try {
199+
preferences.removeNode();
200+
} catch (BackingStoreException ex) {
201+
Exceptions.printStackTrace(ex);
202+
}
203+
}
204+
128205
private Preferences getPreferences() {
129206
return NbPreferences.forModule(GitHubIssuesConfig.class);
130207
}
208+
209+
private Preferences getPreferences(GitHubRepository repository) {
210+
String id = repository.getID();
211+
return getPreferences().node(id);
212+
}
131213
}

src/main/java/com/junichi11/netbeans/modules/github/issues/issue/GitHubIssue.java

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
package com.junichi11.netbeans.modules.github.issues.issue;
4343

4444
import com.junichi11.netbeans.modules.github.issues.GitHubIssueState;
45+
import com.junichi11.netbeans.modules.github.issues.GitHubIssuesConfig;
4546
import com.junichi11.netbeans.modules.github.issues.repository.GitHubRepository;
4647
import java.beans.PropertyChangeListener;
4748
import java.beans.PropertyChangeSupport;
@@ -62,6 +63,7 @@
6263
import org.netbeans.modules.bugtracking.issuetable.IssueNode;
6364
import org.netbeans.modules.bugtracking.spi.IssueController;
6465
import org.netbeans.modules.bugtracking.spi.IssueProvider;
66+
import org.netbeans.modules.bugtracking.spi.IssueScheduleInfo;
6567
import org.netbeans.modules.bugtracking.spi.IssueStatusProvider;
6668
import org.openide.util.NbBundle;
6769
import org.pegdown.Extensions;
@@ -77,6 +79,7 @@ public final class GitHubIssue {
7779
private Issue issue;
7880
private IssueNode node;
7981
private GitHubIssueController controller;
82+
private IssueScheduleInfo scheduleInfo;
8083
private final PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(this);
8184
public static final String LABEL_NAME_ID = "github.issue.id"; // NOI18N
8285
public static final String LABEL_NAME_STATUS = "github.issue.status"; // NOI18N
@@ -285,6 +288,39 @@ public List<Comment> getComments() {
285288
return repository.getComments(issue.getNumber());
286289
}
287290

291+
// schedule
292+
public void setSchedule(IssueScheduleInfo scheduleInfo) {
293+
this.scheduleInfo = scheduleInfo;
294+
if (scheduleInfo == null) {
295+
// remove schedule
296+
GitHubIssuesConfig.getInstance().removeSchedule(repository, this);
297+
return;
298+
}
299+
GitHubIssuesConfig.getInstance().setScheduleDueDate(repository, this, scheduleInfo.getDate());
300+
GitHubIssuesConfig.getInstance().setScheduleInterval(repository, this, scheduleInfo.getInterval());
301+
}
302+
303+
public Date getDueDate() {
304+
IssueScheduleInfo info = getSchedule();
305+
return info != null ? info.getDate() : null;
306+
}
307+
308+
public IssueScheduleInfo getSchedule() {
309+
if (scheduleInfo == null) {
310+
GitHubIssuesConfig config = GitHubIssuesConfig.getInstance();
311+
Date dueDate = config.getScheduleDueDate(repository, this);
312+
int interval = config.getScheduleInterval(repository, this);
313+
if (dueDate != null) {
314+
if (interval > 0) {
315+
scheduleInfo = new IssueScheduleInfo(dueDate, interval);
316+
} else {
317+
scheduleInfo = new IssueScheduleInfo(dueDate);
318+
}
319+
}
320+
}
321+
return scheduleInfo;
322+
}
323+
288324
@NbBundle.Messages({
289325
"GitHubIssue.column.descriptor.issueType.displayName=Issue Type",
290326
"GitHubIssue.column.descriptor.summary.displayName=Summary",

src/main/java/com/junichi11/netbeans/modules/github/issues/issue/GitHubIssueScheduleProvider.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,16 +53,17 @@ public class GitHubIssueScheduleProvider implements IssueScheduleProvider<GitHub
5353

5454
@Override
5555
public void setSchedule(GitHubIssue issue, IssueScheduleInfo info) {
56+
issue.setSchedule(info);
5657
}
5758

5859
@Override
5960
public Date getDueDate(GitHubIssue issue) {
60-
return null;
61+
return issue.getDueDate();
6162
}
6263

6364
@Override
6465
public IssueScheduleInfo getSchedule(GitHubIssue issue) {
65-
return null;
66+
return issue.getSchedule();
6667
}
6768

6869
}

src/main/java/com/junichi11/netbeans/modules/github/issues/repository/GitHubRepository.java

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -719,10 +719,7 @@ private void setDefaultQuery(GitHubQuery query, boolean isEnabled) {
719719
}
720720

721721
void removed() {
722-
// remove all queries
723-
for (GitHubQuery query : getQueries()) {
724-
removeQueryConfig(query);
725-
}
722+
GitHubIssuesConfig.getInstance().removeRepository(this);
726723
if (queries != null) {
727724
queries.clear();
728725
}

0 commit comments

Comments
 (0)