Changeset 3046


Ignore:
Timestamp:
01/17/12 14:35:00 (4 months ago)
Author:
kasper
Message:

Ticket #442: Fixed cyclic dependency issue.

Location:
AnalyzerBeans/trunk
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • AnalyzerBeans/trunk/core/src/main/java/org/eobjects/analyzer/job/AbstractFilterOutcome.java

    r3031 r3046  
    4747        protected final void decorateIdentity(List<Object> identifiers) { 
    4848                identifiers.add(getCategory()); 
    49                 identifiers.add(getFilterJob()); 
     49                identifiers.add(getSourceJob()); 
    5050        } 
    5151 
  • AnalyzerBeans/trunk/core/src/main/java/org/eobjects/analyzer/job/ImmutableFilterOutcome.java

    r3031 r3046  
    3131                _category = category; 
    3232        } 
     33         
     34        @Override 
     35        public FilterJob getFilterJob() { 
     36                return _filterJob; 
     37        } 
    3338 
    3439        @Override 
    35         public FilterJob getFilterJob() { 
     40        public FilterJob getSourceJob() { 
    3641                return _filterJob; 
    3742        } 
  • AnalyzerBeans/trunk/core/src/main/java/org/eobjects/analyzer/job/ImmutableMergedOutcome.java

    r3031 r3046  
    4949                return false; 
    5050        } 
     51 
     52        @Override 
     53        public OutcomeSourceJob getSourceJob() { 
     54                return _mergedOutcomeJob; 
     55        } 
    5156} 
  • AnalyzerBeans/trunk/core/src/main/java/org/eobjects/analyzer/job/LazyMergedOutcome.java

    r3031 r3046  
    2323 
    2424public final class LazyMergedOutcome extends AbstractMergedOutcome implements MergedOutcome { 
    25          
     25 
    2626        private static final long serialVersionUID = 1L; 
    2727 
     
    3030        public LazyMergedOutcome(MergedOutcomeJobBuilder mergedOutcomeJobBuilder) { 
    3131                _mergedOutcomeJobBuilder = mergedOutcomeJobBuilder; 
    32         } 
    33          
    34         public MergedOutcomeJobBuilder getBuilder() { 
    35                 return _mergedOutcomeJobBuilder; 
    3632        } 
    3733 
     
    4541                return _mergedOutcomeJobBuilder.toMergedOutcomeJob(); 
    4642        } 
     43 
     44        @Override 
     45        public MergedOutcomeJobBuilder getSourceJob() { 
     46                return _mergedOutcomeJobBuilder; 
     47        } 
    4748} 
  • AnalyzerBeans/trunk/core/src/main/java/org/eobjects/analyzer/job/Outcome.java

    r3031 r3046  
    3535 
    3636        /** 
     37         * Gets the source job for this outcome 
     38         *  
     39         * @return the source job for this outcome 
     40         */ 
     41        public OutcomeSourceJob getSourceJob(); 
     42 
     43        /** 
    3744         * Requests whether or not a specific requirement is satisfied by this 
    3845         * outcome 
  • AnalyzerBeans/trunk/core/src/main/java/org/eobjects/analyzer/job/builder/AbstractBeanWithInputColumnsBuilder.java

    r3045 r3046  
    3535import org.eobjects.analyzer.job.Outcome; 
    3636import org.eobjects.analyzer.job.OutcomeSinkJob; 
     37import org.eobjects.analyzer.job.OutcomeSourceJob; 
    3738import org.eobjects.analyzer.util.CollectionUtils2; 
    3839import org.eobjects.metamodel.util.CollectionUtils; 
     
    180181        } 
    181182 
    182         public void setRequirement(Outcome requirement) { 
     183        public void setRequirement(Outcome requirement) throws IllegalArgumentException { 
     184                if (!validateRequirementCandidate(requirement)) { 
     185                        throw new IllegalArgumentException("Cyclic dependency detected when setting requirement: " + requirement); 
     186                } 
    183187                if (_requirement != requirement) { 
    184188                        _requirement = requirement; 
    185189                        onRequirementChanged(); 
    186190                } 
     191        } 
     192 
     193        public boolean validateRequirementCandidate(Outcome requirement) { 
     194                if (requirement == null) { 
     195                        return true; 
     196                } 
     197                OutcomeSourceJob sourceJob = requirement.getSourceJob(); 
     198                if (sourceJob == this) { 
     199                        return false; 
     200                } 
     201                if (sourceJob instanceof OutcomeSinkJob) { 
     202                        Outcome[] requirements = ((OutcomeSinkJob) sourceJob).getRequirements(); 
     203                        for (Outcome transitiveRequirement : requirements) { 
     204                                boolean transitiveValidation = validateRequirementCandidate(transitiveRequirement); 
     205                                if (!transitiveValidation) { 
     206                                        return false; 
     207                                } 
     208                        } 
     209                } 
     210                return true; 
    187211        } 
    188212 
  • AnalyzerBeans/trunk/core/src/main/java/org/eobjects/analyzer/job/builder/LazyFilterOutcome.java

    r3031 r3046  
    2525import org.eobjects.analyzer.job.ImmutableBeanConfiguration; 
    2626import org.eobjects.analyzer.job.ImmutableFilterJob; 
     27import org.eobjects.analyzer.job.OutcomeSourceJob; 
    2728 
    2829public final class LazyFilterOutcome extends AbstractFilterOutcome { 
    29          
     30 
    3031        private static final long serialVersionUID = 1L; 
    3132 
     
    3637                _filterJobBuilder = filterJobBuilder; 
    3738                _category = category; 
     39        } 
     40 
     41        @Override 
     42        public OutcomeSourceJob getSourceJob() { 
     43                return _filterJobBuilder; 
    3844        } 
    3945 
  • AnalyzerBeans/trunk/core/src/test/java/org/eobjects/analyzer/job/builder/AnalysisJobBuilderTest.java

    r3000 r3046  
    3939import org.eobjects.analyzer.beans.stringpattern.PatternFinderAnalyzer; 
    4040import org.eobjects.analyzer.configuration.AnalyzerBeansConfigurationImpl; 
    41 import org.eobjects.analyzer.connection.DatastoreConnection; 
    4241import org.eobjects.analyzer.connection.Datastore; 
    4342import org.eobjects.analyzer.connection.DatastoreCatalogImpl; 
     43import org.eobjects.analyzer.connection.DatastoreConnection; 
    4444import org.eobjects.analyzer.connection.JdbcDatastore; 
    4545import org.eobjects.analyzer.data.DataTypeFamily; 
     
    7878        } 
    7979 
     80        public void testPreventCyclicFilterDependencies() throws Exception { 
     81                analysisJobBuilder.addSourceColumns("PUBLIC.EMPLOYEES.REPORTSTO"); 
     82                FilterJobBuilder<MaxRowsFilter, ValidationCategory> filter1 = analysisJobBuilder.addFilter(MaxRowsFilter.class); 
     83                FilterJobBuilder<NotNullFilter, ValidationCategory> filter2 = analysisJobBuilder.addFilter(NotNullFilter.class); 
     84                filter2.addInputColumn(analysisJobBuilder.getSourceColumnByName("reportsto")); 
     85                filter1.setRequirement(filter2.getOutcome(ValidationCategory.VALID)); 
     86 
     87                try { 
     88                        filter2.setRequirement(filter1.getOutcome(ValidationCategory.VALID)); 
     89                        fail("Exception expected"); 
     90                } catch (IllegalArgumentException e) { 
     91                        assertEquals("Cyclic dependency detected when setting requirement: FilterOutcome[category=VALID]", 
     92                                        e.getMessage()); 
     93                } 
     94        } 
     95 
    8096        public void testGetDatastore() throws Exception { 
    8197                assertNotNull(analysisJobBuilder.getDatastore()); 
  • AnalyzerBeans/trunk/env/xml-config/src/main/java/org/eobjects/analyzer/job/JaxbJobReader.java

    r2749 r3046  
    647647                                        LazyMergedOutcome outcome = (LazyMergedOutcome) outcomeMapping 
    648648                                                        .get(id); 
    649                                         MergedOutcomeJobBuilder builder = outcome.getBuilder(); 
     649                                        MergedOutcomeJobBuilder builder = outcome.getSourceJob(); 
    650650 
    651651                                        // map the input requirements and columns 
Note: See TracChangeset for help on using the changeset viewer.