Changeset 5377


Ignore:
Timestamp:
06/20/14 13:38:26 (10 years ago)
Author:
Twan Goosen
Message:

Refactoring: created a factory interface for VirtualCollectionValidator? and a service locator factory bean for Spring to inject a dynamically generated factory instance into VirtualCollectionRegistry so that fresh instances can be generated without the tight coupling

Location:
VirtualCollectionRegistry/trunk/VirtualCollectionRegistry/src/main
Files:
2 added
3 edited

Legend:

Unmodified
Added
Removed
  • VirtualCollectionRegistry/trunk/VirtualCollectionRegistry/src/main/java/eu/clarin/cmdi/virtualcollectionregistry/VirtualCollectionRegistry.java

    r5376 r5377  
    11package eu.clarin.cmdi.virtualcollectionregistry;
    22
    3 import eu.clarin.cmdi.virtualcollectionregistry.service.impl.VirtualCollectionValidatorImpl;
     3import eu.clarin.cmdi.oai.provider.impl.OAIProvider;
     4import eu.clarin.cmdi.virtualcollectionregistry.model.User;
     5import eu.clarin.cmdi.virtualcollectionregistry.model.VirtualCollection;
     6import eu.clarin.cmdi.virtualcollectionregistry.model.VirtualCollectionList;
     7import eu.clarin.cmdi.virtualcollectionregistry.pid.PersistentIdentifier;
     8import eu.clarin.cmdi.virtualcollectionregistry.pid.PersistentIdentifierProvider;
     9import eu.clarin.cmdi.virtualcollectionregistry.query.ParsedQuery;
     10import eu.clarin.cmdi.virtualcollectionregistry.service.VirtualCollectionValidator;
     11import eu.clarin.cmdi.virtualcollectionregistry.service.VirtualCollectionValidatorFactory;
    412import java.security.Principal;
    513import java.util.Date;
     
    816import java.util.TimerTask;
    917import java.util.concurrent.atomic.AtomicBoolean;
    10 
    1118import javax.persistence.EntityManager;
    1219import javax.persistence.EntityTransaction;
     
    1926import javax.persistence.criteria.Predicate;
    2027import javax.persistence.criteria.Root;
    21 
    2228import org.slf4j.Logger;
    2329import org.slf4j.LoggerFactory;
    24 
    25 import eu.clarin.cmdi.oai.provider.impl.OAIProvider;
    26 import eu.clarin.cmdi.virtualcollectionregistry.pid.PersistentIdentifier;
    27 import eu.clarin.cmdi.virtualcollectionregistry.pid.PersistentIdentifierProvider;
    28 import eu.clarin.cmdi.virtualcollectionregistry.model.User;
    29 import eu.clarin.cmdi.virtualcollectionregistry.model.VirtualCollection;
    30 import eu.clarin.cmdi.virtualcollectionregistry.model.VirtualCollectionList;
    31 import eu.clarin.cmdi.virtualcollectionregistry.query.ParsedQuery;
    3230import org.springframework.beans.factory.DisposableBean;
    3331import org.springframework.beans.factory.InitializingBean;
     
    4442    @Autowired
    4543    private OAIProvider oaiProvider;
    46    
     44    @Autowired
     45    private VirtualCollectionValidatorFactory validatorFactory;
     46
    4747    private static final Logger logger =
    4848        LoggerFactory.getLogger(VirtualCollectionRegistry.class);
     
    8282        logger.info("Stopping Virtual Collection Registry maintenance schedule");
    8383        timer.cancel();
    84        
     84
    8585        logger.info("Shutting down OAI provider");
    8686        oaiProvider.shutdown();
     
    9898        logger.debug("creating virtual collection");
    9999
    100         VirtualCollectionValidatorImpl validator =
    101             new VirtualCollectionValidatorImpl();
     100        VirtualCollectionValidator validator = validatorFactory.createValidator();
    102101        validator.validate(vc);
    103102        try {
     
    138137        logger.debug("updating virtual collection (id={})", id);
    139138
    140         VirtualCollectionValidatorImpl validator =
    141             new VirtualCollectionValidatorImpl();
     139        VirtualCollectionValidator validator = validatorFactory.createValidator();
    142140        validator.validate(vc);
    143141
     
    160158                        principal.getName() + "\"");
    161159            }
    162            
     160
    163161            // update virtual collection
    164162            c.updateFrom(vc);
     
    299297            boolean update = false;
    300298            switch (state) {
    301             case PRIVATE:
     299                case PRIVATE:
    302300                update =  vc.getState() != state;
    303                 break;
    304             case PUBLIC_PENDING:
     301                    break;
     302                case PUBLIC_PENDING:
    305303                update =  vc.getState() != VirtualCollection.State.PUBLIC;
    306                 break;
     304                    break;
    307305            }
    308306            if (update) {
     
    320318        }
    321319    }
    322    
     320
    323321    /**
    324      * 
     322     *
    325323     * @param id identifier of the virtual collection to retrieve
    326324     * @return the identified virtual collection, never null
     
    514512        }
    515513    }
    516    
     514
    517515    public List<VirtualCollection> getVirtualCollections(
    518516            int first, int count, QueryOptions options)
     
    561559        // (for now) purge deleted collection roughly after 30 seconds
    562560        final Date nowDatePurge = new Date(now - 30*1000);
    563        
     561
    564562        EntityManager em = datastore.getEntityManager();
    565563        try {
     
    570568            TypedQuery<VirtualCollection> q =
    571569                em.createNamedQuery("VirtualCollection.findAllByState",
    572                                     VirtualCollection.class);
     570                            VirtualCollection.class);
    573571            q.setParameter("state", VirtualCollection.State.PUBLIC_PENDING);
    574572            q.setParameter("date", nowDateAlloc);
     
    587585            }
    588586            em.getTransaction().commit();
    589            
     587
    590588            /*
    591589             * delayed purging of deleted virtual collections
  • VirtualCollectionRegistry/trunk/VirtualCollectionRegistry/src/main/java/eu/clarin/cmdi/virtualcollectionregistry/service/impl/VirtualCollectionValidatorImpl.java

    r5376 r5377  
    1111import java.util.HashSet;
    1212import java.util.Set;
     13import static org.springframework.beans.factory.config.ConfigurableBeanFactory.SCOPE_PROTOTYPE;
     14import org.springframework.beans.factory.config.ServiceLocatorFactoryBean;
     15import org.springframework.context.annotation.Scope;
     16import org.springframework.stereotype.Service;
    1317
    14 //TODO: @Service
    15 //TODO: @Scope(value = SCOPE_PROTOTYPE)
     18/**
     19 * A virtual collection validator. Scoped prototype, because it carries state.
     20 * Use a factory (e.g. dynamically generated using
     21 * {@link ServiceLocatorFactoryBean}) to get new instances within a singleton.
     22 *
     23 * @author twagoo
     24 */
     25@Service
     26@Scope(value = SCOPE_PROTOTYPE)
    1627public class VirtualCollectionValidatorImpl implements VirtualCollectionValidator {
    1728    private final Set<Creator> uniqueCreators = new HashSet<Creator>(16);
     
    3344                    "collection has an empty name");
    3445        }
    35        
     46
    3647        for (Creator creator : vc.getCreators()) {
    3748            if (uniqueCreators.contains(creator)) {
     
    4354
    4455        switch (vc.getType()) {
    45         case EXTENSIONAL:
    46             if (vc.getResources().isEmpty()) {
    47                 throw new VirtualCollectionRegistryUsageException(
     56            case EXTENSIONAL:
     57                if (vc.getResources().isEmpty()) {
     58                    throw new VirtualCollectionRegistryUsageException(
    4859                        "extensional collection must contain on or " +
    4960                        "more resources");
    50             }
    51             if (vc.getGeneratedBy() != null) {
    52                 throw new VirtualCollectionRegistryUsageException(
    53                         "extensional collection must not contain GeneratedBy");
    54             }
    55             break;
    56         case INTENSIONAL:
    57             final GeneratedBy generatedBy = vc.getGeneratedBy();
    58             if (generatedBy == null) {
    59                 throw new VirtualCollectionRegistryUsageException(
    60                         "intensional collections needs GeneratedBy");
    61             }
    62             if (generatedBy.getDescription() == null) {
    63                 throw new VirtualCollectionRegistryUsageException(
    64                         "GeneratedBy has empty description");
    65             }
    66             final GeneratedByQuery query = generatedBy.getQuery();
    67             if (query != null) {
    68                 if (query.getProfile() == null) {
     61                }
     62                if (vc.getGeneratedBy() != null) {
    6963                    throw new VirtualCollectionRegistryUsageException(
    70                             "profile of GeneratedBy.Query is empty");
     64                            "extensional collection must not contain GeneratedBy");
    7165                }
    72                 if (query.getValue() == null) {
     66                break;
     67            case INTENSIONAL:
     68                final GeneratedBy generatedBy = vc.getGeneratedBy();
     69                if (generatedBy == null) {
    7370                    throw new VirtualCollectionRegistryUsageException(
    74                             "query of GeneratedBy.Query is empty");
     71                            "intensional collections needs GeneratedBy");
    7572                }
    76             }
     73                if (generatedBy.getDescription() == null) {
     74                    throw new VirtualCollectionRegistryUsageException(
     75                            "GeneratedBy has empty description");
     76                }
     77                final GeneratedByQuery query = generatedBy.getQuery();
     78                if (query != null) {
     79                    if (query.getProfile() == null) {
     80                        throw new VirtualCollectionRegistryUsageException(
     81                                "profile of GeneratedBy.Query is empty");
     82                    }
     83                    if (query.getValue() == null) {
     84                        throw new VirtualCollectionRegistryUsageException(
     85                                "query of GeneratedBy.Query is empty");
     86                    }
     87                }
    7788        }
    7889
  • VirtualCollectionRegistry/trunk/VirtualCollectionRegistry/src/main/webapp/WEB-INF/applicationContext.xml

    r5374 r5377  
    1616    -->
    1717    <context:component-scan base-package="eu.clarin.cmdi.virtualcollectionregistry" />
    18            
     18
     19    <!--
     20    Will generate a factory for virtual collection validator, based on the
     21    prototype bean for the VirtualCollectionValidator implementation
     22    see http://docs.spring.io/spring/docs/4.0.5.RELEASE/javadoc-api/org/springframework/beans/factory/config/ServiceLocatorFactoryBean.html
     23    -->
     24    <bean id="validatorFactory"
     25          class="org.springframework.beans.factory.config.ServiceLocatorFactoryBean">
     26        <property name="serviceLocatorInterface" value="eu.clarin.cmdi.virtualcollectionregistry.service.VirtualCollectionValidatorFactory"/>
     27    </bean>
     28               
    1929</beans>
Note: See TracChangeset for help on using the changeset viewer.