blob: 17c2618b09abf752e42c50ff2a5284b7a2a27d89 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.netbeans.modules.bugzilla;
import java.beans.PropertyChangeListener;
import org.eclipse.mylyn.internal.bugzilla.core.BugzillaClientManager;
import org.netbeans.modules.bugzilla.repository.BugzillaRepository;
import java.net.MalformedURLException;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.logging.Logger;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.mylyn.internal.bugzilla.core.BugzillaClient;
import org.eclipse.mylyn.internal.bugzilla.core.BugzillaRepositoryConnector;
import org.eclipse.mylyn.internal.bugzilla.core.RepositoryConfiguration;
import org.netbeans.modules.bugtracking.commons.SimpleIssueFinder;
import org.netbeans.modules.bugtracking.issuetable.IssueNode;
import org.netbeans.modules.bugtracking.spi.BugtrackingSupport;
import org.netbeans.modules.bugtracking.spi.IssueFinder;
import org.netbeans.modules.bugtracking.spi.IssuePriorityInfo;
import org.netbeans.modules.bugtracking.spi.IssuePriorityProvider;
import org.netbeans.modules.bugtracking.spi.IssueScheduleInfo;
import org.netbeans.modules.bugtracking.spi.IssueScheduleProvider;
import org.netbeans.modules.bugtracking.spi.IssueStatusProvider;
import org.netbeans.modules.bugzilla.issue.BugzillaIssue;
import org.netbeans.modules.bugzilla.query.BugzillaQuery;
import org.netbeans.modules.mylyn.util.MylynSupport;
import org.openide.util.RequestProcessor;
/**
*
* @author Tomas Stupka
*/
public class Bugzilla {
private BugzillaRepositoryConnector brc;
private static Bugzilla instance;
public static final Logger LOG = Logger.getLogger("org.netbeans.modules.bugzilla.Bugzilla"); // NOI18N
private RequestProcessor rp;
private BugzillaClientManager clientManager;
private BugtrackingSupport<BugzillaRepository, BugzillaQuery, BugzillaIssue> bf;
private BugzillaIssueProvider bip;
private BugzillaQueryProvider bqp;
private BugzillaRepositoryProvider brp;
private IssueStatusProvider<BugzillaRepository, BugzillaIssue> sp;
private IssuePriorityProvider<BugzillaIssue> pp;
private IssueNode.ChangesProvider<BugzillaIssue> bcp;
private IssueScheduleProvider<BugzillaIssue> schedulingProvider;
private IssueFinder issueFinder;
private Bugzilla() {
brc = MylynRepositoryConnectorProvider.getInstance().getConnector();
clientManager = brc.getClientManager();
MylynSupport.getInstance().addRepositoryListener(clientManager);
}
public static synchronized Bugzilla getInstance() {
if(instance == null) {
instance = new Bugzilla();
}
return instance;
}
static synchronized void init() {
getInstance();
}
public BugzillaRepositoryConnector getRepositoryConnector() {
return brc;
}
public RepositoryConfiguration getRepositoryConfiguration(BugzillaRepository repository, boolean forceRefresh) throws CoreException, MalformedURLException {
getClient(repository); // XXX mylyn 3.1.1 workaround. initialize the client, otherwise the configuration will be downloaded twice
RepositoryConfiguration rc = brc.getRepositoryConfiguration(repository.getTaskRepository(), forceRefresh, new NullProgressMonitor());
return rc;
}
/**
* Returns a BugzillaClient for the given repository
* @param repository
* @return
* @throws java.net.MalformedURLException
* @throws org.eclipse.core.runtime.CoreException
*/
public BugzillaClient getClient(BugzillaRepository repository) throws MalformedURLException, CoreException {
return clientManager.getClient(repository.getTaskRepository(), new NullProgressMonitor());
}
/**
* Returns the request processor for common tasks in bugzilla.
* Do not use this when accesing a remote repository.
*
* @return
*/
public final RequestProcessor getRequestProcessor() {
if(rp == null) {
rp = new RequestProcessor("Bugzilla", 1, true); // NOI18N
}
return rp;
}
public BugtrackingSupport<BugzillaRepository, BugzillaQuery, BugzillaIssue> getBugtrackingFactory() {
if(bf == null) {
bf = new BugtrackingSupport<>(getRepositoryProvider(), getQueryProvider(), getIssueProvider());
}
return bf;
}
public BugzillaIssueProvider getIssueProvider() {
if(bip == null) {
bip = new BugzillaIssueProvider();
}
return bip;
}
public BugzillaQueryProvider getQueryProvider() {
if(bqp == null) {
bqp = new BugzillaQueryProvider();
}
return bqp;
}
public BugzillaRepositoryProvider getRepositoryProvider() {
if(brp == null) {
brp = new BugzillaRepositoryProvider();
}
return brp;
}
public IssueStatusProvider<BugzillaRepository, BugzillaIssue> getStatusProvider() {
if(sp == null) {
sp = new IssueStatusProvider<BugzillaRepository, BugzillaIssue>() {
@Override
public IssueStatusProvider.Status getStatus(BugzillaIssue issue) {
return issue.getStatus();
}
@Override
public void setSeenIncoming(BugzillaIssue issue, boolean uptodate) {
issue.setUpToDate(uptodate);
}
@Override
public void removePropertyChangeListener(BugzillaIssue issue, PropertyChangeListener listener) {
issue.removePropertyChangeListener(listener);
}
@Override
public void addPropertyChangeListener(BugzillaIssue issue, PropertyChangeListener listener) {
issue.addPropertyChangeListener(listener);
}
@Override
public Collection<BugzillaIssue> getUnsubmittedIssues(BugzillaRepository r) {
return r.getUnsubmittedIssues();
}
@Override
public void discardOutgoing(BugzillaIssue i) {
i.discardLocalEdits();
}
@Override
public boolean submit (BugzillaIssue data) {
return data.submitAndRefresh();
}
};
}
return sp;
}
public IssuePriorityProvider<BugzillaIssue> createPriorityProvider(final BugzillaRepository repository) {
return new IssuePriorityProvider<BugzillaIssue>() {
private IssuePriorityInfo[] infos;
@Override
public String getPriorityID(BugzillaIssue i) {
return i.getPriority();
}
@Override
public synchronized IssuePriorityInfo[] getPriorityInfos() {
if(infos == null) {
List<String> priorities = repository.getConfiguration().getPriorities();
infos = new IssuePriorityInfo[priorities.size()];
for (int i = 0; i < priorities.size(); i++) {
String p = priorities.get(i);
infos[i] = new IssuePriorityInfo(p, p);
}
}
return infos;
}
};
}
public IssueScheduleProvider<BugzillaIssue> getSchedulingProvider() {
if(schedulingProvider == null) {
schedulingProvider = new IssueScheduleProvider<BugzillaIssue>() {
@Override
public void setSchedule (BugzillaIssue i, IssueScheduleInfo date) {
i.setTaskScheduleDate(date, true);
}
@Override
public Date getDueDate (BugzillaIssue i) {
return i.getPersistentDueDate();
}
@Override
public IssueScheduleInfo getSchedule (BugzillaIssue i) {
return i.getPersistentScheduleInfo();
}
};
}
return schedulingProvider;
}
public IssueNode.ChangesProvider<BugzillaIssue> getChangesProvider() {
if(bcp == null) {
bcp = new IssueNode.ChangesProvider<BugzillaIssue>() {
@Override
public String getRecentChanges(BugzillaIssue i) {
return i.getRecentChanges();
}
};
}
return bcp;
}
public IssueFinder getBugzillaIssueFinder() {
if(issueFinder == null) {
issueFinder = new IssueFinder() {
@Override
public int[] getIssueSpans(CharSequence text) {
return SimpleIssueFinder.getInstance().getIssueSpans(text);
}
@Override
public String getIssueId(String issueHyperlinkText) {
return SimpleIssueFinder.getInstance().getIssueId(issueHyperlinkText);
}
};
}
return issueFinder;
}
}