summaryrefslogtreecommitdiff
path: root/cpp/src/Slice/JavaUtil.cpp
diff options
context:
space:
mode:
authorBernard Normier <bernard@zeroc.com>2009-01-23 17:07:21 -0500
committerBernard Normier <bernard@zeroc.com>2009-01-23 17:07:21 -0500
commit2380e089401d048490da23bc6d71e5687bafbe47 (patch)
tree6d97052d1f93bc2bafcd7fd1a9ebe103544b6cad /cpp/src/Slice/JavaUtil.cpp
parentFixed permissions (diff)
parent3.3.1 third-party updates (diff)
downloadice-2380e089401d048490da23bc6d71e5687bafbe47.tar.bz2
ice-2380e089401d048490da23bc6d71e5687bafbe47.tar.xz
ice-2380e089401d048490da23bc6d71e5687bafbe47.zip
Merge branch 'R3_3_branch' of cvs:/home/git/ice into R3_3_branch
Conflicts: java/resources/IceGridAdmin/icegridadmin_content_dyn.html java/resources/IceGridAdmin/icegridadmin_content_static.html
Diffstat (limited to 'cpp/src/Slice/JavaUtil.cpp')
-rw-r--r--cpp/src/Slice/JavaUtil.cpp82
1 files changed, 43 insertions, 39 deletions
diff --git a/cpp/src/Slice/JavaUtil.cpp b/cpp/src/Slice/JavaUtil.cpp
index 3f35bf1af32..b67f36055a4 100644
--- a/cpp/src/Slice/JavaUtil.cpp
+++ b/cpp/src/Slice/JavaUtil.cpp
@@ -1,18 +1,21 @@
// **********************************************************************
//
-// Copyright (c) 2003-2008 ZeroC, Inc. All rights reserved.
+// Copyright (c) 2003-2009 ZeroC, Inc. All rights reserved.
//
// This copy of Ice is licensed to you under the terms described in the
// ICE_LICENSE file included in this distribution.
//
// **********************************************************************
+#include <IceUtil/DisableWarnings.h>
#include <Slice/JavaUtil.h>
-#include <Slice/SignalHandler.h>
+#include <Slice/FileTracker.h>
#include <IceUtil/Functional.h>
+#include <IceUtil/DisableWarnings.h>
#include <sys/types.h>
#include <sys/stat.h>
+#include <string.h>
#ifdef _WIN32
#include <direct.h>
@@ -27,20 +30,6 @@ using namespace Slice;
using namespace IceUtil;
using namespace IceUtilInternal;
-//
-// Callback for Crtl-C signal handling
-//
-static Slice::JavaGenerator* _javaGen = 0;
-
-static void closeCallback()
-{
- if(_javaGen != 0)
- {
- _javaGen->close();
- }
-}
-
-
Slice::JavaOutput::JavaOutput()
{
}
@@ -55,7 +44,7 @@ Slice::JavaOutput::JavaOutput(const char* s) :
{
}
-bool
+void
Slice::JavaOutput::openClass(const string& cls, const string& prefix)
{
string package;
@@ -96,6 +85,13 @@ Slice::JavaOutput::openClass(const string& cls, const string& prefix)
result = stat(path.c_str(), &st);
if(result == 0)
{
+ if(!(st.st_mode & S_IFDIR))
+ {
+ ostringstream os;
+ os << "failed to create package directory `" << path
+ << "': file already exists and is not a directory";
+ throw FileException(__FILE__, __LINE__, os.str());
+ }
continue;
}
#ifdef _WIN32
@@ -105,8 +101,11 @@ Slice::JavaOutput::openClass(const string& cls, const string& prefix)
#endif
if(result != 0)
{
- return false;
+ ostringstream os;
+ os << "cannot create directory `" << path << "': " << strerror(errno);
+ throw FileException(__FILE__, __LINE__, os.str());
}
+ FileTracker::instance()->addDirectory(path);
}
while(pos != string::npos);
}
@@ -124,11 +123,11 @@ Slice::JavaOutput::openClass(const string& cls, const string& prefix)
path += "/";
}
path += file;
- SignalHandler::addFile(path);
open(path.c_str());
if(isOpen())
{
+ FileTracker::instance()->addFile(path);
printHeader();
if(!package.empty())
@@ -139,11 +138,13 @@ Slice::JavaOutput::openClass(const string& cls, const string& prefix)
print(package.c_str());
print(";");
}
-
- return true;
}
-
- return false;
+ else
+ {
+ ostringstream os;
+ os << "cannot open file `" << path << "': " << strerror(errno);
+ throw FileException(__FILE__, __LINE__, os.str());
+ }
}
void
@@ -152,7 +153,7 @@ Slice::JavaOutput::printHeader()
static const char* header =
"// **********************************************************************\n"
"//\n"
-"// Copyright (c) 2003-2008 ZeroC, Inc. All rights reserved.\n"
+"// Copyright (c) 2003-2009 ZeroC, Inc. All rights reserved.\n"
"//\n"
"// This copy of Ice is licensed to you under the terms described in the\n"
"// ICE_LICENSE file included in this distribution.\n"
@@ -174,7 +175,6 @@ Slice::JavaGenerator::JavaGenerator(const string& dir) :
_dir(dir),
_out(0)
{
- SignalHandler::setCallback(closeCallback);
}
Slice::JavaGenerator::JavaGenerator(const string& dir, Slice::FeatureProfile profile) :
@@ -186,26 +186,31 @@ Slice::JavaGenerator::JavaGenerator(const string& dir, Slice::FeatureProfile pro
Slice::JavaGenerator::~JavaGenerator()
{
+ // If open throws an exception other generators could be left open
+ // during the stack unwind.
+ if(_out != 0)
+ {
+ close();
+ }
assert(_out == 0);
}
-bool
+void
Slice::JavaGenerator::open(const string& absolute)
{
assert(_out == 0);
JavaOutput* out = createOutput();
- if(out->openClass(absolute, _dir))
+ try
{
- _out = out;
- _javaGen = this; // For Ctrl-C handling
+ out->openClass(absolute, _dir);
}
- else
+ catch(const FileException&)
{
delete out;
+ throw;
}
-
- return _out != 0;
+ _out = out;
}
void
@@ -215,7 +220,6 @@ Slice::JavaGenerator::close()
*_out << nl;
delete _out;
_out = 0;
- _javaGen = 0; // For Ctrl-C handling
}
Output&
@@ -3422,7 +3426,7 @@ Slice::JavaGenerator::MetaDataVisitor::visitModuleStart(const ModulePtr& p)
if(!ok)
{
- cout << file << ": warning: ignoring invalid global metadata `" << s << "'" << endl;
+ cerr << file << ": warning: ignoring invalid global metadata `" << s << "'" << endl;
}
}
_history.insert(s);
@@ -3478,7 +3482,7 @@ Slice::JavaGenerator::MetaDataVisitor::visitOperation(const OperationPtr& p)
ClassDefPtr cl = ClassDefPtr::dynamicCast(p->container());
if(!cl->isLocal())
{
- cout << p->definitionContext()->filename() << ":" << p->line()
+ cerr << p->definitionContext()->filename() << ":" << p->line()
<< ": warning: metadata directive `UserException' applies only to local operations "
<< "but enclosing " << (cl->isInterface() ? "interface" : "class") << "`" << cl->name()
<< "' is not local" << endl;
@@ -3494,7 +3498,7 @@ Slice::JavaGenerator::MetaDataVisitor::visitOperation(const OperationPtr& p)
{
if(q->find("java:type:", 0) == 0)
{
- cout << p->definitionContext()->filename() << ":" << p->line()
+ cerr << p->definitionContext()->filename() << ":" << p->line()
<< ": warning: invalid metadata for operation" << endl;
break;
}
@@ -3593,7 +3597,7 @@ Slice::JavaGenerator::MetaDataVisitor::getMetaData(const ContainedPtr& cont)
continue;
}
- cout << file << ":" << cont->line() << ": warning: ignoring invalid metadata `" << s << "'" << endl;
+ cerr << file << ":" << cont->line() << ": warning: ignoring invalid metadata `" << s << "'" << endl;
}
_history.insert(s);
@@ -3626,7 +3630,7 @@ Slice::JavaGenerator::MetaDataVisitor::validateType(const SyntaxTreeBasePtr& p,
assert(b);
str = b->typeId();
}
- cout << file << ":" << line << ": warning: invalid metadata for " << str << endl;
+ cerr << file << ":" << line << ": warning: invalid metadata for " << str << endl;
}
}
}
@@ -3656,7 +3660,7 @@ Slice::JavaGenerator::MetaDataVisitor::validateGetSet(const SyntaxTreeBasePtr& p
assert(b);
str = b->typeId();
}
- cout << file << ":" << line << ": warning: invalid metadata for " << str << endl;
+ cerr << file << ":" << line << ": warning: invalid metadata for " << str << endl;
}
}
}