package org.bundlemaker.core.internal.transformation;
import org.bundlemaker.core.analysis.IBundleMakerArtifact;
import org.bundlemaker.core.analysis.IGroupAndModuleContainer;
import org.bundlemaker.core.analysis.IModuleArtifact;
import org.bundlemaker.core.internal.analysis.AdapterRoot2IArtifact;
import org.bundlemaker.core.internal.api.resource.IModifiableModularizedSystem;
import org.bundlemaker.core.internal.api.resource.IModifiableModule;
import org.bundlemaker.core.internal.gson.GsonHelper;
import org.bundlemaker.core.internal.resource.ModuleIdentifier;
import org.bundlemaker.core.resource.ITransformationCreateModule;
import org.bundlemaker.core.resource.IModuleIdentifier;
import org.bundlemaker.core.spi.analysis.AbstractArtifactContainer;
import org.eclipse.core.runtime.Assert;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.Path;
import com.google.gson.JsonElement;
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;
/**
* <p>
* </p>
*
* @author Gerd Wütherich (gerd@gerd-wuetherich.de)
*/
public class CreateModuleTransformation extends
AbstractConfigurableTransformation<CreateModuleTransformation.Configuration> implements ITransformationCreateModule {
/** - */
private IModuleArtifact _moduleArtifact;
/** - */
private CreateGroupTransformation _nestedCreateGroupTransformation;
/**
* <p>
* Creates a new instance of type {@link CreateModuleTransformation}.
* </p>
*
* @param groupAndModuleContainer
* @param qualifiedModuleName
* @param moduleVersion
*/
public CreateModuleTransformation(IGroupAndModuleContainer groupAndModuleContainer, String qualifiedModuleName,
String moduleVersion) {
super(new Configuration(groupAndModuleContainer, qualifiedModuleName, moduleVersion).toJsonTree());
}
/**
* <p>
* Creates a new instance of type {@link CreateModuleTransformation}.
* </p>
*
* @param configuration
*/
public CreateModuleTransformation(JsonElement configuration) {
super(configuration);
}
/**
* {@inheritDoc}
*/
@Override
public void undo() {
//
if (_moduleArtifact != null) {
getModularizedSystem().removeModule(_moduleArtifact.getAssociatedModule());
_moduleArtifact = null;
}
//
if (_nestedCreateGroupTransformation != null) {
_nestedCreateGroupTransformation.undo();
}
}
/**
* <p>
* </p>
*
* @return
*/
public final IModuleArtifact getModuleArtifact() {
return _moduleArtifact;
}
/**
* {@inheritDoc}
*/
@Override
protected void onApply(Configuration config, IModifiableModularizedSystem modularizedSystem,
IProgressMonitor progressMonitor) {
//
Assert.isTrue(modularizedSystem == config.getGroupAndModuleContainer().getRoot().getModularizedSystem(),
"Invalid ModularizedSystem");
// normalize the qualified module name
String qualifiedModuleName = config.getQualifiedModuleName().replace('\\', '/');
// the root container is 'this' GroupAndModuleContainer
IBundleMakerArtifact rootContainer = config.getGroupAndModuleContainer();
// if the qualified name starts with '/', it is an absolute path
if (qualifiedModuleName.startsWith("/")) {
qualifiedModuleName = qualifiedModuleName.substring(1);
rootContainer = rootContainer.getRoot();
}
//
String moduleName = qualifiedModuleName;
AbstractArtifactContainer moduleParentArtifact = (AbstractArtifactContainer) rootContainer;
// if the qualified name contains groups, we have to create the groups first
int index = moduleName.lastIndexOf('/');
if (index != -1) {
// create the group
_nestedCreateGroupTransformation = new CreateGroupTransformation(new CreateGroupTransformation.Configuration(
(IGroupAndModuleContainer) rootContainer, new Path(qualifiedModuleName.substring(0, index))).toJsonTree());
_nestedCreateGroupTransformation.apply(modularizedSystem, null);
moduleParentArtifact = (AbstractArtifactContainer) _nestedCreateGroupTransformation.getGroupArtifact();
// set the simple module name
moduleName = qualifiedModuleName.substring(index + 1);
}
// try to get the module...
IModuleIdentifier moduleIdentifier = new ModuleIdentifier(moduleName, config.getModuleVersion());
IModuleArtifact moduleArtifact = (IModuleArtifact) moduleParentArtifact.getChild(moduleIdentifier.toString());
// ...and create it if necessary
if (moduleArtifact == null) {
// create the module
IModifiableModule resourceModule = ((IModifiableModularizedSystem) config.getGroupAndModuleContainer()
.getRoot()
.getModularizedSystem()).createResourceModule(moduleIdentifier);
// set the classification
IPath classification = moduleParentArtifact.getFullPath();
if (!".".equals(classification.toOSString())) {
resourceModule.setClassification(classification);
}
//
moduleArtifact = ((AdapterRoot2IArtifact) config.getGroupAndModuleContainer().getRoot()).getArtifactCache()
.getModuleArtifact(resourceModule);
}
//
_moduleArtifact = moduleArtifact;
}
/**
* {@inheritDoc}
*/
@Override
protected void assertConfiguration(JsonElement element) {
// TODO
}
/**
* {@inheritDoc}
*/
@Override
protected Class<Configuration> getConfigurationType() {
return Configuration.class;
}
/**
* <p>
* </p>
*
* @author Gerd Wütherich (gerd@gerd-wuetherich.de)
*/
public static class Configuration {
/** - */
@Expose
@SerializedName("parent")
private IGroupAndModuleContainer _groupAndModuleContainer;
/** - */
@Expose
@SerializedName("name")
private String _qualifiedModuleName;
/** - */
@Expose
@SerializedName("version")
private String _moduleVersion;
/**
* <p>
* Creates a new instance of type {@link Configuration}.
* </p>
*
* @param groupAndModuleContainer
* @param qualifiedModuleName
* @param moduleVersion
*/
public Configuration(IGroupAndModuleContainer groupAndModuleContainer, String qualifiedModuleName,
String moduleVersion) {
Assert.isNotNull(groupAndModuleContainer);
Assert.isNotNull(qualifiedModuleName);
Assert.isNotNull(moduleVersion);
_groupAndModuleContainer = groupAndModuleContainer;
_qualifiedModuleName = qualifiedModuleName;
_moduleVersion = moduleVersion;
}
/**
* <p>
* </p>
*
* @return
*/
public IGroupAndModuleContainer getGroupAndModuleContainer() {
return _groupAndModuleContainer;
}
/**
* <p>
* </p>
*
* @return
*/
public String getQualifiedModuleName() {
return _qualifiedModuleName;
}
/**
* <p>
* </p>
*
* @return
*/
public String getModuleVersion() {
return _moduleVersion;
}
/**
* <p>
* </p>
*
* @return
*/
public JsonElement toJsonTree() {
return GsonHelper.gson(_groupAndModuleContainer.getModularizedSystem()).toJsonTree(this);
}
/**
* {@inheritDoc}
*/
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((_groupAndModuleContainer == null) ? 0 : _groupAndModuleContainer.hashCode());
result = prime * result + ((_moduleVersion == null) ? 0 : _moduleVersion.hashCode());
result = prime * result + ((_qualifiedModuleName == null) ? 0 : _qualifiedModuleName.hashCode());
return result;
}
/**
* {@inheritDoc}
*/
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Configuration other = (Configuration) obj;
if (_groupAndModuleContainer == null) {
if (other._groupAndModuleContainer != null)
return false;
} else if (!_groupAndModuleContainer.equals(other._groupAndModuleContainer))
return false;
if (_moduleVersion == null) {
if (other._moduleVersion != null)
return false;
} else if (!_moduleVersion.equals(other._moduleVersion))
return false;
if (_qualifiedModuleName == null) {
if (other._qualifiedModuleName != null)
return false;
} else if (!_qualifiedModuleName.equals(other._qualifiedModuleName))
return false;
return true;
}
}
}