summaryrefslogtreecommitdiff
path: root/cpp/src
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/src')
-rw-r--r--cpp/src/Slice/JavaUtil.cpp100
-rw-r--r--cpp/src/slice2java/Gen.cpp87
2 files changed, 185 insertions, 2 deletions
diff --git a/cpp/src/Slice/JavaUtil.cpp b/cpp/src/Slice/JavaUtil.cpp
index e124b33292d..533342a6593 100644
--- a/cpp/src/Slice/JavaUtil.cpp
+++ b/cpp/src/Slice/JavaUtil.cpp
@@ -11,6 +11,7 @@
#include <Slice/JavaUtil.h>
#include <Slice/FileTracker.h>
#include <Slice/Util.h>
+#include <Slice/MD5.h>
#include <IceUtil/Functional.h>
#include <IceUtil/DisableWarnings.h>
@@ -31,6 +32,100 @@ using namespace Slice;
using namespace IceUtil;
using namespace IceUtilInternal;
+long
+Slice::computeSerialVersionUUID(const ClassDefPtr& p)
+{
+ ostringstream os;
+
+ ClassList bases = p->bases();
+ os << "Name: " << p->scoped();
+
+ os << " Bases: [";
+ for(ClassList::const_iterator i = bases.begin(); i != bases.end();)
+ {
+ os << (*i)->scoped();
+ i++;
+ if(i != l.end())
+ {
+ os << ", ";
+ }
+ }
+ os << "]";
+
+ os << " Members: [";
+ DataMemberList members = p->dataMembers();
+ for(DataMemberList::const_iterator i = members.begin(); i != members.end();)
+ {
+ os << (*i)->name() << ":" << (*i)->type();
+ i++;
+ if(i != l.end())
+ {
+ os << ", ";
+ }
+ }
+ os << "]";
+
+ const string data = os.str();
+ MD5 md5(reinterpret_cast<const unsigned char*>(data.c_str()), static_cast<int>(data.size()));
+ vector<unsigned char> bytes;
+ bytes.resize(16);
+ md5.getDigest(reinterpret_cast<unsigned char*>(&bytes[0]));
+
+ long h0 = 0;
+ long h1 = 0;
+ for(int i = 0; i < 8; ++i)
+ {
+ h0 |= (long)bytes[i] << (i * 4);
+ }
+ if(h0)
+
+ for(int i = 0; i < 8; ++i)
+ {
+ h1 |= (long)bytes[i + 8] << (i * 4);
+ }
+ return abs(h0 ^ h1);
+}
+
+long
+Slice::computeSerialVersionUUID(const StructPtr& p)
+{
+ ostringstream os;
+
+ os << "Name: " << p->scoped();
+ os << " Members: [";
+ DataMemberList members = p->dataMembers();
+ for(DataMemberList::const_iterator i = members.begin(); i != members.end();)
+ {
+ os << (*i)->name() << ":" << (*i)->type();
+ i++;
+ if(i != l.end())
+ {
+ os << ", ";
+ }
+ }
+ os << "]";
+
+ const string data = os.str();
+ MD5 md5(reinterpret_cast<const unsigned char*>(data.c_str()), static_cast<int>(data.size()));
+ vector<unsigned char> bytes;
+ bytes.resize(16);
+ md5.getDigest(reinterpret_cast<unsigned char*>(&bytes[0]));
+
+ long h0 = 0;
+ long h1 = 0;
+ for(int i = 0; i < 8; ++i)
+ {
+ h0 |= (long)bytes[i] << (i * 4);
+ }
+
+ for(int i = 0; i < 8; ++i)
+ {
+ h1 |= (long)bytes[i + 8] << (i * 4);
+ }
+
+ return abs(h0 ^ h1);
+}
+
Slice::JavaOutput::JavaOutput()
{
}
@@ -2829,6 +2924,11 @@ Slice::JavaGenerator::MetaDataVisitor::getMetaData(const ContainedPtr& cont)
result.push_back(s);
continue;
}
+ else if(s.substr(prefix.size(), pos - prefix.size()) == "serialVersionUID")
+ {
+ result.push_back(s);
+ continue;
+ }
emitWarning(cont->file(), cont->line(), "ignoring invalid metadata `" + s + "'");
}
diff --git a/cpp/src/slice2java/Gen.cpp b/cpp/src/slice2java/Gen.cpp
index da876279cd4..70b91db68fb 100644
--- a/cpp/src/slice2java/Gen.cpp
+++ b/cpp/src/slice2java/Gen.cpp
@@ -2567,6 +2567,41 @@ void
Slice::Gen::TypesVisitor::visitClassDefEnd(const ClassDefPtr& p)
{
Output& out = output();
+ out << nl << "public static final long serialVersionUID = ";
+ string serialVersionUID;
+ if(p->findMetaData("java:serialVersionUID", serialVersionUID))
+ {
+ string::size_type pos = serialVersionUID.rfind(":") + 1;
+ if(pos == string::npos)
+ {
+ ostringstream os;
+ os << "Invalid serialVersionUID for class `" << p->scoped() << "' default to slice2java generated value.";
+ emitWarning("", "", os.str());
+ out << computeSerialVersionUUID(p);
+ }
+ else
+ {
+ long v = 0;
+ serialVersionUID = serialVersionUID.substr(pos);
+ if(serialVersionUID != "0")
+ {
+ v = atol(serialVersionUID.c_str());
+ if(v == 0) // conversion error
+ {
+ ostringstream os;
+ os << "Invalid serialVersionUID for class `" << p->scoped() << "' default to slice2java generated value.";
+ emitWarning("", "", os.str());
+ out << computeSerialVersionUUID(p);
+ }
+ }
+ out << v;
+ }
+ }
+ else
+ {
+ out << computeSerialVersionUUID(p);
+ }
+ out << "L;";
out << eb;
close();
}
@@ -3311,6 +3346,43 @@ Slice::Gen::TypesVisitor::visitStructEnd(const StructPtr& p)
out << eb;
}
}
+
+ out << nl;
+ out << nl << "public static final long serialVersionUID = ";
+ string serialVersionUID;
+ if(p->findMetaData("java:serialVersionUID", serialVersionUID))
+ {
+ string::size_type pos = serialVersionUID.rfind(":") + 1;
+ if(pos == string::npos)
+ {
+ ostringstream os;
+ os << "Invalid serialVersionUID for struct `" << p->scoped() << "' default to slice2java generated value.";
+ emitWarning("", "", os.str());
+ out << computeSerialVersionUUID(p);
+ }
+ else
+ {
+ long v = 0;
+ serialVersionUID = serialVersionUID.substr(pos);
+ if(serialVersionUID != "0")
+ {
+ v = atol(serialVersionUID.c_str());
+ if(v == 0) // conversion error
+ {
+ ostringstream os;
+ os << "Invalid serialVersionUID for struct `" << p->scoped() << "' default to slice2java generated value.";
+ emitWarning("", "", os.str());
+ out << computeSerialVersionUUID(p);
+ }
+ }
+ out << v;
+ }
+ }
+ else
+ {
+ out << computeSerialVersionUUID(p);
+ }
+ out << "L;";
out << eb;
close();
@@ -4426,8 +4498,14 @@ Slice::Gen::HelperVisitor::visitClassDefStart(const ClassDefPtr& p)
out << nl << "return null;";
out << eb;
}
-
+
+ //
+ // Avoid serialVersionUID warnings for Proxy Helper classes.
+ //
+ out << nl;
+ out << nl << "public static final long serialVersionUID = 0L;";
out << eb;
+
close();
if(_stream)
@@ -5382,7 +5460,12 @@ Slice::Gen::DispatcherVisitor::visitClassDefStart(const ClassDefPtr& p)
out << eb;
writeDispatchAndMarshalling(out, p, _stream);
-
+
+ //
+ // Avoid serialVersionUID warnings for dispatch classes.
+ //
+ out << nl;
+ out << nl << "public static final long serialVersionUID = 0L;";
out << eb;
close();