/* Copyright (C) 2006 Christian Schneider
*
* This file is part of Nomad.
*
* Nomad is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* Nomad 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Nomad; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
package net.sf.nmedit.jpatch.impl;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import net.sf.nmedit.jpatch.ModuleDescriptions;
import net.sf.nmedit.jpatch.PConnectorDescriptor;
import net.sf.nmedit.jpatch.PDescriptor;
import net.sf.nmedit.jpatch.PLightDescriptor;
import net.sf.nmedit.jpatch.PModuleDescriptor;
import net.sf.nmedit.jpatch.PParameterDescriptor;
/**
* The reference implementation of interface {@link PModuleDescriptor}.
* @author Christian Schneider
*/
public class PBasicModuleDescriptor extends PBasicDescriptor
implements PModuleDescriptor//, Serializable
{
private static final long serialVersionUID = 5166147655672576230L;
private List<PParameterDescriptor> parameters;
private List<PConnectorDescriptor> connectors;
private List<PLightDescriptor> lights;
private transient Map<Object, PDescriptor> componentIdMap;
private transient ModuleDescriptions modules;
public PBasicModuleDescriptor(ModuleDescriptions modules, String name, Object componentId)
{
this(modules, name, componentId, false);
}
public void setModuleDescriptions(ModuleDescriptions modules)
{
this.modules = modules;
}
public PBasicModuleDescriptor(ModuleDescriptions modules, String name, Object componentId, boolean setComponents)
{
super(name, componentId);
this.modules = modules;
if (!setComponents)
{
parameters = new ArrayList<PParameterDescriptor>(1);
connectors = new ArrayList<PConnectorDescriptor>(1);
lights = new ArrayList<PLightDescriptor>(0);
}
}
public void setParameters(Collection<PParameterDescriptor> c)
{
parameters = new ArrayList<PParameterDescriptor>(c);
for (int i=parameters.size()-1;i>=0;i--)
parameters.get(i).setDescriptorIndex(i);
}
public void setConnectors(Collection<PConnectorDescriptor> c)
{
connectors = new ArrayList<PConnectorDescriptor>(c);
for (int i=connectors.size()-1;i>=0;i--)
connectors.get(i).setDescriptorIndex(i);
}
public void setLights(Collection<PLightDescriptor> c)
{
lights = new ArrayList<PLightDescriptor>(c);
for (int i=lights.size()-1;i>=0;i--)
lights.get(i).setDescriptorIndex(i);
}
public ModuleDescriptions getModules()
{
return modules;
}
public void addLightDescriptor(PLightDescriptor descriptor)
{
int index = lights.size();
lights.add(index, descriptor);
descriptor.setDescriptorIndex(index);
}
public void addParameterDescriptor(PParameterDescriptor descriptor)
{
int index = parameters.size();
parameters.add(index, descriptor);
descriptor.setDescriptorIndex(index);
}
public void addConnectorDescriptor(PConnectorDescriptor descriptor)
{
int index = connectors.size();
connectors.add(index, descriptor);
descriptor.setDescriptorIndex(index);
}
public PLightDescriptor getLightDescriptor(int index)
{
return lights.get(index);
}
public int getLightDescriptorCount()
{
return lights.size();
}
public PConnectorDescriptor getConnectorDescriptor(int index)
{
return connectors.get(index);
}
public int getConnectorDescriptorCount()
{
return connectors.size();
}
public PParameterDescriptor getParameterDescriptor(int index)
{
return parameters.get(index);
}
public int getParameterDescriptorCount()
{
return parameters.size();
}
public int getLimit()
{
return getIntAttribute("limit", -1);
}
public PDescriptor getComponentByComponentId(Object id)
{
if (componentIdMap == null)
{
int dc = getParameterDescriptorCount()+getConnectorDescriptorCount()+getLightDescriptorCount();
componentIdMap = new HashMap<Object, PDescriptor>(dc*2);
for (PDescriptor d: parameters) putComponentInMap(d);
for (PDescriptor d: connectors) putComponentInMap(d);
for (PDescriptor d: lights) putComponentInMap(d);
}
return componentIdMap.get(id);
}
private void putComponentInMap(PDescriptor c)
{
componentIdMap.put(c.getComponentId(), c);
}
public String getCategory()
{
return getStringAttribute("category");
}
public boolean isInstanciable()
{
return getBooleanAttribute("instantiable", true);
}
/*
private void writeObject(java.io.ObjectOutputStream out) throws IOException
{
out.defaultWriteObject();
Map<Object, Object> extensions = null;
for (PParameterDescriptor parameter: parameters)
{
if (parameter instanceof PBasicParameterDescriptor)
{
PParameterDescriptor extension = parameter.getExtensionDescriptor();
if (extension != null)
{
if (extensions == null)
extensions = new HashMap<Object, Object>();
extensions.put(parameter.getComponentId(), extension.getComponentId());
}
}
}
if (extensions == null)
out.writeInt(0); // size
else
{
out.writeInt(extensions.size());
for (Entry<Object, Object> e: extensions.entrySet())
{
out.writeObject(e.getKey());
out.writeObject(e.getValue());
}
}
}
private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException
{
in.defaultReadObject();
int extSize = in.readInt(); // extensions
for (int i=0;i<extSize;i++)
{
Object src = in.readObject();
Object dst = in.readObject();
PParameterDescriptor psrc = getParameterByComponentId(src);
PParameterDescriptor pdst = getParameterByComponentId(dst);
((PBasicParameterDescriptor)psrc).setExtensionDescriptor(pdst);
}
for (PLightDescriptor d: lights)
{
if (d instanceof PBasicLightDescriptor)
((PBasicLightDescriptor)d).setParent(this);
}
for (PParameterDescriptor d: parameters)
{
if (d instanceof PBasicParameterDescriptor)
((PBasicParameterDescriptor)d).setParent(this);
}
for (PConnectorDescriptor d: connectors)
{
if (d instanceof PBasicConnectorDescriptor)
((PBasicConnectorDescriptor)d).setParent(this);
}
}
*/
}