/*******************************************************************************
* Copyright (c) 2006-2007 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are 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:
* IBM Corporation - initial API and implementation
* IBM Research
*******************************************************************************/
package com.ibm.research.tours.serializer;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Vector;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.CoreException;
import com.ibm.research.tours.ITimeLimit;
import com.ibm.research.tours.ITour;
import com.ibm.research.tours.ITourElement;
import com.ibm.research.tours.ITourElementListener;
import com.ibm.research.tours.ITourListener;
import com.ibm.research.tours.ToursPlugin;
class XMLTour implements ITour
{
private class TourElementListener implements ITourElementListener
{
public void elementChanged(ITourElement element)
{
fireTourChangedEvent();
}
}
private TourElementListener fTourElementListener = new TourElementListener();
private String fTitle;
private String fDescription;
private String fAuthor;
private Date fDate;
private ITimeLimit fTimeLimit;
private List<ITourElement> fElements;
private List<ITourListener> fListeners;
private IFile fFile;
private String fID;
public XMLTour(String title, String description, String author) {
this.fTitle = title;
this.fDescription = description;
this.fAuthor = author;
setID(generateUniqueID(title));
}
public String getTitle()
{
if(fTitle == null)
fTitle = new String();
return fTitle;
}
public void setTitle(String title)
{
if(!getTitle().equals(title))
{
fTitle = title;
fireTourChangedEvent();
}
}
public String getDescription()
{
if(fDescription == null)
fDescription = new String();
return fDescription;
}
public void setDescription(String description)
{
fDescription = description;
fireTourChangedEvent();
}
public String getAuthor()
{
if(fAuthor == null)
fAuthor = new String();
return fAuthor;
}
public void setAuthor(String author)
{
fAuthor = author;
fireTourChangedEvent();
}
public Date getDate()
{
return fDate;
}
public void setDate(Date date)
{
fDate = date;
fireTourChangedEvent();
}
public void addElements(int index, ITourElement[] elements)
{
if(elements == null || (elements != null &&elements.length == 0))
return;
if(index < 0 || index > getElementCount())
return;
final Vector<ITourElement> added = new Vector<ITourElement>();
int insertionIndex = index;
for(ITourElement element : elements)
{
if(element!=null)
{
// If not already in the tour
if(!getElementList().contains(element))
{
getElementList().add(insertionIndex,element);
element.addTourElementListener(fTourElementListener);
added.add(element);
insertionIndex = insertionIndex + 1;
}
}
}
if(!added.isEmpty())
{
ToursPlugin.getDefault().getEventDispatcher().dispatch(new Runnable()
{
public void run()
{
for(ITourListener listener : getListeners())
listener.elementsAdded(XMLTour.this,added.toArray(new ITourElement[0]));
}
});
}
}
public void addElements(ITourElement[] elements)
{
if(elements == null || (elements != null &&elements.length == 0))
return;
final Vector<ITourElement> added = new Vector<ITourElement>();
for(ITourElement element : elements)
{
// If not already in the tour
if(!getElementList().contains(element))
{
getElementList().add(element);
element.addTourElementListener(fTourElementListener);
added.add(element);
}
}
if(!added.isEmpty())
{
ToursPlugin.getDefault().getEventDispatcher().dispatch(new Runnable()
{
public void run()
{
for(ITourListener listener : getListeners())
listener.elementsAdded(XMLTour.this,added.toArray(new ITourElement[0]));
}
});
}
}
public ITourElement getElement(int index)
{
return getElementList().get(index);
}
public void removeElements(ITourElement[] elements)
{
if(elements == null || (elements != null &&elements.length == 0))
return;
final Vector<ITourElement> removed = new Vector<ITourElement>();
for(ITourElement element : elements)
{
// check and remove
if(getElementList().remove(element))
{
element.removeTourElementListener(fTourElementListener);
removed.add(element);
}
}
if(!removed.isEmpty())
{
ToursPlugin.getDefault().getEventDispatcher().dispatch(new Runnable()
{
public void run()
{
for(ITourListener listener : getListeners())
listener.elementsRemoved(XMLTour.this,removed.toArray(new ITourElement[0]));
}
});
}
}
public ITourElement removeElement(int index)
{
final ITourElement element = getElementList().remove(index);
if(element!=null)
{
element.removeTourElementListener(fTourElementListener);
ToursPlugin.getDefault().getEventDispatcher().dispatch(new Runnable()
{
public void run()
{
for(ITourListener listener : getListeners())
listener.elementsRemoved(XMLTour.this,new ITourElement[]{element});
}
});
}
return element;
}
protected List<ITourElement> getElementList()
{
if(fElements == null)
fElements = new ArrayList<ITourElement>();
return fElements;
}
protected List<ITourListener> getListeners()
{
if(fListeners == null)
fListeners = new ArrayList<ITourListener>();
return fListeners;
}
public ITourElement[] getElements()
{
return getElementList().toArray(new ITourElement[0]);
}
public int getElementCount()
{
return getElementList().size();
}
public void fireTourChangedEvent()
{
ToursPlugin.getDefault().getEventDispatcher().dispatch(new Runnable()
{
public void run()
{
for(ITourListener listener: getListeners())
{
listener.tourChanged(XMLTour.this);
}
}
});
}
public void addTourListener(ITourListener listener, boolean getCatchupEvents)
{
if(listener!=null && !getListeners().contains(listener))
{
getListeners().add(listener);
if(getElementCount() > 0 && getCatchupEvents)
{
ToursPlugin.getDefault().getEventDispatcher().dispatch(new Runnable()
{
public void run()
{
for(ITourListener listener : getListeners())
listener.elementsAdded(XMLTour.this,getElementList().toArray(new ITourElement[0]));
}
});
}
}
}
public void removeTourListener(ITourListener listener)
{
getListeners().remove(listener);
}
public boolean contins(ITourElement element)
{
return getElementList().contains(element);
}
public int getIndex(ITourElement element)
{
return getElementList().indexOf(element);
}
public ITourElement setElement(int index, ITourElement element)
{
return getElementList().set(index, element);
}
// Write the tour to the file specified
public void write(IFile file) throws Exception
{
fFile = file;
TourSerializer.write(file,this);
}
// Read tour information from the file specified
public void read(IFile file) throws CoreException {
fFile = file;
// Ensure everything comes in fresh
setTitle(null);
setDescription(null);
setAuthor(null);
setTimeLimit(null);
setDate(null);
clear();
TourSerializer.read(file,this);
}
public void clear()
{
removeElements(getElementList().toArray(new ITourElement[0]));
}
public void setTimeLimit(ITimeLimit limit)
{
if(fTimeLimit == null && limit !=null)
{
if(limit !=null)
{
fTimeLimit = limit;
fireTourChangedEvent();
}
}
else if(fTimeLimit!=null && !fTimeLimit.equals(limit))
{
fTimeLimit = limit;
fireTourChangedEvent();
}
}
public ITimeLimit getTimeLimit()
{
return fTimeLimit;
}
public IFile getFile() {
return fFile;
}
public void setID(String uniqueID) {
this.fID = uniqueID;
}
public String getID() {
return fID;
}
/**
*
* @return
*/
private static String generateUniqueID(String title) {
String titleID = title.replaceAll("\\s+", "");
titleID = titleID.replaceAll("\\.", "");
titleID = titleID.replaceAll("\\(", "");
titleID = titleID.replaceAll("\\)", "");
return titleID + "." + System.currentTimeMillis();
}
}