package org.bundlemaker.core.itestframework.jedit_model;
import java.util.Collections;
import java.util.Comparator;
import java.util.LinkedList;
import java.util.List;
import org.bundlemaker.core.analysis.AnalysisCore;
import org.bundlemaker.core.analysis.AnalysisModelQueries;
import org.bundlemaker.core.analysis.IAnalysisModelConfiguration;
import org.bundlemaker.core.analysis.IAnalysisModelModifiedListener;
import org.bundlemaker.core.analysis.IAnalysisModelVisitor;
import org.bundlemaker.core.analysis.IBundleMakerArtifact;
import org.bundlemaker.core.analysis.IDependency;
import org.bundlemaker.core.analysis.IGroupArtifact;
import org.bundlemaker.core.analysis.IModuleArtifact;
import org.bundlemaker.core.analysis.IRootArtifact;
import org.bundlemaker.core.resource.IModularizedSystem;
import org.junit.Assert;
/**
* <p>
*
* <pre>
* </pre>
*
* </p>
*
* @author Gerd Wütherich (gerd@gerd-wuetherich.de)
*
*/
public class JeditAnalysisModel {
/** - */
private IRootArtifact _rootArtifact;
/** - */
private IBundleMakerArtifact _jeditModuleArtifact;
/** - */
private IBundleMakerArtifact _velocityModuleArtifact;
/** - */
private IBundleMakerArtifact _jreArtifact;
/** - */
private IBundleMakerArtifact _group1Artifact;
/** - */
private IBundleMakerArtifact _group2Artifact;
/** - */
private IBundleMakerArtifact _missingTypesArtifact;
/** - */
private IModularizedSystem _modularizedSystem;
/** - */
private int _modifiedNotificationCount;
/**
* <p>
* Creates a new instance of type {@link JeditAnalysisModel}.
* </p>
*
* @param modularizedSystem
* @param configuration
*/
public JeditAnalysisModel(IModularizedSystem modularizedSystem, IAnalysisModelConfiguration configuration) {
//
Assert.assertNotNull(modularizedSystem);
Assert.assertNotNull(configuration);
_modularizedSystem = modularizedSystem;
_rootArtifact = createArtifactModel(modularizedSystem, configuration);
_jreArtifact = assertJreArtifactModule(_rootArtifact);
_group1Artifact = assertGroupArtifact(_rootArtifact, "group1");
_group2Artifact = assertGroupArtifact(_rootArtifact, "group1/group2");
_jeditModuleArtifact = AnalysisModelQueries.getModuleArtifact(_rootArtifact, _modularizedSystem.getName(), "1.0.0");
assertNode(_jeditModuleArtifact.getParent(), IGroupArtifact.class, "group2");
assertNode(_jeditModuleArtifact.getParent().getParent(), IGroupArtifact.class, "group1");
_velocityModuleArtifact = AnalysisModelQueries.getModuleArtifact(_rootArtifact, "velocity", "1.5");
// add an model modified listener
_rootArtifact.addAnalysisModelModifiedListener(new IAnalysisModelModifiedListener() {
@Override
public void analysisModelModified() {
_modifiedNotificationCount++;
}
});
}
public int getModifiedNotificationCount() {
return _modifiedNotificationCount;
}
public IRootArtifact getRootArtifact() {
return _rootArtifact;
}
public IBundleMakerArtifact getJeditModuleArtifact() {
return _jeditModuleArtifact;
}
public IBundleMakerArtifact getVelocityModuleArtifact() {
return _velocityModuleArtifact;
}
public IBundleMakerArtifact getJreArtifact() {
return _jreArtifact;
}
public IBundleMakerArtifact getGroup1Artifact() {
return _group1Artifact;
}
public IBundleMakerArtifact getGroup2Artifact() {
return _group2Artifact;
}
public IBundleMakerArtifact getMissingTypesArtifact() {
return _missingTypesArtifact;
}
public IModularizedSystem getModularizedSystem() {
return _modularizedSystem;
}
/**
* <p>
* </p>
*
* @return
*/
public List<IDependency> getDependenciesTo(IBundleMakerArtifact from, IBundleMakerArtifact... to) {
// test dependencies
List<IDependency> deps = new LinkedList<IDependency>(from.getDependenciesTo(to));
//
Collections.sort(deps, new Comparator<IDependency>() {
public int compare(IDependency o1, IDependency o2) {
return o1.toString().compareTo(o2.toString());
}
});
//
return deps;
}
/**
* <p>
* </p>
*
* @param rootArtifact
* @param qualifiedName
* @return
*/
private IGroupArtifact assertGroupArtifact(IBundleMakerArtifact rootArtifact, String qualifiedName) {
IGroupArtifact result = AnalysisModelQueries.findGroupArtifactByQualifiedName(rootArtifact, qualifiedName);
Assert.assertNotNull(qualifiedName, result);
return result;
}
/**
* <p>
* </p>
*
* @param rootArtifact
* @return
*/
private IModuleArtifact assertJreArtifactModule(final IRootArtifact rootArtifact) {
//
final IModuleArtifact[] result = new IModuleArtifact[1];
//
rootArtifact.accept(new IAnalysisModelVisitor.Adapter() {
@Override
public boolean visit(IModuleArtifact moduleArtifact) {
if (rootArtifact.getModularizedSystem().getExecutionEnvironment().equals(moduleArtifact.getAssociatedModule())) {
result[0] = moduleArtifact;
}
return false;
}
});
//
Assert.assertNotNull(result[0]);
return result[0];
}
/**
* <p>
* </p>
*
* @param node
* @param type
* @param nodeName
*/
private void assertNode(IBundleMakerArtifact node, Class<?> type, String nodeName) {
Assert.assertTrue(String.format("Node '%s' has to be assignable from %s", node, type),
type.isAssignableFrom(node.getClass()));
Assert.assertEquals(nodeName, node.getName());
Assert.assertNotNull(node.getParent());
}
/**
* <p>
* </p>
*
* @return
*/
private IRootArtifact createArtifactModel(IModularizedSystem modularizedSystem,
IAnalysisModelConfiguration configuration) {
IRootArtifact rootArtifact = AnalysisCore.getAnalysisModel(modularizedSystem, configuration).getRoot();
Assert.assertNotNull(rootArtifact);
// Assert.assertEquals(4, rootArtifact.getChildren().size());
// assert JRE
Assert.assertNotNull(AnalysisModelQueries.getJreModuleArtifact(rootArtifact));
// return the result
return rootArtifact;
}
}