Skip to content
GitLab
Explore
Sign in
Register
Primary navigation
Search or go to…
Project
S
SnapArchivingServers
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Iterations
Wiki
Requirements
Jira
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Locked files
Build
Pipelines
Jobs
Pipeline schedules
Test cases
Artifacts
Deploy
Releases
Package registry
Container registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Code review analytics
Issue analytics
Insights
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
GitLab community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Software Control System
Tango controls archiving
SnapArchivingServers
Commits
f8086df0
Commit
f8086df0
authored
Sep 6, 2011
by
Gwenaelle ABEILLE
Browse files
Options
Downloads
Patches
Plain Diff
release
parent
0b720cbf
No related branches found
No related tags found
No related merge requests found
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
SnapExtractor.java
+1082
-0
1082 additions, 0 deletions
SnapExtractor.java
with
1082 additions
and
0 deletions
SnapExtractor.java
0 → 100644
+
1082
−
0
View file @
f8086df0
//+============================================================================
//$Source: /cvsroot/tango-cs/tango/jserver/snapshoting/SnapExtractor/SnapExtractor.java,v $
//project : Tango Device Server
//Description: java source code for the SnapExtractor class and its commands.
//This class is derived from DeviceImpl class.
//It represents the CORBA servant obbject which
//will be accessed from the network. All commands which
//can be executed on the SnapExtractor are implemented
//in this file.
//$Author: soleilarc $
//$Revision: 1.16 $
//$Log: SnapExtractor.java,v $
//Revision 1.16 2007/10/15 15:14:53 soleilarc
//Author: XP
//Mantis bug ID: 6256
//Comment:
//In the init_device method, put the call to get_device_property method at the beginning.
//In the get_device_property method, the values of the table propnames must be DbUser and DbPassword, instead of SnapUser and SnapPassword.
//Revision 1.15 2007/05/11 13:58:55 pierrejoseph
//Attribute addition : release version
//Revision 1.14 2007/03/14 15:47:01 ounsy
//passes its user and password to the APIs
//Revision 1.13 2007/03/02 07:54:57 ounsy
//extend DeviceImpl instead of DeviceImplWithShutdownRunnable
//Revision 1.12 2006/12/06 10:16:02 ounsy
//minor changes
//Revision 1.11 2006/11/20 09:38:54 ounsy
//minor changes
//Revision 1.10 2006/11/13 15:58:06 ounsy
//all java devices now inherit from UnexportOnShutdownDeviceImpl instead of from DeviceImpl
//Revision 1.9 2006/10/31 16:54:15 ounsy
//milliseconds and null values management
//Revision 1.8 2006/04/12 15:47:03 ounsy
//organized imports
//Revision 1.7 2006/04/12 08:40:35 ounsy
//cleaned the code and added a better error logging
//Revision 1.6 2006/03/29 11:35:12 ounsy
//small modification of the remove_dyn_attrs method so that in case the removal of an attribute fails, the others are still removed
//Revision 1.5 2006/03/27 13:58:18 ounsy
//added the commands removeAllDynAttr et removeDynAttrs
//Revision 1.4 2006/03/14 13:05:16 ounsy
//corrected the SNAP/spectrums/RW problem
//about the read and write values having the same length
//Revision 1.3 2006/03/08 16:31:13 ounsy
//added the global POGO class comments for the devices SnapExtractor
//Revision 1.2 2006/03/08 14:36:42 ounsy
//added pogo comments
//Revision 1.1 2006/02/07 13:03:52 ounsy
//moved from the Archiving package
//Revision 1.2 2006/02/06 13:11:20 ounsy
//corrected a bug for WO attributes
//Revision 1.1 2006/01/27 14:39:14 ounsy
//new device for snap extracting
//copyleft : European Synchrotron Radiation Facility
//BP 220, Grenoble 38043
//FRANCE
//-============================================================================
//This file is generated by POGO
//(Program Obviously used to Generate tango Object)
//(c) - Software Engineering Group - ESRF
//=============================================================================
package
SnapExtractor
;
import
org.omg.CORBA.SystemException
;
import
org.omg.CORBA.UserException
;
import
fr.esrf.Tango.AttrDataFormat
;
import
fr.esrf.Tango.AttrWriteType
;
import
fr.esrf.Tango.DevFailed
;
import
fr.esrf.Tango.DevState
;
import
fr.esrf.Tango.DevVarLongStringArray
;
import
fr.esrf.TangoApi.DbDatum
;
import
fr.esrf.TangoDs.Attr
;
import
fr.esrf.TangoDs.Attribute
;
import
fr.esrf.TangoDs.DeviceClass
;
import
fr.esrf.TangoDs.DeviceImpl
;
import
fr.esrf.TangoDs.Except
;
import
fr.esrf.TangoDs.ImageAttr
;
import
fr.esrf.TangoDs.SpectrumAttr
;
import
fr.esrf.TangoDs.TangoConst
;
import
fr.esrf.TangoDs.TimedAttrData
;
import
fr.esrf.TangoDs.Util
;
import
fr.soleil.commonarchivingapi.ArchivingTools.Tools.DbData
;
import
fr.soleil.snapArchivingApi.SnapExtractorApi.convert.ConverterFactory
;
import
fr.soleil.snapArchivingApi.SnapExtractorApi.convert.IConverter
;
import
fr.soleil.snapArchivingApi.SnapExtractorApi.datasources.db.ISnapReader
;
import
fr.soleil.snapArchivingApi.SnapExtractorApi.datasources.db.SnapReaderFactory
;
import
fr.soleil.snapArchivingApi.SnapExtractorApi.devicelink.Warnable
;
import
fr.soleil.snapArchivingApi.SnapExtractorApi.naming.DynamicAttributeNamerFactory
;
import
fr.soleil.snapArchivingApi.SnapExtractorApi.naming.IDynamicAttributeNamer
;
import
fr.soleil.snapArchivingApi.SnapExtractorApi.tools.Tools
;
import
fr.soleil.snapArchivingApi.SnapManagerApi.SnapManagerApi
;
import
fr.soleil.snapArchivingApi.SnapshotingTools.Tools.SnapAttributeExtract
;
import
fr.soleil.snapArchivingApi.SnapshotingTools.Tools.SnapshotingException
;
/**
* Class Description: This device is in charge of extracting snapshots from the
* SNAP database. It can look up the snapshots for a given context, and extract
* those snapshots.
*
* @author $Author: soleilarc $
* @version $Revision: 1.16 $
*/
// --------- Start of States Description ----------
/*
* Device States Description: DevState.ON : DevState.OFF : DevState.INIT :
* DevState.FAULT : DevState.EXTRACT : DevState.UNKNOWN :
*/
// --------- End of States Description ----------
public
class
SnapExtractor
extends
DeviceImpl
/* WithShutdownRunnable */
implements
TangoConst
{
protected
int
state
;
private
final
String
m_version
;
// --------- Start of attributes data members ----------
private
int
id
=
0
;
// --------- End of attributes data members ----------
// --------- Start of properties data members ----------
/**
* User identifier (name) used to connect the database SNAP. <br>
* <b>Default value : </b> snap
*/
String
snapUser
;
/**
* Password used to connect the database SNAP. <br>
* <b>Default value : </b> snap
*/
String
snapPassword
;
// --------- End of properties data members ----------
// Add your own data members here
protected
int
formerState
=
DevState
.
_UNKNOWN
;
private
String
dbHost
;
private
String
dbName
;
private
String
dbSchema
;
private
String
isRac
;
private
ISnapReader
snapReader
;
// --------------------------------------
// =========================================================
/**
* Constructor for simulated Time Device Server.
*
* @param cl
* The DeviceClass object
* @param s
* The Device name.
* @param version
* The device version
*/
// =========================================================
SnapExtractor
(
DeviceClass
cl
,
String
s
,
String
version
)
throws
DevFailed
{
super
(
cl
,
s
);
m_version
=
version
;
init_device
();
}
// =========================================================
/**
* Constructor for simulated Time Device Server.
*
* @param cl
* The DeviceClass object
* @param s
* The Device name.
* @param d
* Device description.
* @param version
* The device version
*/
// =========================================================
SnapExtractor
(
DeviceClass
cl
,
String
s
,
String
d
,
String
version
)
throws
DevFailed
{
super
(
cl
,
s
,
d
);
m_version
=
version
;
init_device
();
}
// =========================================================
/**
* Initialize the device.
*/
// =========================================================
@Override
public
synchronized
void
init_device
()
throws
DevFailed
{
System
.
out
.
println
(
"SnapExtractor() create "
+
device_name
);
// Initialise variables to default values
get_device_property
();
// LifeCycleManagerFactory.setUser(this.snapUser);
// LifeCycleManagerFactory.setPassword(this.snapPassword);
// LifeCycleManager lifeCycleManager = LifeCycleManagerFactory
// .getImpl(LifeCycleManagerFactory.DEFAULT_LIFE_CYCLE);
// lifeCycleManager.setWatcherToWarn(this);
//
// Thread apiThread = lifeCycleManager.getAsThread();
// apiThread.start();
// -------------------------------------------
try
{
// Snap Database connection
SnapManagerApi
.
initSnapConnection
(
dbHost
,
dbName
,
dbSchema
,
snapUser
,
snapPassword
,
isRac
);
snapReader
=
SnapReaderFactory
.
getImpl
(
SnapReaderFactory
.
REAL
);
snapReader
.
openConnection
();
}
catch
(
SnapshotingException
e
)
{
get_logger
().
warn
(
e
.
toString
(),
e
);
throw
e
.
toTangoException
();
}
set_state
(
DevState
.
ON
);
}
// =========================================================
/**
* Execute command "RemoveDynamicAttribute" on device. Remove the dynamic
* attribute specified by its name argin.
*
* @param argin
* The dynamic attribute's name
*/
// =========================================================
public
void
remove_dyn_attr
(
String
argin
)
throws
DevFailed
{
get_logger
().
info
(
"Entering remove_dynamic_attribute()"
);
// ---Add your Own code to control device here ---
// Remove prop for the attribute
String
[]
obj_to_del
=
new
String
[
3
];
obj_to_del
[
0
]
=
device_name
;
obj_to_del
[
1
]
=
"attribute"
;
obj_to_del
[
2
]
=
argin
;
Util
tg
=
Util
.
instance
();
tg
.
get_dserver_device
().
rem_obj_polling
(
obj_to_del
,
false
);
// Remove the attribute
remove_attribute
(
argin
);
get_logger
().
info
(
"Exiting remove_dynamic_attribute()"
);
}
// =========================================================
/**
* Execute command "RemoveDynamicAttributes" on device. Remove the dynamic
* attributes specified by the names list.
*
* @param argin
* The dynamic attributes names
*/
// =========================================================
public
void
remove_dyn_attrs
(
String
[]
argin
)
throws
DevFailed
{
get_logger
().
info
(
"Entering remove_dyn_attrs()"
);
// ---Add your Own code to control device here ---
// Remove prop for the attribute
if
(
argin
==
null
)
{
return
;
}
for
(
int
i
=
0
;
i
<
argin
.
length
;
i
++)
{
try
{
String
[]
obj_to_del
=
new
String
[
3
];
obj_to_del
[
0
]
=
device_name
;
obj_to_del
[
1
]
=
"attribute"
;
obj_to_del
[
2
]
=
argin
[
i
];
Util
tg
=
Util
.
instance
();
tg
.
get_dserver_device
().
rem_obj_polling
(
obj_to_del
,
false
);
// Remove the attribute
this
.
remove_attribute
(
argin
[
i
]);
}
catch
(
Throwable
t
)
{
Tools
.
printIfDevFailed
(
t
);
continue
;
}
}
get_logger
().
info
(
"Exiting remove_dyn_attrs()"
);
}
// =========================================================
/**
* Execute command "RemoveAllDynamicAttribute" on device. Remove all
* existing dynamic attributes.
*
* @param argin
* The dynamic attribute's name
*/
// =========================================================
public
void
remove_all_dyn_attr
()
throws
DevFailed
{
get_logger
().
info
(
"Entering remove_dynamic_attribute()"
);
// ---Add your Own code to control device here ---
int
numberOfAttributes
=
this
.
dev_attr
==
null
?
0
:
this
.
dev_attr
.
get_attr_nb
();
String
[]
attributesToRemove
=
new
String
[
numberOfAttributes
];
for
(
int
i
=
0
;
i
<
numberOfAttributes
;
i
++)
{
Attribute
nextAttribute
=
this
.
dev_attr
.
get_attr_by_ind
(
i
);
String
attributeName
=
nextAttribute
.
get_name
();
// System.out.println ( "CLA/attributeName/"+attributeName);
attributesToRemove
[
i
]
=
attributeName
;
}
this
.
remove_dyn_attrs
(
attributesToRemove
);
}
// ===================================================================
/**
* Read the device properties from database.
*/
// ===================================================================
public
void
get_device_property
()
throws
DevFailed
{
// Initialize your default values here.
// ------------------------------------------
snapUser
=
""
;
snapPassword
=
""
;
dbHost
=
""
;
dbName
=
""
;
dbSchema
=
""
;
isRac
=
""
;
// Read device properties from database.(Automatic code generation)
// -------------------------------------------------------------
if
(
Util
.
_UseDb
==
false
)
{
return
;
}
String
[]
propnames
=
{
"DbUser"
,
"DbPassword"
,
"DbHost"
,
"DbName"
,
"DbSchema"
,
"IsRac"
};
// Call database and extract values
// --------------------------------------------
DbDatum
[]
dev_prop
=
get_db_device
().
get_property
(
propnames
);
SnapExtractorClass
ds_class
=
(
SnapExtractorClass
)
get_device_class
();
int
i
=
-
1
;
// Extract SnapUser value
if
(
dev_prop
[++
i
].
is_empty
()
==
false
)
{
snapUser
=
dev_prop
[
i
].
extractString
();
}
else
{
// Try to get value from class property
DbDatum
cl_prop
=
ds_class
.
get_class_property
(
dev_prop
[
i
].
name
);
if
(
cl_prop
.
is_empty
()
==
false
)
{
snapUser
=
cl_prop
.
extractString
();
}
}
// Extract SnapPassword value
if
(
dev_prop
[++
i
].
is_empty
()
==
false
)
{
snapPassword
=
dev_prop
[
i
].
extractString
();
}
else
{
// Try to get value from class property
DbDatum
cl_prop
=
ds_class
.
get_class_property
(
dev_prop
[
i
].
name
);
if
(
cl_prop
.
is_empty
()
==
false
)
{
snapPassword
=
cl_prop
.
extractString
();
}
}
// Extract DbHost value
if
(
dev_prop
[++
i
].
is_empty
()
==
false
)
{
dbHost
=
dev_prop
[
i
].
extractString
();
}
else
{
// Try to get value from class property
DbDatum
cl_prop
=
ds_class
.
get_class_property
(
dev_prop
[
i
].
name
);
if
(
cl_prop
.
is_empty
()
==
false
)
{
dbHost
=
cl_prop
.
extractString
();
}
}
// Extract DbName value
if
(
dev_prop
[++
i
].
is_empty
()
==
false
)
{
dbName
=
dev_prop
[
i
].
extractString
();
}
else
{
// Try to get value from class property
DbDatum
cl_prop
=
ds_class
.
get_class_property
(
dev_prop
[
i
].
name
);
if
(
cl_prop
.
is_empty
()
==
false
)
{
dbName
=
cl_prop
.
extractString
();
}
}
// Extract DbSchema value
if
(
dev_prop
[++
i
].
is_empty
()
==
false
)
{
dbSchema
=
dev_prop
[
i
].
extractString
();
}
else
{
// Try to get value from class property
DbDatum
cl_prop
=
ds_class
.
get_class_property
(
dev_prop
[
i
].
name
);
if
(
cl_prop
.
is_empty
()
==
false
)
{
dbSchema
=
cl_prop
.
extractString
();
}
}
// Extract IsRac value
if
(
dev_prop
[++
i
].
is_empty
()
==
false
)
{
isRac
=
dev_prop
[
i
].
extractString
();
}
else
{
// Try to get value from class property
DbDatum
cl_prop
=
ds_class
.
get_class_property
(
dev_prop
[
i
].
name
);
if
(
cl_prop
.
is_empty
()
==
false
)
{
isRac
=
cl_prop
.
extractString
();
}
}
// End of Automatic code generation
// -------------------------------------------------------------
}
// =========================================================
/**
* Method always executed before command execution.
*/
// =========================================================
@Override
public
void
always_executed_hook
()
{
// get_logger().info("In always_executed_hook method()");
}
// =========================================================
/**
* Execute command "GetSnap" on device. Loads a snapshot of given ID: if the
* snapshot exists, creates for each one of the snapshot's attributes a
* dynamic attribute for its read part, and, if the attribute isn't
* read-only, for its write part. Returns a table containing, as many times
* as there are attributes for the specified snapshot:
* <UL>
* <LI>the attribute complete name
* <LI>the name of the dynamic attribute containing the attribute's read
* value (if it has one, otherwise blank)
* <LI>the name of the dynamic attribute containing the attribute's write
* value (if it has one, otherwise blank)
* </UL>
*
* @param argin
* the snapshot's ID
* @return A table containing [attrRealName, dynAttrNameR,dynAttrNameW]*n
* @throws DevFailed
*/
// =========================================================
public
synchronized
String
[]
get_snap
(
int
argin
)
throws
DevFailed
{
String
[]
argout
=
new
String
[
5
];
get_logger
().
info
(
"Entering get_snap()"
);
// ---Add your Own code to control device here ---
try
{
SnapAttributeExtract
[]
sae
=
snapReader
.
getSnap
(
argin
);
if
(
sae
==
null
||
sae
.
length
==
0
)
{
Except
.
throw_exception
(
"INPUT_ERROR"
,
"Snapshot ID does not exist"
,
"SnapExtractor.GetSnap"
);
}
// return emptyResult ();
argout
=
this
.
add_attributes
(
sae
);
}
catch
(
Throwable
t
)
{
Tools
.
printIfDevFailed
(
t
);
if
(
t
instanceof
DevFailed
)
{
throw
(
DevFailed
)
t
;
}
}
// ------------------------------------------------
get_logger
().
info
(
"Exiting get_snap()"
);
return
argout
;
}
// =========================================================
/**
* Execute command "GetSnapValue" on device. Loads a snapshot of given ID:
* if the snapshot exists, find if the attribute exists for this snapshot if
* the attribute exists, Returns an attribute value
*
* @param snapID
* the snapshot's ID
* @param attr_name
* the attribute name
* @return the attribute value
* @throws DevFailed
*/
// =========================================================
public
synchronized
String
[]
get_snap_value
(
int
snapID
,
String
attr_name
)
throws
DevFailed
{
get_logger
().
info
(
"Entering get_snap_value()"
);
String
[]
argout
=
{
"NaN"
,
"NaN"
};
// ---Add your Own code to control device here ---
try
{
SnapAttributeExtract
[]
sae
=
snapReader
.
getSnap
(
snapID
);
if
(
sae
==
null
||
sae
.
length
==
0
)
{
return
argout
;
}
int
index
=
getIndexOfAttribute
(
sae
,
attr_name
);
if
(
index
!=
-
1
)
{
argout
=
this
.
get_attribute_value
(
sae
[
index
]);
}
else
{
argout
=
null
;
Except
.
throw_exception
(
"INPUT_ERROR"
,
"Invalid Attribute"
,
"SnapExtractor.GetSnapValue"
);
}
}
catch
(
Throwable
t
)
{
Tools
.
printIfDevFailed
(
t
);
if
(
t
instanceof
DevFailed
)
{
throw
(
DevFailed
)
t
;
}
}
// ------------------------------------------------
get_logger
().
info
(
"Exiting get_snap_value()"
);
return
argout
;
}
// =========================================================
/**
* Execute command "GetSnapID" on device. Loads the list of snapshot' id of
* a given context that respect the given criterion.
*
* @param ctxID
* the context's ID
* @param criterion
* the search criterion
* @return the list of snapshot ids.
* @throws DevFailed
* @throws SnapshotingException
*/
// =========================================================
public
synchronized
int
[]
get_snap_id
(
int
ctxID
,
String
[]
criterions
)
throws
DevFailed
{
get_logger
().
info
(
"Entering get_snap_id()"
);
int
[]
snap_ids
=
snapReader
.
getSnapshotsID
(
ctxID
,
criterions
);
if
(
snap_ids
==
null
)
{
Except
.
throw_exception
(
"INPUT_ERROR"
,
"Invalid Criterions"
,
"SnapExtractor.GetSnapID"
);
}
get_logger
().
info
(
"Exiting get_snaps_id()"
);
return
snap_ids
;
}
// /**
// *
// * @return a String[2] for an invalid attribute name callback
// */
// private String[] getInvalidAttributeName() {
// // TODO Auto-generated method stub
// return new String[]{"Invalid attribute name",""};
// }
/**
*
* @param sae
* : list of SnapAttributeExtract
* @param attr_name
* : the given attribute name
* @return the index of the attribute in the list of SnapAttributeExtract.
*/
private
int
getIndexOfAttribute
(
SnapAttributeExtract
[]
sae
,
String
attr_name
)
{
// TODO Auto-generated method stub
int
index
=
-
1
;
for
(
int
i
=
0
;
i
<
sae
.
length
;
i
++)
{
if
(
sae
[
i
].
getAttribute_complete_name
().
equalsIgnoreCase
(
attr_name
))
{
index
=
i
;
break
;
}
}
return
index
;
}
/**
*
* @param snapAttributeExtract
* @return read_value and write_value
*/
private
synchronized
String
[]
get_attribute_value
(
SnapAttributeExtract
snapAttributeExtract
)
{
// TODO Auto-generated method stub
String
[]
argout
=
{
"NaN"
,
"NaN"
};
try
{
SnapAttributeExtract
currentExtract
=
snapAttributeExtract
;
argout
[
0
]
=
currentExtract
.
valueToString
(
0
);
argout
[
1
]
=
currentExtract
.
valueToString
(
1
);
}
catch
(
Exception
e
)
{
}
return
argout
;
}
/**
* Loads the list of snapshots attached to a given context, specified by its
* ID. Returns a DevVarLongStringArray object, where the array is as long as
* there are many snapshots for the context. The Long part is the snapshot's
* ID, the String part is the concatenation of its Date and Comment fields
* values.
*
* @param argin
* The context ID
* @return The snapshots: [ID, Date + Comment]*n
* @throws DevFailed
*/
public
synchronized
DevVarLongStringArray
get_snaps_for_context
(
int
argin
)
throws
DevFailed
{
get_logger
().
info
(
"Entering get_snaps_for_context()"
);
// ---Add your Own code to control device here ---
DevVarLongStringArray
snapshots
=
snapReader
.
getSnapshotsForContext
(
argin
);
if
(
snapshots
==
null
)
{
return
emptyDevVarLongStringArrayResult
();
}
// ------------------------------------------------
get_logger
().
info
(
"Exiting get_snaps_for_context()"
);
return
snapshots
;
}
/**
* @return
*/
private
DevVarLongStringArray
emptyDevVarLongStringArrayResult
()
{
DevVarLongStringArray
ret
=
new
DevVarLongStringArray
();
int
[]
lvalue
=
new
int
[
1
];
java
.
lang
.
String
[]
svalue
=
new
java
.
lang
.
String
[
1
];
lvalue
[
0
]
=
-
1
;
svalue
[
0
]
=
"NO SNAPSHOT FOR THIS CONTEXT ID"
;
ret
.
lvalue
=
lvalue
;
ret
.
svalue
=
svalue
;
return
ret
;
}
/**
* @return
*/
private
String
[]
emptyResult
()
{
String
[]
argout
=
new
String
[
3
];
argout
[
0
]
=
"NO SUCH SNAPSHOT"
;
argout
[
1
]
=
""
;
argout
[
2
]
=
""
;
return
argout
;
}
// =========================================================
/**
* main part for the device server class
*/
// =========================================================
public
static
void
main
(
String
[]
argv
)
{
try
{
Util
tg
=
Util
.
init
(
argv
,
"SnapExtractor"
);
tg
.
server_init
();
System
.
out
.
println
(
"Ready to accept request"
);
tg
.
server_run
();
}
catch
(
OutOfMemoryError
ex
)
{
System
.
err
.
println
(
"Can't allocate memory !!!!"
);
System
.
err
.
println
(
"Exiting"
);
}
catch
(
UserException
ex
)
{
Except
.
print_exception
(
ex
);
System
.
err
.
println
(
"Received a CORBA user exception"
);
System
.
err
.
println
(
"Exiting"
);
}
catch
(
SystemException
ex
)
{
Except
.
print_exception
(
ex
);
System
.
err
.
println
(
"Received a CORBA system exception"
);
System
.
err
.
println
(
"Exiting"
);
}
System
.
exit
(-
1
);
}
private
String
[]
add_attributes
(
SnapAttributeExtract
[]
sae
)
throws
DevFailed
{
int
numberOfAttributes
=
sae
.
length
;
String
[]
argout
=
new
String
[
3
*
numberOfAttributes
];
int
j
=
0
;
for
(
int
i
=
0
;
i
<
numberOfAttributes
;
i
++)
{
SnapAttributeExtract
currentExtract
=
sae
[
i
];
String
realName
=
currentExtract
.
getAttribute_complete_name
();
// Object val = currentExtract.getValue();
String
[]
names
=
this
.
addAttribute
(
currentExtract
);
String
read_name
=
names
[
0
];
String
write_name
=
names
[
1
];
argout
[
j
]
=
realName
;
argout
[
j
+
1
]
=
read_name
;
argout
[
j
+
2
]
=
write_name
;
j
+=
3
;
}
return
argout
;
}
/**
* @param currentExtract
* @return
* @throws DevFailed
*/
private
String
[]
addAttribute
(
SnapAttributeExtract
currentExtract
)
throws
DevFailed
{
if
(
currentExtract
.
getValue
()
==
null
)
{
String
message
=
"Null value for attribute |"
+
currentExtract
.
getAttribute_complete_name
()
+
"|"
;
this
.
trace
(
message
,
Warnable
.
LOG_LEVEL_WARN
);
return
getErrorNames
(
currentExtract
);
}
IConverter
converter
=
ConverterFactory
.
getImpl
(
ConverterFactory
.
DEFAULT
);
DbData
dbData
=
converter
.
convert
(
currentExtract
);
if
(
dbData
==
null
)
{
String
message
=
"Null DbData for attribute |"
+
currentExtract
.
getAttribute_complete_name
()
+
"| (if the attribute is R/W or is a spectrum, at least one of its value's component is null)"
;
this
.
trace
(
message
,
Warnable
.
LOG_LEVEL_WARN
);
return
getErrorNames
(
currentExtract
);
}
String
[]
names
=
this
.
buildDynamicAttributesNames
(
currentExtract
);
this
.
createDynamicAttribute
(
dbData
,
names
);
return
names
;
}
private
String
[]
getErrorNames
(
SnapAttributeExtract
currentExtract
)
{
String
[]
errorNames
=
new
String
[
2
];
String
name
=
currentExtract
.
getAttribute_complete_name
();
errorNames
[
0
]
=
name
+
"_ERROR"
;
errorNames
[
1
]
=
name
+
"_ERROR"
;
return
errorNames
;
}
/**
* @param currentExtract
* @return
*/
private
String
[]
buildDynamicAttributesNames
(
SnapAttributeExtract
currentExtract
)
{
String
random_name_1
=
""
,
random_name_2
=
""
;
String
[]
names
;
// String name = currentExtract.getAttribute_complete_name ();
// String dynamicAttributeName = "";
// get_logger().info("CLA/buildRandomNames/name/"+name+"/");
boolean
hasBothReadAndWriteValues
=
currentExtract
.
getWritable
()
==
AttrWriteType
.
_READ_WITH_WRITE
||
currentExtract
.
getWritable
()
==
AttrWriteType
.
_READ_WRITE
;
// Build new Attribute's name
IDynamicAttributeNamer
dynamicAttributeNamer
=
DynamicAttributeNamerFactory
.
getImpl
(
DynamicAttributeNamerFactory
.
DEFAULT
);
boolean
firstIsRead
=
currentExtract
.
getWritable
()
!=
AttrWriteType
.
_WRITE
;
random_name_1
=
dynamicAttributeNamer
.
getName
(
currentExtract
,
id
,
firstIsRead
);
// id++;
// get_logger().info("CLA/buildRandomNames/random_name_1/"+random_name_1+"/");
if
(
hasBothReadAndWriteValues
)
{
random_name_2
=
dynamicAttributeNamer
.
getName
(
currentExtract
,
id
,
!
firstIsRead
);
// id++;
// get_logger().info("CLA/buildRandomNames/random_name_2/"+random_name_2+"/");
}
id
++;
names
=
new
String
[
2
];
names
[
0
]
=
random_name_1
;
names
[
1
]
=
random_name_2
;
return
names
;
}
private
DevVarLongStringArray
createDynamicAttribute
(
DbData
dbData
/*
* added
* by CLA
*/
,
String
[]
names
)
throws
DevFailed
{
try
{
DevVarLongStringArray
argout
=
new
DevVarLongStringArray
();
boolean
_2value
=
dbData
.
getWritable
()
==
AttrWriteType
.
_READ_WITH_WRITE
||
dbData
.
getWritable
()
==
AttrWriteType
.
_READ_WRITE
?
true
:
false
;
// CLA modified
String
random_name_1
=
names
[
0
];
String
random_name_2
=
names
[
1
];
if
(
dbData
.
getData_type
()
==
Tango_DEV_STATE
)
{
// We have to convert state vars to int otherwise they're not
// recognised by the method fr.esrf.TangoDs.check_type()
dbData
.
setData_type
(
Tango_DEV_LONG
);
}
// Create the attribute depends on DataFormat
switch
(
dbData
.
getData_format
())
{
case
AttrDataFormat
.
_SCALAR
:
add_attribute
(
new
Attr
(
random_name_1
,
dbData
.
getData_type
(),
AttrWriteType
.
READ
));
if
(
_2value
)
{
add_attribute
(
new
Attr
(
random_name_2
,
dbData
.
getData_type
(),
AttrWriteType
.
READ
));
}
break
;
case
AttrDataFormat
.
_SPECTRUM
:
add_attribute
(
new
SpectrumAttr
(
random_name_1
,
dbData
.
getData_type
(),
dbData
.
getMax_x
()));
if
(
_2value
)
{
add_attribute
(
new
SpectrumAttr
(
random_name_2
,
dbData
.
getData_type
(),
dbData
.
getMax_x
()));
}
break
;
case
AttrDataFormat
.
_IMAGE
:
add_attribute
(
new
ImageAttr
(
random_name_1
,
dbData
.
getData_type
(),
dbData
.
getMax_x
(),
dbData
.
getMax_y
()));
break
;
}
set_polled_attr
(
names
);
set_poll_ring_depth
(
dbData
.
size
());
// Start polling for this device in external sync. mode (udt = 0)
DevVarLongStringArray
poll_1
,
poll_2
;
poll_1
=
new
DevVarLongStringArray
();
poll_2
=
new
DevVarLongStringArray
();
poll_1
.
lvalue
=
new
int
[
1
];
poll_1
.
lvalue
[
0
]
=
0
;
poll_1
.
svalue
=
new
String
[
3
];
poll_1
.
svalue
[
0
]
=
device_name
;
poll_1
.
svalue
[
1
]
=
"attribute"
;
poll_1
.
svalue
[
2
]
=
random_name_1
;
if
(
_2value
)
{
poll_2
.
lvalue
=
new
int
[
1
];
poll_2
.
lvalue
[
0
]
=
0
;
poll_2
.
svalue
=
new
String
[
3
];
poll_2
.
svalue
[
0
]
=
device_name
;
poll_2
.
svalue
[
1
]
=
"attribute"
;
poll_2
.
svalue
[
2
]
=
random_name_2
;
}
Util
tg_1
=
Util
.
instance
();
tg_1
.
get_dserver_device
().
add_obj_polling
(
poll_1
,
false
);
Util
tg_2
=
Util
.
instance
();
if
(
_2value
)
{
tg_2
.
get_dserver_device
().
add_obj_polling
(
poll_2
,
false
);
}
// And fill buffer with database's data
if
(
_2value
)
{
// System.out.println ( "CLA/SnapExtractor/" +dbData.);
DbData
[]
dbDatas
=
dbData
.
splitDbData
();
DbData
readDbData
=
dbDatas
[
0
];
DbData
writeDbData
=
dbDatas
[
1
];
TimedAttrData
[]
readTimedAttrDatas
=
readDbData
.
getDataAsTimedAttrData
();
TimedAttrData
[]
writeTimedAttrDatas
=
writeDbData
.
getDataAsTimedAttrData
();
updateWriteData
(
writeTimedAttrDatas
);
tg_1
.
fill_attr_polling_buffer
(
this
,
random_name_1
,
readTimedAttrDatas
);
tg_2
.
fill_attr_polling_buffer
(
this
,
random_name_2
,
writeTimedAttrDatas
);
}
else
{
tg_1
.
fill_attr_polling_buffer
(
this
,
random_name_1
,
dbData
.
getDataAsTimedAttrData
());
}
argout
=
new
DevVarLongStringArray
();
argout
.
lvalue
=
new
int
[
1
];
if
(!
_2value
)
{
argout
.
svalue
=
new
String
[
1
];
}
else
{
argout
.
svalue
=
new
String
[
2
];
}
argout
.
lvalue
[
0
]
=
dbData
.
getData_timed
().
length
;
argout
.
svalue
[
0
]
=
random_name_1
;
if
(
_2value
)
{
argout
.
svalue
[
1
]
=
random_name_2
;
}
return
argout
;
}
catch
(
Throwable
t
)
{
Tools
.
throwDevFailed
(
t
);
}
return
null
;
}
/**
* update x dimension to the data array length
*
* @param data
*/
private
void
updateWriteData
(
TimedAttrData
[]
data
)
{
// TODO Auto-generated method stub
for
(
int
i
=
0
;
i
<
data
.
length
;
i
++)
{
int
size
=
0
;
switch
(
data
[
i
].
data_type
)
{
case
Tango_DEV_BOOLEAN:
size
=
data
[
i
].
bool_ptr
.
length
;
break
;
case
Tango_DEV_SHORT:
size
=
data
[
i
].
sh_ptr
.
length
;
break
;
case
Tango_DEV_LONG:
size
=
data
[
i
].
lg_ptr
.
length
;
break
;
case
Tango_DEV_LONG64:
size
=
data
[
i
].
lg64_ptr
.
length
;
break
;
case
Tango_DEV_FLOAT:
size
=
data
[
i
].
fl_ptr
.
length
;
break
;
case
Tango_DEV_DOUBLE:
size
=
data
[
i
].
db_ptr
.
length
;
break
;
case
Tango_DEV_STRING:
size
=
data
[
i
].
str_ptr
.
length
;
break
;
default
:
;
}
data
[
i
].
x
=
size
;
}
}
/**
* @param i
*/
private
String
formatStatus
(
int
_state
)
{
switch
(
_state
)
{
case
DevState
.
_ALARM
:
return
"Archiving problems have been detected."
;
case
DevState
.
_FAULT
:
return
"This device isn't working properly."
;
case
DevState
.
_INIT
:
return
"No control step has been completed yet. Please wait."
;
case
DevState
.
_OFF
:
return
"This device is waiting."
;
case
DevState
.
_ON
:
return
"This device is running normally."
;
default
:
return
"Unknown"
;
}
}
public
synchronized
void
trace
(
String
msg
,
int
level
)
throws
DevFailed
{
switch
(
level
)
{
case
Warnable
.
LOG_LEVEL_DEBUG
:
get_logger
().
debug
(
msg
);
break
;
case
Warnable
.
LOG_LEVEL_INFO
:
get_logger
().
info
(
msg
);
break
;
case
Warnable
.
LOG_LEVEL_WARN
:
get_logger
().
warn
(
msg
);
break
;
case
Warnable
.
LOG_LEVEL_ERROR
:
get_logger
().
error
(
msg
);
break
;
case
Warnable
.
LOG_LEVEL_FATAL
:
get_logger
().
fatal
(
msg
);
break
;
default
:
Tools
.
throwDevFailed
(
new
IllegalArgumentException
(
"Expected LOG_LEVEL_DEBUG(9), LOG_LEVEL_INFO(7), LOG_LEVEL_WARN(5), LOG_LEVEL_ERROR(3), or LOG_LEVEL_FATAL(1), got "
+
level
+
"instead."
));
}
}
public
synchronized
void
trace
(
String
msg
,
Throwable
t
,
int
level
)
throws
DevFailed
{
switch
(
level
)
{
case
Warnable
.
LOG_LEVEL_DEBUG
:
get_logger
().
debug
(
msg
,
t
);
break
;
case
Warnable
.
LOG_LEVEL_INFO
:
get_logger
().
info
(
msg
,
t
);
break
;
case
Warnable
.
LOG_LEVEL_WARN
:
get_logger
().
warn
(
msg
,
t
);
break
;
case
Warnable
.
LOG_LEVEL_ERROR
:
get_logger
().
error
(
msg
,
t
);
break
;
case
Warnable
.
LOG_LEVEL_FATAL
:
get_logger
().
fatal
(
msg
,
t
);
break
;
default
:
Tools
.
throwDevFailed
(
new
IllegalArgumentException
(
"Expected LOG_LEVEL_DEBUG(9), LOG_LEVEL_INFO(7), LOG_LEVEL_WARN(5), LOG_LEVEL_ERROR(3), or LOG_LEVEL_FATAL(1), got "
+
level
+
"instead."
));
}
}
// ===================================================================
/**
* Method called by the read_attributes CORBA operation to set internal
* attribute value.
*
* @param attr
* reference to the Attribute object
*/
// ===================================================================
@Override
public
void
read_attr
(
Attribute
attr
)
throws
DevFailed
{
String
attr_name
=
attr
.
get_name
();
get_logger
().
info
(
"In read_attr for attribute "
+
attr_name
);
// Switch on attribute name
// ---------------------------------
if
(
attr_name
==
"version"
)
{
// Add your own code here
attr
.
set_value
(
m_version
);
}
}
@Override
public
void
delete_device
()
throws
DevFailed
{
// TODO Auto-generated method stub
}
}
// --------------------------------------------------------------------------
/*
* end of $Source:
* /cvsroot/tango-cs/tango/jserver/snapshoting/SnapExtractor/SnapExtractor
* .java,v $
*/
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment