/**
* <copyright>
*
* Copyright (c) 2002-2006 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 - Initial API and implementation
*
* </copyright>
*
* $Id: RoseLoader.java,v 1.7 2006/12/28 06:56:06 marcelop Exp $
*/
package com.sap.emf.importer.moin.rose.parser;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.resource.URIConverter;
import com.sap.emf.importer.moin.rose.RoseImporterPlugin;
/**
* A loader that creates Buffered Reader.
*
*/
public class RoseLoader extends RoseComponent
{
public static final String PROGRESS = "ROSE_LOADER_PROGRESS";
protected boolean valid;
protected BufferedReader bufferedReader;
protected long length = 0;
protected long currentLength = 0;
protected int progressIncrement = 10;
protected int oldValue;
protected int lower = 0;
protected int upper = 100;
public RoseLoader(String fileName, URIConverter uriConverter) throws Exception
{
try
{
if (!fileName.startsWith("\\\\"))
{
fileName = Util.updateFileName(fileName, "\\\\");
}
fileName = Util.updateFileName(fileName, "\\");
fileName = Util.updateFileName(fileName, "/");
bufferedReader = new BufferedReader(new FileReader(fileName));
valid = true;
length = (new File(fileName)).length();
currentLength = 0;
oldValue = lower;
}
catch (Exception exception)
{
Pattern pattern = Pattern.compile(".*/([^/]*?)(?:_)?[0-9.]*/((src/)?model/[^/]*\\.cat)$");
Matcher matcher = pattern.matcher(fileName.replaceAll("\\\\", "/"));
if (matcher.matches())
{
String name = matcher.group(1);
String tail = matcher.group(2);
InputStream inputStream = null;
try
{
inputStream = uriConverter.createInputStream(URI.createPlatformResourceURI(name + "/" + tail, true));
}
catch (Exception resourceException)
{
try
{
inputStream = uriConverter.createInputStream(URI.createPlatformPluginURI(name + "/" + tail, true));
}
catch (Exception pluginException)
{
// Ignore
}
}
if (inputStream != null)
{
bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
valid = true;
length = inputStream.available();
currentLength = 0;
oldValue = lower;
}
else
{
RoseImporterPlugin.INSTANCE.log(exception);
}
}
else
{
RoseImporterPlugin.INSTANCE.log(exception);
}
}
}
public boolean isValid()
{
return valid;
}
public void setProgressIncrement(int progressIncrement)
{
this.progressIncrement = progressIncrement;
}
public void setLower(int lower)
{
this.lower = lower;
oldValue = lower;
}
public int getLower()
{
return lower;
}
public void setUpper(int upper)
{
this.upper = upper;
}
public int getUpper()
{
return upper;
}
public String readLine()
{
try
{
String line = bufferedReader.readLine();
if (line != null)
{
currentLength += line.length();
if (length > 0)
{
int newValue = lower + (int)(currentLength * (upper - lower) / length);
if (newValue >= oldValue + progressIncrement && newValue < upper)
{
firePropertyChange(PROGRESS, oldValue, newValue);
oldValue = newValue;
}
}
}
return line;
}
catch (Exception e)
{
return null;
}
}
public void close() throws IOException
{
if (bufferedReader != null)
{
bufferedReader.close();
}
}
}