/*
* Copyright (c) 2012 Google Inc.
*
* 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
*/
package com.google.eclipse.protobuf.cdt.actions;
import static org.eclipse.xtext.util.Strings.isEmpty;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.StringReader;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.core.model.ITranslationUnit;
import org.eclipse.cdt.internal.ui.editor.CEditor;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.ui.IEditorPart;
import com.google.inject.Singleton;
/**
* @author alruiz@google.com (Alex Ruiz)
*/
@SuppressWarnings("restriction")
@Singleton class ProtoFilePathFinder {
private static final Pattern PROTO_PATH_PATTERN = Pattern.compile("// source: (.*)");
IPath findProtoFilePathIn(IEditorPart editor) {
CEditor cEditor = (CEditor) editor;
String contents = contentsOf(cEditor);
if (isEmpty(contents)) {
return null;
}
String line = null;
int lineCounter = 0;
BufferedReader reader = new BufferedReader(new StringReader(contents));
try {
while ((line = reader.readLine()) != null) {
switch (lineCounter) {
case 0:
if (!"// Generated by the protocol buffer compiler. DO NOT EDIT!".equals(line)) {
return null;
}
lineCounter++;
break;
case 1:
return pathFrom(line);
}
}
} catch (IOException e) {}
return null;
}
private String contentsOf(CEditor cEditor) {
ICElement input = cEditor.getInputCElement();
if (input instanceof ITranslationUnit) {
ITranslationUnit translationUnit = (ITranslationUnit) input;
return new String(translationUnit.getContents());
}
return null;
}
private IPath pathFrom(String line) {
Matcher matcher = PROTO_PATH_PATTERN.matcher(line);
if (!matcher.matches()) {
return null;
}
String path = matcher.group(1);
return (!isEmpty(path)) ? Path.fromOSString(path) : null;
}
}