/**
SpagoBI, the Open Source Business Intelligence suite
Copyright (C) 2012 Engineering Ingegneria Informatica S.p.A. - SpagoBI Competency Center
This Source Code Form is subject to the terms of the Mozilla Public
License, v. 2.0. If a copy of the MPL was not distributed with this file,
You can obtain one at http://mozilla.org/MPL/2.0/.
**/
package it.eng.spagobi.studio.core.services.resources;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathFactory;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.QualifiedName;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.ui.PlatformUI;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.NodeList;
public class ResourcesHandler {
private static Logger logger = LoggerFactory.getLogger(ResourcesHandler.class);
public boolean deleteResources(ISelection selection){
logger.debug("IN");
IStructuredSelection structuredSelection = (IStructuredSelection)selection;
List<Object> selectedObjects = structuredSelection.toList();
boolean delete = MessageDialog.openConfirm(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), "Delete Resource", "Confirm deleting resource(s)");
if(delete){
for (Object selectedObject : selectedObjects) {
if(selectedObject instanceof IResource){
IResource res = (IResource) selectedObject;
deleteResource(res);
}
}
}
logger.debug("OUT");
return true;
}
public boolean deleteResource(IResource resource) {
try{
if ((resource.getFileExtension()!= null ) && (resource.getFileExtension().equals("sbimodel"))){
deleteModelResource(resource);
} else {
resource.delete(true, null);
logger.debug("resource [" + resource.getName() + "] succesfully deleted ");
}
}
catch (Exception e) {
logger.error("Error in deleting the resource", e);
MessageDialog.openError(
PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell()
, "Error", "Error in deleting the resource; try deleting it from resource navigato view");
}
return true;
}
public boolean deleteModelResource(IResource modelResource) {
try {
String modelName = null;
try {
modelName = getModelName(modelResource);
} catch(Throwable t) {
logger.warn("Impossible to delete resources related to model stored in file [" + modelResource.getRawLocation().toFile() + "]");
}
modelResource.delete(true, null);
if(modelName != null) {
deleteModelMappingFolder(modelResource, modelName);
deleteModelQueries(modelResource, modelName);
}
logger.debug("resource cancelled " + modelResource.getName());
} catch (Exception e) {
logger.error("Error in deleting the resource", e);
MessageDialog.openError(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), "Error", "Error in deleting the resource; try deleting it from resource navigato view");
}
return true;
}
public void deleteModelQueries(IResource modelResource, String modelName) {
List<IResource> projectResources = getProjectResource(modelResource.getProject()) ;
for ( IResource projectResource : projectResources ) {
if ((projectResource.getFileExtension()!= null) && ( projectResource.getFileExtension().equals("metaquery"))){
String queryFileModelName = null;
try {
queryFileModelName = projectResource.getPersistentProperty(new QualifiedName("it.eng.spagobi.meta.editor.modelId", "modelId"));
} catch (CoreException e) {
logger.warn("Impossible to read the value of property [modelId] from query ["+ projectResource.getName() + "]");
}
if(modelName.equals(queryFileModelName)){
try {
projectResource.delete(true, null);
} catch (Throwable t) {
logger.warn("Impossible ro delete query ["+ projectResource.getName() + "]");
}
}
}
}
}
public void deleteModelMappingFolder(IResource modelResource, String modelName) {
File parentDirectory = modelResource.getParent().getRawLocation().toFile();
File mappingDirectory = new File(parentDirectory, modelName);
if (deleteDir(mappingDirectory)){
logger.debug("Mapping folder of model [" + modelName + "] deleted succesfully");
try {
modelResource.getParent().refreshLocal(IResource.DEPTH_INFINITE, null);
} catch(Throwable t) {
logger.warn("Impossibe to refresh contents of folder [" + parentDirectory + "] after the deletion its subfolder [" + mappingDirectory + "] ");
}
} else {
logger.warn("Impossible to delete mapping folder of model [" + modelName + "]");
}
}
public String getModelName(IResource resources) {
File modelFile;
String modelName;
logger.debug("IN");
modelFile = null;
modelName = null;
try {
modelFile = resources.getRawLocation().toFile();
DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
domFactory.setNamespaceAware(true);
DocumentBuilder builder = domFactory.newDocumentBuilder();
Document doc = builder.parse(modelFile);
XPath xpath = XPathFactory.newInstance().newXPath();
XPathExpression expr = xpath.compile("//*[@name]");
Object result = expr.evaluate(doc, XPathConstants.NODESET);
NodeList nodes = (NodeList) result;
if (nodes.getLength()>0) {
//get the first node (root)
NamedNodeMap nodeAttributes = nodes.item(1).getAttributes();
if (nodeAttributes != null) {
//retrieve Metamodel Name
modelName = nodeAttributes.getNamedItem("name").getNodeValue();
}
}
return modelName;
} catch(Throwable t) {
throw new RuntimeException("Impossible to read model name from file [" + modelFile + "]. Please check if it is a valid .sbimodel file");
} finally {
logger.debug("OUT");
}
}
public List<IResource> getProjectResource(IProject project) {
List<IResource> projectContents = new ArrayList<IResource>();
try {
IResource[] projectMembers = project.members();
getFolderChildren(Arrays.asList(projectMembers), projectContents);
} catch (CoreException e) {
e.printStackTrace();
}
return projectContents;
}
public void getFolderChildren(List<IResource> levelElements, List<IResource> allContents){
allContents.addAll(levelElements);
try {
for (IResource resource : levelElements){
if (resource.getType() == IResource.FOLDER){
IResource[] folderMembers = ((IFolder)resource).members();
if (folderMembers.length > 0){
getFolderChildren( Arrays.asList(folderMembers), allContents );
}
}
}
return;
} catch (CoreException e){
e.printStackTrace();
}
}
// Deletes all files and subdirectories under dir.
// Returns true if all deletions were successful.
// If a deletion fails, the method stops attempting to delete and returns false.
public static boolean deleteDir(File dir) {
if (dir.isDirectory()) {
String[] children = dir.list();
for (int i=0; i<children.length; i++) {
boolean success = deleteDir(new File(dir, children[i]));
if (!success) {
return false;
}
}
}
// The directory is now empty so delete it
return dir.delete();
}
}