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