package name.abuchen.portfolio.ui.handlers;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.lang.reflect.InvocationTargetException;
import java.nio.charset.StandardCharsets;
import java.util.Map;
import java.util.MissingResourceException;
import java.util.ResourceBundle;
import java.util.stream.Collectors;
import javax.inject.Inject;
import javax.inject.Named;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.e4.core.di.annotations.Execute;
import org.eclipse.e4.ui.di.UISynchronize;
import org.eclipse.e4.ui.model.application.MApplication;
import org.eclipse.e4.ui.model.application.ui.basic.MPart;
import org.eclipse.e4.ui.model.application.ui.basic.MPartStack;
import org.eclipse.e4.ui.services.IServiceConstants;
import org.eclipse.e4.ui.workbench.modeling.EModelService;
import org.eclipse.e4.ui.workbench.modeling.EPartService;
import org.eclipse.e4.ui.workbench.modeling.EPartService.PartState;
import org.eclipse.jface.dialogs.ProgressMonitorDialog;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.swt.widgets.Shell;
import name.abuchen.portfolio.model.Classification;
import name.abuchen.portfolio.model.Client;
import name.abuchen.portfolio.model.ClientFactory;
import name.abuchen.portfolio.model.Taxonomy;
import name.abuchen.portfolio.model.Taxonomy.Visitor;
import name.abuchen.portfolio.model.TaxonomyTemplate;
import name.abuchen.portfolio.ui.PortfolioPlugin;
import name.abuchen.portfolio.ui.UIConstants;
import name.abuchen.portfolio.util.ProgressMonitorInputStream;
import name.abuchen.portfolio.util.TokenReplacingReader;
import name.abuchen.portfolio.util.TokenReplacingReader.ITokenResolver;
public class OpenSampleHandler
{
@Inject
private UISynchronize sync;
private static final ResourceBundle RESOURCES = ResourceBundle
.getBundle("name.abuchen.portfolio.ui.parts.samplemessages"); //$NON-NLS-1$
@Execute
public void execute(
@Named(IServiceConstants.ACTIVE_SHELL) Shell shell, //
final MApplication app, //
final EPartService partService, final EModelService modelService,
@Named(UIConstants.Parameter.SAMPLE_FILE) final String sampleFile)
{
try
{
IRunnableWithProgress loadResourceOperation = new IRunnableWithProgress()
{
@Override
public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException
{
try (InputStream in = this.getClass().getResourceAsStream(sampleFile))
{
InputStream inputStream = new ProgressMonitorInputStream(in, monitor);
Reader replacingReader = new TokenReplacingReader(new InputStreamReader(inputStream,
StandardCharsets.UTF_8), buildResourcesTokenResolver());
final Client client = ClientFactory.load(replacingReader);
fixTaxonomyLabels(client);
sync.asyncExec(() -> {
MPart part = partService.createPart(UIConstants.Part.PORTFOLIO);
part.setLabel(sampleFile.substring(sampleFile.lastIndexOf('/') + 1));
part.getTransientData().put(Client.class.getName(), client);
MPartStack stack = (MPartStack) modelService.find(UIConstants.PartStack.MAIN, app);
stack.getChildren().add(part);
partService.showPart(part, PartState.ACTIVATE);
});
}
catch (IOException ignore)
{
PortfolioPlugin.log(ignore);
}
}
};
new ProgressMonitorDialog(shell).run(true, true, loadResourceOperation);
}
catch (InvocationTargetException | InterruptedException e)
{
PortfolioPlugin.log(e);
}
}
protected void fixTaxonomyLabels(Client client)
{
for (Taxonomy taxonomy : client.getTaxonomies())
{
TaxonomyTemplate template = TaxonomyTemplate.byId(taxonomy.getId());
if (template != null)
applyTaxonomyLabels(template, taxonomy);
}
}
private void applyTaxonomyLabels(TaxonomyTemplate template, Taxonomy taxonomy)
{
Taxonomy original = template.buildOriginal();
taxonomy.setName(original.getName());
taxonomy.setDimensions(original.getDimensions());
Map<String, Classification> translated = original.getAllClassifications() //
.stream().collect(Collectors.toMap(c -> c.getId(), c -> c));
taxonomy.foreach(new Visitor()
{
@Override
public void visit(Classification classification)
{
Classification t = translated.get(classification.getId());
if (t != null)
{
classification.setName(t.getName());
classification.setNote(t.getNote());
}
}
});
}
private static ITokenResolver buildResourcesTokenResolver()
{
return new ITokenResolver()
{
@Override
public String resolveToken(String tokenName)
{
try
{
return RESOURCES.getString(tokenName);
}
catch (MissingResourceException e)
{
return tokenName;
}
}
};
}
}