Fixed: [Issue 21] ProtobufQualifiedNameProvider assumes package names do not contain dots.
http://code.google.com/p/protobuf-dt/issues/detail?id=21
We split package names into segments and verify that the qualified name contains all the segments of the package name.
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/naming/ProtobufQualifiedNameProvider.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/naming/ProtobufQualifiedNameProvider.java
index 2019edc..5e77a2f 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/naming/ProtobufQualifiedNameProvider.java
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/naming/ProtobufQualifiedNameProvider.java
@@ -28,14 +28,32 @@
/** {@inheritDoc} */
@Override public QualifiedName getFullyQualifiedName(EObject obj) {
- QualifiedName fqn = super.getFullyQualifiedName(obj);
- if (fqn == null || obj instanceof Package) return fqn;
+ QualifiedName qualifiedName = super.getFullyQualifiedName(obj);
+ if (qualifiedName == null || obj instanceof Package) return qualifiedName;
Package p = finder.findPackage(obj);
- if (p == null) return fqn;
- List<String> segments = new ArrayList<String>(fqn.getSegments());
+ if (p == null) return qualifiedName;
+ List<String> newQualifiedNameSegments = new ArrayList<String>();
+ List<String> qualifiedNameSegments = qualifiedName.getSegments();
String packageName = p.getName();
- if (packageName != null && !segments.isEmpty() && !packageName.equals(segments.get(0)))
- segments.add(0, packageName);
- return QualifiedName.create(segments.toArray(new String[segments.size()]));
+ if (packageName != null) {
+ String[] packageNameSegments = packageName.split("\\.");
+ if (!qualifiedNameContainsPackageName(qualifiedNameSegments, packageNameSegments)) {
+ // add package to the new FQN
+ for (String packageSegment : packageNameSegments) newQualifiedNameSegments.add(packageSegment);
+ }
+ }
+ newQualifiedNameSegments.addAll(qualifiedNameSegments);
+ return QualifiedName.create(newQualifiedNameSegments.toArray(new String[newQualifiedNameSegments.size()]));
+ }
+
+ private boolean qualifiedNameContainsPackageName(List<String> qualifiedNameSegments, String[] packageNameSegments) {
+ int fqnLength = qualifiedNameSegments.size();
+ int packageSegmentCount = packageNameSegments.length;
+ if (fqnLength <= packageSegmentCount) return false;
+ for (int i = 0; i < fqnLength; i++) {
+ if (i == packageSegmentCount) break;
+ if (!qualifiedNameSegments.get(i).equals(packageNameSegments[i])) return false;
+ }
+ return true;
}
}