/*******************************************************************************
* Copyright (c) 2015 Zend Technologies and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Zend Technologies - initial API and implementation
*******************************************************************************/
package org.eclipse.php.internal.server.ui.types;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.eclipse.core.runtime.FileLocator;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.resource.ImageRegistry;
import org.eclipse.php.internal.server.ui.Activator;
import org.eclipse.php.internal.ui.wizards.WizardFragmentsFactoryRegistry;
import org.eclipse.php.server.ui.types.IServerTypeDescriptor;
import org.eclipse.php.ui.wizards.ICompositeFragmentFactory;
import org.eclipse.swt.graphics.Image;
import org.osgi.framework.Bundle;
/**
* Common implementation for server type descriptor.
*/
@SuppressWarnings("restriction")
public class ServerTypeDescriptor implements IServerTypeDescriptor {
private class Fragment {
private String id;
Fragment(String id) {
super();
this.id = id;
}
String getId() {
return id;
}
}
protected static final String FRAGMENT_GROUP_ID = "org.eclipse.php.server.ui.serverWizardAndComposite"; //$NON-NLS-1$
private IConfigurationElement element;
private String id;
private String serverTypeId;
private List<Fragment> wizardFragments;
private List<Fragment> editorFragments;
public ServerTypeDescriptor(IConfigurationElement element) {
construct(element);
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.php.internal.server.ui.types.IServerTypeDescriptor#getId()
*/
@Override
public String getId() {
return id;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.php.internal.server.ui.types.IServerTypeDescriptor#
* getServerTypeId()
*/
@Override
public String getServerTypeId() {
return serverTypeId;
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.php.internal.server.ui.types.IServerTypeDescriptor#getImage
* (org
* .eclipse.php.internal.server.ui.types.IServerTypeDescriptor.ImageType)
*/
@Override
public Image getImage(ImageType type) {
return getImage(type.getAttribute());
}
/*
* (non-Javadoc)
*
* @see org.eclipse.php.internal.server.ui.types.IServerTypeDescriptor#
* getImageDescriptor
* (org.eclipse.php.internal.server.ui.types.IServerTypeDescriptor
* .ImageType)
*/
@Override
public ImageDescriptor getImageDescriptor(ImageType type) {
return getImageDescriptor(type.getAttribute());
}
/*
* (non-Javadoc)
*
* @see org.eclipse.php.internal.server.ui.types.IServerTypeDescriptor#
* getWizardFragmentFactories()
*/
@Override
public ICompositeFragmentFactory[] getWizardFragmentFactories() {
Map<String, ICompositeFragmentFactory> factories = WizardFragmentsFactoryRegistry
.getFragmentsFactories(FRAGMENT_GROUP_ID);
List<ICompositeFragmentFactory> result = new ArrayList<ICompositeFragmentFactory>();
for (Fragment fragment : wizardFragments) {
ICompositeFragmentFactory factory = factories.get(fragment.getId());
if (factory != null) {
result.add(factory);
}
}
return result.toArray(new ICompositeFragmentFactory[result.size()]);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.php.internal.server.ui.types.IServerTypeDescriptor#
* getEditorFragmentFactories()
*/
@Override
public ICompositeFragmentFactory[] getEditorFragmentFactories() {
Map<String, ICompositeFragmentFactory> factories = WizardFragmentsFactoryRegistry
.getFragmentsFactories(FRAGMENT_GROUP_ID);
List<ICompositeFragmentFactory> result = new ArrayList<ICompositeFragmentFactory>();
for (Fragment fragment : editorFragments) {
ICompositeFragmentFactory factory = factories.get(fragment.getId());
if (factory != null) {
result.add(factory);
}
}
return result.toArray(new ICompositeFragmentFactory[result.size()]);
}
private void construct(IConfigurationElement element) {
this.element = element;
this.id = element.getAttribute("id"); //$NON-NLS-1$
this.serverTypeId = element.getAttribute("serverTypeId"); //$NON-NLS-1$
this.wizardFragments = new ArrayList<Fragment>();
this.editorFragments = new ArrayList<Fragment>();
for (IConfigurationElement child : element.getChildren()) {
if (child.getName().equals("wizard")) { //$NON-NLS-1$
for (IConfigurationElement wizardFragment : child.getChildren()) {
wizardFragments.add(new Fragment(wizardFragment.getAttribute("id"))); //$NON-NLS-1$
}
} else if (child.getName().equals("editor")) { //$NON-NLS-1$
for (IConfigurationElement wizardFragment : child.getChildren()) {
editorFragments.add(new Fragment(wizardFragment.getAttribute("id"))); //$NON-NLS-1$
}
}
}
}
private Image getImage(String name) {
ImageRegistry regitry = Activator.getDefault().getImageRegistry();
String id = getId() + name;
Image image = regitry.get(id);
if (image == null) {
ImageDescriptor descriptor = getImageDescriptor(name);
regitry.put(id, descriptor != null ? descriptor : ImageDescriptor.getMissingImageDescriptor());
image = regitry.get(id);
}
return image;
}
private ImageDescriptor getImageDescriptor(String attribute) {
Bundle bundle = Platform.getBundle(element.getContributor().getName());
String iconPath = element.getAttribute(attribute);
if (iconPath != null) {
URL iconURL = FileLocator.find(bundle, new Path(iconPath), null);
if (iconURL != null) {
return ImageDescriptor.createFromURL(iconURL);
} else { // try to search as a URL in case it is absolute path
try {
iconURL = FileLocator.find(new URL(iconPath));
if (iconURL != null) {
return ImageDescriptor.createFromURL(iconURL);
}
} catch (MalformedURLException e) {
// return null
}
}
}
return null;
}
}