package org.zend.php.zendserver.deployment.core.internal.descriptor;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactoryConfigurationError;
import javax.xml.xpath.XPathExpressionException;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.Path;
import org.eclipse.jface.text.IDocument;
import org.xml.sax.SAXException;
import org.zend.php.zendserver.deployment.core.DeploymentCore;
import org.zend.php.zendserver.deployment.core.descriptor.ChangeEvent;
import org.zend.php.zendserver.deployment.core.descriptor.IDeploymentDescriptor;
import org.zend.php.zendserver.deployment.core.descriptor.IDescriptorChangeListener;
import org.zend.php.zendserver.deployment.core.descriptor.IDescriptorContainer;
import org.zend.php.zendserver.deployment.core.sdk.EclipseMappingModelLoader;
import org.zend.sdklib.mapping.IMappingModel;
import org.zend.sdklib.mapping.MappingModelFactory;
public class DescriptorContainer implements IDescriptorContainer {
private IFile fFile;
private DeploymentDescriptor fModel;
private IMappingModel fMappingModel;
private ModelSerializer lm;
private IDocument fDocument;
private boolean isLoading;
public DescriptorContainer(IFile file) {
lm = new ModelSerializer();
lm.setOutput(new FileStore(file));
fFile = file;
}
public ModelSerializer getModelSerializer() {
return lm;
}
public void load() {
InputStream src = null;
InputStream src2 = null;
if (fDocument != null) {
src = new ByteArrayInputStream(fDocument.get().getBytes());
} else if (fFile.exists()) {
try {
src = fFile.getContents();
src2 = fFile.getContents();
} catch (CoreException e) {
DeploymentCore.log(e);
}
}
if (fModel == null) {
fModel = new DeploymentDescriptor();
}
if (src == null) {
return;
}
try {
isLoading = true;
lm.load(src, src2, fModel);
} catch (XPathExpressionException e) {
// seems model error, write to log
DeploymentCore.log(e);
} catch (SAXException e) {
// should be catched by validator, we can ignore it
} catch (IOException e) {
// should be catched by validator, we can ignore it
} finally {
if (src != null) {
try {
src.close();
} catch (IOException e) {
// ignore
}
}
if (src2 != null) {
try {
src2.close();
} catch (IOException e) {
// ignore
}
}
isLoading = false;
}
}
public IDeploymentDescriptor getDescriptorModel() {
if (fModel == null) {
load();
}
return fModel;
}
public IProject getProject() {
return fFile.getProject();
}
public IFile getFile() {
return fFile;
}
public void connect(IDocument document) {
this.fDocument = document;
lm.setOutput(new JFaceDocumentStore(document));
IDeploymentDescriptor model = getDescriptorModel();
model.addListener(new IDescriptorChangeListener() {
public void descriptorChanged(ChangeEvent event) {
if (isLoading) {
return;
}
save(event);
}
});
}
public IMappingModel getMappingModel() {
return fMappingModel;
}
public void initializeMappingModel(IDocument document) {
if (fMappingModel == null || !fMappingModel.isLoaded()) {
File container = fFile.getParent().getLocation().toFile();
fMappingModel = MappingModelFactory.createModel(
new EclipseMappingModelLoader(document), container);
}
}
public void save() {
save(null);
}
private void save(ChangeEvent event) {
IDeploymentDescriptor model = getDescriptorModel();
try {
lm.serialize(model, event);
lm.write();
} catch (XPathExpressionException e) {
// seems model error, write to log
DeploymentCore.log(e);
} catch (CoreException e) {
DeploymentCore.log(e);
} catch (TransformerFactoryConfigurationError e) {
DeploymentCore.log(e);
} catch (TransformerException e) {
DeploymentCore.log(e);
}
}
public IFile getMappingFile() {
return getFile().getParent().getFile(new Path(MappingModelFactory.DEPLOYMENT_PROPERTIES));
}
}