/*
* Copyright 2010 Red Hat, Inc. and/or its affiliates.
*
* Licensed 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.guvnor.tools.views.model;
import java.net.ConnectException;
import java.net.URL;
import java.util.ArrayList;
import java.util.EnumSet;
import java.util.List;
import java.util.Map;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.jobs.ISchedulingRule;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.ui.progress.IDeferredWorkbenchAdapter;
import org.eclipse.ui.progress.IElementCollector;
import org.eclipse.webdav.IResponse;
import org.guvnor.tools.Activator;
import org.guvnor.tools.GuvnorRepository;
import org.guvnor.tools.Messages;
import org.guvnor.tools.utils.PlatformUtils;
import org.guvnor.tools.utils.webdav.IWebDavClient;
import org.guvnor.tools.utils.webdav.ResourceProperties;
import org.guvnor.tools.utils.webdav.WebDavClientFactory;
import org.guvnor.tools.utils.webdav.WebDavException;
import org.guvnor.tools.utils.webdav.WebDavServerCache;
/**
* A container node for Guvnor structure.
*/
public class TreeParent extends TreeObject implements IDeferredWorkbenchAdapter {
private ArrayList<TreeObject> children;
public TreeParent(String name, Type nodeType) {
super(name, nodeType);
children = new ArrayList<TreeObject>();
}
public void addChild(TreeObject child) {
children.add(child);
child.setParent(this);
}
public void removeChild(TreeObject child) {
children.remove(child);
child.setParent(null);
}
public TreeObject [] getChildren() {
return (TreeObject [])children.toArray(new TreeObject[children.size()]);
}
public boolean hasChildren() {
return children.size()>0;
}
/*
* (non-Javadoc)
* @see org.eclipse.ui.progress.IDeferredWorkbenchAdapter#fetchDeferredChildren(java.lang.Object, org.eclipse.ui.progress.IElementCollector, org.eclipse.core.runtime.IProgressMonitor)
*/
public void fetchDeferredChildren(Object object,
IElementCollector collector,
IProgressMonitor monitor) {
if (!(object instanceof TreeParent)) {
return;
}
TreeParent node = (TreeParent)object;
if (node.getNodeType() == Type.NONE) {
List<GuvnorRepository> reps = Activator.getLocationManager().getRepositories();
monitor.beginTask(Messages.getString("pending"), reps.size()); //$NON-NLS-1$
for (int i = 0; i < reps.size(); i++) {
TreeParent p = new TreeParent(reps.get(i).getLocation(), Type.REPOSITORY);
p.setParent(node);
p.setGuvnorRepository(reps.get(i));
ResourceProperties props = new ResourceProperties();
props.setBase(""); //$NON-NLS-1$
p.setResourceProps(props);
collector.add(p, monitor);
monitor.worked(1);
}
monitor.done();
}
if (EnumSet.of(Type.REPOSITORY, Type.GLOBALS, Type.PACKAGES, Type.SNAPSHOTS, Type.PACKAGE,
Type.SNAPSHOT_PACKAGE).contains(node.getNodeType())) {
listDirectory(node, collector, monitor);
}
}
/**
* Creates a directory listing.
* @param node The directory to list.
* @param collector The collector for the elements listed.
* @param monitor Progress monitor for the operation.
*/
public void listDirectory(TreeParent node,
IElementCollector collector,
IProgressMonitor monitor) {
monitor.beginTask(Messages.getString("pending"), 1); //$NON-NLS-1$
monitor.worked(1);
GuvnorRepository rep = node.getGuvnorRepository();
try {
IWebDavClient webdav = WebDavServerCache.getWebDavClient(rep.getLocation());
if (webdav == null) {
webdav = WebDavClientFactory.createClient(new URL(rep.getLocation()));
WebDavServerCache.cacheWebDavClient(rep.getLocation(), webdav);
}
Map<String, ResourceProperties> listing = null;
try {
listing = webdav.listDirectory(node.getFullPath());
} catch (WebDavException wde) {
if (wde.getErrorCode() != IResponse.SC_UNAUTHORIZED) {
// If not an authentication failure, we don't know what to do with it
throw wde;
}
boolean retry = PlatformUtils.getInstance().authenticateForServer(
node.getGuvnorRepository().getLocation(), webdav);
if (retry) {
listing = webdav.listDirectory(node.getFullPath());
}
}
if (listing != null) {
for (String s: listing.keySet()) {
ResourceProperties resProps = listing.get(s);
TreeObject o = null;
if (resProps.isDirectory()) {
Type childType;
switch (getNodeType()) {
case REPOSITORY:
if (s.startsWith("snapshot")) {
childType = Type.SNAPSHOTS;
} else if (s.startsWith("packages")) {
childType = Type.PACKAGES;
} else if (s.startsWith("globalarea")) {
childType = Type.GLOBALS;
} else {
childType = Type.PACKAGE;
}
break;
case SNAPSHOTS:
childType = Type.SNAPSHOT_PACKAGE;
break;
case SNAPSHOT_PACKAGE:
childType = Type.SNAPSHOT;
break;
default:
childType = Type.PACKAGE;
}
o = new TreeParent(s, childType);
} else {
o = new TreeObject(s, Type.RESOURCE);
}
o.setGuvnorRepository(rep);
o.setResourceProps(resProps);
node.addChild(o);
collector.add(o, monitor);
}
}
monitor.worked(1);
} catch (WebDavException e) {
if (e.getErrorCode() == IResponse.SC_UNAUTHORIZED) {
PlatformUtils.reportAuthenticationFailure();
} else {
if (e.getErrorCode() == IResponse.SC_NOT_IMPLEMENTED) {
Activator.getDefault().displayMessage(IStatus.ERROR,
Messages.getString("rep.connect.fail")); //$NON-NLS-1$
} else {
Activator.getDefault().displayError(IStatus.ERROR, e.getMessage(), e, true);
}
}
} catch (ConnectException ce) {
Activator.getDefault().
displayMessage(IStatus.ERROR,
Messages.getString("rep.connect.fail")); //$NON-NLS-1$
} catch (Exception e) {
Activator.getDefault().displayError(IStatus.ERROR, e.getMessage(), e, true);
}
}
/*
* (non-Javadoc)
* @see org.eclipse.ui.progress.IDeferredWorkbenchAdapter#getRule(java.lang.Object)
*/
public ISchedulingRule getRule(Object object) {
return null;
}
/*
* (non-Javadoc)
* @see org.eclipse.ui.progress.IDeferredWorkbenchAdapter#isContainer()
*/
public boolean isContainer() {
return true;
}
/*
* (non-Javadoc)
* @see org.eclipse.ui.model.IWorkbenchAdapter#getChildren(java.lang.Object)
*/
public Object[] getChildren(Object o) {
return children.toArray();
}
/*
* (non-Javadoc)
* @see org.eclipse.ui.model.IWorkbenchAdapter#getImageDescriptor(java.lang.Object)
*/
public ImageDescriptor getImageDescriptor(Object object) {
return null;
}
/*
* (non-Javadoc)
* @see org.eclipse.ui.model.IWorkbenchAdapter#getLabel(java.lang.Object)
*/
public String getLabel(Object o) {
return o.toString();
}
/*
* (non-Javadoc)
* @see org.eclipse.ui.model.IWorkbenchAdapter#getParent(java.lang.Object)
*/
public Object getParent(Object o) {
if (o instanceof TreeObject) {
return ((TreeObject)o).getParent();
} else {
return null;
}
}
}