blob: fa42dff6ce0c8dce438bc1777b615d8d0d2f9071 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011 BSI Business Systems Integration AG.
* 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:
* Daniel Wiehl (BSI Business Systems Integration AG) - initial API and implementation
******************************************************************************/
package org.eclipse.scout.sdk.ws.jaxws.swt.view.pages;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.UUID;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceChangeEvent;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.ui.JavaUI;
import org.eclipse.scout.commons.StringUtility;
import org.eclipse.scout.sdk.ui.action.AbstractScoutHandler;
import org.eclipse.scout.sdk.ui.action.IScoutHandler;
import org.eclipse.scout.sdk.ui.view.outline.pages.AbstractPage;
import org.eclipse.scout.sdk.ui.view.outline.pages.IPage;
import org.eclipse.scout.sdk.util.ScoutSeverityManager;
import org.eclipse.scout.sdk.util.type.TypeUtility;
import org.eclipse.scout.sdk.workspace.IScoutBundle;
import org.eclipse.scout.sdk.ws.jaxws.JaxWsSdk;
import org.eclipse.scout.sdk.ws.jaxws.marker.IMarkerRebuildListener;
import org.eclipse.scout.sdk.ws.jaxws.marker.MarkerRebuildUtility;
import org.eclipse.scout.sdk.ws.jaxws.marker.MarkerUtility;
import org.eclipse.scout.sdk.ws.jaxws.resource.IResourceListener;
import org.eclipse.scout.sdk.ws.jaxws.resource.ResourceFactory;
import org.eclipse.scout.sdk.ws.jaxws.resource.XmlResource;
import org.eclipse.scout.sdk.ws.jaxws.swt.action.WsProviderCodeFirstDeleteAction;
import org.eclipse.scout.sdk.ws.jaxws.swt.model.SunJaxWsBean;
import org.eclipse.scout.sdk.ws.jaxws.util.JaxWsSdkUtility;
import org.eclipse.scout.sdk.ws.jaxws.util.listener.AbstractTypeChangedListener;
import org.eclipse.scout.sdk.ws.jaxws.util.listener.IPageLoadedListener;
import org.eclipse.scout.sdk.ws.jaxws.util.listener.IPageReloadNotification;
public class WebServiceProviderCodeFirstNodePage extends AbstractPage implements IMarkerRebuildListener, IPageReloadNotification {
public static final int DATA_JDT_TYPE = 1 << 0;
public static final int DATA_SUN_JAXWS_ENTRY = 1 << 1;
private boolean m_pageUnloaded = false;
private String m_markerGroupUUID;
private IScoutBundle m_bundle; // necessary to be hold as in method unloadPage, a reference to the bundle is required
private String m_alias;
private Object m_pageLoadedListenerLock;
private IType m_portType;
private SunJaxWsBean m_sunJaxWsBean;
private IResourceListener m_sunJaxWsResourceListener;
private P_PortTypeChangeListener m_portTypeChangedListener;
private Set<IPageLoadedListener> m_pageLoadedListeners;
public WebServiceProviderCodeFirstNodePage(IPage parent, SunJaxWsBean sunJaxWsBean) {
setParent(parent);
setName(StringUtility.nvl(sunJaxWsBean.getAlias(), "?"));
setImageDescriptor(JaxWsSdk.getImageDescriptor(JaxWsSdk.WebServiceProviderCodeFirst));
m_sunJaxWsBean = sunJaxWsBean;
m_alias = sunJaxWsBean.getAlias();
m_bundle = getScoutResource();
m_markerGroupUUID = UUID.randomUUID().toString();
m_sunJaxWsResourceListener = new P_SunJaxWsResourceListener();
m_pageLoadedListeners = new HashSet<IPageLoadedListener>();
m_pageLoadedListenerLock = new Object();
// register for events being of interest
getSunJaxWsResource().addResourceListener(sunJaxWsBean.getAlias(), m_sunJaxWsResourceListener);
m_portTypeChangedListener = new P_PortTypeChangeListener();
ResourcesPlugin.getWorkspace().addResourceChangeListener(m_portTypeChangedListener);
// register page to receive page reload notification
JaxWsSdk.getDefault().registerPage(WebServiceProviderNodePage.class, this);
reloadPage(DATA_JDT_TYPE);
}
@Override
public String getPageId() {
return IJaxWsPageConstants.PROVIDER_CODE_FIRST_NODE_PAGE;
}
@Override
public boolean isFolder() {
return false;
}
@Override
public void prepareMenuAction(IScoutHandler menu) {
if (menu instanceof WsProviderCodeFirstDeleteAction) {
((WsProviderCodeFirstDeleteAction) menu).init(m_bundle, getSunJaxWsBean());
}
}
@SuppressWarnings("unchecked")
@Override
public Class<? extends IScoutHandler>[] getSupportedMenuActions() {
List<Class<? extends AbstractScoutHandler>> actions = new ArrayList<Class<? extends AbstractScoutHandler>>();
actions.add(WsProviderCodeFirstDeleteAction.class);
return actions.toArray(new Class[actions.size()]);
}
@Override
public void reloadPage(int dataMask) {
if (isPageUnloaded()) {
return;
}
if ((dataMask & DATA_SUN_JAXWS_ENTRY) > 0) {
SunJaxWsBean sunJaxWsBean = getSunJaxWsBean();
if (sunJaxWsBean == null) {
m_sunJaxWsBean = SunJaxWsBean.load(m_bundle, m_alias);
}
else {
if (!sunJaxWsBean.reload(m_bundle)) {
m_sunJaxWsBean = null;
}
}
}
if ((dataMask & DATA_JDT_TYPE) > 0) {
m_portType = null;
if (m_sunJaxWsBean != null && m_sunJaxWsBean.getImplementation() != null && TypeUtility.existsType(m_sunJaxWsBean.getImplementation())) {
m_portType = TypeUtility.getType(m_sunJaxWsBean.getImplementation());
}
m_portTypeChangedListener.setType(m_portType);
}
// notify listeners
notifyPageLoadedListeners();
JaxWsSdk.getDefault().getMarkerQueueManager().queueRequest(this);
}
@Override
public void refresh(boolean clearCache) {
if (clearCache) {
super.refresh(clearCache);
}
else {
JaxWsSdk.getDefault().getMarkerQueueManager().queueRequest(this);
}
}
@Override
public void unloadPage() {
m_pageUnloaded = true;
MarkerUtility.clearMarkers(m_bundle, m_markerGroupUUID);
getSunJaxWsResource().removeResourceListener(m_sunJaxWsResourceListener);
ResourcesPlugin.getWorkspace().removeResourceChangeListener(m_portTypeChangedListener);
// unregister page to not receive page reload notification anymore
JaxWsSdk.getDefault().unregisterPage(WebServiceProviderNodePage.class, this);
super.unloadPage();
}
@Override
public IScoutBundle getScoutResource() {
return (IScoutBundle) super.getScoutResource();
}
@Override
public int getQuality() {
int quality = MarkerUtility.getQuality(this, m_bundle, m_markerGroupUUID);
if (quality == IMarker.SEVERITY_ERROR) {
return quality;
}
IType portType = getPortType();
if (portType != null) {
quality = Math.max(quality, ScoutSeverityManager.getInstance().getSeverityOf(portType));
}
return quality;
}
@Override
public boolean handleDoubleClickedDelegate() {
if (getPortType() != null) {
try {
JavaUI.openInEditor(getPortType());
}
catch (Exception e) {
JaxWsSdk.logWarning("could not open type in editor", e);
}
return true;
}
return false;
}
@Override
protected void loadChildrenImpl() {
// handler page
new WebServiceProviderHandlerNodePage(this, getSunJaxWsBean());
}
@Override
public void rebuildMarkers() {
synchronized (m_markerGroupUUID) {
try {
MarkerUtility.clearMarkers(m_bundle, m_markerGroupUUID);
if (isPageUnloaded()) {
return;
}
MarkerRebuildUtility.rebuildCodeFirstPortTypeMarkers(m_bundle, getPortType(), getSunJaxWsBean(), getMarkerGroupUUID());
}
catch (Exception e) {
JaxWsSdk.logWarning("failed to update markers", e);
}
finally {
Set<IResource> resources = new HashSet<IResource>();
if (JaxWsSdkUtility.exists(getSunJaxWsResource().getFile())) {
resources.add(getSunJaxWsResource().getFile());
}
if (TypeUtility.exists(getPortType())) {
resources.add(getPortType().getResource());
}
ScoutSeverityManager.getInstance().fireSeverityChanged(resources);
}
}
}
@Override
public WebServiceProviderTablePage getParent() {
return (WebServiceProviderTablePage) super.getParent();
}
@Override
public String getMarkerGroupUUID() {
return m_markerGroupUUID;
}
public IType getPortType() {
return m_portType;
}
public SunJaxWsBean getSunJaxWsBean() {
return m_sunJaxWsBean;
}
public void addPageLoadedListener(IPageLoadedListener listener) {
synchronized (m_pageLoadedListenerLock) {
m_pageLoadedListeners.add(listener);
}
}
public void removePageLoadedListener(IPageLoadedListener listener) {
synchronized (m_pageLoadedListenerLock) {
m_pageLoadedListeners.remove(listener);
}
}
private void notifyPageLoadedListeners() {
IPageLoadedListener[] listeners;
synchronized (m_pageLoadedListenerLock) {
listeners = m_pageLoadedListeners.toArray(new IPageLoadedListener[m_pageLoadedListeners.size()]);
}
for (IPageLoadedListener listener : listeners) {
try {
listener.pageLoaded();
}
catch (Exception e) {
JaxWsSdk.logError("error while notifying pageLoaded listener", e);
}
}
}
public XmlResource getSunJaxWsResource() {
return ResourceFactory.getSunJaxWsResource(m_bundle);
}
public boolean isPageUnloaded() {
return m_pageUnloaded;
}
private class P_SunJaxWsResourceListener implements IResourceListener {
@Override
public void changed(String element, int event) {
if (event == IResourceListener.EVENT_SUNJAXWS_WSDL_CHANGED || event == EVENT_SUNJAXWS_HANDLER_CHANGED || event == EVENT_SUNJAXWS_URL_PATTERN_CHANGED) {
reloadPage(DATA_SUN_JAXWS_ENTRY);
}
else {
JaxWsSdk.getDefault().getMarkerQueueManager().queueRequest(WebServiceProviderCodeFirstNodePage.this);
}
}
}
private class P_PortTypeChangeListener extends AbstractTypeChangedListener {
@Override
protected boolean shouldAnalayseForChange(IResourceChangeEvent event) {
return !isPageUnloaded();
}
@Override
protected void typeChanged() {
reloadPage(DATA_JDT_TYPE);
}
}
}