Author: ogusakov Date: Tue Mar 24 04:36:08 2009 New Revision: 757659 URL: http://svn.apache.org/viewvc?rev=757659&view=rev Log: [MERCURY-105] fixed precision error in objective function, added tree serialization for debugging
Added: maven/mercury/trunk/mercury-artifact/src/test/java/org/apache/maven/mercury/artifact/ArtifactMetadataTest.java (with props) maven/mercury/trunk/mercury-md/mercury-md-sat/src/main/java/org/apache/maven/mercury/metadata/DependencyTreeDumper.java (with props) maven/mercury/trunk/mercury-md/mercury-md-sat/src/main/mdo/ maven/mercury/trunk/mercury-md/mercury-md-sat/src/main/mdo/forest.mdo (with props) Modified: maven/mercury/trunk/mercury-artifact/src/main/java/org/apache/maven/mercury/artifact/ArtifactMetadata.java maven/mercury/trunk/mercury-md/mercury-md-sat/pom.xml maven/mercury/trunk/mercury-md/mercury-md-sat/src/main/java/org/apache/maven/mercury/metadata/DependencyTreeBuilder.java maven/mercury/trunk/mercury-md/mercury-md-sat/src/main/java/org/apache/maven/mercury/metadata/MetadataTreeNode.java maven/mercury/trunk/mercury-md/mercury-md-sat/src/main/java/org/apache/maven/mercury/metadata/sat/DefaultSatSolver.java maven/mercury/trunk/pom.xml Modified: maven/mercury/trunk/mercury-artifact/src/main/java/org/apache/maven/mercury/artifact/ArtifactMetadata.java URL: http://svn.apache.org/viewvc/maven/mercury/trunk/mercury-artifact/src/main/java/org/apache/maven/mercury/artifact/ArtifactMetadata.java?rev=757659&r1=757658&r2=757659&view=diff ============================================================================== --- maven/mercury/trunk/mercury-artifact/src/main/java/org/apache/maven/mercury/artifact/ArtifactMetadata.java (original) +++ maven/mercury/trunk/mercury-artifact/src/main/java/org/apache/maven/mercury/artifact/ArtifactMetadata.java Tue Mar 24 04:36:08 2009 @@ -211,7 +211,7 @@ if ( count > 4 ) { - this.type = nullify( tokens[4] ); + setType( nullify( tokens[4] ) ); } if ( this.type == null || this.type.length() < 1 ) @@ -478,7 +478,13 @@ public void setType( String type ) { - this.type = type; + if( "test-jar".equals( type ) ) + { + setClassifier( "tests" ); + setType( "jar" ); + } + else + this.type = type; } public Map<String, String> getAttributes() Added: maven/mercury/trunk/mercury-artifact/src/test/java/org/apache/maven/mercury/artifact/ArtifactMetadataTest.java URL: http://svn.apache.org/viewvc/maven/mercury/trunk/mercury-artifact/src/test/java/org/apache/maven/mercury/artifact/ArtifactMetadataTest.java?rev=757659&view=auto ============================================================================== --- maven/mercury/trunk/mercury-artifact/src/test/java/org/apache/maven/mercury/artifact/ArtifactMetadataTest.java (added) +++ maven/mercury/trunk/mercury-artifact/src/test/java/org/apache/maven/mercury/artifact/ArtifactMetadataTest.java Tue Mar 24 04:36:08 2009 @@ -0,0 +1,42 @@ +/* +Licensed to the Apache Software Foundation (ASF) under one +or more contributor license agreements. See the NOTICE file +distributed with this work for additional information +regarding copyright ownership. The ASF licenses this file +to you under the Apache License, Version 2.0 (the +"License"); you may not use this file except in compliance +with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, +software distributed under the License is distributed on an +"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +KIND, either express or implied. See the License for the +specific language governing permissions and limitations +under the License. +*/ + +package org.apache.maven.mercury.artifact; + +import junit.framework.TestCase; + +/** + * + * + * @author Oleg Gusakov + * @version $Id$ + * + */ +public class ArtifactMetadataTest + extends TestCase +{ + public void testTestJar() + { + ArtifactMetadata md = new ArtifactMetadata("a:a:1::test-jar"); + + assertEquals( "tests", md.getClassifier() ); + + assertEquals( "jar", md.getType() ); + } +} Propchange: maven/mercury/trunk/mercury-artifact/src/test/java/org/apache/maven/mercury/artifact/ArtifactMetadataTest.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: maven/mercury/trunk/mercury-artifact/src/test/java/org/apache/maven/mercury/artifact/ArtifactMetadataTest.java ------------------------------------------------------------------------------ svn:keywords = Author Date Id Revision Modified: maven/mercury/trunk/mercury-md/mercury-md-sat/pom.xml URL: http://svn.apache.org/viewvc/maven/mercury/trunk/mercury-md/mercury-md-sat/pom.xml?rev=757659&r1=757658&r2=757659&view=diff ============================================================================== --- maven/mercury/trunk/mercury-md/mercury-md-sat/pom.xml (original) +++ maven/mercury/trunk/mercury-md/mercury-md-sat/pom.xml Tue Mar 24 04:36:08 2009 @@ -93,6 +93,30 @@ </execution> </executions> </plugin> + + <plugin> + <groupId>org.codehaus.modello</groupId> + <artifactId>modello-maven-plugin</artifactId> + <version>${modello.version}</version> + <configuration> + <version>1.0.0</version> + <useJava5>true</useJava5> + <models> + <model>src/main/mdo/forest.mdo</model> + </models> + </configuration> + <executions> + <execution> + <id>standard</id> + <goals> + <goal>java</goal> + <goal>xpp3-reader</goal> + <goal>xpp3-writer</goal> + </goals> + </execution> + </executions> + </plugin> + </plugins> </build> </project> \ No newline at end of file Modified: maven/mercury/trunk/mercury-md/mercury-md-sat/src/main/java/org/apache/maven/mercury/metadata/DependencyTreeBuilder.java URL: http://svn.apache.org/viewvc/maven/mercury/trunk/mercury-md/mercury-md-sat/src/main/java/org/apache/maven/mercury/metadata/DependencyTreeBuilder.java?rev=757659&r1=757658&r2=757659&view=diff ============================================================================== --- maven/mercury/trunk/mercury-md/mercury-md-sat/src/main/java/org/apache/maven/mercury/metadata/DependencyTreeBuilder.java (original) +++ maven/mercury/trunk/mercury-md/mercury-md-sat/src/main/java/org/apache/maven/mercury/metadata/DependencyTreeBuilder.java Tue Mar 24 04:36:08 2009 @@ -61,6 +61,14 @@ public static final ArtifactMetadata DUMMY_ROOT = new ArtifactMetadata( "__fake:__fake:1.0" ); private static final Language LANG = new DefaultLanguage( DependencyTreeBuilder.class ); + + public static final String SYSTEM_PROPERTY_DUMP_DEPENDENCY_TREE = "mercury.dump.tree"; + + private static final String _depTreeDumpFileName = System.getProperty( SYSTEM_PROPERTY_DUMP_DEPENDENCY_TREE ); + + private static final boolean _dumpDepTree = _depTreeDumpFileName != null; + + private static final DependencyTreeDumper _dumper = _dumpDepTree ? new DependencyTreeDumper(_depTreeDumpFileName ) : null; private static final IMercuryLogger LOG = MercuryLoggerManager.getLogger( DependencyTreeBuilder.class ); @@ -177,7 +185,13 @@ { ArtifactMetadata bmd = startMDs.get( 0 ); MetadataTreeNode rooty = buildTree( bmd, scope ); + + List<ArtifactMetadata> res = resolveConflicts( rooty ); + +if(_dumpDepTree ) + _dumper.dump( scope, artifacts, inclusions, exclusions, rooty, res ); + return res; } @@ -193,6 +207,9 @@ for ( ArtifactMetadata bmd : startMDs ) { + if( scope != null && !scope.encloses( bmd.getArtifactScope() ) ) + continue; + try { if( ! DUMMY_ROOT.allowDependency( bmd ) ) @@ -243,12 +260,15 @@ DUMMY_ROOT.setDependencies( startMDs ); root = buildTree( DUMMY_ROOT, scope ); } - + List<ArtifactMetadata> res = resolveConflicts( root ); if( res != null ) res.remove( DUMMY_ROOT ); +if(_dumpDepTree ) + _dumper.dump( scope, artifacts, inclusions, exclusions, root, res ); + return res; } // ----------------------------------------------------- Added: maven/mercury/trunk/mercury-md/mercury-md-sat/src/main/java/org/apache/maven/mercury/metadata/DependencyTreeDumper.java URL: http://svn.apache.org/viewvc/maven/mercury/trunk/mercury-md/mercury-md-sat/src/main/java/org/apache/maven/mercury/metadata/DependencyTreeDumper.java?rev=757659&view=auto ============================================================================== --- maven/mercury/trunk/mercury-md/mercury-md-sat/src/main/java/org/apache/maven/mercury/metadata/DependencyTreeDumper.java (added) +++ maven/mercury/trunk/mercury-md/mercury-md-sat/src/main/java/org/apache/maven/mercury/metadata/DependencyTreeDumper.java Tue Mar 24 04:36:08 2009 @@ -0,0 +1,285 @@ +/* +Licensed to the Apache Software Foundation (ASF) under one +or more contributor license agreements. See the NOTICE file +distributed with this work for additional information +regarding copyright ownership. The ASF licenses this file +to you under the Apache License, Version 2.0 (the +"License"); you may not use this file except in compliance +with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, +software distributed under the License is distributed on an +"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +KIND, either express or implied. See the License for the +specific language governing permissions and limitations +under the License. +*/ + +package org.apache.maven.mercury.metadata; + +import java.io.BufferedOutputStream; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.FileWriter; +import java.io.IOException; +import java.io.Writer; +import java.util.List; +import java.util.TreeSet; + +import org.apache.maven.mercury.artifact.ArtifactExclusionList; +import org.apache.maven.mercury.artifact.ArtifactInclusionList; +import org.apache.maven.mercury.artifact.ArtifactMetadata; +import org.apache.maven.mercury.artifact.ArtifactQueryList; +import org.apache.maven.mercury.artifact.ArtifactScopeEnum; +import org.apache.maven.mercury.metadata.forest.Forest; +import org.apache.maven.mercury.metadata.forest.Node; +import org.apache.maven.mercury.metadata.forest.Tree; +import org.apache.maven.mercury.metadata.forest.io.xpp3.ForrestXpp3Reader; +import org.apache.maven.mercury.metadata.forest.io.xpp3.ForrestXpp3Writer; +import org.apache.maven.mercury.util.TimeUtil; + +/** + * + * + * @author Oleg Gusakov + * @version $Id$ + * + */ +public class DependencyTreeDumper +{ + String _dumpFileName; + File _dumpFile; + Writer _wr; + + public DependencyTreeDumper( String name ) + { + _dumpFileName = name; + } + + /** + * this one does not work because the writer runs out of stack memory on + * huge trees + * + * @param scope + * @param artifacts + * @param inclusions + * @param exclusions + * @param dirty + * @param result + * @throws MetadataTreeException + */ + public synchronized void realDump( ArtifactScopeEnum scope + , ArtifactQueryList artifacts + , ArtifactInclusionList inclusions + , ArtifactExclusionList exclusions + , MetadataTreeNode dirty + , List<ArtifactMetadata> result + ) + throws MetadataTreeException + { + try + { + if( artifacts == null || artifacts.getMetadataList() == null ) + return; + + Forest forest; + if( _dumpFile.exists() ) + { + forest = new ForrestXpp3Reader().read( new FileInputStream(_dumpFile) ); + } + else + forest = new Forest(); + + Tree tree = new Tree(); + + forest.addTree( tree ); + + tree.setScope( scope == null ? "null" : scope.toString() ); + + tree.setTimestamp( TimeUtil.getUTCTimestamp() ); + + for( ArtifactMetadata md : artifacts.getMetadataList() ) + { + Node n = new Node(); + n.setName( md.toString() ); + n.setScope( md.getScope() ); + tree.addRequest( n ); + } + + if( inclusions != null ) + for( ArtifactMetadata md : inclusions.getMetadataList() ) + { + Node n = new Node(); + n.setName( md.toString() ); + n.setScope( md.getScope() ); + tree.addInclusion( n ); + + } + + if( exclusions != null ) + for( ArtifactMetadata md : exclusions.getMetadataList() ) + { + Node n = new Node(); + n.setName( md.toString() ); + n.setScope( md.getScope() ); + tree.addExclusion( n ); + + } + + Node root = createNode( dirty, 0L ); + + tree.addDirtyTree( root ); + + if( result != null ) + for( ArtifactMetadata md : result ) + { + Node n = new Node(); + n.setName( md.toString() ); + n.setScope( md.getScope() ); + tree.addResult( n ); + } + + new ForrestXpp3Writer().write( new FileWriter(_dumpFile), forest ); + } + catch (Exception e) + { + throw new MetadataTreeException(e); + } + } + + public synchronized void dump( ArtifactScopeEnum scope + , ArtifactQueryList artifacts + , ArtifactInclusionList inclusions + , ArtifactExclusionList exclusions + , MetadataTreeNode dirty + , List<ArtifactMetadata> result + ) + throws MetadataTreeException + { + try + { + _dumpFile = new File(_dumpFileName+"-"+TimeUtil.getUTCTimestamp()+"-"+System.currentTimeMillis()+".xml" ); + _wr = new FileWriter(_dumpFile); + _wr.write( "<tree>\n" ); + } + catch ( IOException e ) + { + throw new MetadataTreeException(e); + } + try + { + if( artifacts != null && artifacts.getMetadataList() != null ) + { + if( scope != null ) + _wr.write( "<scope>"+scope+"</scope>\n" ); + + _wr.write( "<timestamp>"+ TimeUtil.getUTCTimestamp() +"</timestamp>\n" ); + + _wr.write( "<request>\n" ); + for( ArtifactMetadata md : artifacts.getMetadataList() ) + { + _wr.write( " <node scope='"+md.getScope()+"'>"+md.toString()+"</node>\n" ); + } + _wr.write( "</request>\n" ); + + if( inclusions != null ) + { + _wr.write( "<inclusions>\n" ); + for( ArtifactMetadata md : inclusions.getMetadataList() ) + { + _wr.write( " <inclusion>"+md.toString()+"</inclusion>\n" ); + } + _wr.write( "</inclusions>\n" ); + } + + if( exclusions != null ) + { + _wr.write( "<exclusions>\n" ); + for( ArtifactMetadata md : exclusions.getMetadataList() ) + { + _wr.write( " <exclusion>"+md.toString()+"</exclusion>\n" ); + } + _wr.write( "</exclusions>\n" ); + } + + _wr.write( "<source>\n" ); + showNode( dirty, 0L ); + _wr.write( "</source>\n" ); + + if( result != null ) + { + TreeSet<String> ts = new TreeSet<String>(); + for( ArtifactMetadata md : result ) + ts.add( md.toString() ); + + _wr.write( "<result>\n" ); + for( String name : ts ) + { + _wr.write( " <node>"+name+"</node>\n" ); + } + _wr.write( "</result>\n" ); + } + + } + } + catch (Exception e) + { + throw new MetadataTreeException(e); + } + finally + { + if( _wr != null ) + try { _wr.write( "</tree>\n" );_wr.flush(); _wr.close(); } catch( Exception ee ) {} + + _wr = null; + } + } + + private void showNode( MetadataTreeNode mtn, long level ) + throws IOException + { + if( mtn == null ) + return; + + ArtifactMetadata md = mtn.getMd(); + for( int i=0; i<level; i++ ) + _wr.write( " " ); + + _wr.write( " <node level='"+level+"'>"+md.toString()+"</node>\n" ); + + if( mtn.hasChildren() ) + { + _wr.write( " <kids>\n" ); + for( MetadataTreeNode kid : mtn.getChildren() ) + showNode( kid, level+1 ); + _wr.write( " </kids>\n" ); + } + } + + private static Node createNode( MetadataTreeNode mtn, long level ) + { + if( mtn == null ) + return null; + + Node n = new Node(); + + ArtifactMetadata md = mtn.getMd(); + + n.setName( md.toString() ); + + n.setLevel( level ); + + if( mtn.hasChildren() ) + { + for( MetadataTreeNode kid : mtn.getChildren() ) + n.addChildren( createNode( kid, level+1 ) ); + } + + return n; + + } +} Propchange: maven/mercury/trunk/mercury-md/mercury-md-sat/src/main/java/org/apache/maven/mercury/metadata/DependencyTreeDumper.java ------------------------------------------------------------------------------ svn:mergeinfo = Modified: maven/mercury/trunk/mercury-md/mercury-md-sat/src/main/java/org/apache/maven/mercury/metadata/MetadataTreeNode.java URL: http://svn.apache.org/viewvc/maven/mercury/trunk/mercury-md/mercury-md-sat/src/main/java/org/apache/maven/mercury/metadata/MetadataTreeNode.java?rev=757659&r1=757658&r2=757659&view=diff ============================================================================== --- maven/mercury/trunk/mercury-md/mercury-md-sat/src/main/java/org/apache/maven/mercury/metadata/MetadataTreeNode.java (original) +++ maven/mercury/trunk/mercury-md/mercury-md-sat/src/main/java/org/apache/maven/mercury/metadata/MetadataTreeNode.java Tue Mar 24 04:36:08 2009 @@ -298,10 +298,15 @@ public static final void showNode( MetadataTreeNode n, int level, Writer wr ) throws IOException { + if( n == null ) + { + wr.write( "null node" ); + return; + } for ( int i = 0; i < level; i++ ) wr.write( " " ); - wr.write( level + "." + n.getMd() + "\n" ); + wr.write( level + " " + n.getMd() + "\n" ); if ( n.hasChildren() ) { Modified: maven/mercury/trunk/mercury-md/mercury-md-sat/src/main/java/org/apache/maven/mercury/metadata/sat/DefaultSatSolver.java URL: http://svn.apache.org/viewvc/maven/mercury/trunk/mercury-md/mercury-md-sat/src/main/java/org/apache/maven/mercury/metadata/sat/DefaultSatSolver.java?rev=757659&r1=757658&r2=757659&view=diff ============================================================================== --- maven/mercury/trunk/mercury-md/mercury-md-sat/src/main/java/org/apache/maven/mercury/metadata/sat/DefaultSatSolver.java (original) +++ maven/mercury/trunk/mercury-md/mercury-md-sat/src/main/java/org/apache/maven/mercury/metadata/sat/DefaultSatSolver.java Tue Mar 24 04:36:08 2009 @@ -67,6 +67,8 @@ protected MetadataTreeNode _root; protected EventManager _eventManager; + + public static final BigInteger TWO = new BigInteger("2"); protected static final Comparator<MetadataTreeNode> gaComparator = new MetadataTreeNodeGAComparator(); //----------------------------------------------------------------------- @@ -192,9 +194,9 @@ { vars.push( varLiteral ); - long cf = (long)Math.pow( 2, count++ ); + BigInteger cf = TWO.pow( count++ ); - coeffs.push( BigInteger.valueOf( cf ) ); + coeffs.push( cf ); if( LOG.isDebugEnabled() ) LOG.debug( " "+cf+" x"+var.getLiteral() ); Added: maven/mercury/trunk/mercury-md/mercury-md-sat/src/main/mdo/forest.mdo URL: http://svn.apache.org/viewvc/maven/mercury/trunk/mercury-md/mercury-md-sat/src/main/mdo/forest.mdo?rev=757659&view=auto ============================================================================== --- maven/mercury/trunk/mercury-md/mercury-md-sat/src/main/mdo/forest.mdo (added) +++ maven/mercury/trunk/mercury-md/mercury-md-sat/src/main/mdo/forest.mdo Tue Mar 24 04:36:08 2009 @@ -0,0 +1,153 @@ +<!-- +Licensed to the Apache Software Foundation (ASF) under one +or more contributor license agreements. See the NOTICE file +distributed with this work for additional information +regarding copyright ownership. The ASF licenses this file +to you under the Apache License, Version 2.0 (the +"License"); you may not use this file except in compliance +with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, +software distributed under the License is distributed on an +"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +KIND, either express or implied. See the License for the +specific language governing permissions and limitations +under the License. +--> + +<model> + <id>forest</id> + + <name>Forrest</name> + + <defaults> + <default> + <key>package</key> + <value>org.apache.maven.mercury.metadata.forest</value> + </default> + </defaults> + + <classes> + + <class rootElement="true"> + <name>Forest</name> + <version>1.0.0</version> + <fields> + + <field> + <name>trees</name> + <version>1.0.0</version> + <association> + <type>Tree</type> + <multiplicity>*</multiplicity> + </association> + </field> + + </fields> + </class> + + <class> + <name>Tree</name> + <version>1.0.0</version> + <fields> + + <field> + <name>timestamp</name> + <version>1.0.0</version> + <type>String</type> + </field> + + <field> + <name>scope</name> + <version>1.0.0</version> + <type>String</type> + </field> + + <field> + <name>request</name> + <version>1.0.0</version> + <association> + <type>Node</type> + <multiplicity>*</multiplicity> + </association> + </field> + + <field> + <name>inclusions</name> + <version>1.0.0</version> + <association> + <type>Node</type> + <multiplicity>*</multiplicity> + </association> + </field> + + <field> + <name>exclusions</name> + <version>1.0.0</version> + <association> + <type>Node</type> + <multiplicity>*</multiplicity> + </association> + </field> + + <field> + <name>dirtyTree</name> + <version>1.0.0</version> + <association> + <type>Node</type> + <multiplicity>*</multiplicity> + </association> + </field> + + <field> + <name>result</name> + <version>1.0.0</version> + <association> + <type>Node</type> + <multiplicity>*</multiplicity> + </association> + </field> + + </fields> + </class> + + <class> + <name>Node</name> + <version>1.0.0</version> + + <fields> + + <field> + <name>name</name> + <version>1.0.0</version> + <type>String</type> + </field> + + <field> + <name>scope</name> + <version>1.0.0</version> + <type>String</type> + </field> + + <field> + <name>level</name> + <version>1.0.0</version> + <type>long</type> + </field> + + <field> + <name>children</name> + <version>1.0.0</version> + <association> + <type>Node</type> + <multiplicity>*</multiplicity> + </association> + </field> + + </fields> + </class> + + </classes> +</model> Propchange: maven/mercury/trunk/mercury-md/mercury-md-sat/src/main/mdo/forest.mdo ------------------------------------------------------------------------------ svn:eol-style = native Propchange: maven/mercury/trunk/mercury-md/mercury-md-sat/src/main/mdo/forest.mdo ------------------------------------------------------------------------------ svn:keywords = Author Date Id Revision Modified: maven/mercury/trunk/pom.xml URL: http://svn.apache.org/viewvc/maven/mercury/trunk/pom.xml?rev=757659&r1=757658&r2=757659&view=diff ============================================================================== --- maven/mercury/trunk/pom.xml (original) +++ maven/mercury/trunk/pom.xml Tue Mar 24 04:36:08 2009 @@ -102,6 +102,7 @@ Never use in Mercury modules because Mercury does not depend on Maven --> <maven.version>3.0-SNAPSHOT</maven.version> + <modello.version>1.0.1</modello.version> <!-- mercury-wagon --> <wagon.provider.api.version>1.0-beta-4</wagon.provider.api.version>