Originariamente inviato da andbin
E riguardo al tuo dubbio sulla thread safety di JDOM, la FAQ ufficiale ha la risposta:
Is JDOM thread safe? .
Se ho capito bene in questa FAQ si dice che la libreria jdom non contiene blocchi di codice synchronized e se si ha proprio la necessità di sincronizzare bisogna forse farlo su di una istanza di document . giusto?
Originariamente inviato da andbin
Innanzitutto bisognerebbe vedere meglio cosa devi fare di preciso e cosa hai già scritto a livello di codice. Già la tua affermazione "
ho pensato di dichiararli come attributi di classe in modo tale che tutti i metodi che li utilizzano non fossero costretti a rileggere l'intero file prima di poter operare" mi lascia un po' perplesso.
Posto un po di codice anche se devo tagliare molto perche sono già arrivato ad una classe di 700 righe di codice ...
codice:
public class Rbac implements RBACInterface {
//l’istanza unica da pubblicare
private static Rbac instance = null;
private static Object sinc = new Object(); //oggetto usato per il lock dell'instanziazione
final private String rolePathXML = "src/app/sourceXML/RolesXMLDocument.xml";
final private String objPathXML = "src/app/sourceXML/objectXMLDocument.xml";
final private String operationPathXML = "src/app/sourceXML/operationXMLDocument.xml";
private Document documentRoleXML = null;
private Document documentObjectXML = null;
private Document documentOperationXML = null;
//l’interfaccia unica per accedere alla sola istanza
public static Rbac getInstance()
{
if(instance == null) {
synchronized(sinc){//sincronizziamo l'accwesso all'istanziazione di Rbac
if(instance == null) instance = new Rbac();
}
}
return instance;
}
private Rbac () {
try
{
/* Portiamo in memoria tutti i file XML */
SAXBuilder saxBuilder = new SAXBuilder();
documentObjectXML = saxBuilder.build(new File(objPathXML));
documentOperationXML = saxBuilder.build(new File(operationPathXML));
documentRoleXML = saxBuilder.build(new File(rolePathXML));
}
catch (JDOMException ex)
{
System.err.println(ex);
}
catch (IOException ex)
{
System.err.println(ex);
}
}
/* ESEMPIO DI LETTURA */
public RBAC.Object getObject (int idObj)
{
RBAC.Object obj=null;
Element root = documentObjectXML.getRootElement();
/*Lettura Oggetti*/
Iterator objectIt = root.getChildren().iterator();
while (objectIt.hasNext())/*Scansione oggetti */
{
Element tmpObject = (Element)objectIt.next();
int tmpId =Integer.parseInt(tmpObject.getAttributeValue("id"));
if(idObj == tmpId) /* oggetto trovato */
{
obj = new RBAC.Object();
obj.setId(idObj);
obj.setName(tmpObject.getAttributeValue("name"));
obj.setDescription(tmpObject.getAttributeValue("description"));
Element aux = tmpObject.getChild("operations");
if (aux!=null) /*SE lo troviamo passiamo alla scnsione dele proprietà*/
{
Set<String> operations =new HashSet();
Iterator operationsIt = aux.getChildren().iterator();
while (operationsIt.hasNext())/*Scansione dei Ruoli*/
{
Element operationXML = (Element)operationsIt.next();
operations.add(operationXML.getAttributeValue("id"));
}
obj.setOperations(operations);
}
}
}
return obj;
}
/* ESEMPIO DI SCRITTURA */
public void addObject(int idObj,String name,String description)throws AddObjectException
{
//questo parametro è richiesto
if(name==null || name.equals(""))throw new AddObjectException("Il nome dell'oggetto non può essere vuoto o nullo");
RBAC.Object obj =getObject(idObj);
if(obj != null) throw new AddObjectException("Oggetto già esistente (verificare l'id)");
Element root = documentObjectXML.getRootElement();
Element elementObj = new Element("object");
elementObj.setAttribute("id", String.valueOf(idObj));
elementObj.setAttribute("name", name);
elementObj.setAttribute("description", description);
root.addContent(elementObj);
writeDocumentXml(documentObjectXML,objPathXML);
}
/* writeDocumentXml */
private void writeDocumentXml(Document document , String pathFile)
{ /* Metodo per la scrittura su file XML */
XMLOutputter xmlOutputter = new XMLOutputter();
xmlOutputter.setFormat(Format.getPrettyFormat());
try
{
FileOutputStream fileOutputStream = new FileOutputStream(pathFile);
xmlOutputter.output(document, fileOutputStream);
}
catch (FileNotFoundException ex)
{
System.err.println(ex);
}
catch (IOException ex)
{
System.err.println(ex);
}
}