blob: 4dc965febf96d2c0bdfc92ca29edceedbce03416 [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.
*/
/*
* Contributor(s): theanuradha@netbeans.org
*/
package org.netbeans.modules.maven.repository;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.net.URISyntaxException;
import java.util.Date;
import javax.swing.AbstractAction;
import javax.swing.Action;
import org.netbeans.api.annotations.common.StaticResource;
import org.netbeans.modules.maven.indexer.api.RepositoryIndexer;
import org.netbeans.modules.maven.indexer.api.RepositoryInfo;
import org.netbeans.modules.maven.indexer.api.RepositoryPreferences;
import static org.netbeans.modules.maven.repository.Bundle.*;
import org.netbeans.modules.maven.repository.register.RepositoryRegisterUI;
import org.openide.DialogDescriptor;
import org.openide.DialogDisplayer;
import org.openide.NotifyDescriptor;
import org.openide.actions.DeleteAction;
import org.openide.actions.PropertiesAction;
import org.openide.nodes.AbstractNode;
import org.openide.nodes.Children;
import org.openide.nodes.Node;
import org.openide.nodes.PropertySupport;
import org.openide.nodes.Sheet;
import org.openide.util.ImageUtilities;
import org.openide.util.NbBundle.Messages;
import org.openide.util.RequestProcessor;
/**
*
* @author Anuradha G
*/
public class RepositoryNode extends AbstractNode {
private static final @StaticResource String LOCAL_REPO = "org/netbeans/modules/maven/repository/localrepo.png";
private static final @StaticResource String REMOTE_REPO = "org/netbeans/modules/maven/repository/remoterepo.png";
private RepositoryInfo info;
private final GroupListChildren children;
private static final RequestProcessor RPrefreshindex = new RequestProcessor(RefreshIndexAction.class.getName(),1);
public RepositoryNode(RepositoryInfo info) {
this(info, new GroupListChildren(info));
}
private RepositoryNode(RepositoryInfo info, GroupListChildren children) {
super(Children.create(children, true));
this.info = info;
this.children = children;
setName(info.getId());
setDisplayName(info.getName());
}
@Override
public Image getIcon(int arg0) {
if (info.isRemoteDownloadable()) {
return ImageUtilities.loadImage(REMOTE_REPO, true);
}
return ImageUtilities.loadImage(LOCAL_REPO, true);
}
@Override
public Image getOpenedIcon(int arg0) {
return getIcon(arg0);
}
@Override
public String getHtmlDisplayName() {
StringBuilder base = new StringBuilder().append(getDisplayName());
if (info.isMirror()) {
base.append(" <font color='!controlShadow'>[");
for (RepositoryInfo nf : info.getMirroredRepositories()) {
base.append(nf.getName()).append(",");
}
base.setLength(base.length() - 1);
base.append("]</font>");
}
return base.toString();
}
@Messages({
"#{0} - repository id",
"LBL_REPO_ID=Repository ID:<b> {0} </b><p>",
"#{0} - repository name",
"LBL_REPO_Name=Repository Name: <b> {0} </b><p>",
"#{0} - repository url",
"LBL_REPO_Url=Repository URL:<b> {0} </b><p>",
"LBL_ORIGIN=Repository Origin:<b> {0} </b><p>",
"LBL_ORIGIN_PERSISTENT=User defined",
"LBL_ORIGIN_TRANSIENT=Added by the IDE",
"LBL_Mirrors=Mirrors repositories: <b> {0} </b><p>"
})
@Override public String getShortDescription() {
StringBuilder buffer = new StringBuilder();
buffer.append("<html>");//NOI18N
buffer.append(LBL_REPO_ID(info.getId()));
buffer.append(LBL_REPO_Name(info.getName()));
//show repo url if available
if (info.getRepositoryUrl() != null) {
buffer.append(LBL_REPO_Url(info.getRepositoryUrl()));
}
buffer.append(LBL_ORIGIN(
RepositoryPreferences.getInstance().isPersistent(info.getId()) ?
LBL_ORIGIN_PERSISTENT() :
LBL_ORIGIN_TRANSIENT()));
if (info.isMirror()) {
StringBuilder s = new StringBuilder();
for (RepositoryInfo nf : info.getMirroredRepositories()) {
s.append(nf.getName()).append(",");
}
s.setLength(s.length() - 1);
buffer.append(LBL_Mirrors(s.toString()));
}
buffer.append("</html>");//NOI18N
return buffer.toString();
}
@Override
public void destroy() throws IOException {
RepositoryPreferences.getInstance().removeRepositoryInfo(info);
super.destroy();
}
@Override
public boolean canDestroy() {
return RepositoryPreferences.getInstance().isPersistent(info.getId());
}
@Override
public Action[] getActions(boolean arg0) {
return new Action[]{
// XXX Find
new RefreshIndexAction(), // XXX allow multiselections
new EditAction(),
DeleteAction.get(DeleteAction.class),
null,
PropertiesAction.get(PropertiesAction.class)
};
}
@Messages({
"LBL_Id=ID",
"LBL_Name=Name",
"LBL_Local=Local",
"LBL_Local_repository_path=Local repository path",
"LBL_Remote_Index=Remote Index Downloadable",
"LBL_Remote_URL=Remote Repository URL",
"LBL_Remote_Index_URL=Remote Index URL",
"LBL_last_indexed=Last Indexed"
})
@Override protected Sheet createSheet() {
Sheet sheet = Sheet.createDefault();
Sheet.Set basicProps = sheet.get(Sheet.PROPERTIES);
try {
Node.Property<?> id = new PropertySupport.Reflection<String>(info, String.class, "getId", null); //NOI18N
id.setDisplayName(LBL_Id());
id.setShortDescription(""); //NOI18N
Node.Property<?> name = new PropertySupport.Reflection<String>(info, String.class, "getName", null); //NOI18N
name.setDisplayName(LBL_Name());
name.setShortDescription(""); //NOI18N
Node.Property<?> local = new PropertySupport.Reflection<Boolean>(info, Boolean.TYPE, "isLocal", null); //NOI18N
local.setName("local"); //NOI18N
local.setDisplayName(LBL_Local());
local.setShortDescription("");
Node.Property<?> localRepoLocation = new PropertySupport.Reflection<String>(info, String.class, "getRepositoryPath", null); //NOI18N
localRepoLocation.setDisplayName(LBL_Local_repository_path());
Node.Property<?> remoteDownloadable = new PropertySupport.Reflection<Boolean>(info, Boolean.TYPE, "isRemoteDownloadable", null); //NOI18N
remoteDownloadable.setDisplayName(LBL_Remote_Index());
Node.Property<?> repoURL = new PropertySupport.Reflection<String>(info, String.class, "getRepositoryUrl", null); //NOI18N
repoURL.setDisplayName(LBL_Remote_URL());
Node.Property<?> indexURL = new PropertySupport.Reflection<String>(info, String.class, "getIndexUpdateUrl", null); //NOI18N
indexURL.setDisplayName(LBL_Remote_Index_URL());
Node.Property<?> lastIndexed = new PropertySupport.ReadOnly<Date>("lastIndexed", Date.class, LBL_last_indexed(), null) {
@Override public Date getValue() throws IllegalAccessException, InvocationTargetException {
return RepositoryPreferences.getLastIndexUpdate(info.getId());
}
};
basicProps.put(new Node.Property<?>[] {
id, name, local, localRepoLocation, remoteDownloadable, repoURL, indexURL, lastIndexed
});
} catch (NoSuchMethodException exc) {
exc.printStackTrace();
}
return sheet;
}
public class RefreshIndexAction extends AbstractAction {
@Messages("LBL_REPO_Update_Index=Update Index")
public RefreshIndexAction() {
putValue(NAME, LBL_REPO_Update_Index());
}
public @Override void actionPerformed(ActionEvent e) {
setEnabled(false); // XXX ineffective if in context menu
RPrefreshindex.post(new Runnable() {
public @Override void run() {
RepositoryIndexer.indexRepo(info);
}
});
}
}
private class EditAction extends AbstractAction {
@Messages("ACT_Edit=Edit...")
EditAction() {
putValue(NAME, ACT_Edit());
}
@Override public boolean isEnabled() {
return RepositoryPreferences.getInstance().isPersistent(info.getId()) && info.isRemoteDownloadable();
}
@Messages("LBL_Edit_Repo=Edit Repository")
@Override public void actionPerformed(ActionEvent e) {
final RepositoryRegisterUI rrui = new RepositoryRegisterUI(RepositoryNode.this.info);
rrui.getAccessibleContext().setAccessibleDescription(LBL_Edit_Repo());
DialogDescriptor dd = new DialogDescriptor(rrui, LBL_Edit_Repo());
dd.setClosingOptions(new Object[]{
rrui.getButton(),
DialogDescriptor.CANCEL_OPTION
});
dd.setOptions(new Object[]{
rrui.getButton(),
DialogDescriptor.CANCEL_OPTION
});
Object ret = DialogDisplayer.getDefault().notify(dd);
if (rrui.getButton() == ret) {
RepositoryInfo info;
try {
info = rrui.getRepositoryInfo();
} catch (URISyntaxException x) {
DialogDisplayer.getDefault().notify(new NotifyDescriptor.Message(x.getLocalizedMessage(), NotifyDescriptor.ERROR_MESSAGE));
return;
}
RepositoryPreferences.getInstance().addOrModifyRepositoryInfo(info);
RepositoryNode.this.info = info;
setDisplayName(info.getName());
fireIconChange();
fireOpenedIconChange();
children.setInfo(info);
}
}
}
}