/*
* Project Info: http://jcae.sourceforge.net
*
* This program is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
* details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation, Inc.,
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
*
* (C) Copyright 2005-2009, by EADS France
*/
package org.jcae.netbeans.mesh;
import java.beans.XMLDecoder;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import org.jcae.netbeans.Utilities;
import org.openide.ErrorManager;
import org.openide.filesystems.FileObject;
import org.openide.filesystems.FileUtil;
import org.openide.loaders.DataObjectExistsException;
import org.openide.loaders.FileEntry;
import org.openide.loaders.MultiDataObject;
import org.openide.loaders.MultiDataObject.Entry;
import org.openide.loaders.MultiFileLoader;
import org.openide.util.NbBundle;
public class AmibeDataLoader extends MultiFileLoader
{
public static final String REQUIRED_MIME = "text/mesh+xml";
private static final long serialVersionUID = 1L;
private static Map<FileObject, Mesh> primaryToMesh = new HashMap<FileObject, Mesh>();
public AmibeDataLoader()
{
super("org.jcae.netbeans.mesh.AmibeDataObject");
}
@Override
protected String defaultDisplayName()
{
return NbBundle.getMessage(AmibeDataLoader.class, "LBL_Mesh_loader_name");
}
@Override
protected FileObject findPrimaryFile(FileObject arg0) {
FileObject toReturn = null;
if(REQUIRED_MIME.equals(arg0.getMIMEType()))
{
toReturn = addMapEntry(arg0);
}
else if(isjCAEDirectory(arg0))
{
toReturn = arg0;
}
else if("oemm".equals(arg0.getExt()) && arg0.isFolder())
{
toReturn = addMapEntry(arg0.getParent().getFileObject(arg0.getName()+"_mesh.xml"));
}
return toReturn;
}
@Override
protected MultiDataObject createMultiObject(FileObject primaryFile)
throws DataObjectExistsException
{
Mesh m = primaryToMesh.remove(primaryFile);
if(m == null)
m = new Mesh(primaryFile.getNameExt());
return new AmibeDataObject(primaryFile, this, m);
}
@Override
protected String actionsContext()
{
return "Loaders/" + REQUIRED_MIME + "/Actions";
}
@Override
protected Entry createSecondaryEntry(MultiDataObject obj, FileObject secondaryFile) {
return new FileEntry(obj, secondaryFile);
}
@Override
protected Entry createPrimaryEntry(MultiDataObject obj, FileObject primaryFile) {
return new FileEntry(obj, primaryFile);
}
private boolean isjCAEDirectory(FileObject arg0) {
if(arg0.isFolder())
return arg0.getFileObject("jcae3d") != null;
else
return false;
}
/**
*
* @param arg0 secondary file (.xml)
* @return primary file (amibe.dir)
*/
private FileObject addMapEntry(FileObject secondaryFile)
{
File fp = FileUtil.toFile(secondaryFile.getParent());
if(fp == null)
//will happen if the FileObject is a template
return null;
Mesh m = createMesh(secondaryFile);
FileObject primaryFile = FileUtil.toFileObject(
new File(Utilities.absoluteFileName(m.getMeshFile(), fp.getPath())));
primaryToMesh.put(primaryFile, m);
return primaryFile;
}
private static Mesh createMesh(FileObject file)
{
InputStream in=null;
Mesh toReturn;
try
{
in=file.getInputStream();
XMLDecoder decoder=new XMLDecoder(in);
toReturn=(Mesh)decoder.readObject();
}
catch (Exception ex)
{
ErrorManager.getDefault().log(ex.getMessage());
String name=Utilities.getFreeName(file.getParent(), "amibe",".dir");
toReturn = new Mesh(name);
}
finally
{
if(in!=null)
try
{
in.close();
}
catch (IOException ex)
{
ErrorManager.getDefault().notify(ex);
}
}
return toReturn;
}
}