/******************************************************************************* * 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.util.*; import org.eclipse.swt.widgets.Display; import org.jboss.tools.common.model.*; import org.jboss.tools.common.meta.action.XAction; import org.jboss.tools.common.meta.action.XActionInvoker; import org.jboss.tools.common.meta.action.impl.handlers.*; import org.jboss.tools.common.meta.impl.XMetaDataConstants; import org.jboss.tools.common.model.loaders.EntityRecognizerContext; import org.jboss.tools.common.model.util.*; public class CreateFileHandler extends DefaultCreateHandler { public void executeHandler(XModelObject object, Properties prop) throws XModelException { if(!isEnabled(object) || data == null || data.length == 0) return; Properties p = extractProperties(data[0]); String defaultExtention = getDefaultExtension(prop); validateNameAndExtension(action, p, defaultExtention); XModelObject parent = getParentFolder(object, p); String ext = p.getProperty(XModelObjectConstants.ATTR_NAME_EXTENSION); String entity = action.getProperty(XMetaDataConstants.ENTITY); if(entity == null) { entity = (ext != null) ? object.getModel().getEntityRecognizer().getEntityName(new EntityRecognizerContext(ext)) : data[0].getModelEntity().getName(); if(entity == null || object.getModel().getMetaData().getEntity(entity) == null) entity = data[0].getModelEntity().getName(); } setOtherProperties(object, p); XModelObject c = XModelObjectLoaderUtil.createValidObject(object.getModel(), entity, p); c = modifyCreatedObject(c); if(parent.isActive()) { addCreatedObject(parent, c, p); } else { addCreatedObject(parent, c, false, p); XModelObject po = (XModelObject)p.get("parentObject"); //$NON-NLS-1$ XModelObject co = (XModelObject)p.get("childObject"); //$NON-NLS-1$ addCreatedObject(po, co, p); } if(parent instanceof FolderImpl) { FolderImpl f = (FolderImpl)parent; f.saveChild(c); } final XModelObject q = c; if(q != null) Display.getDefault().asyncExec(new Runnable() { public void run() { XActionInvoker.invoke("Open", q, new Properties()); //$NON-NLS-1$ } }); } private String getDefaultExtension(Properties prop) { String ext = (prop == null) ? null : prop.getProperty("defaultExtention"); //$NON-NLS-1$ return (ext == null) ? null : ext; } public static void validateNameAndExtension(XAction action, Properties p, String defaultExtention) { String name = p.getProperty(XModelObjectConstants.ATTR_NAME); String ext = defaultExtention; String path = null; int i = name.lastIndexOf('.'); if(i > 0) { String es = action.getProperty("extensions"); //$NON-NLS-1$ String xext = name.substring(i + 1); if(es == null || es.length() == 0 || es.indexOf("." + xext + ".") >= 0) { //$NON-NLS-1$ //$NON-NLS-2$ ext = xext; name = name.substring(0, i); } } name = name.replace('\\', '/'); i = name.lastIndexOf('/'); if(i >= 0) { path = name.substring(0, i); name = name.substring(i + 1); } p.setProperty(XModelObjectConstants.ATTR_NAME, name); if(ext != null) p.setProperty(XModelObjectConstants.ATTR_NAME_EXTENSION, ext); if(path != null) p.setProperty("path", path); //$NON-NLS-1$ } private XModelObject getParentFolder(XModelObject object, Properties p) throws XModelException { String path = p.getProperty("path"); //$NON-NLS-1$ if(path == null || path.length() == 0) return object; StringTokenizer st = new StringTokenizer(path, XModelObjectConstants.SEPARATOR); while(st.hasMoreTokens()) { String pp = st.nextToken(); XModelObject c = object.getChildByPath(pp); if(c == null) { c = object.getModel().createModelObject("FileFolder", null); //$NON-NLS-1$ c.setAttributeValue(XModelObjectConstants.ATTR_NAME, pp); p.put("parentObject", object); //$NON-NLS-1$ p.put("childObject", c); //$NON-NLS-1$ return createFolder(c, st); } else if(!"FileFolder".equals(c.getModelEntity().getName())) { //$NON-NLS-1$ throw new XModelException("Cannot create folder " + pp + " in " + object.getPathPart()); } else { object = c; } } return object; } private XModelObject createFolder(XModelObject object, StringTokenizer path) throws XModelException { while(path.hasMoreTokens()) { String pp = path.nextToken(); XModelObject c = object.getModel().createModelObject("FileFolder", null); //$NON-NLS-1$ c.setAttributeValue(XModelObjectConstants.ATTR_NAME, pp); object.addChild(c); object = c; } return object; } }