// ============================================================================
//
// Copyright (C) 2006-2016 Talend Inc. - www.talend.com
//
// This source code is available under agreement available at
// %InstallDIR%\features\org.talend.rcp.branding.%PRODUCTNAME%\%PRODUCTNAME%license.txt
//
// You should have received a copy of the agreement
// along with this program; if not, write to Talend SA
// 9 rue Pages 92150 Suresnes, France
//
// ============================================================================
package com.amalto.workbench.editors.xsdeditor;
import java.io.ByteArrayInputStream;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IProjectDescription;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.NullProgressMonitor;
import com.amalto.workbench.i18n.Messages;
import com.amalto.workbench.models.TreeObject;
import com.amalto.workbench.utils.EXtentisObjects;
import com.amalto.workbench.webservices.WSDataModel;
public class XSDEditorUtil {
private static Log log = LogFactory.getLog(XSDEditorUtil.class);
private static String getXObjectPath(TreeObject xobject) {
String name = xobject.getDisplayName().replace(" ", "");//$NON-NLS-1$//$NON-NLS-2$
if (xobject.getParent().getDisplayName().startsWith(EXtentisObjects.DataMODEL.getDisplayName())) {
// the datamodel root
return xobject.getParent().getDisplayName().replace(" ", "") + "/" + name;//$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$
} else {
return getXObjectPath(xobject.getParent()) + "/" + name;//$NON-NLS-1$
}
}
public static IFile createFile(TreeObject xobject) throws Exception {
WSDataModel wsDataModel = (WSDataModel) xobject.getWsObject();
if (wsDataModel == null) {
return null;
}
String filename = xobject.getDisplayName().replace(" ", "") + ".xsd";//$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$
String content = wsDataModel.getXsdSchema();
IProject project = createProject(xobject);
String path = getXObjectPath(xobject);
int pos = path.indexOf('/');
String folder = path.substring(0, pos);
IFolder fold = project.getFolder(folder);
if (!fold.exists()) {
fold.create(true, true, null);
}
IFile file = fold.getFile(filename);
if (!file.exists()) {
file.create(new ByteArrayInputStream(content.getBytes("utf-8")), IFile.FORCE, null);//$NON-NLS-1$
} else {
sycFileContents(file, content);
}
return file;
}
private static void sycFileContents(IFile file, String content) throws Exception {
if (file.exists()) {
file.setContents(new ByteArrayInputStream(content.getBytes("utf-8")), IFile.FORCE, new NullProgressMonitor());//$NON-NLS-1$
}
}
private static boolean isEditorOpened(TreeObject xobject) throws Exception {
WSDataModel wsDataModel = (WSDataModel) xobject.getWsObject();
String filename = xobject.getDisplayName().replace(" ", "") + ".xsd";//$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$
String content = wsDataModel.getXsdSchema();
IProject project = createProject(xobject);
String path = getXObjectPath(xobject);
int pos = path.indexOf('/');
String folder = path.substring(0, pos);
IFolder fold = project.getFolder(folder);
if (!fold.exists()) {
fold.create(true, true, null);
}
IFile file = fold.getFile(filename);
if (!file.exists()) {
return true;
}
return false;
}
public static IProject createProject(TreeObject xobject) {
IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
String projectname = xobject.getServerRoot().getDisplayName().trim().replace("://", "").replace("/", "").replace(" ", "")//$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$//$NON-NLS-4$//$NON-NLS-5$//$NON-NLS-6$
.replace(":", "");//$NON-NLS-1$//$NON-NLS-2$
IProject prj = root.getProject(projectname);
if (prj.exists()) {
try {
prj.open(null);
} catch (CoreException e) {
log.error(e.getMessage(), e);
}
return prj;
}
final IWorkspace workspace = ResourcesPlugin.getWorkspace();
final IProjectDescription desc = workspace.newProjectDescription(projectname);
desc.setNatureIds(new String[] { "org.talend.mdm.schema.nature" });//$NON-NLS-1$
desc.setComment(Messages.XSDEditorUtil_Comment);
try {
prj.create(desc, null);
prj.open(IResource.BACKGROUND_REFRESH, null);
} catch (CoreException e) {
log.error(e.getMessage(), e);
}
return prj;
}
}