/*
* Copyright 2012-2015 Aerospike, Inc.
*
* Portions may be licensed to Aerospike, Inc. under one or more contributor
* license agreements.
*
* 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 com.aerospike.core;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceChangeEvent;
import org.eclipse.core.resources.IResourceChangeListener;
import org.eclipse.core.resources.IResourceDelta;
import org.eclipse.core.resources.IResourceDeltaVisitor;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.QualifiedName;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.swt.graphics.Image;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.console.ConsolePlugin;
import org.eclipse.ui.console.IConsole;
import org.eclipse.ui.console.IConsoleManager;
import org.eclipse.ui.console.MessageConsole;
import org.eclipse.ui.plugin.AbstractUIPlugin;
import org.eclipse.ui.statushandlers.StatusManager;
import org.osgi.framework.BundleContext;
import com.aerospike.client.AerospikeClient;
import com.aerospike.client.AerospikeException;
import com.aerospike.client.Host;
import com.aerospike.client.policy.ClientPolicy;
import com.aerospike.client.policy.InfoPolicy;
import com.aerospike.core.model.AsCluster;
import com.aerospike.core.model.ClusterRefreshJob;
import com.aerospike.core.nature.AerospikeNature;
import com.aerospike.core.preferences.PreferenceConstants;
/**
* The activator class controls the plug-in life cycle
*/
public class CoreActivator extends AbstractUIPlugin implements IResourceChangeListener{
// The plug-in ID
public static final String PLUGIN_ID = "aerospike-core-plugin"; //$NON-NLS-1$
public static final String AS_CONSOLE = "AerospikeConsole"; //$NON-NLS-1$
public static final QualifiedName SEED_NODE_PROPERTY = new QualifiedName("Aerospike", "SeedNode");
public static final QualifiedName PORT_PROPERTY = new QualifiedName("Aerospike", "Port");
public static final QualifiedName CLUSTER_PROPERTY = new QualifiedName("Aerospike", "AerospikeCluster");
public static final QualifiedName CLIENT_PROPERTY = new QualifiedName("Aerospike", "AerospikeClient");
public static final QualifiedName UDF_DIRECTORY = new QualifiedName("Aerospike", "UDFDirectory");
public static final QualifiedName AQL_GENERATION_DIRECTORY = new QualifiedName("Aerospike", "AQLGenerationDirectory");
public static final QualifiedName UDF_REGISTERED = new QualifiedName("Aerospike", "UDFregistered");
public static final QualifiedName CLUSTER_CONNECTION_TIMEOUT_PROPERTY = new QualifiedName("Aerospike", "ClusterConnectionTimeout");
private static final QualifiedName CLIENT_POLICY = new QualifiedName("Aerospike", "ClientPolicy");
private static final QualifiedName INFO_POLICY = new QualifiedName("Aerospike", "InfoPolicy");
public static final QualifiedName EDITED_FROM_NODE = new QualifiedName("Aerospike", "EditedFromNode");
public static final QualifiedName CLUSTER = new QualifiedName("Aerospike", "AsCluster");
public static final QualifiedName AUTO_REFRESH = new QualifiedName("Aerospike", "AutoRefreshCluster");
public static final QualifiedName REFRESH_PERIOD = new QualifiedName("Aerospike", "RefreshPeriod");
public static final QualifiedName USER_PROPERTY = new QualifiedName("Aerospike", "User");
public static final QualifiedName PASSWORD_PROPERTY = new QualifiedName("Aerospike", "Password");
// The shared instance
private static CoreActivator plugin;
//
/**
* The constructor
*/
public CoreActivator() {
}
/*
* (non-Javadoc)
* @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
*/
public void start(BundleContext context) throws Exception {
super.start(context);
plugin = this;
}
/*
* (non-Javadoc)
* @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
*/
public void stop(BundleContext context) throws Exception {
plugin = null;
super.stop(context);
}
/**
* Returns the shared instance
*
* @return the shared instance
*/
public static CoreActivator getDefault() {
return plugin;
}
/**
* Returns an image descriptor for the image file at the given
* plug-in relative path
*
* @param path the path
* @return the image descriptor
*/
public static ImageDescriptor getImageDescriptor(String path) {
return getImageDescriptor(PLUGIN_ID, path);
}
public static ImageDescriptor getImageDescriptor(String pluginID, String path) {
return imageDescriptorFromPlugin(pluginID, path);
}
/**
* Returns an Image for the image file at the given
* plug-in relative path
* @param iconString
* @return
*/
public static Image getImage(String iconString) {
ImageDescriptor img = getImageDescriptor(iconString);
if (img == null)
return null;
return img.createImage();
}
/**
*
* shows an error
* @param e
* @param message
*/
public static void showError(Throwable e, String message){
IStatus status = new Status(IStatus.ERROR, PLUGIN_ID, e.getMessage(), e);
StatusManager.getManager().handle(status, StatusManager.LOG | StatusManager.SHOW);
}
public static void showError(String message){
IStatus status = new Status(IStatus.ERROR, PLUGIN_ID, message, null);
StatusManager.getManager().handle(status, StatusManager.LOG | StatusManager.SHOW);
}
public static void log(int level, String message){
plugin.getLog().log(new Status(level, PLUGIN_ID, message, null));
}
public static void log(int level, String message, Throwable e){
plugin.getLog().log(new Status(level, PLUGIN_ID, message, e));
}
public static MessageConsole findConsole(String name) {
MessageConsole targetConsole = null;
ConsolePlugin plugin = ConsolePlugin.getDefault();
if (plugin != null){
IConsoleManager conMan = plugin.getConsoleManager();
IConsole[] existing = conMan.getConsoles();
for (int i = 0; i < existing.length; i++)
if (name.equals(existing[i].getName()))
return (MessageConsole) existing[i];
//no console found, so create a new one
targetConsole = new MessageConsole(name, null);
conMan.addConsoles(new IConsole[]{targetConsole});
}
return targetConsole;
}
public static MessageConsole findAerospikeConsole() {
return findConsole(AS_CONSOLE);
}
public static void clearPolicies(IProject project){
try {
project.setSessionProperty(CoreActivator.CLIENT_POLICY, null);
project.setSessionProperty(CoreActivator.INFO_POLICY, null);
} catch (CoreException e) {
showError(e, "Cannot clear policies");
}
}
public static void clearClient(IProject project){
AerospikeClient client;
try {
client = (AerospikeClient) project.getSessionProperty(CoreActivator.CLIENT_PROPERTY);
if (client != null){
client.close();
client = null;
}
project.setSessionProperty(CoreActivator.CLIENT_PROPERTY, null);
clearPolicies(project);
} catch (CoreException e) {
showError(e, "Cannot clear Aerospike client");
}
}
public static AerospikeClient getClient(IProject project){
AerospikeClient client = null;
try {
client = (AerospikeClient) project.getSessionProperty(CoreActivator.CLIENT_PROPERTY);
/*
* remove client if not connected
*/
if (client != null && !client.isConnected()){
client = null;
}
/*
* if there is no client, make one
*/
if (client == null){
String seedNode = getSeedHost(project);
int port = getPort(project);
ClientPolicy cp = getClientPolicy(project);
if (seedNode.contains(",")){
String names[] = seedNode.split(",");
List<Host> hosts = new ArrayList<Host>();
for (String name : names){
Host host = new Host(name, port);
hosts.add(host);
}
client = new AerospikeClient(cp, hosts.toArray(new Host[hosts.size()]));
} else {
client = new AerospikeClient(cp, seedNode, port);
}
project.setSessionProperty(CoreActivator.CLIENT_PROPERTY, client);
}
} catch (CoreException e) {
CoreActivator.clearClient(project);
showError(e, "Cannot get Aerospike client");
} catch (NumberFormatException e) {
CoreActivator.clearClient(project);
showError(e, "Cannot get Aerospike client");
} catch (AerospikeException e) {
CoreActivator.clearClient(project);
//showError(e, "Cannot get Aerospike client");
}
return client;
}
public static AsCluster getCluster(IProject project) {
try {
return (AsCluster) project.getSessionProperty(CoreActivator.CLUSTER);
} catch (CoreException e) {
showError(e, "Cannot get Cluster from session property");
}
return null;
}
public static ClientPolicy getClientPolicy(IProject project){
ClientPolicy policy = null;
try {
policy = (ClientPolicy) project.getSessionProperty(CoreActivator.CLIENT_POLICY);
if (policy == null){
policy = new ClientPolicy();
policy.timeout = getConnectionTimeout(project);
policy.failIfNotConnected = true;
policy.user = getUser(project);
policy.password = getPassword(project);
project.setSessionProperty(CoreActivator.CLIENT_POLICY, policy);
}
} catch (CoreException e) {
showError(e, "Cannot get Aerospike client Policy");
}
return policy;
}
public static InfoPolicy getInfoPolicy(IProject project){
InfoPolicy policy = null;
try {
policy = (InfoPolicy) project.getSessionProperty(CoreActivator.INFO_POLICY);
if (policy == null){
policy = new InfoPolicy();
policy.timeout = getConnectionTimeout(project);
project.setSessionProperty(CoreActivator.INFO_POLICY, policy);
}
} catch (CoreException e) {
showError(e, "Cannot get Info Policy");
}
return policy;
}
public static int getPort(IProject project){
String portString;
int port = 3000;
try {
portString = project.getPersistentProperty(CoreActivator.PORT_PROPERTY);
if (portString == null || portString.isEmpty()){
IPreferenceStore store = getDefault().getPreferenceStore();
port = store.getDefaultInt(PreferenceConstants.PORT);
project.setPersistentProperty(CoreActivator.PORT_PROPERTY, Integer.toString(port));
} else {
port = Integer.parseInt(portString);
}
} catch (CoreException e) {
CoreActivator.log(Status.ERROR, "Error getting PORT_PROPERTY", e);
} catch (NumberFormatException e){
//use default
}
return port;
}
public static int getConnectionTimeout(IProject project) {
String timeoutString;
int timeout = 20;
try {
timeoutString = project.getPersistentProperty(CoreActivator.CLUSTER_CONNECTION_TIMEOUT_PROPERTY);
if (timeoutString == null || timeoutString.isEmpty()){
IPreferenceStore store = getDefault().getPreferenceStore();
timeout = store.getDefaultInt(PreferenceConstants.CLUSTER_CONNECTION_TIMEOUT);
project.setPersistentProperty(CoreActivator.PORT_PROPERTY, Integer.toString(timeout));
} else {
timeout = Integer.parseInt(timeoutString);
}
} catch (CoreException e) {
CoreActivator.log(Status.ERROR, "Error getting CLUSTER_CONNECTION_TIMEOUT_PROPERTY", e);
} catch (NumberFormatException e){
//use default
}
return timeout;
}
public static String getSeedHost(IProject project){
String seedHost = "127.0.0.1";
try {
seedHost = project.getPersistentProperty(CoreActivator.SEED_NODE_PROPERTY);
if (seedHost == null || seedHost.isEmpty()){
IPreferenceStore store = getDefault().getPreferenceStore();
seedHost = store.getDefaultString(PreferenceConstants.SEED_NODE);
project.setPersistentProperty(CoreActivator.SEED_NODE_PROPERTY, seedHost);
}
} catch (CoreException e) {
CoreActivator.log(Status.ERROR, "Error getting SEED_NODE_PROPERTY", e);
}
return seedHost;
}
public static Map<String, String> parseMap(final String input, String seperator) {
final Map<String, String> map = new HashMap<String, String>();
for (String pair : input.split(seperator)) {
String[] kv = pair.split("=");
map.put(kv[0], kv[1]);
}
return map;
}
public static IFolder getUdfFolder(IProject project){
String udfFolderString;
try {
udfFolderString = project.getPersistentProperty(CoreActivator.UDF_DIRECTORY);
IResource udfFolder = project.findMember(udfFolderString);
return (IFolder) udfFolder;
} catch (CoreException e) {
showError(e, "Cannot locate UDF folder");
}
return null;
}
public static String getUser(IProject project) {
String user = null;
try {
user = project.getPersistentProperty(CoreActivator.USER_PROPERTY);
} catch (CoreException e) {
CoreActivator.log(Status.ERROR, "Error getting USER_PROPERTY", e);
}
return user;
}
public static String getPassword(IProject project) {
String password = null;
try {
password = project.getPersistentProperty(CoreActivator.PASSWORD_PROPERTY);
} catch (CoreException e) {
CoreActivator.log(Status.ERROR, "Error getting PASSWORD_PROPERTY", e);
}
return password;
}
@Override
public void resourceChanged(final IResourceChangeEvent event) {
if (event == null || event.getDelta() == null) {
return;
}
if (event.getResource() instanceof IProject){
IProject project = (IProject) event.getResource();
try {
event.getDelta().accept(new IResourceDeltaVisitor() {
public boolean visit(final IResourceDelta delta) throws CoreException {
IResource resource = delta.getResource();
if (((resource.getType() & IResource.PROJECT) != 0)
&& resource.getProject().isOpen()
&& delta.getKind() == IResourceDelta.CHANGED
&& ((delta.getFlags() & IResourceDelta.OPEN) != 0)) {
IProject project = (IProject)resource;
if (project.hasNature(AerospikeNature.NATURE_ID)){
ClusterRefreshJob refreshJob = new ClusterRefreshJob(project);
refreshJob.schedule(5);
}
}
return true;
}
});
} catch (CoreException e) {
showError(e, "Error registering project listener");
}
}
}
}