/******************************************************************************* * Copyright (c) 2007 Exadel, Inc. and Red Hat, Inc. * Distributed under license by Red Hat, Inc. All rights reserved. * This program is made available under the terms of the * Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Exadel, Inc. and Red Hat, Inc. - initial API and implementation ******************************************************************************/ package org.jboss.tools.common.model.filesystems.impl; import java.io.File; import java.util.Properties; import org.jboss.tools.common.meta.action.impl.handlers.DefaultCreateHandler; import org.jboss.tools.common.meta.action.impl.handlers.DefaultRemoveHandler; import org.jboss.tools.common.model.XModel; import org.jboss.tools.common.model.XModelException; import org.jboss.tools.common.model.XModelObjectConstants; import org.jboss.tools.common.model.XModelObject; import org.jboss.tools.common.model.XModelObjectConstants; import org.jboss.tools.common.model.loaders.EntityRecognizerContext; import org.jboss.tools.common.model.loaders.XObjectLoader; import org.jboss.tools.common.model.undo.XTransactionUndo; import org.jboss.tools.common.model.undo.XUndoManager; import org.jboss.tools.common.model.util.FindObjectHelper; import org.jboss.tools.common.model.util.XModelObjectLoaderUtil; import org.jboss.tools.common.util.FileUtil; public class ExtensionChange { private XModelObject file = null; private String extension = null; public ExtensionChange() {} public boolean execute(XModelObject file, String extension) { this.file = file; this.extension = extension; return execute(); } private boolean execute() { XModel model = file.getModel(); String entity = model.getEntityRecognizer().getEntityName(new EntityRecognizerContext(extension)); String oldEntity = file.getModelEntity().getName(); String body = __body(); if(body == null) return false; if("FileAny".equals(entity)) { if(XModelObjectConstants.ENT_FILE_ANY_LONG.equals(oldEntity)) return false; if(FileUtil.isText(body)) entity = "FileTXT"; else return false; } else if(entity == null) { entity = model.getEntityRecognizer().getEntityName(new EntityRecognizerContext(extension, body)); } if(entity == null || model.getMetaData().getEntity(entity) == null) entity = "FileAny"; if(file.getModelEntity().getName().equals(entity)) return false; XModelObject o = createFileObject(entity, body); if(o == null) return false; if(o.getModelEntity().getAttribute(XModelObjectConstants.ATTR_NAME__FILE) != null && file.getModelEntity().getAttribute(XModelObjectConstants.ATTR_NAME__FILE) != null) { o.set(XModelObjectConstants.ATTR_NAME__FILE, file.get(XModelObjectConstants.ATTR_NAME__FILE)); } XUndoManager undo = model.getUndoManager(); String d = "Change extension " + file.getParent().getAttributeValue(XModelObjectConstants.ATTR_NAME); XTransactionUndo u = new XTransactionUndo(d, XTransactionUndo.EDIT); undo.addUndoable(u); try { XModelObject p = file.getParent(); DefaultRemoveHandler.removeFromParent(file); DefaultCreateHandler.addCreatedObject(p, o, FindObjectHelper.IN_NAVIGATOR_ONLY); } catch (XModelException e) { undo.rollbackTransactionInProgress(); return false; } finally { u.commit(); } return true; } private String __body() { XObjectLoader loader = XModelObjectLoaderUtil.getObjectLoader(file); if(loader != null) { file.setModified(true); loader.save(file); return XModelObjectLoaderUtil.getTempBody(file); } else if(file.getModelEntity().getAttribute(XModelObjectConstants.ATTR_NAME__FILE) != null) { String sfn = file.get(XModelObjectConstants.ATTR_NAME__FILE); if(sfn.length() == 0) return null; File sf = new File(sfn); return (sf.isFile()) ? FileUtil.readFile(sf) : null; } else { return file.getAttributeValue(XModelObjectConstants.ATTR_NAME_BODY); } } private XModelObject createFileObject(String entity, String body) { Properties p = new Properties(); p.setProperty(XModelObjectConstants.ATTR_NAME, file.getAttributeValue(XModelObjectConstants.ATTR_NAME)); p.setProperty(XModelObjectConstants.ATTR_NAME_EXTENSION, extension); XModelObject c = file.getModel().createModelObject(entity, p); XObjectLoader loader = XModelObjectLoaderUtil.getObjectLoader(c); if(loader != null) { XModelObjectLoaderUtil.setTempBody(c, body); loader.load(c); } else { c.setAttributeValue(XModelObjectConstants.ATTR_NAME_BODY, body); } return c; } }