You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@juddi.apache.org by jf...@apache.org on 2009/04/10 03:18:52 UTC

svn commit: r763853 - in /webservices/juddi/branches/v3_trunk/juddi-core/src/main/java/org/apache/juddi: api/impl/UDDISubscriptionImpl.java mapping/MappingApiToModel.java validation/ValidateSubscription.java

Author: jfaath
Date: Fri Apr 10 01:18:52 2009
New Revision: 763853

URL: http://svn.apache.org/viewvc?rev=763853&view=rev
Log:
JUDDI-206, JUDDI-209: adding functionality for saving/deleting subscriptions

Modified:
    webservices/juddi/branches/v3_trunk/juddi-core/src/main/java/org/apache/juddi/api/impl/UDDISubscriptionImpl.java
    webservices/juddi/branches/v3_trunk/juddi-core/src/main/java/org/apache/juddi/mapping/MappingApiToModel.java
    webservices/juddi/branches/v3_trunk/juddi-core/src/main/java/org/apache/juddi/validation/ValidateSubscription.java

Modified: webservices/juddi/branches/v3_trunk/juddi-core/src/main/java/org/apache/juddi/api/impl/UDDISubscriptionImpl.java
URL: http://svn.apache.org/viewvc/webservices/juddi/branches/v3_trunk/juddi-core/src/main/java/org/apache/juddi/api/impl/UDDISubscriptionImpl.java?rev=763853&r1=763852&r2=763853&view=diff
==============================================================================
--- webservices/juddi/branches/v3_trunk/juddi-core/src/main/java/org/apache/juddi/api/impl/UDDISubscriptionImpl.java (original)
+++ webservices/juddi/branches/v3_trunk/juddi-core/src/main/java/org/apache/juddi/api/impl/UDDISubscriptionImpl.java Fri Apr 10 01:18:52 2009
@@ -17,24 +17,36 @@
 
 package org.apache.juddi.api.impl;
 
+import java.util.GregorianCalendar;
 import java.util.List;
 
 import javax.jws.WebService;
 import javax.persistence.EntityManager;
 import javax.persistence.EntityTransaction;
+import javax.xml.bind.JAXBException;
+import javax.xml.datatype.DatatypeConfigurationException;
+import javax.xml.datatype.DatatypeFactory;
 import javax.xml.ws.Holder;
 
 import org.uddi.sub_v3.DeleteSubscription;
 import org.uddi.sub_v3.GetSubscriptionResults;
-import org.uddi.sub_v3.SaveSubscription;
 import org.uddi.sub_v3.Subscription;
+import org.uddi.sub_v3.SubscriptionFilter;
 import org.uddi.sub_v3.SubscriptionResultsList;
 import org.uddi.v3_service.DispositionReportFaultMessage;
 import org.uddi.v3_service.UDDISubscriptionPortType;
+import org.apache.commons.configuration.ConfigurationException;
+import org.apache.juddi.config.AppConfig;
+import org.apache.juddi.config.Property;
+import org.apache.juddi.error.ErrorMessage;
+import org.apache.juddi.error.FatalErrorException;
 import org.apache.juddi.mapping.MappingApiToModel;
+import org.apache.juddi.model.SubscriptionMatch;
 import org.apache.juddi.model.UddiEntityPublisher;
 import org.apache.juddi.query.PersistenceManager;
+import org.apache.juddi.util.JAXBMarshaller;
 import org.apache.juddi.validation.ValidateSubscription;
+import org.apache.log4j.Logger;
 
 
 @WebService(serviceName="UDDISubscriptionService", 
@@ -42,6 +54,10 @@
 			targetNamespace = "urn:uddi-org:sub_v3_portType")
 public class UDDISubscriptionImpl extends AuthenticatedService implements UDDISubscriptionPortType {
 
+	private static Logger logger = Logger.getLogger(UDDISubscriptionImpl.class);
+	
+	public static final int DEFAULT_SUBSCRIPTIONEXPIRATION_DAYS = 30;
+
 
 	public void deleteSubscription(DeleteSubscription body)
 			throws DispositionReportFaultMessage {
@@ -49,6 +65,9 @@
 		EntityTransaction tx = em.getTransaction();
 		tx.begin();
 
+		UddiEntityPublisher publisher = this.getEntityPublisher(em, body.getAuthInfo());
+		new ValidateSubscription(publisher).validateDeleteSubscription(em, body);
+		
         List<String> subscriptionKeyList = body.getSubscriptionKey();
         for (String subscriptionKey : subscriptionKeyList) {
                 Object obj = em.find(org.apache.juddi.model.Subscription.class, subscriptionKey);
@@ -109,10 +128,146 @@
 		List<org.uddi.sub_v3.Subscription> apiSubscriptionList = subscription.value;
 		for (org.uddi.sub_v3.Subscription apiSubscription : apiSubscriptionList) {
 			
+			org.apache.juddi.model.Subscription modelSubscription = new org.apache.juddi.model.Subscription();
+			
+			Object existingEntity = em.find(org.apache.juddi.model.Subscription.class, apiSubscription.getSubscriptionKey());
+			if (existingEntity != null) {
+				doRenewal((org.apache.juddi.model.Subscription)existingEntity, apiSubscription);
+				em.remove(existingEntity);
+			}
+
+			doSubscriptionExpirationDate(apiSubscription);
+			
+			MappingApiToModel.mapSubscription(apiSubscription, modelSubscription);
+
+			// Add the matching keys to the match collection
+			List<?> keys = getSubscriptionMatches(apiSubscription.getSubscriptionFilter(), em);
+			if (keys != null && keys.size() > 0) {
+				for (Object key : keys) {
+					SubscriptionMatch subMatch = new SubscriptionMatch(modelSubscription, (String)key);
+					modelSubscription.getSubscriptionMatches().add(subMatch);
+				}
+			}
+			
+			em.persist(modelSubscription);
 		}
 
 		tx.commit();
 		em.close();
 	}
+
+	/**
+	 * Will perform the necessary logic for when a subscription is renewed (evidenced by a subscription with the same key in existence).  
+	 * In general, the appropriate data is copied from the stored subscription to the renewal subscription request.
+	 * 
+	 * @param existingSubscription - existing stored subscription
+	 * @param apiSubscription - renewal subscription request
+	 * @throws DispositionReportFaultMessage 
+	 */
+	private void doRenewal(org.apache.juddi.model.Subscription existingSubscription, org.uddi.sub_v3.Subscription apiSubscription) throws DispositionReportFaultMessage {
+		if (apiSubscription.getSubscriptionFilter() == null) {
+			String rawFilter = existingSubscription.getSubscriptionFilter();
+			try {
+				SubscriptionFilter existingFilter = (SubscriptionFilter)JAXBMarshaller.unmarshallFromString(rawFilter, "org.uddi.sub_v3");
+				apiSubscription.setSubscriptionFilter(existingFilter);
+			} 
+			catch (JAXBException e) {
+				logger.error("JAXB Exception while marshalling subscription filter", e);
+				throw new FatalErrorException(new ErrorMessage("errors.Unspecified"));
+			} 
+		}
+		
+	}
+	
+	/**
+	 * Will add the expiration date to the provided subscription request.  Date is earlier of user provided date and the system default
+	 * 
+	 * @param apiSubscription
+	 * @throws DispositionReportFaultMessage
+	 */
+	private void doSubscriptionExpirationDate(org.uddi.sub_v3.Subscription apiSubscription) throws DispositionReportFaultMessage {
+
+		int subscriptionExpirationDays = DEFAULT_SUBSCRIPTIONEXPIRATION_DAYS;
+		try { 
+			subscriptionExpirationDays = AppConfig.getConfiguration().getInt(Property.JUDDI_SUBSCRIPTION_EXPIRATION_DAYS); 
+		}
+		catch(ConfigurationException ce) { 
+			throw new FatalErrorException(new ErrorMessage("errors.configuration.Retrieval"));
+		}
+
+		GregorianCalendar expirationDate = new GregorianCalendar();
+		expirationDate.add(GregorianCalendar.DAY_OF_MONTH, subscriptionExpirationDays);
+		
+		// The expiration date is the earlier of the provided date and that specified by the parameter.
+		if (apiSubscription.getExpiresAfter() != null) {
+			GregorianCalendar userExpiration = apiSubscription.getExpiresAfter().toGregorianCalendar();
+			if (userExpiration.getTimeInMillis() < expirationDate.getTimeInMillis())
+				expirationDate.setTimeInMillis(userExpiration.getTimeInMillis());
+		}
+
+		try { 
+			DatatypeFactory df = DatatypeFactory.newInstance();
+			apiSubscription.setExpiresAfter(df.newXMLGregorianCalendar(expirationDate));
+		}
+		catch(DatatypeConfigurationException ce) { 
+			throw new FatalErrorException(new ErrorMessage("errors.Unspecified"));
+		}
+		
+	}
+
+	/**
+	 * Will take a snapshot of the keys that match the subscription filter return them.
+	 * 
+	 * @param subscriptionFilter
+	 * @param em
+	 * @return
+	 * @throws DispositionReportFaultMessage
+	 */
+	private List<?> getSubscriptionMatches(SubscriptionFilter subscriptionFilter, EntityManager em) 
+			 throws DispositionReportFaultMessage {
+		
+		
+		List<?> keys = null;
+		if (subscriptionFilter.getFindBinding() != null) {
+			org.apache.juddi.query.util.FindQualifiers findQualifiers = new org.apache.juddi.query.util.FindQualifiers();
+			findQualifiers.mapApiFindQualifiers(subscriptionFilter.getFindBinding().getFindQualifiers());
+			keys = InquiryHelper.findBinding(subscriptionFilter.getFindBinding(), findQualifiers, em);
+		}
+		if (subscriptionFilter.getFindBusiness() != null) {
+			org.apache.juddi.query.util.FindQualifiers findQualifiers = new org.apache.juddi.query.util.FindQualifiers();
+			findQualifiers.mapApiFindQualifiers(subscriptionFilter.getFindBusiness().getFindQualifiers());
+			keys = InquiryHelper.findBusiness(subscriptionFilter.getFindBusiness(), findQualifiers, em);
+		}
+		if (subscriptionFilter.getFindService() != null) {
+			org.apache.juddi.query.util.FindQualifiers findQualifiers = new org.apache.juddi.query.util.FindQualifiers();
+			findQualifiers.mapApiFindQualifiers(subscriptionFilter.getFindService().getFindQualifiers());
+			keys = InquiryHelper.findService(subscriptionFilter.getFindService(), findQualifiers, em);
+		}
+		if (subscriptionFilter.getFindTModel() != null) {
+			org.apache.juddi.query.util.FindQualifiers findQualifiers = new org.apache.juddi.query.util.FindQualifiers();
+			findQualifiers.mapApiFindQualifiers(subscriptionFilter.getFindTModel().getFindQualifiers());
+			keys = InquiryHelper.findTModel(subscriptionFilter.getFindTModel(), findQualifiers, em);
+		}
+		if (subscriptionFilter.getFindRelatedBusinesses() != null) {
+			// TODO: should we bother taking a snapshot of these?
+		}
+		if (subscriptionFilter.getGetBindingDetail() != null) {
+			keys = subscriptionFilter.getGetBindingDetail().getBindingKey();
+		}
+		if (subscriptionFilter.getGetBusinessDetail() != null) {
+			keys = subscriptionFilter.getGetBusinessDetail().getBusinessKey();
+		}
+		if (subscriptionFilter.getGetServiceDetail() != null) {
+			keys = subscriptionFilter.getGetServiceDetail().getServiceKey();
+		}
+		if (subscriptionFilter.getGetTModelDetail() != null) {
+			keys = subscriptionFilter.getGetTModelDetail().getTModelKey();
+		}
+		if (subscriptionFilter.getGetAssertionStatusReport() != null) {
+			// Nothing needs to be done
+		}
+		return keys;
+		
+	}
 	
 }

Modified: webservices/juddi/branches/v3_trunk/juddi-core/src/main/java/org/apache/juddi/mapping/MappingApiToModel.java
URL: http://svn.apache.org/viewvc/webservices/juddi/branches/v3_trunk/juddi-core/src/main/java/org/apache/juddi/mapping/MappingApiToModel.java?rev=763853&r1=763852&r2=763853&view=diff
==============================================================================
--- webservices/juddi/branches/v3_trunk/juddi-core/src/main/java/org/apache/juddi/mapping/MappingApiToModel.java (original)
+++ webservices/juddi/branches/v3_trunk/juddi-core/src/main/java/org/apache/juddi/mapping/MappingApiToModel.java Fri Apr 10 01:18:52 2009
@@ -17,10 +17,18 @@
 
 package org.apache.juddi.mapping;
 
+import java.util.Date;
+import java.util.GregorianCalendar;
 import java.util.List;
 
 import javax.xml.bind.JAXBElement;
+import javax.xml.bind.JAXBException;
 
+import org.apache.juddi.error.ErrorMessage;
+import org.apache.juddi.error.FatalErrorException;
+import org.apache.juddi.util.JAXBMarshaller;
+import org.apache.log4j.Logger;
+import org.uddi.sub_v3.ObjectFactory;
 import org.uddi.v3_service.DispositionReportFaultMessage;
 
 
@@ -29,7 +37,9 @@
  * @author <a href="mailto:kstam@apache.org">Kurt T Stam</a>
  */
 public class MappingApiToModel {
+	private static Logger logger = Logger.getLogger(MappingApiToModel.class);
 
+	
 	public static void mapPublisher(org.apache.juddi.api.datatype.Publisher apiPublisher, 
 									org.apache.juddi.model.Publisher modelPublisher) 
 				   throws DispositionReportFaultMessage {
@@ -533,23 +543,29 @@
 	}
 
 	public static void mapSubscription(org.uddi.sub_v3.Subscription apiSubscription,
-			org.apache.juddi.model.Subscription modelSubscription) throws DispositionReportFaultMessage {
-		if ((apiSubscription.getSubscriptionKey() != null) && (!"".equals(apiSubscription.getSubscriptionKey()))) {
-			// if the apiSubscription has a key, this is a renewal or update - we don't want to change all of the fields, 
-			// just the ones that have been provided to update the record
-			if (apiSubscription.getBindingKey() != null) {
-				modelSubscription.setBindingKey(apiSubscription.getBindingKey());
-			}
-			
-			if (apiSubscription.getNotificationInterval() != null) {
-				modelSubscription.setNotificationInterval(apiSubscription.getNotificationInterval().toString());
-			}
-			
-		} else {
-			// No key provided, assume that this is a new subscription and map all fields
-			modelSubscription.setBindingKey(apiSubscription.getBindingKey());
-			modelSubscription.setNotificationInterval(apiSubscription.getNotificationInterval().toString());
+									   org.apache.juddi.model.Subscription modelSubscription) 
+				   throws DispositionReportFaultMessage {
+
+		modelSubscription.setSubscriptionKey(apiSubscription.getSubscriptionKey());
+		modelSubscription.setBindingKey(apiSubscription.getBindingKey());
+		modelSubscription.setNotificationInterval(apiSubscription.getNotificationInterval().toString());
+		modelSubscription.setMaxEntities(apiSubscription.getMaxEntities());
+		if (apiSubscription.getExpiresAfter() != null) {
+			GregorianCalendar gc = apiSubscription.getExpiresAfter().toGregorianCalendar();
+			modelSubscription.setExpiresAfter(new Date(gc.getTimeInMillis()));
+		}
+		modelSubscription.setBrief(apiSubscription.isBrief());
+		
+		try {
+			String rawFilter = JAXBMarshaller.marshallToString(new ObjectFactory().createSubscriptionFilter(apiSubscription.getSubscriptionFilter()), "org.uddi.sub_v3");
+			logger.debug("marshalled subscription filter:  " + rawFilter);
+			modelSubscription.setSubscriptionFilter(rawFilter);
+
+		} catch (JAXBException e) {
+			logger.error("JAXBException while marshalling subscription filter", e);
+			throw new FatalErrorException(new ErrorMessage("errors.Unspecified"));
 		}
+		
 	}
 	
 }

Modified: webservices/juddi/branches/v3_trunk/juddi-core/src/main/java/org/apache/juddi/validation/ValidateSubscription.java
URL: http://svn.apache.org/viewvc/webservices/juddi/branches/v3_trunk/juddi-core/src/main/java/org/apache/juddi/validation/ValidateSubscription.java?rev=763853&r1=763852&r2=763853&view=diff
==============================================================================
--- webservices/juddi/branches/v3_trunk/juddi-core/src/main/java/org/apache/juddi/validation/ValidateSubscription.java (original)
+++ webservices/juddi/branches/v3_trunk/juddi-core/src/main/java/org/apache/juddi/validation/ValidateSubscription.java Fri Apr 10 01:18:52 2009
@@ -17,18 +17,20 @@
 
  package org.apache.juddi.validation;
 
+import java.util.HashSet;
 import java.util.List;
 
 import javax.persistence.EntityManager;
 
 import org.apache.juddi.error.ErrorMessage;
 import org.apache.juddi.error.FatalErrorException;
+import org.apache.juddi.error.InvalidKeyPassedException;
 import org.apache.juddi.error.KeyUnavailableException;
 import org.apache.juddi.error.ValueNotAllowedException;
 import org.apache.juddi.keygen.KeyGenerator;
 import org.apache.juddi.keygen.KeyGeneratorFactory;
 import org.apache.juddi.model.UddiEntityPublisher;
-import org.uddi.sub_v3.SaveSubscription;
+import org.uddi.sub_v3.DeleteSubscription;
 import org.uddi.sub_v3.SubscriptionFilter;
 import org.uddi.v3_service.DispositionReportFaultMessage;
 
@@ -106,54 +108,84 @@
 		if (!entityExists && subscriptionFilter == null)
 			throw new ValueNotAllowedException(new ErrorMessage("errors.subscription.NoFilterOnNewSubscription"));
 			
-		int filterCount = 0;
-		ValidateInquiry validateInquiry = new ValidateInquiry(publisher);
-		if (subscriptionFilter.getFindBinding() != null) {
-			filterCount++;
-			validateInquiry.validateFindBinding(subscriptionFilter.getFindBinding());
-		}
-		if (subscriptionFilter.getFindBusiness() != null) {
-			filterCount++;
-			validateInquiry.validateFindBusiness(subscriptionFilter.getFindBusiness());
-		}
-		if (subscriptionFilter.getFindService() != null) {
-			filterCount++;
-			validateInquiry.validateFindService(subscriptionFilter.getFindService());
-		}
-		if (subscriptionFilter.getFindTModel() != null) {
-			filterCount++;
-			validateInquiry.validateFindTModel(subscriptionFilter.getFindTModel(), false);
-		}
-		if (subscriptionFilter.getFindRelatedBusinesses() != null) {
-			filterCount++;
-			validateInquiry.validateFindRelatedBusinesses(subscriptionFilter.getFindRelatedBusinesses(), false);
-		}
-		if (subscriptionFilter.getGetBindingDetail() != null) {
-			filterCount++;
-			validateInquiry.validateGetBindingDetail(subscriptionFilter.getGetBindingDetail());
-		}
-		if (subscriptionFilter.getGetBusinessDetail() != null) {
-			filterCount++;
-			validateInquiry.validateGetBusinessDetail(subscriptionFilter.getGetBusinessDetail());
-		}
-		if (subscriptionFilter.getGetServiceDetail() != null) {
-			filterCount++;
-			validateInquiry.validateGetServiceDetail(subscriptionFilter.getGetServiceDetail());
-		}
-		if (subscriptionFilter.getGetTModelDetail() != null) {
-			filterCount++;
-			validateInquiry.validateGetTModelDetail(subscriptionFilter.getGetTModelDetail());
-		}
-		if (subscriptionFilter.getGetAssertionStatusReport() != null) {
-			filterCount++;
+		if (subscriptionFilter != null) {
+			int filterCount = 0;
+			ValidateInquiry validateInquiry = new ValidateInquiry(publisher);
+			if (subscriptionFilter.getFindBinding() != null) {
+				filterCount++;
+				validateInquiry.validateFindBinding(subscriptionFilter.getFindBinding());
+			}
+			if (subscriptionFilter.getFindBusiness() != null) {
+				filterCount++;
+				validateInquiry.validateFindBusiness(subscriptionFilter.getFindBusiness());
+			}
+			if (subscriptionFilter.getFindService() != null) {
+				filterCount++;
+				validateInquiry.validateFindService(subscriptionFilter.getFindService());
+			}
+			if (subscriptionFilter.getFindTModel() != null) {
+				filterCount++;
+				validateInquiry.validateFindTModel(subscriptionFilter.getFindTModel(), false);
+			}
+			if (subscriptionFilter.getFindRelatedBusinesses() != null) {
+				filterCount++;
+				validateInquiry.validateFindRelatedBusinesses(subscriptionFilter.getFindRelatedBusinesses(), false);
+			}
+			if (subscriptionFilter.getGetBindingDetail() != null) {
+				filterCount++;
+				validateInquiry.validateGetBindingDetail(subscriptionFilter.getGetBindingDetail());
+			}
+			if (subscriptionFilter.getGetBusinessDetail() != null) {
+				filterCount++;
+				validateInquiry.validateGetBusinessDetail(subscriptionFilter.getGetBusinessDetail());
+			}
+			if (subscriptionFilter.getGetServiceDetail() != null) {
+				filterCount++;
+				validateInquiry.validateGetServiceDetail(subscriptionFilter.getGetServiceDetail());
+			}
+			if (subscriptionFilter.getGetTModelDetail() != null) {
+				filterCount++;
+				validateInquiry.validateGetTModelDetail(subscriptionFilter.getGetTModelDetail());
+			}
+			if (subscriptionFilter.getGetAssertionStatusReport() != null) {
+				filterCount++;
+			}
+
+			if (filterCount == 0)
+				throw new ValueNotAllowedException(new ErrorMessage("errors.subscription.BlankFilter"));
+			
+			if (filterCount > 1)
+				throw new ValueNotAllowedException(new ErrorMessage("errors.subscription.TooManyFilters", String.valueOf(filterCount)));
+
 		}
 		
-		if (!entityExists && filterCount == 0)
-			throw new ValueNotAllowedException(new ErrorMessage("errors.subscription.NoFilterOnNewSubscription"));
-		
-		if (filterCount > 1)
-			throw new ValueNotAllowedException(new ErrorMessage("errors.subscription.TooManyFilters", String.valueOf(filterCount)));
 		
 	}
 	
+	public void validateDeleteSubscription(EntityManager em, DeleteSubscription body) throws DispositionReportFaultMessage {
+		// No null input
+		if (body == null)
+			throw new FatalErrorException(new ErrorMessage("errors.NullInput"));
+
+		// No null or empty list
+		List<String> entityKeyList = body.getSubscriptionKey();
+		if (entityKeyList == null || entityKeyList.size() == 0)
+			throw new InvalidKeyPassedException(new ErrorMessage("errors.invalidkey.NoKeys"));
+		
+		HashSet<String> dupCheck = new HashSet<String>();
+		for (String entityKey : entityKeyList) {
+			boolean inserted = dupCheck.add(entityKey);
+			if (!inserted)
+				throw new InvalidKeyPassedException(new ErrorMessage("errors.invalidkey.DuplicateKey", entityKey));
+			
+			Object obj = em.find(org.apache.juddi.model.Subscription.class, entityKey);
+			if (obj == null)
+				throw new InvalidKeyPassedException(new ErrorMessage("errors.invalidkey.SubscriptionNotFound", entityKey));
+			
+			// No ownership specified for subscriptions
+			//if (!publisher.isOwner((UddiEntity)obj))
+			//	throw new UserMismatchException(new ErrorMessage("errors.usermismatch.InvalidOwner", entityKey));
+			
+		}
+	}
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: juddi-cvs-unsubscribe@ws.apache.org
For additional commands, e-mail: juddi-cvs-help@ws.apache.org