/* * 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; } }