/*******************************************************************************
* Copyright © 2008, 2013 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
*
*******************************************************************************/
package org.eclipse.edt.ide.core.internal.dependency;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import org.eclipse.core.runtime.IPath;
import org.eclipse.edt.compiler.internal.core.builder.BuildException;
public class SerializationManager {
private static final SerializationManager INSTANCE = new SerializationManager();
private SerializationManager(){}
public static SerializationManager getInstance(){
return INSTANCE;
}
public void serialize(IPath outputPath, HashMap value) throws IOException{
outputPath.removeLastSegments(1).toFile().mkdirs();
DataOutputStream outputStream = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(outputPath.toFile())));
try{
outputStream.writeInt(value.size());
for (Iterator iter = value.keySet().iterator(); iter.hasNext();) {
IDependencyGraphValue entryName = (IDependencyGraphValue)iter.next();
outputStream.writeInt(entryName.getKind());
entryName.serialize(outputStream);
IDependencyGraphEntry entry = (IDependencyGraphEntry)value.get(entryName);
outputStream.writeInt(entry.getKind());
entry.serialize(outputStream);
}
}finally{
outputStream.close();
}
}
public HashMap deserialize(IPath inputPath) throws IOException{
HashMap result = null;
File file = inputPath.toFile();
if(file.exists()){
DataInputStream inputStream = new DataInputStream(new BufferedInputStream(new FileInputStream(file)));
result = new HashMap();
try{
int numEntries = inputStream.readInt();
for(int i=0; i < numEntries; i++){
// Get the Entry Key
int valueKind = inputStream.readInt();
IDependencyGraphValue entryKey;
switch(valueKind){
case IDependencyGraphValue.FUNCTION:
entryKey = new Function();
break;
case IDependencyGraphValue.PART:
entryKey = new Part();
break;
case IDependencyGraphValue.QUALIFIED_NAME:
entryKey = new QualifiedName();
break;
case IDependencyGraphValue.SIMPLE_NAME:
entryKey = new SimpleName();
break;
default:
throw new BuildException("Invalid Graph Value Kind");
}
entryKey.deserialize(inputStream);
// Get the Entry
int entryKind = inputStream.readInt();
IDependencyGraphEntry entry;
switch(entryKind){
case IDependencyGraphEntry.DEPENDENCY_ENTRY:
entry = new DependencyEntry();
break;
case IDependencyGraphEntry.QUALIFIED_NAME_DEPENDENT_ENTRY:
entry = new QualifiedNameDependentEntry();
break;
case IDependencyGraphEntry.SIMPLE_NAME_DEPENDENT_ENTRY:
entry = new SimpleNameDependentEntry();
break;
case IDependencyGraphEntry.FUNCTION_ENTRY:
entry = new FunctionEntry();
break;
default:
throw new BuildException("Invalid Graph Entry Kind");
}
entry.deserialize(inputStream);
result.put(entryKey, entry);
}
}finally{
inputStream.close();
}
}
return result;
}
}