/****************************************************************************** * Copyright (c) 2009-2013, Linagora * * 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: * Linagora - initial API and implementation *******************************************************************************/ package com.ebmwebsourcing.petals.services.explorer.sources; import java.lang.reflect.InvocationTargetException; import java.util.Collection; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.jface.operation.IRunnableWithProgress; import org.eclipse.swt.widgets.Display; import org.eclipse.ui.PlatformUI; import com.ebmwebsourcing.petals.common.internal.provisional.utils.CommonUtils; import com.ebmwebsourcing.petals.common.internal.provisional.utils.JbiXmlUtils; import com.ebmwebsourcing.petals.services.PetalsServicesPlugin; import com.ebmwebsourcing.petals.services.explorer.model.EndpointBean; import com.ebmwebsourcing.petals.services.explorer.model.ServiceUnitBean; import com.sun.java.xml.ns.jbi.Jbi; import com.sun.java.xml.ns.jbi.Provides; /** * An abstract class representing a source of end-points. * @author Vincent Zurczak - EBM WebSourcing */ public abstract class EndpointSource { protected String name, id, description; private Collection<ServiceUnitBean> serviceUnits; /** * Constructor with two setters. * @param name the source name * @param id the source id */ public EndpointSource( String name, String id ) { this.name = name; this.id = id; } /** * @return the serviceUnits */ public final Collection<ServiceUnitBean> getServiceUnits() { if( this.serviceUnits == null ) { final IRunnableWithProgress rwp = new IRunnableWithProgress() { @Override public void run( IProgressMonitor monitor ) throws InvocationTargetException, InterruptedException { try { monitor.beginTask( "Getting service units for " + EndpointSource.this.name + "...", IProgressMonitor.UNKNOWN ); EndpointSource.this.serviceUnits = refreshServiceUnits( monitor ); } finally { monitor.done(); } } }; Display.getDefault().syncExec( new Runnable() { @Override public void run() { try { PlatformUI.getWorkbench().getActiveWorkbenchWindow().run( false, false, rwp ); } catch( InvocationTargetException e ) { PetalsServicesPlugin.log( e, IStatus.ERROR ); } catch( InterruptedException e ) { // nothing } } }); } return this.serviceUnits; } /** * Refreshes the list of service units. * <p> * The list will be refreshed on the next call to {@link #getServiceUnits()}. * </p> */ public final void refreshServiceUnitList() { this.serviceUnits = null; } /** * Gets the service units from this source. * <p> * This method should be called in a runnable with a progress monitor. * </p> * * @param monitor a progress monitor, already initialized (unknown count) * @return the service units from this source */ protected abstract Collection<ServiceUnitBean> refreshServiceUnits( IProgressMonitor monitor ); /** * Destroys this source. */ public abstract void dispose(); /** * @return the name */ public String getName() { return this.name; } /** * @param name the name to set */ public void setName( String name ) { this.name = name; } /** * @return the id */ public String getId() { return this.id; } /** * @param id the id to set */ public void setId( String id ) { this.id = id; } /** * @return the description */ public String getDescription() { return this.description; } /** * @param description the description to set */ public void setDescription( String description ) { this.description = description; } /* * (non-Javadoc) * @see java.lang.Object#equals(java.lang.Object) */ @Override public boolean equals( Object obj ) { return obj instanceof EndpointSource && CommonUtils.areEqual(((EndpointSource) obj).id, this.id ); } /* * (non-Javadoc) * @see java.lang.Object#hashCode() */ @Override public int hashCode() { return this.id == null ? 137 : 199 * this.id.charAt( 0 ) * this.id.length(); } /** * Gets the end-points from a jbi.xml for service unit. * @param jbi the JBI model * @param suBean the SU bean to complete */ protected void getEndpointBeans( Jbi jbi, ServiceUnitBean suBean ) { for( Provides provides : jbi.getServices().getProvides()) { EndpointBean bean = new EndpointBean(); // Simple fields bean.setEndpointName( provides.getEndpointName()); bean.setInterfaceName( provides.getInterfaceName()); bean.setServiceName( provides.getServiceName()); // WSDL String wsdlValue = JbiXmlUtils.getWsdlValue( provides ); bean.setWsdlLocation( wsdlValue ); bean.setServiceUnit( suBean ); suBean.addEndpoint( bean ); } } /** * Gets the directory path which stores the WSDLs for the given service unit. * <p> * Be careful, this is applied to service-units and not to end-points.<br /> * When the WSDL container location is computed, it must be done for all the * end-points of the service-unit. * </p> * * @param suBean * @return the directory path where is located the WSDL of this jbi.xml. * <p> * This method cannot return null, but can return "" in case of problem. * </p> */ public abstract String getWsdlContainerLocation( ServiceUnitBean suBean ); }