/**
* Copyright (c) 2008-2011 Sonatype, Inc.
* All rights reserved. Includes the third-party code listed at http://www.sonatype.com/products/nexus/attributions.
*
* This program is free software: you can redistribute it and/or modify it only under the terms of the GNU Affero General
* Public License Version 3 as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License Version 3
* for more details.
*
* You should have received a copy of the GNU Affero General Public License Version 3 along with this program. If not, see
* http://www.gnu.org/licenses.
*
* Sonatype Nexus (TM) Open Source Version is available from Sonatype, Inc. Sonatype and Sonatype Nexus are trademarks of
* Sonatype, Inc. Apache Maven is a trademark of the Apache Foundation. M2Eclipse is a trademark of the Eclipse Foundation.
* All other trademarks are the property of their respective owners.
*/
package org.sonatype.nexus.ext.gwt.ui.client.reposerver;
import java.util.List;
import org.sonatype.nexus.ext.gwt.ui.client.data.CallbackResponseHandler;
import org.sonatype.nexus.ext.gwt.ui.client.data.ResponseHandler;
import org.sonatype.nexus.ext.gwt.ui.client.reposerver.model.Repository;
import org.sonatype.nexus.ext.gwt.ui.client.reposerver.model.RepositoryListResource;
import org.sonatype.nexus.ext.gwt.ui.client.reposerver.model.RepositoryStatusListResource;
import org.sonatype.nexus.ext.gwt.ui.client.reposerver.model.RepositoryStatusResource;
import com.extjs.gxt.ui.client.Style.SortDir;
import com.extjs.gxt.ui.client.binder.TableBinder;
import com.extjs.gxt.ui.client.data.BaseListLoader;
import com.extjs.gxt.ui.client.data.BaseModelData;
import com.extjs.gxt.ui.client.data.DataProxy;
import com.extjs.gxt.ui.client.data.DataReader;
import com.extjs.gxt.ui.client.data.ListLoader;
import com.extjs.gxt.ui.client.data.LoadEvent;
import com.extjs.gxt.ui.client.data.ModelComparer;
import com.extjs.gxt.ui.client.data.ModelData;
import com.extjs.gxt.ui.client.event.BaseEvent;
import com.extjs.gxt.ui.client.event.Listener;
import com.extjs.gxt.ui.client.event.LoadListener;
import com.extjs.gxt.ui.client.store.ListStore;
import com.extjs.gxt.ui.client.store.StoreEvent;
import com.extjs.gxt.ui.client.store.StoreListener;
import com.extjs.gxt.ui.client.store.StoreSorter;
import com.extjs.gxt.ui.client.util.DelayedTask;
import com.extjs.gxt.ui.client.widget.MessageBox;
import com.extjs.gxt.ui.client.widget.table.Table;
import com.google.gwt.http.client.Response;
import com.google.gwt.user.client.rpc.AsyncCallback;
public class RepoTableBinding {
private RepoServerInstance server;
private ListLoader loader;
private ListStore store;
private TableBinder<Repository> binder;
public RepoTableBinding(final Table table, final RepoServerInstance server) {
this.server = server;
DataProxy proxy = new DataProxy() {
public void load(DataReader reader, Object loadConfig, final AsyncCallback callback) {
server.getRepositories(
new CallbackResponseHandler<List<RepositoryListResource>>(callback));
}
};
loader = new BaseListLoader(proxy) {
{
setSortField("name");
setSortDir(SortDir.ASC);
addLoadListener(new LoadListener() {
public void loaderBeforeLoad(LoadEvent le) {
table.el().mask("Loading...");
}
public void loaderLoad(LoadEvent le) {
table.el().unmask();
}
public void loaderLoadException(LoadEvent le) {
table.el().mask("Loading failed!");
}
});
}
};
store = new ListStore(loader) {
{
addStoreListener(new StoreListener() {
public void storeDataChanged(StoreEvent event) {
loadStatuses(true);
}
});
setStoreSorter(new StoreSorter());
setModelComparer(new ModelComparer() {
public boolean equals(ModelData model1, ModelData model2) {
String resourceURI1 = (String) model1.get("resourceURI");
String resourceURI2 = (String) model2.get("resourceURI");
resourceURI2 = resourceURI2.replace(server.getServicePath() + "/repository_statuses", server.getServicePath() + "/repositories");
return resourceURI1.equals(resourceURI2);
}
});
}
};
binder = new TableBinder(table, store);
}
public void reload() {
int sortColumn = binder.getTable().getTableHeader().getSortColumn();
if (sortColumn != -1) {
loader.setSortField(binder.getTable().getColumn(sortColumn).getId());
loader.setSortDir(binder.getTable().getColumn(sortColumn).getSortDir());
}
loader.load();
}
public TableBinder<Repository> getBinder() {
return binder;
}
public void updateRepoStatus(RepositoryStatusResource status) {
BaseModelData item = new BaseModelData();
item.set("resourceURI", server.getServicePath() + "/repository_statuses/" + status.getId());
Repository storeItem = (Repository) store.findModel(item);
storeItem.setStatus(status);
storeItem.set("statusText", convertStatusToString(status));
store.update(storeItem);
loadStatuses(false);
}
private void loadStatuses(boolean forceCheck) {
server.getRepositoryStatuses(forceCheck, new ResponseHandler<List<RepositoryStatusListResource>>() {
public void onError(Response response, Throwable error) {
MessageBox.alert("Error", "Status retrieval failed!", null);
}
public void onSuccess(Response response, List<RepositoryStatusListResource> statuses) {
for (RepositoryStatusListResource repoStatus : statuses) {
Repository storeItem = (Repository) store.findModel(repoStatus);
if (storeItem != null) {
repoStatus.getStatus().setRepoType(repoStatus.getRepoType());
storeItem.setStatus(repoStatus.getStatus());
storeItem.set("statusText", convertStatusToString(repoStatus.getStatus()));
store.update(storeItem);
}
}
if (response.getStatusCode() == Response.SC_ACCEPTED) {
DelayedTask task = new DelayedTask(new Listener() {
public void handleEvent(BaseEvent event) {
loadStatuses(false);
}
});
task.delay(2000);
}
}
});
}
private String convertStatusToString(RepositoryStatusResource status) {
String localStatus = status.getLocalStatus();
String statusText = localStatus.equals("inService") ? "In Service" : "Out of Service";
if (status.getRepoType().equals("proxy")) {
String remoteStatus = status.getRemoteStatus();
String proxyMode = status.getProxyMode();
if (proxyMode.startsWith("blocked")) {
statusText += proxyMode.equals("blockedAuto")
? " - Remote Automatically Blocked"
: " - Remote Manually Blocked";
statusText += remoteStatus.equals("available")
? " and Available"
: " and Unavailable";
} else {
if (localStatus.equals("inService")) {
if (!remoteStatus.equals("available")) {
statusText += remoteStatus.equals("unknown")
? " - <i>checking remote...</i>"
: " - Attempting to Proxy and Remote Unavailable";
}
} else {
statusText += remoteStatus.equals("available")
? " - Remote Available"
: " - Remote Unavailable";
}
}
}
return statusText;
}
}